diff --git a/README.md b/README.md index ba6c1be5..8dc5e0f5 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ The complete documentation is available on https://docs.invidious.io/ (or altern ## Contact: -Feel free to join our [Matrix room](https://matrix.to/#/#invidious:matrix.org), or #invidious on freenode. Both platforms are bridged together. +Feel free to join our [Matrix room](https://matrix.to/#/#invidious:matrix.org). --- diff --git a/assets/css/default.css b/assets/css/default.css index a725b456..07a879bb 100644 --- a/assets/css/default.css +++ b/assets/css/default.css @@ -310,194 +310,15 @@ footer a { } } -/* Control Bar */ -@media screen and (max-width: 640px) { - .video-js .vjs-control-bar, - .vjs-menu-button-popup .vjs-menu .vjs-menu-content { - overflow-x: scroll; - } -} - -ul.vjs-menu-content::-webkit-scrollbar { - display: none; -} - -.vjs-user-inactive { - cursor: none; -} - -.video-js .vjs-text-track-display > div > div > div { - background-color: rgba(0, 0, 0, 0.75) !important; - border-radius: 9px !important; - padding: 5px !important; -} - -.vjs-play-control, -.vjs-volume-panel, -.vjs-current-time, -.vjs-time-control, -.vjs-duration, -.vjs-progress-control, -.vjs-remaining-time { - order: 1; -} - -.vjs-captions-button { - order: 2; -} - -.vjs-quality-selector, -.video-js .vjs-http-source-selector { - order: 3; -} - -.vjs-playback-rate { - order: 4; -} - -.vjs-share-control { - order: 5; -} - -.vjs-fullscreen-control { - order: 6; -} - -.vjs-playback-rate > .vjs-menu { - width: 50px; -} - -.vjs-control-bar { - display: flex; - flex-direction: row; - scrollbar-width: none; -} - -.vjs-control-bar::-webkit-scrollbar { - display: none; -} - -.video-js .vjs-icon-cog { - font-size: 18px; -} - -.video-js .vjs-control-bar, -.vjs-menu-button-popup .vjs-menu .vjs-menu-content { - background-color: rgba(35, 35, 35, 0.75); -} - -.vjs-menu li.vjs-menu-item:focus, -.vjs-menu li.vjs-menu-item:hover { - background-color: rgba(255, 255, 255, 0.75); - color: rgba(49, 49, 51, 0.75); -} - -.vjs-menu li.vjs-selected, -.vjs-menu li.vjs-selected:focus, -.vjs-menu li.vjs-selected:hover { - background-color: rgba(0, 182, 240, 0.75); -} - -/* Progress Bar */ -.video-js .vjs-slider { - background-color: rgba(15, 15, 15, 0.5); -} - fieldset > select, span > select { color: rgba(49, 49, 51, 1); } -.video-js .vjs-load-progress, -.video-js .vjs-load-progress div { - background: rgba(87, 87, 88, 1); -} - -.video-js .vjs-slider:hover, -.video-js button:hover { - color: rgba(0, 182, 240, 1); -} - -.video-js .vjs-play-progress { - background-color: rgba(0, 182, 240, 1); -} - -/* Overlay */ -.video-js .vjs-overlay { - background-color: rgba(35, 35, 35, 0.75); - color: rgba(255, 255, 255, 1); -} - -/* ProgressBar marker */ -.vjs-marker { - background-color: rgba(255, 255, 255, 1); - z-index: 0; -} - -/* Big "Play" Button */ -.video-js .vjs-big-play-button { - background-color: rgba(35, 35, 35, 0.5); -} - -.video-js:hover .vjs-big-play-button { - background-color: rgba(35, 35, 35, 0.75); -} - -.video-js .vjs-current-time, -.video-js .vjs-time-divider, -.video-js .vjs-duration { - display: block; -} - -.video-js .vjs-time-divider { - min-width: 0px; - padding-left: 0px; - padding-right: 0px; -} - -.video-js .vjs-poster { - background-size: cover; - object-fit: cover; -} - -.player-dimensions.vjs-fluid { - padding-top: 82vh; -} - -video.video-js { - position: absolute; - height: 100%; -} - -#player-container { - position: relative; - padding-bottom: 82vh; - height: 0; -} - .pure-control-group label { word-wrap: normal; } -.video-js.player-style-invidious { - /* This is already the default */ -} - -.video-js.player-style-youtube .vjs-control-bar { - display: flex; - flex-direction: row; -} -.video-js.player-style-youtube .vjs-big-play-button { - /* - Styles copied from video-js.min.css, definition of - .vjs-big-play-centered .vjs-big-play-button - */ - top: 50%; - left: 50%; - margin-top: -0.81666em; - margin-left: -1.5em; -} - /* * Light theme */ @@ -669,3 +490,28 @@ See https://stackoverflow.com/a/34372979 for more info */ hr { margin: auto 0 auto 0; } + +/* Description Expansion Styling*/ +#description-box { + display: flex; + flex-direction: column; +} + +#descexpansionbutton { + display: none +} + +#descexpansionbutton ~ div { + overflow: hidden; + height: 8.3em; +} + +#descexpansionbutton:checked ~ div { + overflow: unset; + height: 100%; +} + +#descexpansionbutton + label { + order: 1; + margin-top: 20px; +} diff --git a/assets/css/embed.css b/assets/css/embed.css index 12fefe58..466a284a 100644 --- a/assets/css/embed.css +++ b/assets/css/embed.css @@ -8,3 +8,19 @@ height: auto; z-index: -100; } + +.watch-on-invidious { + font-size: 1.3em !important; + font-weight: bold; + white-space: nowrap; + margin: 0 1em 0 1em !important; + order: 3; +} + +.watch-on-invidious > a { + color: white; +} + +.watch-on-invidious > a:hover { + color: rgba(0, 182, 240, 1);; +} diff --git a/assets/css/player.css b/assets/css/player.css new file mode 100644 index 00000000..656fb48c --- /dev/null +++ b/assets/css/player.css @@ -0,0 +1,250 @@ +/* Youtube player style */ +.video-js.player-style-youtube .vjs-progress-control { + height: 0; +} + +.video-js.player-style-youtube .vjs-progress-control .vjs-progress-holder, .video-js.player-style-youtube .vjs-progress-control { + position: absolute; + right: 0; + left: 0; + width: 100%; + margin: 0; +} + +.video-js.player-style-youtube .vjs-control-bar { + background: linear-gradient(rgba(0,0,0,0.1), rgba(0, 0, 0,0.5)); +} + +.video-js.player-style-youtube .vjs-slider { + background-color: rgba(255,255,255,0.2); +} + +.video-js.player-style-youtube .vjs-load-progress > div { + background-color: rgba(255,255,255,0.5); +} + +.video-js.player-style-youtube .vjs-play-progress { + background-color: red; +} + +.video-js.player-style-youtube .vjs-progress-control:hover .vjs-progress-holder { + font-size: 15px; +} + +.video-js.player-style-youtube .vjs-control-bar > .vjs-spacer { + flex: 1; + order: 2; +} + +.video-js.player-style-youtube .vjs-play-progress .vjs-time-tooltip { + display: none; +} + +.video-js.player-style-youtube .vjs-play-progress::before { + color: red; + font-size: 0.85em; + display: none; +} + +.video-js.player-style-youtube .vjs-progress-holder:hover .vjs-play-progress::before { + display: unset; +} + +.video-js.player-style-youtube .vjs-control-bar { + display: flex; + flex-direction: row; +} + +.video-js.player-style-youtube .vjs-big-play-button { + /* + Styles copied from video-js.min.css, definition of + .vjs-big-play-centered .vjs-big-play-button + */ + top: 50%; + left: 50%; + margin-top: -0.81666em; + margin-left: -1.5em; +} + +.video-js.player-style-youtube .vjs-menu-button-popup .vjs-menu { + margin-bottom: 2em; +} + +ul.vjs-menu-content::-webkit-scrollbar { + display: none; +} + +.vjs-user-inactive { + cursor: none; +} + +.video-js .vjs-text-track-display > div > div > div { + background-color: rgba(0, 0, 0, 0.75) !important; + border-radius: 9px !important; + padding: 5px !important; +} + +.vjs-play-control, +.vjs-volume-panel, +.vjs-current-time, +.vjs-time-control, +.vjs-duration, +.vjs-progress-control, +.vjs-remaining-time { + order: 1; +} + +.vjs-captions-button { + order: 2; +} + +.vjs-quality-selector, +.video-js .vjs-http-source-selector { + order: 3; +} + +.vjs-playback-rate { + order: 4; +} + +.vjs-share-control { + order: 5; +} + +.vjs-fullscreen-control { + order: 6; +} + +.vjs-playback-rate > .vjs-menu { + width: 50px; +} + +.vjs-control-bar { + display: flex; + flex-direction: row; + scrollbar-width: none; +} + +.vjs-control-bar::-webkit-scrollbar { + display: none; +} + +.video-js .vjs-icon-cog { + font-size: 18px; +} + +.video-js .vjs-control-bar, +.vjs-menu-button-popup .vjs-menu .vjs-menu-content { + background-color: rgba(35, 35, 35, 0.75); +} + +.vjs-menu li.vjs-menu-item:focus, +.vjs-menu li.vjs-menu-item:hover { + background-color: rgba(255, 255, 255, 0.75); + color: rgba(49, 49, 51, 0.75); +} + +.vjs-menu li.vjs-selected, +.vjs-menu li.vjs-selected:focus, +.vjs-menu li.vjs-selected:hover { + background-color: rgba(0, 182, 240, 0.75); +} + +/* Progress Bar */ +.video-js .vjs-slider { + background-color: rgba(15, 15, 15, 0.5); +} + +.video-js .vjs-load-progress, +.video-js .vjs-load-progress div { + background: rgba(87, 87, 88, 1); +} + +.video-js .vjs-slider:hover, +.video-js button:hover { + color: rgba(0, 182, 240, 1); +} + +.video-js.player-style-invidious .vjs-play-progress { + background-color: rgba(0, 182, 240, 1); +} +vjs-menu-content +/* Overlay */ +.video-js .vjs-overlay { + background-color: rgba(35, 35, 35, 0.75); + color: rgba(255, 255, 255, 1); +} + +/* ProgressBar marker */ +.vjs-marker { + background-color: rgba(255, 255, 255, 1); + z-index: 0; +} + +/* Big "Play" Button */ +.video-js .vjs-big-play-button { + background-color: rgba(35, 35, 35, 0.5); +} + +.video-js:hover .vjs-big-play-button { + background-color: rgba(35, 35, 35, 0.75); +} + +.video-js .vjs-current-time, +.video-js .vjs-time-divider, +.video-js .vjs-duration { + display: block; +} + +.video-js .vjs-time-divider { + min-width: 0px; + padding-left: 0px; + padding-right: 0px; +} + +.video-js .vjs-poster { + background-size: cover; + object-fit: cover; +} + +.player-dimensions.vjs-fluid { + padding-top: 82vh; +} + +video.video-js { + position: absolute; + height: 100%; +} + +#player-container { + position: relative; + padding-bottom: 82vh; + height: 0; +} + +.mobile-operations-bar { + display: flex; + position: absolute; + top: 0; + right: 1px !important; + left: initial !important; + width: initial !important; +} + +.mobile-operations-bar ul { + position: absolute !important; + bottom: unset !important; + top: 1.5em; +} + +@media screen and (max-width: 700px) { + .video-js .vjs-share { + justify-content: unset; + } +} + +@media screen and (max-width: 650px) { + .vjs-modal-dialog-content { + overflow-x: hidden; + } +} diff --git a/assets/css/videojs-mobile-ui.css b/assets/css/videojs-mobile-ui.css new file mode 100644 index 00000000..c307274a --- /dev/null +++ b/assets/css/videojs-mobile-ui.css @@ -0,0 +1,7 @@ +/** + * videojs-mobile-ui + * @version 0.5.2 + * @copyright 2021 mister-ben + * @license MIT + */ +@keyframes fadeAndScale{0%{opacity:0}25%{opacity:1}100%{opacity:0}}.video-js.vjs-has-started .vjs-touch-overlay{position:absolute;pointer-events:auto;top:0}.video-js .vjs-touch-overlay{display:block;width:100%;height:100%;pointer-events:none}.video-js .vjs-touch-overlay.skip{opacity:0;animation:fadeAndScale 0.6s linear;background-repeat:no-repeat;background-position:80% center;background-size:10%;background-image:url('data:image/svg+xml;utf8,')}.video-js .vjs-touch-overlay.skip.reverse{background-position:20% center;background-image:url('data:image/svg+xml;utf8,')}.video-js .vjs-touch-overlay .vjs-play-control{top:50%;left:50%;transform:translate(-50%, -50%);position:absolute;width:30%;height:80%;pointer-events:none;opacity:0;transition:opacity 0.3s ease}.video-js .vjs-touch-overlay .vjs-play-control .vjs-icon-placeholder::before{content:'';background-size:60%;background-position:center center;background-repeat:no-repeat;background-image:url('data:image/svg+xml;utf8,')}.video-js .vjs-touch-overlay .vjs-play-control.vjs-paused .vjs-icon-placeholder::before{content:'';background-image:url('data:image/svg+xml;utf8,')}.video-js .vjs-touch-overlay .vjs-play-control.vjs-ended .vjs-icon-placeholder::before{content:'';background-image:url('data:image/svg+xml;utf8,')}.video-js .vjs-touch-overlay.show-play-toggle .vjs-play-control{opacity:1;pointer-events:auto}.video-js.vjs-mobile-ui-disable-end.vjs-ended .vjs-touch-overlay{display:none} diff --git a/assets/js/player.js b/assets/js/player.js index 1c6e336c..a6d0c8c1 100644 --- a/assets/js/player.js +++ b/assets/js/player.js @@ -14,6 +14,7 @@ var options = { 'durationDisplay', 'progressControl', 'remainingTimeDisplay', + 'Spacer', 'captionsButton', 'qualitySelector', 'playbackRateMenuButton', @@ -73,6 +74,55 @@ if (location.pathname.startsWith('/embed/')) { }); } +// Detect mobile users and initalize mobileUi for better UX +// Detection code taken from https://stackoverflow.com/a/20293441 + +function isMobile() { + try{ document.createEvent("TouchEvent"); return true; } + catch(e){ return false; } +} + +if (isMobile()) { + player.mobileUi(); + + buttons = ["playToggle", "volumePanel", "captionsButton"]; + + if (video_data.params.quality !== 'dash') { + buttons.push("qualitySelector") + } + + // Create new control bar object for operation buttons + const ControlBar = videojs.getComponent("controlBar"); + let operations_bar = new ControlBar(player, { + children: [], + playbackRates: [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0] + }); + buttons.slice(1).forEach(child => operations_bar.addChild(child)) + + // Remove operation buttons from primary control bar + primary_control_bar = player.getChild("controlBar"); + buttons.forEach(child => primary_control_bar.removeChild(child)); + + operations_bar_element = operations_bar.el(); + operations_bar_element.className += " mobile-operations-bar" + player.addChild(operations_bar) + + // Playback menu doesn't work when its initalized outside of the primary control bar + playback_element = document.getElementsByClassName("vjs-playback-rate")[0] + operations_bar_element.append(playback_element) + + // The share and http source selector element can't be fetched till the players ready. + player.one("playing", () => { + share_element = document.getElementsByClassName("vjs-share-control")[0] + operations_bar_element.append(share_element) + + if (video_data.params.quality === 'dash') { + http_source_selector = document.getElementsByClassName("vjs-http-source-selector vjs-menu-button")[0] + operations_bar_element.append(http_source_selector) + } + }) +} + player.on('error', function (event) { if (player.error().code === 2 || player.error().code === 4) { setTimeout(function (event) { @@ -566,3 +616,20 @@ if (navigator.vendor == "Apple Computer, Inc." && video_data.params.listen) { }); }); } + +// Watch on Invidious link +if (window.location.pathname.startsWith("/embed/")) { + const Button = videojs.getComponent('Button'); + let watch_on_invidious_button = new Button(player); + + // 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.appendChild(document.createTextNode("Invidious")) + + watch_on_invidious_button.el().appendChild(redirect_element) + watch_on_invidious_button.addClass("watch-on-invidious") + + cb = player.getChild('ControlBar') + cb.addChild(watch_on_invidious_button) +}; diff --git a/assets/js/videojs-mobile-ui.min.js b/assets/js/videojs-mobile-ui.min.js new file mode 100644 index 00000000..e624fbe2 --- /dev/null +++ b/assets/js/videojs-mobile-ui.min.js @@ -0,0 +1,7 @@ +/** + * videojs-mobile-ui + * @version 0.5.2 + * @copyright 2021 mister-ben + * @license MIT + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("video.js"),require("global/window")):"function"==typeof define&&define.amd?define(["video.js","global/window"],t):e.videojsMobileUi=t(e.videojs,e.window)}(this,function(e,t){"use strict";e=e&&e.hasOwnProperty("default")?e.default:e,t=t&&t.hasOwnProperty("default")?t.default:t;var n=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},o=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t},i=e.getComponent("Component"),r=e.dom||e,a=function(e){function i(t,r){n(this,i);var a=o(this,e.call(this,t,r));return a.seekSeconds=r.seekSeconds,a.tapTimeout=r.tapTimeout,a.addChild("playToggle",{}),t.on(["playing","userinactive"],function(e){a.removeClass("show-play-toggle")}),0===a.player_.options_.inactivityTimeout&&(a.player_.options_.inactivityTimeout=5e3),a.enable(),a}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(i,e),i.prototype.createEl=function(){return r.createEl("div",{className:"vjs-touch-overlay",tabIndex:-1})},i.prototype.handleTap=function(e){var n=this;e.target===this.el_&&(e.preventDefault(),this.firstTapCaptured?(this.firstTapCaptured=!1,this.timeout&&t.clearTimeout(this.timeout),this.handleDoubleTap(e)):(this.firstTapCaptured=!0,this.timeout=t.setTimeout(function(){n.firstTapCaptured=!1,n.handleSingleTap(e)},this.tapTimeout)))},i.prototype.handleSingleTap=function(e){this.removeClass("skip"),this.toggleClass("show-play-toggle")},i.prototype.handleDoubleTap=function(e){var n=this,o=this.el_.getBoundingClientRect(),i=e.changedTouches[0].clientX-o.left;if(i<.4*o.width)this.player_.currentTime(Math.max(0,this.player_.currentTime()-this.seekSeconds)),this.addClass("reverse");else{if(!(i>o.width-.4*o.width))return;this.player_.currentTime(Math.min(this.player_.duration(),this.player_.currentTime()+this.seekSeconds)),this.removeClass("reverse")}this.removeClass("show-play-toggle"),this.removeClass("skip"),t.requestAnimationFrame(function(){n.addClass("skip")})},i.prototype.enable=function(){this.firstTapCaptured=!1,this.on("touchend",this.handleTap)},i.prototype.disable=function(){this.off("touchend",this.handleTap)},i}(i);i.registerComponent("TouchOverlay",a);var s={fullscreen:{enterOnRotate:!0,exitOnRotate:!0,lockOnRotate:!0,iOS:!1},touchControls:{seekSeconds:10,tapTimeout:300,disableOnEnd:!1}},l=t.screen,u=function(n,o){n.addClass("vjs-mobile-ui"),(o.touchControls.disableOnEnd||"function"==typeof n.endscreen)&&n.addClass("vjs-mobile-ui-disable-end"),o.fullscreen.iOS&&e.browser.IS_IOS&&e.browser.IOS_VERSION>9&&!n.el_.ownerDocument.querySelector(".bc-iframe")&&(n.tech_.el_.setAttribute("playsinline","playsinline"),n.tech_.supportsFullScreen=function(){return!1});var i=void 0,r=e.VERSION.split("."),a=parseInt(r[0],10),s=parseInt(r[1],10);i=a<7||7===a&&s<7?Array.prototype.indexOf.call(n.el_.children,n.getChild("ControlBar").el_):n.children_.indexOf(n.getChild("ControlBar")),n.addChild("TouchOverlay",o.touchControls,i);var u=!1,c=function(){var i="number"==typeof t.orientation?t.orientation:l&&l.orientation&&l.orientation.angle?t.orientation:(e.log("angle unknown"),0);90!==i&&270!==i&&-90!==i||!o.enterOnRotate||!1===n.paused()&&(n.requestFullscreen(),o.fullscreen.lockOnRotate&&l.orientation&&l.orientation.lock&&l.orientation.lock("landscape").then(function(){u=!0}).catch(function(){e.log("orientation lock not allowed")})),0!==i&&180!==i||!o.exitOnRotate||n.isFullscreen()&&n.exitFullscreen()};e.browser.IS_IOS?t.addEventListener("orientationchange",c):l.orientation&&(l.orientation.onchange=c),n.on("ended",function(e){!0===u&&(l.orientation.unlock(),u=!1)})},c=function(){var t=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};(n.forceForTesting||e.browser.IS_ANDROID||e.browser.IS_IOS)&&this.ready(function(){u(t,e.mergeOptions(s,n))})};return(e.registerPlugin||e.plugin)("mobileUi",c),c.VERSION="0.5.2",c}); \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile index 01abc6f5..87884403 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -18,13 +18,14 @@ RUN apk add --no-cache librsvg ttf-opensans WORKDIR /invidious RUN addgroup -g 1000 -S invidious && \ adduser -u 1000 -S invidious -G invidious -COPY --chown=invidious ./assets/ ./assets/ +COPY ./assets/ ./assets/ COPY --chown=invidious ./config/config.* ./config/ RUN mv -n config/config.example.yml config/config.yml RUN sed -i 's/host: \(127.0.0.1\|localhost\)/host: postgres/' config/config.yml -COPY --chown=invidious ./config/sql/ ./config/sql/ -COPY --chown=invidious ./locales/ ./locales/ +COPY ./config/sql/ ./config/sql/ +COPY ./locales/ ./locales/ COPY --from=builder /invidious/invidious . +RUN chmod o+rX -R ./assets ./config ./locales EXPOSE 3000 USER invidious diff --git a/locales/ar.json b/locales/ar.json index 540e4df0..7ce297b9 100644 --- a/locales/ar.json +++ b/locales/ar.json @@ -4,79 +4,80 @@ "": "`x` المشتركين" }, "`x` videos": { - "([^.,0-9]|^)1([^.,0-9]|$)": "`x` الفيديوهات", - "": "`x` الفيديوهات" + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` المقاطع المرئيَّة", + "": "`x` المقاطع المرئيَّة" }, "`x` playlists": { "([^.,0-9]|^)1([^.,0-9]|$)": "`x` قوائم التشغيل", "": "`x` قوائم التشغيل" }, - "LIVE": "مباشر", - "Shared `x` ago": "تم رفع الفيديو منذ `x`", + "LIVE": "مُباشِر", + "Shared `x` ago": "تمَّ رفع المقطع المرئيّ مُنذ `x`", "Unsubscribe": "إلغاء الإشتراك", - "Subscribe": "إشتراك", + "Subscribe": "الإشتراك", "View channel on YouTube": "زيارة القناة على موقع يوتيوب", "View playlist on YouTube": "عرض قائمة التشغيل على اليوتيوب", "newest": "الأجدد", "oldest": "الأقدم", "popular": "الأكثر شعبية", - "last": "اخر قوائم التشغيل المعدلة", - "Next page": "الصفحة الثانية", + "last": "الأخيرة", + "Next page": "الصفحة التالية", "Previous page": "الصفحة السابقة", - "Clear watch history?": "مسح السجل ؟", - "New password": "الرقم السرى الجديد", - "New passwords must match": "الأرقام السرية يجب ان تكون متطابقة", - "Cannot change password for Google accounts": "لا يستطيع تغيير الرقم السرى لحساب جوجل", - "Authorize token?": "رمز الإذن ؟", - "Authorize token for `x`?": "تصريح الرمز لـ `x` ؟", + "Clear watch history?": "هل تريد محو سجل المشاهدة؟", + "New password": "كلمة مرور جديدة", + "New passwords must match": "يَجبُ أن تكون كلمتي المرور متطابقتان", + "Cannot change password for Google accounts": "لا يُمكن تغيير كلمة المرور لِحسابات جوجل", + "Authorize token?": "رمز التفويض؟", + "Authorize token for `x`?": "رمز التفويض لِـ `x` ؟", "Yes": "نعم", "No": "لا", - "Import and Export Data": "استخراج و إضافة البيانات", - "Import": "إضافة", - "Import Invidious data": "إضافة بيانات Invidious", - "Import YouTube subscriptions": "إضافةالإشتراكات من موقع يوتيوب", - "Import FreeTube subscriptions (.db)": "إضافةالمشتركين من FreeTube (.db)", - "Import NewPipe subscriptions (.json)": "إضافة المشتركين من NewPipe (.json)", - "Import NewPipe data (.zip)": "إضافة بيانات NewPipe (.zip)", - "Export": "استخراج", - "Export subscriptions as OPML": "استخراج المشتركين كـ OPML", - "Export subscriptions as OPML (for NewPipe & FreeTube)": "استخراج المشتركين كـ OPML (لـ NewPipe و FreeTube)", - "Export data as JSON": "استخراج البيانات كـ JSON", - "Delete account?": "حذف الحساب ؟", - "History": "السجل", - "An alternative front-end to YouTube": "البديل الكامل لموقع يوتيوب", - "JavaScript license information": "معلومات ترخيص JavaScript", + "Import and Export Data": "اِستيراد البيانات وتصديرها", + "Import": "استيراد", + "Import Invidious data": "استيراد بيانات انفيدياس", + "Import YouTube subscriptions": "استيراد اشتراكات يوتيوب", + "Import FreeTube subscriptions (.db)": "استيراد اشتراكات فريتيوب (.db)", + "Import NewPipe subscriptions (.json)": "استيراد اشتراكات نيو بايب (.json)", + "Import NewPipe data (.zip)": "استيراد بيانات نيو بايب (.zip)", + "Export": "تصدير", + "Export subscriptions as OPML": "تصدير الاشتراكات كَـ OPML", + "Export subscriptions as OPML (for NewPipe & FreeTube)": "تصدير الاشتراكات كَـ OPML (لِنيو بايب و فريتيوب)", + "Export data as JSON": "تصدير البيانات بتنسيق JSON", + "Delete account?": "حذف الحساب؟", + "History": "السِّجل", + "An alternative front-end to YouTube": "واجهة أمامية بديلة لموقع يوتيوب", + "JavaScript license information": "معلومات ترخيص جافا سكربت", "source": "المصدر", "Log in": "تسجيل الدخول", - "Log in/register": "تسجيل الدخول\\إنشاء حساب", - "Log in with Google": "تسجيل الدخول بإستخدام جوجل", - "User ID": "إسم المستخدم", - "Password": "الرقم السرى", - "Time (h:mm:ss):": "(يجب ان يكتب مثل هذا التنسيق) الوقت (h(ساعات):mm(دقائق):ss(ثوانى)):", - "Text CAPTCHA": "CAPTCHA كلامية", - "Image CAPTCHA": "CAPTCHA صورية", + "Log in/register": "تسجيل الدخول \\ إنشاء حساب", + "Log in with Google": "تسجيل الدخول باستخدام جوجل", + "User ID": "مُعرِّف المُستخدم", + "Password": "كلمة المرور", + "Time (h:mm:ss):": "الوقت (h:mm:ss):", + "Text CAPTCHA": "نص الكابتشا", + "Image CAPTCHA": "صورة الكابتشا", "Sign In": "تسجيل الدخول", - "Register": "انشاء الحساب", - "E-mail": "الإيميل", + "Register": "التسجيل", + "E-mail": "البريد الإلكتروني", "Google verification code": "رمز تحقق جوجل", "Preferences": "التفضيلات", - "Player preferences": "التفضيلات المشغل", - "Always loop: ": "كرر الفيديو دائما: ", - "Autoplay: ": "تشغيل تلقائى: ", - "Play next by default: ": "شغل الفيديو التالي تلقائيا: ", - "Autoplay next video: ": "شغل الفيديو التالي تلقائيا (في قوائم التشغيل) ", - "Listen by default: ": "تشغيل النسخة السمعية تلقائى: ", - "Proxy videos: ": "عرض الفيديوهات عن طريق البروكسي؟ ", + "Player preferences": "التفضيلات المُشغِّل", + "Always loop: ": "كرر المقطع المرئيّ دائما: ", + "Autoplay: ": "تشغيل تلقائي: ", + "Play next by default: ": "شغل المقطع التالي تلقائيًا: ", + "Autoplay next video: ": "شغل المقطع التالي تلقائيًا: ", + "Listen by default: ": "تشغيل النسخة السمعية تلقائيًا: ", + "Proxy videos: ": "بروكسي المقاطع المرئيّة؟ ", "Default speed: ": "السرعة الإفتراضية: ", - "Preferred video quality: ": "الجودة المفضلة للفيديوهات: ", + "Preferred video quality: ": "الجودة المفضلة للمقاطع: ", "Player volume: ": "صوت المشغل: ", - "Default comments: ": "إضهار التعليقات الإفتراضية لـ: ", + "Default comments: ": "التعليقات الإفتراضية: ", "youtube": "يوتيوب", - "reddit": "Reddit", - "Default captions: ": "الترجمات الإفتراضية: ", - "Fallback captions: ": "الترجمات المصاحبة: ", + "reddit": "ريديت", + "Default captions: ": "التسميات التوضيحية الإفتراضية: ", + "Fallback captions: ": "التسميات التوضيحية الاحتياطيَّة: ", "Show related videos: ": "اعرض الفيديوهات ذات الصلة: ", "Show annotations by default: ": "اعرض الملاحظات في الفيديو تلقائيا: ", + "Automatically extend video description: ": "", "Visual preferences": "التفضيلات المرئية", "Player style: ": "شكل مشغل الفيديوهات: ", "Dark mode: ": "الوضع الليلى: ", @@ -156,6 +157,8 @@ "Title": "العنوان", "Playlist privacy": "إعدادات الخصوصيه", "Editing playlist `x`": "تعديل قائمه التشفيل `x`", + "Show more": "", + "Show less": "", "Watch on YouTube": "مشاهدة الفيديو على اليوتيوب", "Hide annotations": "إخفاء الملاحظات فى الفيديو", "Show annotations": "عرض الملاحظات فى الفيديو", diff --git a/locales/bn_BD.json b/locales/bn_BD.json index 1c1cc274..b6df0470 100644 --- a/locales/bn_BD.json +++ b/locales/bn_BD.json @@ -71,6 +71,7 @@ "Fallback captions: ": "", "Show related videos: ": "", "Show annotations by default: ": "", + "Automatically extend video description: ": "", "Visual preferences": "", "Player style: ": "", "Dark mode: ": "", @@ -144,6 +145,8 @@ "Title": "", "Playlist privacy": "", "Editing playlist `x`": "", + "Show more": "", + "Show less": "", "Watch on YouTube": "", "Hide annotations": "", "Show annotations": "", diff --git a/locales/cs.json b/locales/cs.json index 802249ef..7e0a31a4 100644 --- a/locales/cs.json +++ b/locales/cs.json @@ -8,15 +8,15 @@ "": "`x` videí." }, "`x` playlists": { - "([^.,0-9]|^)1([^.,0-9]|$)": "", - "": "" + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` playlist", + "": "`x` playlisty." }, "LIVE": "ŽIVĚ", - "Shared `x` ago": "", + "Shared `x` ago": "Sdíleno před `x`", "Unsubscribe": "Odhlásit odběr", "Subscribe": "Odebírat", "View channel on YouTube": "Otevřít kanál na YouTube", - "View playlist on YouTube": "", + "View playlist on YouTube": "Zobrazit playlist na YouTube", "newest": "nejnovější", "oldest": "nejstarší", "popular": "populární", @@ -28,7 +28,7 @@ "New passwords must match": "Hesla se musí schodovat", "Cannot change password for Google accounts": "Nelze změnit heslo pro účty Google", "Authorize token?": "Autorizovat token?", - "Authorize token for `x`?": "", + "Authorize token for `x`?": "Autorizovat token pro `x`?", "Yes": "Ano", "No": "Ne", "Import and Export Data": "Import a Export údajů", @@ -63,107 +63,110 @@ "Player preferences": "Nastavení přehravače", "Always loop: ": "Vždy opakovat: ", "Autoplay: ": "Automatické přehrávání: ", - "Play next by default: ": "", - "Autoplay next video: ": "", - "Listen by default: ": "", - "Proxy videos: ": "", - "Default speed: ": "", - "Preferred video quality: ": "", + "Play next by default: ": "Přehrát další ve výchozím stavu: ", + "Autoplay next video: ": "Automaticky přehrát další video: ", + "Listen by default: ": "Poslouchat ve výchozím nastavení: ", + "Proxy videos: ": "Video přes proxy: ", + "Default speed: ": "Základní Rychlost: ", + "Preferred video quality: ": "Preferovaná kvalita videa: ", "Player volume: ": "Hlasitost přehrávače: ", - "Default comments: ": "", - "youtube": "youtube", + "Default comments: ": "Předpřipravené komentáře: ", + "youtube": "YouTube", "reddit": "reddit", - "Default captions: ": "", - "Fallback captions: ": "", + "Default captions: ": "Standartní Titulky: ", + "Fallback captions: ": "Záložní titulky: ", "Show related videos: ": "Zobrazit podobné videa: ", - "Show annotations by default: ": "", - "Visual preferences": "", + "Show annotations by default: ": "Zobrazovat poznámky ve výchozím nastavení: ", + "Automatically extend video description: ": "Rozšířit automaticky popis u videa: ", + "Visual preferences": "Nastavení vzhledu", "Player style: ": "Styl přehrávače ", "Dark mode: ": "Tmavý režim ", - "Theme: ": "", - "dark": "", - "light": "", - "Thin mode: ": "", - "Subscription preferences": "", - "Show annotations by default for subscribed channels: ": "", - "Redirect homepage to feed: ": "", - "Number of videos shown in feed: ": "", + "Theme: ": "Vzhled: ", + "dark": "tmavý", + "light": "světlý", + "Thin mode: ": "Kompaktní režim: ", + "Subscription preferences": "Nastavení předplatných", + "Show annotations by default for subscribed channels: ": "Ve výchozím nastavení zobrazovat poznámky u odebíraných kanálů: ", + "Redirect homepage to feed: ": "Přesměrovávat domovskou stránku na informační kanál: ", + "Number of videos shown in feed: ": "Počet videí zobrazovaných v informačním kanále: ", "Sort videos by: ": "Roztřídit videa podle: ", "published": "publikováno", - "published - reverse": "", + "published - reverse": "podle publikování - obrátit", "alphabetically": "podle abecedy", - "alphabetically - reverse": "", + "alphabetically - reverse": "podle abecedy - převrátit", "channel name": "název kanálu", - "channel name - reverse": "", + "channel name - reverse": "podle jména kanálu - převrátit", "Only show latest video from channel: ": "Jenom zobrazit nejnovjejší video z kanálu: ", - "Only show latest unwatched video from channel: ": "", - "Only show unwatched: ": "", - "Only show notifications (if there are any): ": "", + "Only show latest unwatched video from channel: ": "Zobrazit jen nejnovější nezhlédnuté video z daného kanálu: ", + "Only show unwatched: ": "Zobrazit jen již nezhlédnuté: ", + "Only show notifications (if there are any): ": "Zobrazit pouze upozornění (pokud nějaká jsou): ", "Enable web notifications": "Povolit webové upozornění", "`x` uploaded a video": "`x` nahrál(a) video", "`x` is live": "`x` je živě", - "Data preferences": "", + "Data preferences": "Nastavení dat", "Clear watch history": "Smazat historii", - "Import/export data": "", + "Import/export data": "importovat/exportovat data", "Change password": "Změnit heslo", - "Manage subscriptions": "", - "Manage tokens": "", - "Watch history": "", - "Delete account": "", - "Administrator preferences": "", - "Default homepage: ": "", - "Feed menu: ": "", + "Manage subscriptions": "Spravovat odebírané kanály", + "Manage tokens": "Spravovat klíče", + "Watch history": "Historie Sledování", + "Delete account": "Smazat Účet", + "Administrator preferences": "Administrátorská nastavení", + "Default homepage: ": "Základní domovská stránka: ", + "Feed menu: ": "Menu doporučených: ", "Top enabled: ": "", - "CAPTCHA enabled: ": "", - "Login enabled: ": "", - "Registration enabled: ": "", - "Report statistics: ": "", - "Save preferences": "", - "Subscription manager": "", - "Token manager": "", - "Token": "", + "CAPTCHA enabled: ": "CAPTCHA povolena: ", + "Login enabled: ": "Přihlášení povoleno: ", + "Registration enabled: ": "Registrace povolena ", + "Report statistics: ": "Oznámit statistiky: ", + "Save preferences": "Uložit nastavení", + "Subscription manager": "Správa Odběrů", + "Token manager": "Správa klíčů", + "Token": "Klíč", "`x` subscriptions": { - "([^.,0-9]|^)1([^.,0-9]|$)": "", - "": "" + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` Odběry.([^.,0-9]|^)1([^.,0-9]|$)", + "": "`x` Odebíraných kanálů." }, "`x` tokens": { - "([^.,0-9]|^)1([^.,0-9]|$)": "", - "": "" + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` Klíčů", + "": "`x` klíčů." }, - "Import/export": "", - "unsubscribe": "", - "revoke": "", - "Subscriptions": "", + "Import/export": "Importovat/exportovat", + "unsubscribe": "odhlásit odběr", + "revoke": "vrátit zpět", + "Subscriptions": "Odběry", "`x` unseen notifications": { - "([^.,0-9]|^)1([^.,0-9]|$)": "", - "": "" + "([^.,0-9]|^)1([^.,0-9]|$)": "`x` nezhlédnutých oznámení", + "": "`x` nezhlédnutých oznámení." }, - "search": "", - "Log out": "", - "Released under the AGPLv3 by Omar Roth.": "", - "Source available here.": "", - "View JavaScript license information.": "", - "View privacy policy.": "", - "Trending": "", - "Public": "", - "Unlisted": "", - "Private": "", - "View all playlists": "", - "Updated `x` ago": "", - "Delete playlist `x`?": "", - "Delete playlist": "", - "Create playlist": "", - "Title": "", + "search": "hledat", + "Log out": "Odhlásit se", + "Released under the AGPLv3 by Omar Roth.": "Vydáno Omarem Roth pod AGPLv3.", + "Source available here.": "Zdrojový kód dostupný zde.", + "View JavaScript license information.": "Zobrazit informace o licenci JavaScript .", + "View privacy policy.": "Zobrazit Zásady ochrany osobních údajů.", + "Trending": "Trendy", + "Public": "Veřejné", + "Unlisted": "Nevypsáno", + "Private": "Soukromé", + "View all playlists": "Zobrazit všechny playlisty", + "Updated `x` ago": "Aktualizováno před `x`", + "Delete playlist `x`?": "Smazat playlist `x`?", + "Delete playlist": "Smazat playlist", + "Create playlist": "Vytvořit playlist", + "Title": "Název", "Playlist privacy": "", - "Editing playlist `x`": "", - "Watch on YouTube": "", - "Hide annotations": "", - "Show annotations": "", - "Genre: ": "", - "License: ": "", - "Family friendly? ": "", + "Editing playlist `x`": "Upravování playlistu `x`", + "Show more": "Zobrazit více", + "Show less": "Zobrazit méně", + "Watch on YouTube": "Sledovat na YouTube", + "Hide annotations": "Skrýt vysvětlivky", + "Show annotations": "Zobrazit vysvětlivky", + "Genre: ": "Žánr: ", + "License: ": "Licence: ", + "Family friendly? ": "Vhodné pro děti? ", "Wilson score: ": "", - "Engagement: ": "", + "Engagement: ": "Závaznost: ", "Whitelisted regions: ": "", "Blacklisted regions: ": "", "Shared `x`": "", @@ -412,4 +415,4 @@ "hdr": "HDR", "filter": "filtr", "Current version: ": "" -} \ No newline at end of file +} diff --git a/locales/da.json b/locales/da.json index cd98c587..0962524b 100644 --- a/locales/da.json +++ b/locales/da.json @@ -77,6 +77,7 @@ "Fallback captions: ": "Alternative undertekster: ", "Show related videos: ": "Vis relaterede videoer: ", "Show annotations by default: ": "Vis annotationer som standard: ", + "Automatically extend video description: ": "", "Visual preferences": "Visuelle præferencer", "Player style: ": "Afspiller stil: ", "Dark mode: ": "Mørk tilstand: ", @@ -156,6 +157,8 @@ "Title": "Titel", "Playlist privacy": "Privatlivsindstillinger for afspilningsliste", "Editing playlist `x`": "Redigerer afspilningsliste `x`", + "Show more": "", + "Show less": "", "Watch on YouTube": "Se på YouTube", "Hide annotations": "Skjul annotationer", "Show annotations": "Vis annotationer", @@ -412,4 +415,4 @@ "hdr": "", "filter": "", "Current version: ": "" -} +} \ No newline at end of file diff --git a/locales/de.json b/locales/de.json index 1985e43a..f82df34f 100644 --- a/locales/de.json +++ b/locales/de.json @@ -25,7 +25,7 @@ "Previous page": "Vorherige Seite", "Clear watch history?": "Verlauf löschen?", "New password": "Neues Passwort", - "New passwords must match": "Neue Passwörter müssen gleich sein", + "New passwords must match": "Neue Passwörter müssen übereinstimmen", "Cannot change password for Google accounts": "Ich kann das Passwort deines Google Kontos nicht ändern", "Authorize token?": "Token autorisieren?", "Authorize token for `x`?": "Token für `x` autorisieren?", @@ -50,7 +50,7 @@ "Log in": "Anmelden", "Log in/register": "Anmelden/registrieren", "Log in with Google": "Mit Google anmelden", - "User ID": "Benutzer ID", + "User ID": "Benutzer-ID", "Password": "Passwort", "Time (h:mm:ss):": "Zeit (h:mm:ss):", "Text CAPTCHA": "Text CAPTCHA", @@ -77,12 +77,13 @@ "Fallback captions: ": "Ersatzuntertitel: ", "Show related videos: ": "Ähnliche Videos anzeigen? ", "Show annotations by default: ": "Standardmäßig Anmerkungen anzeigen? ", + "Automatically extend video description: ": "", "Visual preferences": "Anzeigeeinstellungen", "Player style: ": "Abspielgeräterstil: ", "Dark mode: ": "Nachtmodus: ", "Theme: ": "Modus: ", "dark": "Nachtmodus", - "light": "klarer Modus", + "light": "heller Modus", "Thin mode: ": "Schlanker Modus: ", "Subscription preferences": "Abonnementeinstellungen", "Show annotations by default for subscribed channels: ": "Anmerkungen für abonnierte Kanäle standardmäßig anzeigen? ", @@ -104,7 +105,7 @@ "`x` is live": "`x` ist live", "Data preferences": "Dateneinstellungen", "Clear watch history": "Verlauf löschen", - "Import/export data": "Daten im-/exportieren", + "Import/export data": "Daten importieren/exportieren", "Change password": "Passwort ändern", "Manage subscriptions": "Abonnements verwalten", "Manage tokens": "Tokens verwalten", @@ -156,6 +157,8 @@ "Title": "Titel", "Playlist privacy": "Vertrauliche Wiedergabeliste", "Editing playlist `x`": "Wiedergabeliste bearbeiten `x`", + "Show more": "", + "Show less": "", "Watch on YouTube": "Video auf YouTube ansehen", "Hide annotations": "Anmerkungen ausblenden", "Show annotations": "Anmerkungen anzeigen", @@ -215,10 +218,10 @@ "": "`x` Punkte" }, "Could not create mix.": "Mix konnte nicht erstellt werden.", - "Empty playlist": "Playlist ist leer", - "Not a playlist.": "Ungültige Playlist.", - "Playlist does not exist.": "Playlist existiert nicht.", - "Could not pull trending pages.": "Trending Seiten konnten nicht geladen werden.", + "Empty playlist": "Wiedergabeliste ist leer", + "Not a playlist.": "Ungültige Wiedergabeliste.", + "Playlist does not exist.": "Wiedergabeliste existiert nicht.", + "Could not pull trending pages.": "Trendenz-Seiten konnten nicht geladen werden.", "Hidden field \"challenge\" is a required field": "Verstecktes Feld „challenge“ ist eine erforderliche Eingabe", "Hidden field \"token\" is a required field": "Verstecktes Feld „token“ ist eine erforderliche Eingabe", "Erroneous challenge": "Ungültiger Test", @@ -361,7 +364,7 @@ }, "Fallback comments: ": "Alternative Kommentare: ", "Popular": "Populär", - "Search": "", + "Search": "Suchen", "Top": "Top", "About": "Über", "Rating: ": "Bewertung: ", @@ -384,32 +387,32 @@ "Videos": "Videos", "Playlists": "Wiedergabelisten", "Community": "Gemeinschaft", - "relevance": "", - "rating": "", - "date": "", - "views": "", - "content_type": "", - "duration": "", - "features": "", - "sort": "", - "hour": "", - "today": "", - "week": "", - "month": "", - "year": "", - "video": "", - "channel": "", - "playlist": "", - "movie": "", + "relevance": "Relevanz", + "rating": "Bewertung", + "date": "Datum", + "views": "Aufrufe", + "content_type": "Inhaltstyp", + "duration": "Dauer", + "features": "Eigenschaften", + "sort": "sortieren", + "hour": "Letzte Stunde", + "today": "Heute", + "week": "Diese Woche", + "month": "Diesen Monat", + "year": "Dieses Jahr", + "video": "Video", + "channel": "Kanal", + "playlist": "Wiedergabeliste", + "movie": "Film", "show": "", - "hd": "", - "subtitles": "", - "creative_commons": "", - "3d": "", - "live": "", - "4k": "", - "location": "", - "hdr": "", - "filter": "", + "hd": "HD", + "subtitles": "Untertitel / CC", + "creative_commons": "Creative Commons", + "3d": "3D", + "live": "Live", + "4k": "4K", + "location": "Standort", + "hdr": "HDR", + "filter": "Filtern", "Current version: ": "Aktuelle Version: " -} \ No newline at end of file +} diff --git a/locales/el.json b/locales/el.json index 390b81fd..5eb4a304 100644 --- a/locales/el.json +++ b/locales/el.json @@ -77,6 +77,7 @@ "Fallback captions: ": "Εναλλακτικοί υπότιτλοι: ", "Show related videos: ": "Προβολή σχετικών βίντεο; ", "Show annotations by default: ": "Αυτόματη προβολή σημειώσεων: ", + "Automatically extend video description: ": "", "Visual preferences": "Προτιμήσεις εμφάνισης", "Player style: ": "Τεχνοτροπία της συσκευής αναπαραγωγης: ", "Dark mode: ": "Σκοτεινή λειτουργία: ", @@ -156,6 +157,8 @@ "Title": "Τίτλος", "Playlist privacy": "Ιδιωτικότητα καταλόγων αναπαραγωγής", "Editing playlist `x`": "Επεξεργασία `x` καταλόγου αναπαραγωγής", + "Show more": "", + "Show less": "", "Watch on YouTube": "Προβολή στο YouTube", "Hide annotations": "Απόκρυψη σημειώσεων", "Show annotations": "Προβολή σημειώσεων", @@ -412,4 +415,4 @@ "hdr": "", "filter": "", "Current version: ": "Τρέχουσα έκδοση: " -} +} \ No newline at end of file diff --git a/locales/en-US.json b/locales/en-US.json index a7dc3107..71485826 100644 --- a/locales/en-US.json +++ b/locales/en-US.json @@ -77,6 +77,7 @@ "Fallback captions: ": "Fallback captions: ", "Show related videos: ": "Show related videos: ", "Show annotations by default: ": "Show annotations by default: ", + "Automatically extend video description: ": "Automatically extend video description: ", "Visual preferences": "Visual preferences", "Player style: ": "Player style: ", "Dark mode: ": "Dark mode: ", @@ -156,6 +157,8 @@ "Title": "Title", "Playlist privacy": "Playlist privacy", "Editing playlist `x`": "Editing playlist `x`", + "Show more": "Show more", + "Show less": "Show less", "Watch on YouTube": "Watch on YouTube", "Hide annotations": "Hide annotations", "Show annotations": "Show annotations", diff --git a/locales/eo.json b/locales/eo.json index 14a1c425..a6550cae 100644 --- a/locales/eo.json +++ b/locales/eo.json @@ -77,6 +77,7 @@ "Fallback captions: ": "Retrodefaŭltaj subtekstoj: ", "Show related videos: ": "Ĉu montri rilatajn filmetojn? ", "Show annotations by default: ": "Ĉu montri prinotojn defaŭlte? ", + "Automatically extend video description: ": "Aŭtomate etendi priskribon de filmeto: ", "Visual preferences": "Vidaj preferoj", "Player style: ": "Ludila stilo: ", "Dark mode: ": "Malhela reĝimo: ", @@ -156,6 +157,8 @@ "Title": "Titolo", "Playlist privacy": "Privateco de ludlisto", "Editing playlist `x`": "Redaktante ludlisto `x`", + "Show more": "Montri pli", + "Show less": "Montri malpli", "Watch on YouTube": "Vidi filmeton en JuTubo", "Hide annotations": "Kaŝi prinotojn", "Show annotations": "Montri prinotojn", diff --git a/locales/es.json b/locales/es.json index 9562fa84..51993cd2 100644 --- a/locales/es.json +++ b/locales/es.json @@ -77,6 +77,7 @@ "Fallback captions: ": "Subtítulos alternativos: ", "Show related videos: ": "¿Mostrar vídeos relacionados? ", "Show annotations by default: ": "¿Mostrar anotaciones por defecto? ", + "Automatically extend video description: ": "Extender automáticamente la descripción del vídeo: ", "Visual preferences": "Preferencias visuales", "Player style: ": "Estilo de reproductor: ", "Dark mode: ": "Modo oscuro: ", @@ -156,6 +157,8 @@ "Title": "Título", "Playlist privacy": "Privacidad de la lista de reproducción", "Editing playlist `x`": "Editando la lista de reproducción 'x'", + "Show more": "Mostrar más", + "Show less": "Mostrar menos", "Watch on YouTube": "Ver el vídeo en Youtube", "Hide annotations": "Ocultar anotaciones", "Show annotations": "Mostrar anotaciones", diff --git a/locales/eu.json b/locales/eu.json index 709d9caf..d5021c25 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -68,6 +68,7 @@ "Fallback captions: ": "", "Show related videos: ": "Erakutsi erlazionatutako bideoak: ", "Show annotations by default: ": "Erakutsi oharrak modu lehenetsian: ", + "Automatically extend video description: ": "", "Visual preferences": "Hobespen bisualak", "Player style: ": "Erreproduzigailu mota: ", "Dark mode: ": "Gai iluna: ", @@ -138,6 +139,8 @@ "Title": "", "Playlist privacy": "", "Editing playlist `x`": "", + "Show more": "", + "Show less": "", "Watch on YouTube": "", "Hide annotations": "", "Show annotations": "", diff --git a/locales/fa.json b/locales/fa.json index f2fdbf3b..b6114292 100644 --- a/locales/fa.json +++ b/locales/fa.json @@ -77,6 +77,7 @@ "Fallback captions: ": "عقب گرد زیرنویس ها: ", "Show related videos: ": "نمایش ویدیو های مرتبط: ", "Show annotations by default: ": "نمایش حاشیه نویسی ها به طور پیشفرض: ", + "Automatically extend video description: ": "", "Visual preferences": "ترجیحات بصری", "Player style: ": "حالت پخش کننده: ", "Dark mode: ": "حالت تاریک: ", @@ -156,6 +157,8 @@ "Title": "عنوان", "Playlist privacy": "حریم خصوصی لیست پخش", "Editing playlist `x`": "تغییر لیست پخش `x`", + "Show more": "", + "Show less": "", "Watch on YouTube": "تماشا در یوتیوب", "Hide annotations": "مخفی کردن حاشیه نویسی ها", "Show annotations": "نمایش حاشیه نویسی ها", diff --git a/locales/fi.json b/locales/fi.json index a009cdb6..5adeec05 100644 --- a/locales/fi.json +++ b/locales/fi.json @@ -77,6 +77,7 @@ "Fallback captions: ": "Toissijaiset tekstitykset: ", "Show related videos: ": "Näytä aiheeseen liittyviä videoita: ", "Show annotations by default: ": "Näytä huomautukset oletuksena: ", + "Automatically extend video description: ": "", "Visual preferences": "Visuaaliset asetukset", "Player style: ": "Soittimen tyyli: ", "Dark mode: ": "Tumma tila: ", @@ -156,6 +157,8 @@ "Title": "Nimi", "Playlist privacy": "Soittolistan yksityisyys", "Editing playlist `x`": "Muokataan soittolistaa `x`", + "Show more": "", + "Show less": "", "Watch on YouTube": "Katso YouTubessa", "Hide annotations": "Piilota merkkaukset", "Show annotations": "Näytä merkkaukset", diff --git a/locales/fr.json b/locales/fr.json index 3efb69fb..af0f2d1a 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -27,7 +27,7 @@ "New password": "Nouveau mot de passe", "New passwords must match": "Les nouveaux mots de passe doivent correspondre", "Cannot change password for Google accounts": "Le mot de passe d'un compte Google ne peut pas être changé depuis Invidious", - "Authorize token?": "Autoriser le token ?", + "Authorize token?": "Autoriser le token ?", "Authorize token for `x`?": "Autoriser le token pour `x` ?", "Yes": "Oui", "No": "Non", @@ -48,7 +48,7 @@ "JavaScript license information": "Informations sur les licences JavaScript", "source": "source", "Log in": "Se connecter", - "Log in/register": "Se connecter/Créer un compte", + "Log in/register": "Se connecter/S'inscrire", "Log in with Google": "Se connecter avec Google", "User ID": "Identifiant utilisateur", "Password": "Mot de passe", @@ -77,6 +77,7 @@ "Fallback captions: ": "Sous-titres alternatifs : ", "Show related videos: ": "Voir les vidéos liées : ", "Show annotations by default: ": "Afficher les annotations par défaut : ", + "Automatically extend video description: ": "", "Visual preferences": "Préférences du site", "Player style: ": "Style du lecteur : ", "Dark mode: ": "Mode sombre : ", @@ -120,7 +121,7 @@ "Report statistics: ": "Télémétrie activé : ", "Save preferences": "Enregistrer les préférences", "Subscription manager": "Gestionnaire d'abonnement", - "Token manager": "Gestionnaire de tokens", + "Token manager": "Gestionnaire de token", "Token": "Token", "`x` subscriptions": { "([^.,0-9]|^)1([^.,0-9]|$)": "`x` abonnements", @@ -139,7 +140,7 @@ "": "`x` notifications non vues" }, "search": "rechercher", - "Log out": "Déconnexion", + "Log out": "Se déconnecter", "Released under the AGPLv3 by Omar Roth.": "Publié sous licence AGPLv3 par Omar Roth.", "Source available here.": "Code source disponible ici.", "View JavaScript license information.": "Informations des licences JavaScript.", @@ -156,6 +157,8 @@ "Title": "Titre", "Playlist privacy": "Paramètres de confidentialité de la liste de lecture", "Editing playlist `x`": "Liste de lecture modifier le `x`", + "Show more": "", + "Show less": "", "Watch on YouTube": "Voir la vidéo sur Youtube", "Hide annotations": "Masquer les annotations", "Show annotations": "Afficher les annotations", @@ -388,11 +391,11 @@ "rating": "évaluation", "date": "date", "views": "nombre de vues", - "content_type": "type de contenu", + "content_type": "type", "duration": "durée", "features": "fonctionnalités", "sort": "Trier par", - "hour": "heure", + "hour": "dernière heure", "today": "aujourd'hui", "week": "semaine", "month": "mois", diff --git a/locales/he.json b/locales/he.json index 1b014b87..bf34c085 100644 --- a/locales/he.json +++ b/locales/he.json @@ -77,6 +77,7 @@ "Fallback captions: ": "כתוביות גיבוי ", "Show related videos: ": "הצגת סרטונים קשורים: ", "Show annotations by default: ": "הצגת הערות כברירת מחדל: ", + "Automatically extend video description: ": "", "Visual preferences": "העדפות חזותיות", "Player style: ": "סגנון הנגן: ", "Dark mode: ": "מצב כהה: ", @@ -156,6 +157,8 @@ "Title": "", "Playlist privacy": "Playlist privacy", "Editing playlist `x`": "", + "Show more": "", + "Show less": "", "Watch on YouTube": "צפייה ב־YouTube", "Hide annotations": "", "Show annotations": "", @@ -412,4 +415,4 @@ "hdr": "HDR", "filter": "סינון", "Current version: ": "הגרסה הנוכחית: " -} +} \ No newline at end of file diff --git a/locales/hr.json b/locales/hr.json index ae2f6d6f..0083566d 100644 --- a/locales/hr.json +++ b/locales/hr.json @@ -77,6 +77,7 @@ "Fallback captions: ": "Alternativni titlovi: ", "Show related videos: ": "Prikaži povezana videa: ", "Show annotations by default: ": "Standardno prikaži napomene: ", + "Automatically extend video description: ": "Automatski proširi opis videa: ", "Visual preferences": "Postavke prikaza", "Player style: ": "Stil playera: ", "Dark mode: ": "Tamni modus: ", @@ -156,6 +157,8 @@ "Title": "Naslov", "Playlist privacy": "Privatnost playliste", "Editing playlist `x`": "Uređivanje playliste `x`", + "Show more": "Pokaži više", + "Show less": "Pokaži manje", "Watch on YouTube": "Gledaj na YouTubeu", "Hide annotations": "Sakrij napomene", "Show annotations": "Prikaži napomene", diff --git a/locales/hu-HU.json b/locales/hu-HU.json index 4bdd742d..5c270c4d 100644 --- a/locales/hu-HU.json +++ b/locales/hu-HU.json @@ -68,6 +68,7 @@ "Fallback captions: ": "Másodlagos feliratok: ", "Show related videos: ": "Kapcsolódó videók mutatása: ", "Show annotations by default: ": "Annotációk mutatása alapértelmetésben: ", + "Automatically extend video description: ": "", "Visual preferences": "Vizuális preferenciák", "Player style: ": "Lejátszó stílusa: ", "Dark mode: ": "Sötét mód: ", @@ -138,6 +139,8 @@ "Title": "Címe", "Playlist privacy": "Lejátszási lista láthatósága", "Editing playlist `x`": "`x` lista szerkesztése", + "Show more": "", + "Show less": "", "Watch on YouTube": "Megtekintés a YouTube-on", "Hide annotations": "Annotációk elrejtése", "Show annotations": "Annotációk mutatása", diff --git a/locales/id.json b/locales/id.json index e75b3e50..61424233 100644 --- a/locales/id.json +++ b/locales/id.json @@ -77,6 +77,7 @@ "Fallback captions: ": "Subtitel fallback: ", "Show related videos: ": "Tampilkan video terkait: ", "Show annotations by default: ": "Tampilkan anotasi secara default: ", + "Automatically extend video description: ": "", "Visual preferences": "Preferensi visual", "Player style: ": "Gaya pemutar: ", "Dark mode: ": "Mode gelap: ", @@ -156,6 +157,8 @@ "Title": "Judul", "Playlist privacy": "Privasi daftar putar", "Editing playlist `x`": "Menyunting daftar putar `x`", + "Show more": "", + "Show less": "", "Watch on YouTube": "Tonton di YouTube", "Hide annotations": "Sembunyikan anotasi", "Show annotations": "Tampilkan anotasi", @@ -412,4 +415,4 @@ "hdr": "hdr", "filter": "saring", "Current version: ": "Versi saat ini: " -} +} \ No newline at end of file diff --git a/locales/is.json b/locales/is.json index 8bf1ad8f..569ee9d0 100644 --- a/locales/is.json +++ b/locales/is.json @@ -77,6 +77,7 @@ "Fallback captions: ": "Varatextar: ", "Show related videos: ": "Sýna tengd myndbönd? ", "Show annotations by default: ": "Á að sýna glósur sjálfgefið? ", + "Automatically extend video description: ": "", "Visual preferences": "Sjónrænar stillingar", "Player style: ": "Spilara stíl: ", "Dark mode: ": "Myrkur ham: ", @@ -156,6 +157,8 @@ "Title": "Titill", "Playlist privacy": "Spilunarlista opinberri", "Editing playlist `x`": "Að breyta spilunarlista `x`", + "Show more": "", + "Show less": "", "Watch on YouTube": "Horfa á YouTube", "Hide annotations": "Fela glósur", "Show annotations": "Sýna glósur", @@ -412,4 +415,4 @@ "hdr": "", "filter": "", "Current version: ": "Núverandi útgáfa: " -} +} \ No newline at end of file diff --git a/locales/it.json b/locales/it.json index d86034e5..19556ac4 100644 --- a/locales/it.json +++ b/locales/it.json @@ -77,6 +77,7 @@ "Fallback captions: ": "Sottotitoli alternativi: ", "Show related videos: ": "Mostra video correlati: ", "Show annotations by default: ": "Mostra le annotazioni in modo predefinito: ", + "Automatically extend video description: ": "", "Visual preferences": "Preferenze grafiche", "Player style: ": "Stile riproduttore: ", "Dark mode: ": "Tema scuro: ", @@ -156,6 +157,8 @@ "Title": "Titolo", "Playlist privacy": "Privacy playlist", "Editing playlist `x`": "Modificando la playlist `x`", + "Show more": "", + "Show less": "", "Watch on YouTube": "Guarda su YouTube", "Hide annotations": "Nascondi annotazioni", "Show annotations": "Mostra annotazioni", @@ -361,7 +364,7 @@ }, "Fallback comments: ": "Commenti alternativi: ", "Popular": "Popolare", - "Search": "", + "Search": "Cerca", "Top": "Top", "About": "Al riguardo", "Rating: ": "Punteggio: ", @@ -384,32 +387,32 @@ "Videos": "Video", "Playlists": "Playlist", "Community": "Comunità", - "relevance": "", - "rating": "", - "date": "", - "views": "", - "content_type": "", - "duration": "", - "features": "", - "sort": "", - "hour": "", - "today": "", - "week": "", - "month": "", - "year": "", - "video": "", - "channel": "", - "playlist": "", - "movie": "", + "relevance": "Pertinenza", + "rating": "Valutazione", + "date": "Data di caricamento", + "views": "Numero di visualizzazioni", + "content_type": "Tipo", + "duration": "Durata", + "features": "Caratteristiche", + "sort": "Ordina per", + "hour": "Ultima ora", + "today": "Oggi", + "week": "Questa settimana", + "month": "Questo mese", + "year": "Quest'anno", + "video": "Video", + "channel": "Canale", + "playlist": "Playlist", + "movie": "Film", "show": "", - "hd": "", - "subtitles": "", - "creative_commons": "", - "3d": "", - "live": "", - "4k": "", - "location": "", - "hdr": "", - "filter": "", + "hd": "AD", + "subtitles": "Sottotitoli / CC", + "creative_commons": "Creative Commons", + "3d": "3D", + "live": "In diretta", + "4k": "4K", + "location": "Posizione", + "hdr": "HDR", + "filter": "Filtra", "Current version: ": "Versione attuale: " -} \ No newline at end of file +} diff --git a/locales/ja.json b/locales/ja.json index f1c3265a..90092e83 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -77,6 +77,7 @@ "Fallback captions: ": "フォールバック時の字幕: ", "Show related videos: ": "関連動画を表示: ", "Show annotations by default: ": "デフォルトでアノテーションを表示: ", + "Automatically extend video description: ": "動画の説明文を自動的に拡張: ", "Visual preferences": "外観設定", "Player style: ": "プレイヤースタイル: ", "Dark mode: ": "ダークモード: ", @@ -156,6 +157,8 @@ "Title": "タイトル", "Playlist privacy": "再生リストのプライバシー", "Editing playlist `x`": "再生リスト `x` を編集中", + "Show more": "表示を増やす", + "Show less": "表示を減らす", "Watch on YouTube": "YouTube で視聴", "Hide annotations": "アノテーションを隠す", "Show annotations": "アノテーションを表示", @@ -361,7 +364,7 @@ }, "Fallback comments: ": "フォールバック時のコメント: ", "Popular": "人気", - "Search": "", + "Search": "検索", "Top": "トップ", "About": "このサービスについて", "Rating: ": "評価: ", @@ -384,11 +387,11 @@ "Videos": "動画", "Playlists": "プレイリスト", "Community": "コミュニティ", - "relevance": "", - "rating": "", + "relevance": "関連", + "rating": "評価", "date": "", "views": "", - "content_type": "", + "content_type": "コンテンツの種類", "duration": "", "features": "", "sort": "", @@ -399,7 +402,7 @@ "year": "", "video": "", "channel": "", - "playlist": "", + "playlist": "再生リスト", "movie": "", "show": "", "hd": "", @@ -412,4 +415,4 @@ "hdr": "", "filter": "", "Current version: ": "現在のバージョン: " -} \ No newline at end of file +} diff --git a/locales/nb-NO.json b/locales/nb-NO.json index 8dd05d48..b4b39192 100644 --- a/locales/nb-NO.json +++ b/locales/nb-NO.json @@ -1,15 +1,15 @@ { "`x` subscribers": { "([^.,0-9]|^)1([^.,0-9]|$)": "`x` abonnenter", - "": "`x` abonnenter" + "": "`x` abonnenter." }, "`x` videos": { "([^.,0-9]|^)1([^.,0-9]|$)": "`x` videoer", - "": "`x` videoer" + "": "`x` videoer." }, "`x` playlists": { "([^.,0-9]|^)1([^.,0-9]|$)": "`x` spillelister", - "": "`x` spillelister" + "": "`x` spillelister." }, "LIVE": "SANNTIDSVISNING", "Shared `x` ago": "Delt for `x` siden", @@ -77,6 +77,7 @@ "Fallback captions: ": "Tilbakefallsundertitler: ", "Show related videos: ": "Vis relaterte videoer? ", "Show annotations by default: ": "Vis merknader som forvalg? ", + "Automatically extend video description: ": "Utvid videobeskrivelse automatisk: ", "Visual preferences": "Visuelle innstillinger", "Player style: ": "Avspillerstil: ", "Dark mode: ": "Mørk drakt: ", @@ -124,11 +125,11 @@ "Token": "Symbol", "`x` subscriptions": { "([^.,0-9]|^)1([^.,0-9]|$)": "`x` abonnementer", - "": "`x` abonnementer" + "": "`x` abonnementer." }, "`x` tokens": { "([^.,0-9]|^)1([^.,0-9]|$)": "`x` symboler", - "": "`x` symboler" + "": "`x` symboler." }, "Import/export": "Importer/eksporter", "unsubscribe": "opphev abonnement", @@ -136,7 +137,7 @@ "Subscriptions": "Abonnement", "`x` unseen notifications": { "([^.,0-9]|^)1([^.,0-9]|$)": "`x` usette merknader", - "": "`x` usette merknader" + "": "`x` usette merknader." }, "search": "søk", "Log out": "Logg ut", @@ -156,6 +157,8 @@ "Title": "Tittel", "Playlist privacy": "Vern av spilleliste", "Editing playlist `x`": "Endre spilleliste «x»", + "Show more": "Vis mer", + "Show less": "Vis mindre", "Watch on YouTube": "Vis video på YouTube", "Hide annotations": "Skjul merknader", "Show annotations": "Vis merknader", @@ -169,7 +172,7 @@ "Shared `x`": "Delt `x`", "`x` views": { "([^.,0-9]|^)1([^.,0-9]|$)": "`x` visninger", - "": "`x` visninger" + "": "`x` visninger." }, "Premieres in `x`": "Premiere om `x`", "Premieres `x`": "Première `x`", @@ -178,7 +181,7 @@ "View more comments on Reddit": "Vis flere kommenterer på Reddit", "View `x` comments": { "([^.,0-9]|^)1([^.,0-9]|$)": "Vis `x` kommentarer", - "": "Vis `x` kommentarer" + "": "Vis `x` kommentarer." }, "View Reddit comments": "Vis Reddit-kommentarer", "Hide replies": "Skjul svar", @@ -206,13 +209,13 @@ "Could not fetch comments": "Kunne ikke hente kommentarer", "View `x` replies": { "([^.,0-9]|^)1([^.,0-9]|$)": "Vis `x` svar", - "": "Vis `x` svar" + "": "Vis `x` svar." }, "`x` ago": "`x` siden", "Load more": "Last inn flere", "`x` points": { "([^.,0-9]|^)1([^.,0-9]|$)": "`x` poeng", - "": "`x` poeng" + "": "`x` poeng." }, "Could not create mix.": "Kunne ikke opprette miks.", "Empty playlist": "Spillelisten er tom", @@ -333,35 +336,35 @@ "Zulu": "Zulu", "`x` years": { "([^.,0-9]|^)1([^.,0-9]|$)": "`x` år", - "": "`x` år" + "": "`x` år." }, "`x` months": { "([^.,0-9]|^)1([^.,0-9]|$)": "`x` måneder", - "": "`x` måneder" + "": "`x` måneder." }, "`x` weeks": { "([^.,0-9]|^)1([^.,0-9]|$)": "`x` uker", - "": "`x` uker" + "": "`x` uker." }, "`x` days": { "([^.,0-9]|^)1([^.,0-9]|$)": "`x` dager", - "": "`x` dager" + "": "`x` dager." }, "`x` hours": { "([^.,0-9]|^)1([^.,0-9]|$)": "`x` timer", - "": "`x` timer" + "": "`x` timer." }, "`x` minutes": { "([^.,0-9]|^)1([^.,0-9]|$)": "`x` minutter", - "": "`x` minutter" + "": "`x` minutter." }, "`x` seconds": { "([^.,0-9]|^)1([^.,0-9]|$)": "`x` sekunder", - "": "`x` sekunder" + "": "`x` sekunder." }, "Fallback comments: ": "Tilbakefallskommentarer: ", "Popular": "Populært", - "Search": "", + "Search": "Søk", "Top": "Topp", "About": "Om", "Rating: ": "Vurdering: ", @@ -384,32 +387,32 @@ "Videos": "Videoer", "Playlists": "Spillelister", "Community": "Gemenskap", - "relevance": "", - "rating": "", - "date": "", - "views": "", - "content_type": "", - "duration": "", - "features": "", - "sort": "", - "hour": "", - "today": "", - "week": "", - "month": "", - "year": "", - "video": "", - "channel": "", - "playlist": "", - "movie": "", - "show": "", - "hd": "", - "subtitles": "", - "creative_commons": "", - "3d": "", - "live": "", - "4k": "", - "location": "", - "hdr": "", - "filter": "", + "relevance": "relevans", + "rating": "vurdering", + "date": "dato", + "views": "visninger", + "content_type": "innholdstype", + "duration": "varighet", + "features": "funksjoner", + "sort": "sorter", + "hour": "time", + "today": "i dag", + "week": "uke", + "month": "måned", + "year": "år", + "video": "video", + "channel": "kanal", + "playlist": "spilleliste", + "movie": "film", + "show": "vis", + "hd": "HD", + "subtitles": "undertekster", + "creative_commons": "Creative Commons", + "3d": "3D", + "live": "direkte", + "4k": "4k", + "location": "sted", + "hdr": "HDR", + "filter": "filtrer", "Current version: ": "Gjeldende versjon: " -} \ No newline at end of file +} diff --git a/locales/nl.json b/locales/nl.json index df223f04..6d2ff68c 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -77,6 +77,7 @@ "Fallback captions: ": "Alternatieve ondertiteling: ", "Show related videos: ": "Gerelateerde video's tonen? ", "Show annotations by default: ": "Standaard annotaties tonen? ", + "Automatically extend video description: ": "", "Visual preferences": "Visuele instellingen", "Player style: ": "Speler vormgeving ", "Dark mode: ": "Donkere modus: ", @@ -156,6 +157,8 @@ "Title": "Titel", "Playlist privacy": "Afspeellijst privacy", "Editing playlist `x`": "Afspeellijst `x` wijzigen", + "Show more": "", + "Show less": "", "Watch on YouTube": "Video bekijken op YouTube", "Hide annotations": "Annotaties verbergen", "Show annotations": "Annotaties tonen", diff --git a/locales/pl.json b/locales/pl.json index cf54bd9a..3d64aa07 100644 --- a/locales/pl.json +++ b/locales/pl.json @@ -77,6 +77,7 @@ "Fallback captions: ": "Zastępcze napisy: ", "Show related videos: ": "Pokaż powiązane filmy? ", "Show annotations by default: ": "Domyślnie pokazuj adnotacje: ", + "Automatically extend video description: ": "", "Visual preferences": "Preferencje Wizualne", "Player style: ": "Styl odtwarzacza: ", "Dark mode: ": "Ciemny motyw: ", @@ -156,6 +157,8 @@ "Title": "Tytuł", "Playlist privacy": "Widoczność playlisty", "Editing playlist `x`": "Edycja playlisty `x`", + "Show more": "", + "Show less": "", "Watch on YouTube": "Zobacz film na YouTube", "Hide annotations": "Ukryj adnotacje", "Show annotations": "Pokaż adnotacje", diff --git a/locales/pt-BR.json b/locales/pt-BR.json index 1c9e1f93..d8af008b 100644 --- a/locales/pt-BR.json +++ b/locales/pt-BR.json @@ -77,6 +77,7 @@ "Fallback captions: ": "Legendas alternativas: ", "Show related videos: ": "Mostrar vídeos relacionados: ", "Show annotations by default: ": "Sempre mostrar anotações: ", + "Automatically extend video description: ": "", "Visual preferences": "Preferências visuais", "Player style: ": "Estilo do tocador: ", "Dark mode: ": "Modo escuro: ", @@ -156,6 +157,8 @@ "Title": "Título", "Playlist privacy": "Privacidade da playlist", "Editing playlist `x`": "Editando playlist `x`", + "Show more": "Mostrar mais", + "Show less": "Mostrar menos", "Watch on YouTube": "Assistir no YouTube", "Hide annotations": "Ocultar anotações", "Show annotations": "Mostrar anotações", @@ -361,7 +364,7 @@ }, "Fallback comments: ": "Comentários alternativos: ", "Popular": "Populares", - "Search": "", + "Search": "Procurar", "Top": "No topo", "About": "Sobre", "Rating: ": "Avaliação: ", @@ -384,12 +387,12 @@ "Videos": "Vídeos", "Playlists": "Listas de reprodução", "Community": "Comunidade", - "relevance": "", - "rating": "", - "date": "", - "views": "", + "relevance": "relevância", + "rating": "avaliação", + "date": "data", + "views": "visualizações", "content_type": "", - "duration": "", + "duration": "duração", "features": "", "sort": "", "hour": "", @@ -412,4 +415,4 @@ "hdr": "", "filter": "", "Current version: ": "Versão atual: " -} \ No newline at end of file +} diff --git a/locales/pt-PT.json b/locales/pt-PT.json index d1d94c1f..c25e9353 100644 --- a/locales/pt-PT.json +++ b/locales/pt-PT.json @@ -77,6 +77,7 @@ "Fallback captions: ": "Legendas alternativas: ", "Show related videos: ": "Mostrar vídeos relacionados: ", "Show annotations by default: ": "Mostrar sempre anotações: ", + "Automatically extend video description: ": "", "Visual preferences": "Preferências visuais", "Player style: ": "Estilo do reprodutor: ", "Dark mode: ": "Modo escuro: ", @@ -156,6 +157,8 @@ "Title": "Título", "Playlist privacy": "Privacidade da lista de reprodução", "Editing playlist `x`": "A editar lista de reprodução 'x'", + "Show more": "", + "Show less": "", "Watch on YouTube": "Ver no YouTube", "Hide annotations": "Ocultar anotações", "Show annotations": "Mostrar anotações", diff --git a/locales/ro.json b/locales/ro.json index 8507828d..057b919c 100644 --- a/locales/ro.json +++ b/locales/ro.json @@ -77,6 +77,7 @@ "Fallback captions: ": "Subtitrări alternative: ", "Show related videos: ": "Afișați videoclipurile asemănătoare: ", "Show annotations by default: ": "Afișați adnotările în mod implicit: ", + "Automatically extend video description: ": "", "Visual preferences": "Preferințele site-ului", "Player style: ": "Stilul player-ului : ", "Dark mode: ": "Modul întunecat : ", @@ -156,6 +157,8 @@ "Title": "Titlu", "Playlist privacy": "Parametrii de confidențialitate ai listei de redare", "Editing playlist `x`": "Modificați lista de redare `x`", + "Show more": "", + "Show less": "", "Watch on YouTube": "Urmăriți videoclipul pe YouTube", "Hide annotations": "Ascundeți adnotările", "Show annotations": "Afișați adnotările", diff --git a/locales/ru.json b/locales/ru.json index 6f34abeb..a737745e 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -77,6 +77,7 @@ "Fallback captions: ": "Дополнительный язык субтитров: ", "Show related videos: ": "Показывать похожие видео? ", "Show annotations by default: ": "Всегда показывать аннотации? ", + "Automatically extend video description: ": "", "Visual preferences": "Настройки сайта", "Player style: ": "Стиль проигрывателя: ", "Dark mode: ": "Тёмное оформление: ", @@ -156,6 +157,8 @@ "Title": "Заголовок", "Playlist privacy": "Конфиденциальность плейлиста", "Editing playlist `x`": "Редактирование плейлиста `x`", + "Show more": "", + "Show less": "", "Watch on YouTube": "Смотреть на YouTube", "Hide annotations": "Скрыть аннотации", "Show annotations": "Показать аннотации", diff --git a/locales/si.json b/locales/si.json index 0b3ca597..c30ad33c 100644 --- a/locales/si.json +++ b/locales/si.json @@ -77,6 +77,7 @@ "Fallback captions: ": "", "Show related videos: ": "", "Show annotations by default: ": "", + "Automatically extend video description: ": "", "Visual preferences": "", "Player style: ": "", "Dark mode: ": "", @@ -156,6 +157,8 @@ "Title": "", "Playlist privacy": "", "Editing playlist `x`": "", + "Show more": "", + "Show less": "", "Watch on YouTube": "", "Hide annotations": "", "Show annotations": "", diff --git a/locales/sk.json b/locales/sk.json index 43e9bc94..f74d66db 100644 --- a/locales/sk.json +++ b/locales/sk.json @@ -71,6 +71,7 @@ "Fallback captions: ": "Náhradné titulky: ", "Show related videos: ": "Zobraziť súvisiace videá: ", "Show annotations by default: ": "Predvolene zobraziť anotácie: ", + "Automatically extend video description: ": "", "Visual preferences": "Vizuálne nastavenia", "Player style: ": "Štýl prehrávača: ", "Dark mode: ": "Tmavý režim: ", @@ -144,6 +145,8 @@ "Title": "", "Playlist privacy": "", "Editing playlist `x`": "", + "Show more": "", + "Show less": "", "Watch on YouTube": "", "Hide annotations": "", "Show annotations": "", diff --git a/locales/sr.json b/locales/sr.json index 1e718d7a..7766f32e 100644 --- a/locales/sr.json +++ b/locales/sr.json @@ -77,6 +77,7 @@ "Fallback captions: ": "", "Show related videos: ": "", "Show annotations by default: ": "", + "Automatically extend video description: ": "", "Visual preferences": "", "Player style: ": "", "Dark mode: ": "", @@ -156,6 +157,8 @@ "Title": "", "Playlist privacy": "", "Editing playlist `x`": "", + "Show more": "", + "Show less": "", "Watch on YouTube": "", "Hide annotations": "", "Show annotations": "", diff --git a/locales/sr_Cyrl.json b/locales/sr_Cyrl.json index bb866522..77465501 100644 --- a/locales/sr_Cyrl.json +++ b/locales/sr_Cyrl.json @@ -68,6 +68,7 @@ "Fallback captions: ": "Алтернативни титлови: ", "Show related videos: ": "Прикажи сличне видее: ", "Show annotations by default: ": "Увек приказуј анотације: ", + "Automatically extend video description: ": "", "Visual preferences": "Подешавања изгледа", "Player style: ": "Стил плејера: ", "Dark mode: ": "Тамни режим: ", @@ -138,6 +139,8 @@ "Title": "Наслов", "Playlist privacy": "Видљивост плејлисте", "Editing playlist `x`": "Уређујете плејлисту `x`", + "Show more": "", + "Show less": "", "Watch on YouTube": "Гледајте на YouTube-у", "Hide annotations": "Сакриј анотације", "Show annotations": "Прикажи анотације", diff --git a/locales/sv-SE.json b/locales/sv-SE.json index 5cc8c674..bd309c96 100644 --- a/locales/sv-SE.json +++ b/locales/sv-SE.json @@ -77,6 +77,7 @@ "Fallback captions: ": "Ersättningsundertexter: ", "Show related videos: ": "Visa relaterade videor? ", "Show annotations by default: ": "Visa länkar-i-videon som förval? ", + "Automatically extend video description: ": "", "Visual preferences": "Visuella inställningar", "Player style: ": "Spelarstil: ", "Dark mode: ": "Mörkt läge: ", @@ -156,6 +157,8 @@ "Title": "Titel", "Playlist privacy": "Privatläge på spellista", "Editing playlist `x`": "Redigerer spellistan `x`", + "Show more": "Visa mer", + "Show less": "Visa mindre", "Watch on YouTube": "Titta på YouTube", "Hide annotations": "Dölj länkar-i-video", "Show annotations": "Visa länkar-i-video", @@ -361,7 +364,7 @@ }, "Fallback comments: ": "Fallback-kommentarer: ", "Popular": "Populärt", - "Search": "", + "Search": "Sök", "Top": "Topp", "About": "Om", "Rating: ": "Betyg: ", @@ -384,32 +387,32 @@ "Videos": "Videor", "Playlists": "Spellistor", "Community": "Gemenskap", - "relevance": "", - "rating": "", - "date": "", - "views": "", + "relevance": "relevans", + "rating": "rankning", + "date": "datum", + "views": "visningar", "content_type": "", "duration": "", "features": "", "sort": "", - "hour": "", - "today": "", - "week": "", - "month": "", - "year": "", - "video": "", - "channel": "", - "playlist": "", - "movie": "", - "show": "", - "hd": "", - "subtitles": "", - "creative_commons": "", - "3d": "", - "live": "", - "4k": "", - "location": "", - "hdr": "", + "hour": "timme", + "today": "idag", + "week": "vecka", + "month": "månad", + "year": "år", + "video": "video", + "channel": "kanal", + "playlist": "spellista", + "movie": "film", + "show": "tv-serie", + "hd": "hd", + "subtitles": "undertexter", + "creative_commons": "creative_commons", + "3d": "3d", + "live": "live", + "4k": "4k", + "location": "plats", + "hdr": "hdr", "filter": "", "Current version: ": "Nuvarande version: " -} \ No newline at end of file +} diff --git a/locales/tr.json b/locales/tr.json index 1c1f0e00..6e0912cb 100644 --- a/locales/tr.json +++ b/locales/tr.json @@ -77,6 +77,7 @@ "Fallback captions: ": "Yedek altyazılar: ", "Show related videos: ": "İlgili videoları göster: ", "Show annotations by default: ": "Öntanımlı olarak ek açıklamaları göster: ", + "Automatically extend video description: ": "Video açıklamasını otomatik olarak genişlet: ", "Visual preferences": "Görsel tercihler", "Player style: ": "Oynatıcı biçimi: ", "Dark mode: ": "Karanlık mod: ", @@ -156,6 +157,8 @@ "Title": "Başlık", "Playlist privacy": "Oynatma listesi gizliliği", "Editing playlist `x`": "`x` oynatma listesi düzenleniyor", + "Show more": "Daha fazla göster", + "Show less": "Daha az göster", "Watch on YouTube": "YouTube'da izle", "Hide annotations": "Ek açıklamaları gizle", "Show annotations": "Ek açıklamaları göster", diff --git a/locales/uk.json b/locales/uk.json index eb34e49e..0795612e 100644 --- a/locales/uk.json +++ b/locales/uk.json @@ -77,6 +77,7 @@ "Fallback captions: ": "Запасна мова субтитрів: ", "Show related videos: ": "Показувати схожі відео? ", "Show annotations by default: ": "Завжди показувати анотації? ", + "Automatically extend video description: ": "", "Visual preferences": "Налаштування сайту", "Player style: ": "Стиль програвача: ", "Dark mode: ": "Темне оформлення: ", @@ -156,6 +157,8 @@ "Title": "Заголовок", "Playlist privacy": "Конфіденційність списку відтворення", "Editing playlist `x`": "Редагування списку відтворення \"x\"", + "Show more": "", + "Show less": "", "Watch on YouTube": "Дивитися на YouTube", "Hide annotations": "Приховати анотації", "Show annotations": "Показати анотації", diff --git a/locales/zh-CN.json b/locales/zh-CN.json index a514aaed..8bd49845 100644 --- a/locales/zh-CN.json +++ b/locales/zh-CN.json @@ -77,6 +77,7 @@ "Fallback captions: ": "后备字幕语言: ", "Show related videos: ": "是否显示相关视频: ", "Show annotations by default: ": "是否默认显示视频注释: ", + "Automatically extend video description: ": "", "Visual preferences": "视觉选项", "Player style: ": "播放器样式: ", "Dark mode: ": "深色模式: ", @@ -156,6 +157,8 @@ "Title": "标题", "Playlist privacy": "播放列表隐私设置", "Editing playlist `x`": "正在编辑播放列表 `x`", + "Show more": "", + "Show less": "", "Watch on YouTube": "在 YouTube 观看", "Hide annotations": "隐藏注释", "Show annotations": "显示注释", diff --git a/locales/zh-TW.json b/locales/zh-TW.json index 935ca522..8daf277c 100644 --- a/locales/zh-TW.json +++ b/locales/zh-TW.json @@ -77,6 +77,7 @@ "Fallback captions: ": "汰退字幕: ", "Show related videos: ": "顯示相關的影片: ", "Show annotations by default: ": "預設顯示註釋: ", + "Automatically extend video description: ": "自動展開影片描述: ", "Visual preferences": "視覺偏好設定", "Player style: ": "播放器樣式: ", "Dark mode: ": "深色模式: ", @@ -156,6 +157,8 @@ "Title": "標題", "Playlist privacy": "播放清單隱私", "Editing playlist `x`": "已編輯播放清單 `x`", + "Show more": "顯示更多", + "Show less": "顯示較少", "Watch on YouTube": "在 YouTube 上觀看", "Hide annotations": "隱藏註釋", "Show annotations": "顯示註釋", diff --git a/src/invidious/comments.cr b/src/invidious/comments.cr index 5d72503e..81d6ac2b 100644 --- a/src/invidious/comments.cr +++ b/src/invidious/comments.cr @@ -185,12 +185,14 @@ def fetch_youtube_comments(id, db, cursor, format, locale, thin_mode, region, so json.field "published", published.to_unix json.field "publishedText", translate(locale, "`x` ago", recode_date(published, locale)) - json.field "likeCount", node_comment["likeCount"] + comment_action_buttons_renderer = node_comment["actionButtons"]["commentActionButtonsRenderer"] + + json.field "likeCount", comment_action_buttons_renderer["likeButton"]["toggleButtonRenderer"]["accessibilityData"]["accessibilityData"]["label"].as_s.scan(/\d/).map(&.[0]).join.to_i json.field "commentId", node_comment["commentId"] json.field "authorIsChannelOwner", node_comment["authorIsChannelOwner"] - if node_comment["actionButtons"]["commentActionButtonsRenderer"]["creatorHeart"]? - hearth_data = node_comment["actionButtons"]["commentActionButtonsRenderer"]["creatorHeart"]["creatorHeartRenderer"]["creatorThumbnail"] + if comment_action_buttons_renderer["creatorHeart"]? + hearth_data = comment_action_buttons_renderer["creatorHeart"]["creatorHeartRenderer"]["creatorThumbnail"] json.field "creatorHeart" do json.object do json.field "creatorThumbnail", hearth_data["thumbnails"][-1]["url"] diff --git a/src/invidious/helpers/helpers.cr b/src/invidious/helpers/helpers.cr index 3767cb50..e1d877b7 100644 --- a/src/invidious/helpers/helpers.cr +++ b/src/invidious/helpers/helpers.cr @@ -50,6 +50,7 @@ struct ConfigPreferences property thin_mode : Bool = false property unseen_only : Bool = false property video_loop : Bool = false + property extend_desc : Bool = false property volume : Int32 = 100 def to_tuple @@ -679,7 +680,7 @@ def create_notification_stream(env, topics, connection_channel) end def extract_initial_data(body) : Hash(String, JSON::Any) - return JSON.parse(body.match(/(window\["ytInitialData"\]|var\s*ytInitialData)\s*=\s*(?\{.*?\});/mx).try &.["info"] || "{}").as_h + return JSON.parse(body.match(/(window\["ytInitialData"\]|var\s*ytInitialData)\s*=\s*(?{.*?});<\/script>/mx).try &.["info"] || "{}").as_h end def proxy_file(response, env) diff --git a/src/invidious/users.cr b/src/invidious/users.cr index 8fef64a0..e4ebb4d1 100644 --- a/src/invidious/users.cr +++ b/src/invidious/users.cr @@ -78,6 +78,7 @@ struct Preferences property thin_mode : Bool = CONFIG.default_user_preferences.thin_mode property unseen_only : Bool = CONFIG.default_user_preferences.unseen_only property video_loop : Bool = CONFIG.default_user_preferences.video_loop + property extend_desc : Bool = CONFIG.default_user_preferences.extend_desc property volume : Int32 = CONFIG.default_user_preferences.volume module BoolToString diff --git a/src/invidious/videos.cr b/src/invidious/videos.cr index 38646311..bf281507 100644 --- a/src/invidious/videos.cr +++ b/src/invidious/videos.cr @@ -242,6 +242,7 @@ struct VideoPreferences property speed : Float32 | Float64 property video_end : Float64 | Int32 property video_loop : Bool + property extend_desc : Bool property video_start : Float64 | Int32 property volume : Int32 end @@ -818,7 +819,7 @@ end def extract_polymer_config(body) params = {} of String => JSON::Any - player_response = body.match(/(window\["ytInitialPlayerResponse"\]|var\sytInitialPlayerResponse)\s*=\s*(?{.*?});/m) + player_response = body.match(/(window\["ytInitialPlayerResponse"\]|var\sytInitialPlayerResponse)\s*=\s*(?{.*?});\s*var\s*meta/m) .try { |r| JSON.parse(r["info"]).as_h } if body.includes?("To continue with your YouTube experience, please fill out the form below.") || @@ -1050,6 +1051,7 @@ def process_video_params(query, preferences) related_videos = query["related_videos"]?.try { |q| (q == "true" || q == "1").to_unsafe } speed = query["speed"]?.try &.rchop("x").to_f? video_loop = query["loop"]?.try { |q| (q == "true" || q == "1").to_unsafe } + extend_desc = query["extend_desc"]?.try { |q| (q == "true" || q == "1").to_unsafe } volume = query["volume"]?.try &.to_i? if preferences @@ -1068,6 +1070,7 @@ def process_video_params(query, preferences) related_videos ||= preferences.related_videos.to_unsafe speed ||= preferences.speed video_loop ||= preferences.video_loop.to_unsafe + extend_desc ||= preferences.extend_desc.to_unsafe volume ||= preferences.volume end @@ -1085,6 +1088,7 @@ def process_video_params(query, preferences) related_videos ||= CONFIG.default_user_preferences.related_videos.to_unsafe speed ||= CONFIG.default_user_preferences.speed video_loop ||= CONFIG.default_user_preferences.video_loop.to_unsafe + extend_desc ||= CONFIG.default_user_preferences.extend_desc.to_unsafe volume ||= CONFIG.default_user_preferences.volume annotations = annotations == 1 @@ -1095,6 +1099,7 @@ def process_video_params(query, preferences) local = local == 1 related_videos = related_videos == 1 video_loop = video_loop == 1 + extend_desc = extend_desc == 1 if CONFIG.disabled?("dash") && quality == "dash" quality = "high" @@ -1141,6 +1146,7 @@ def process_video_params(query, preferences) speed: speed, video_end: video_end, video_loop: video_loop, + extend_desc: extend_desc, video_start: video_start, volume: volume, }) diff --git a/src/invidious/views/components/player_sources.ecr b/src/invidious/views/components/player_sources.ecr index d950e0da..a99fdbca 100644 --- a/src/invidious/views/components/player_sources.ecr +++ b/src/invidious/views/components/player_sources.ecr @@ -3,7 +3,10 @@ + + + diff --git a/src/invidious/views/licenses.ecr b/src/invidious/views/licenses.ecr index aae8bb19..c2ada992 100644 --- a/src/invidious/views/licenses.ecr +++ b/src/invidious/views/licenses.ecr @@ -149,6 +149,20 @@ + + + videojs-mobile-ui.min.js + + + + MIT + + + + <%= translate(locale, "source") %> + + + videojs-markers.min.js diff --git a/src/invidious/views/preferences.ecr b/src/invidious/views/preferences.ecr index c1f10818..602340a4 100644 --- a/src/invidious/views/preferences.ecr +++ b/src/invidious/views/preferences.ecr @@ -106,6 +106,12 @@ checked<% end %>> +
+ + checked<% end %>> +
+ + <%= translate(locale, "Visual preferences") %>
diff --git a/src/invidious/views/search_homepage.ecr b/src/invidious/views/search_homepage.ecr index b36500e9..8927c3f1 100644 --- a/src/invidious/views/search_homepage.ecr +++ b/src/invidious/views/search_homepage.ecr @@ -16,7 +16,7 @@ diff --git a/src/invidious/views/watch.ecr b/src/invidious/views/watch.ecr index a86e23b2..8b587eb3 100644 --- a/src/invidious/views/watch.ecr +++ b/src/invidious/views/watch.ecr @@ -25,6 +25,19 @@ <%= rendered "components/player_sources" %> <%= HTML.escape(video.title) %> - Invidious + + + <% end %>