diff --git a/README.md b/README.md index 54c8c0a..e158909 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,9 @@ This is just the WebUI for deemix, it should be used with deemix-pyweb or someth - Use Vue as much as possible - First step: rewrite the app in Single File Components way ✅ - - Second step: Implement custom contextmenu + - Second step: Implement custom contextmenu ⚒ + - Implemented a first version + - Need heavy testing and more features - Third step: Implement routing for the whole app using Vue Router - Fourth step: Remove jQuery - Make i18n async (https://kazupon.github.io/vue-i18n/guide/lazy-loading.html) diff --git a/public/js/bundle.js b/public/js/bundle.js index 810732f..9e1277c 100644 --- a/public/js/bundle.js +++ b/public/js/bundle.js @@ -3,7 +3,7 @@ * (c) 2014-2019 Evan You * Released under the MIT License. */ -var e=Object.freeze({});function t(e){return null==e}function n(e){return null!=e}function a(e){return!0===e}function i(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function r(e){return null!==e&&"object"==typeof e}var s=Object.prototype.toString;function o(e){return"[object Object]"===s.call(e)}function l(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function c(e){return n(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function d(e){return null==e?"":Array.isArray(e)||o(e)&&e.toString===s?JSON.stringify(e,null,2):String(e)}function u(e){var t=parseFloat(e);return isNaN(t)?e:t}function p(e,t){for(var n=Object.create(null),a=e.split(","),i=0;i-1)return e.splice(n,1)}}var g=Object.prototype.hasOwnProperty;function v(e,t){return g.call(e,t)}function b(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var y=/-(\w)/g,_=b((function(e){return e.replace(y,(function(e,t){return t?t.toUpperCase():""}))})),k=b((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),w=/\B([A-Z])/g,A=b((function(e){return e.replace(w,"-$1").toLowerCase()}));var C=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var a=arguments.length;return a?a>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function x(e,t){t=t||0;for(var n=e.length-t,a=new Array(n);n--;)a[n]=e[n+t];return a}function T(e,t){for(var n in t)e[n]=t[n];return e}function S(e){for(var t={},n=0;n0,K=W&&W.indexOf("edge/")>0,Y=(W&&W.indexOf("android"),W&&/iphone|ipad|ipod|ios/.test(W)||"ios"===H),J=(W&&/chrome\/\d+/.test(W),W&&/phantomjs/.test(W),W&&W.match(/firefox\/(\d+)/)),X={}.watch,Z=!1;if(U)try{var ee={};Object.defineProperty(ee,"passive",{get:function(){Z=!0}}),window.addEventListener("test-passive",null,ee)}catch(e){}var te=function(){return void 0===B&&(B=!U&&!V&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),B},ne=U&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function ae(e){return"function"==typeof e&&/native code/.test(e.toString())}var ie,re="undefined"!=typeof Symbol&&ae(Symbol)&&"undefined"!=typeof Reflect&&ae(Reflect.ownKeys);ie="undefined"!=typeof Set&&ae(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var se=M,oe=0,le=function(){this.id=oe++,this.subs=[]};le.prototype.addSub=function(e){this.subs.push(e)},le.prototype.removeSub=function(e){m(this.subs,e)},le.prototype.depend=function(){le.target&&le.target.addDep(this)},le.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t-1)if(r&&!v(i,"default"))s=!1;else if(""===s||s===A(e)){var l=Oe(String,i.type);(l<0||o0&&(lt((l=e(l,(s||"")+"_"+o))[0])&<(d)&&(u[c]=me(d.text+l[0].text),l.shift()),u.push.apply(u,l)):i(l)?lt(d)?u[c]=me(d.text+l):""!==l&&u.push(me(l)):lt(l)&<(d)?u[c]=me(d.text+l.text):(a(r._isVList)&&n(l.tag)&&t(l.key)&&n(s)&&(l.key="__vlist"+s+"_"+o+"__"),u.push(l)));return u}(e):void 0}function lt(e){return n(e)&&n(e.text)&&!1===e.isComment}function ct(e,t){if(e){for(var n=Object.create(null),a=re?Reflect.ownKeys(e):Object.keys(e),i=0;i0,s=t?!!t.$stable:!r,o=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(s&&a&&a!==e&&o===a.$key&&!r&&!a.$hasNormal)return a;for(var l in i={},t)t[l]&&"$"!==l[0]&&(i[l]=ht(n,l,t[l]))}else i={};for(var c in n)c in i||(i[c]=ft(n,c));return t&&Object.isExtensible(t)&&(t._normalized=i),O(i,"$stable",s),O(i,"$key",o),O(i,"$hasNormal",r),i}function ht(e,t,n){var a=function(){var e=arguments.length?n.apply(null,arguments):n({});return(e=e&&"object"==typeof e&&!Array.isArray(e)?[e]:ot(e))&&(0===e.length||1===e.length&&e[0].isComment)?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:a,enumerable:!0,configurable:!0}),a}function ft(e,t){return function(){return e[t]}}function mt(e,t){var a,i,s,o,l;if(Array.isArray(e)||"string"==typeof e)for(a=new Array(e.length),i=0,s=e.length;idocument.createEvent("Event").timeStamp&&(sn=function(){return on.now()})}function ln(){var e,t;for(rn=sn(),nn=!0,Xt.sort((function(e,t){return e.id-t.id})),an=0;anan&&Xt[n].id>e.id;)n--;Xt.splice(n+1,0,e)}else Xt.push(e);tn||(tn=!0,Ze(ln))}}(this)},dn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||r(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(e){je(e,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},dn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},dn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},dn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||m(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var un={enumerable:!0,configurable:!0,get:M,set:M};function pn(e,t,n){un.get=function(){return this[t][n]},un.set=function(e){this[t][n]=e},Object.defineProperty(e,n,un)}function hn(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},a=e._props={},i=e.$options._propKeys=[];e.$parent&&ke(!1);var r=function(r){i.push(r);var s=Re(r,t,n,e);Ce(a,r,s),r in e||pn(e,"_props",r)};for(var s in t)r(s);ke(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]="function"!=typeof t[n]?M:C(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;o(t=e._data="function"==typeof t?function(e,t){de();try{return e.call(t,t)}catch(e){return je(e,t,"data()"),{}}finally{ue()}}(t,e):t||{})||(t={});var n=Object.keys(t),a=e.$options.props,i=(e.$options.methods,n.length);for(;i--;){var r=n[i];a&&v(a,r)||F(r)||pn(e,"_data",r)}Ae(t,!0)}(e):Ae(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),a=te();for(var i in t){var r=t[i],s="function"==typeof r?r:r.get;a||(n[i]=new dn(e,s||M,M,fn)),i in e||mn(e,i,r)}}(e,t.computed),t.watch&&t.watch!==X&&function(e,t){for(var n in t){var a=t[n];if(Array.isArray(a))for(var i=0;i-1:"string"==typeof e?e.split(",").indexOf(t)>-1:(n=e,"[object RegExp]"===s.call(n)&&e.test(t));var n}function xn(e,t){var n=e.cache,a=e.keys,i=e._vnode;for(var r in n){var s=n[r];if(s){var o=An(s.componentOptions);o&&!t(o)&&Tn(n,r,a,i)}}}function Tn(e,t,n,a){var i=e[t];!i||a&&i.tag===a.tag||i.componentInstance.$destroy(),e[t]=null,m(n,t)}!function(t){t.prototype._init=function(t){var n=this;n._uid=yn++,n._isVue=!0,t&&t._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),a=t._parentVnode;n.parent=t.parent,n._parentVnode=a;var i=a.componentOptions;n.propsData=i.propsData,n._parentListeners=i.listeners,n._renderChildren=i.children,n._componentTag=i.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(n,t):n.$options=Le(_n(n.constructor),t||{},n),n._renderProxy=n,n._self=n,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(n),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&Wt(e,t)}(n),function(t){t._vnode=null,t._staticTrees=null;var n=t.$options,a=t.$vnode=n._parentVnode,i=a&&a.context;t.$slots=dt(n._renderChildren,i),t.$scopedSlots=e,t._c=function(e,n,a,i){return It(t,e,n,a,i,!1)},t.$createElement=function(e,n,a,i){return It(t,e,n,a,i,!0)};var r=a&&a.data;Ce(t,"$attrs",r&&r.attrs||e,null,!0),Ce(t,"$listeners",n._parentListeners||e,null,!0)}(n),Jt(n,"beforeCreate"),function(e){var t=ct(e.$options.inject,e);t&&(ke(!1),Object.keys(t).forEach((function(n){Ce(e,n,t[n])})),ke(!0))}(n),hn(n),function(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}(n),Jt(n,"created"),n.$options.el&&n.$mount(n.$options.el)}}(kn),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=xe,e.prototype.$delete=Te,e.prototype.$watch=function(e,t,n){if(o(t))return bn(this,e,t,n);(n=n||{}).user=!0;var a=new dn(this,e,t,n);if(n.immediate)try{t.call(this,a.value)}catch(e){je(e,this,'callback for immediate watcher "'+a.expression+'"')}return function(){a.teardown()}}}(kn),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var a=this;if(Array.isArray(e))for(var i=0,r=e.length;i1?x(n):n;for(var a=x(arguments,1),i='event handler for "'+e+'"',r=0,s=n.length;rparseInt(this.max)&&Tn(s,o[0],o,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return R}};Object.defineProperty(e,"config",t),e.util={warn:se,extend:T,mergeOptions:Le,defineReactive:Ce},e.set=xe,e.delete=Te,e.nextTick=Ze,e.observable=function(e){return Ae(e),e},e.options=Object.create(null),L.forEach((function(t){e.options[t+"s"]=Object.create(null)})),e.options._base=e,T(e.options.components,Mn),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=x(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=Le(this.options,e),this}}(e),wn(e),function(e){L.forEach((function(t){e[t]=function(e,n){return n?("component"===t&&o(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}}))}(e)}(kn),Object.defineProperty(kn.prototype,"$isServer",{get:te}),Object.defineProperty(kn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(kn,"FunctionalRenderContext",{value:Dt}),kn.version="2.6.11";var $n=p("style,class"),Dn=p("input,textarea,option,select,progress"),zn=function(e,t,n){return"value"===n&&Dn(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},Nn=p("contenteditable,draggable,spellcheck"),Pn=p("events,caret,typing,plaintext-only"),Ln=p("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),En="http://www.w3.org/1999/xlink",Rn=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},In=function(e){return Rn(e)?e.slice(6,e.length):""},Fn=function(e){return null==e||!1===e};function On(e){for(var t=e.data,a=e,i=e;n(i.componentInstance);)(i=i.componentInstance._vnode)&&i.data&&(t=jn(i.data,t));for(;n(a=a.parent);)a&&a.data&&(t=jn(t,a.data));return function(e,t){if(n(e)||n(t))return Bn(e,qn(t));return""}(t.staticClass,t.class)}function jn(e,t){return{staticClass:Bn(e.staticClass,t.staticClass),class:n(e.class)?[e.class,t.class]:t.class}}function Bn(e,t){return e?t?e+" "+t:e:t||""}function qn(e){return Array.isArray(e)?function(e){for(var t,a="",i=0,r=e.length;i-1?ha(e,t,n):Ln(t)?Fn(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):Nn(t)?e.setAttribute(t,function(e,t){return Fn(t)||"false"===t?"false":"contenteditable"===e&&Pn(t)?t:"true"}(t,n)):Rn(t)?Fn(n)?e.removeAttributeNS(En,In(t)):e.setAttributeNS(En,t,n):ha(e,t,n)}function ha(e,t,n){if(Fn(n))e.removeAttribute(t);else{if(G&&!Q&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var a=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",a)};e.addEventListener("input",a),e.__ieph=!0}e.setAttribute(t,n)}}var fa={create:ua,update:ua};function ma(e,a){var i=a.elm,r=a.data,s=e.data;if(!(t(r.staticClass)&&t(r.class)&&(t(s)||t(s.staticClass)&&t(s.class)))){var o=On(a),l=i._transitionClasses;n(l)&&(o=Bn(o,qn(l))),o!==i._prevClass&&(i.setAttribute("class",o),i._prevClass=o)}}var ga,va,ba,ya,_a,ka,wa={create:ma,update:ma},Aa=/[\w).+\-_$\]]/;function Ca(e){var t,n,a,i,r,s=!1,o=!1,l=!1,c=!1,d=0,u=0,p=0,h=0;for(a=0;a=0&&" "===(m=e.charAt(f));f--);m&&Aa.test(m)||(c=!0)}}else void 0===i?(h=a+1,i=e.slice(0,a).trim()):g();function g(){(r||(r=[])).push(e.slice(h,a).trim()),h=a+1}if(void 0===i?i=e.slice(0,a).trim():0!==h&&g(),r)for(a=0;a-1?{exp:e.slice(0,ya),key:'"'+e.slice(ya+1)+'"'}:{exp:e,key:null};va=e,ya=_a=ka=0;for(;!Ba();)qa(ba=ja())?Va(ba):91===ba&&Ua(ba);return{exp:e.slice(0,_a),key:e.slice(_a+1,ka)}}(e);return null===n.key?e+"="+t:"$set("+n.exp+", "+n.key+", "+t+")"}function ja(){return va.charCodeAt(++ya)}function Ba(){return ya>=ga}function qa(e){return 34===e||39===e}function Ua(e){var t=1;for(_a=ya;!Ba();)if(qa(e=ja()))Va(e);else if(91===e&&t++,93===e&&t--,0===t){ka=ya;break}}function Va(e){for(var t=e;!Ba()&&(e=ja())!==t;);}var Ha;function Wa(e,t,n){var a=Ha;return function i(){var r=t.apply(null,arguments);null!==r&&Ka(e,i,n,a)}}var Ga=He&&!(J&&Number(J[1])<=53);function Qa(e,t,n,a){if(Ga){var i=rn,r=t;t=r._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=i||e.timeStamp<=0||e.target.ownerDocument!==document)return r.apply(this,arguments)}}Ha.addEventListener(e,t,Z?{capture:n,passive:a}:n)}function Ka(e,t,n,a){(a||Ha).removeEventListener(e,t._wrapper||t,n)}function Ya(e,a){if(!t(e.data.on)||!t(a.data.on)){var i=a.data.on||{},r=e.data.on||{};Ha=a.elm,function(e){if(n(e.__r)){var t=G?"change":"input";e[t]=[].concat(e.__r,e[t]||[]),delete e.__r}n(e.__c)&&(e.change=[].concat(e.__c,e.change||[]),delete e.__c)}(i),it(i,r,Qa,Ka,Wa,a.context),Ha=void 0}}var Ja,Xa={create:Ya,update:Ya};function Za(e,a){if(!t(e.data.domProps)||!t(a.data.domProps)){var i,r,s=a.elm,o=e.data.domProps||{},l=a.data.domProps||{};for(i in n(l.__ob__)&&(l=a.data.domProps=T({},l)),o)i in l||(s[i]="");for(i in l){if(r=l[i],"textContent"===i||"innerHTML"===i){if(a.children&&(a.children.length=0),r===o[i])continue;1===s.childNodes.length&&s.removeChild(s.childNodes[0])}if("value"===i&&"PROGRESS"!==s.tagName){s._value=r;var c=t(r)?"":String(r);ei(s,c)&&(s.value=c)}else if("innerHTML"===i&&Hn(s.tagName)&&t(s.innerHTML)){(Ja=Ja||document.createElement("div")).innerHTML=""+r+"";for(var d=Ja.firstChild;s.firstChild;)s.removeChild(s.firstChild);for(;d.firstChild;)s.appendChild(d.firstChild)}else if(r!==o[i])try{s[i]=r}catch(e){}}}}function ei(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var a=e.value,i=e._vModifiers;if(n(i)){if(i.number)return u(a)!==u(t);if(i.trim)return a.trim()!==t.trim()}return a!==t}(e,t))}var ti={create:Za,update:Za},ni=b((function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach((function(e){if(e){var a=e.split(n);a.length>1&&(t[a[0].trim()]=a[1].trim())}})),t}));function ai(e){var t=ii(e.style);return e.staticStyle?T(e.staticStyle,t):t}function ii(e){return Array.isArray(e)?S(e):"string"==typeof e?ni(e):e}var ri,si=/^--/,oi=/\s*!important$/,li=function(e,t,n){if(si.test(t))e.style.setProperty(t,n);else if(oi.test(n))e.style.setProperty(A(t),n.replace(oi,""),"important");else{var a=di(t);if(Array.isArray(n))for(var i=0,r=n.length;i-1?t.split(hi).forEach((function(t){return e.classList.add(t)})):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function mi(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(hi).forEach((function(t){return e.classList.remove(t)})):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var n=" "+(e.getAttribute("class")||"")+" ",a=" "+t+" ";n.indexOf(a)>=0;)n=n.replace(a," ");(n=n.trim())?e.setAttribute("class",n):e.removeAttribute("class")}}function gi(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&T(t,vi(e.name||"v")),T(t,e),t}return"string"==typeof e?vi(e):void 0}}var vi=b((function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}})),bi=U&&!Q,yi="transition",_i="transitionend",ki="animation",wi="animationend";bi&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(yi="WebkitTransition",_i="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(ki="WebkitAnimation",wi="webkitAnimationEnd"));var Ai=U?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Ci(e){Ai((function(){Ai(e)}))}function xi(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),fi(e,t))}function Ti(e,t){e._transitionClasses&&m(e._transitionClasses,t),mi(e,t)}function Si(e,t,n){var a=$i(e,t),i=a.type,r=a.timeout,s=a.propCount;if(!i)return n();var o="transition"===i?_i:wi,l=0,c=function(){e.removeEventListener(o,d),n()},d=function(t){t.target===e&&++l>=s&&c()};setTimeout((function(){l0&&(n="transition",d=s,u=r.length):"animation"===t?c>0&&(n="animation",d=c,u=l.length):u=(n=(d=Math.max(s,c))>0?s>c?"transition":"animation":null)?"transition"===n?r.length:l.length:0,{type:n,timeout:d,propCount:u,hasTransform:"transition"===n&&Mi.test(a[yi+"Property"])}}function Di(e,t){for(;e.length1}function Ri(e,t){!0!==t.data.show&&Ni(t)}var Ii=function(e){var r,s,o={},l=e.modules,c=e.nodeOps;for(r=0;rf?y(e,t(i[v+1])?null:i[v+1].elm,i,h,v,r):h>v&&k(a,p,f)}(p,m,v,r,d):n(v)?(n(e.text)&&c.setTextContent(p,""),y(p,null,v,0,v.length-1,r)):n(m)?k(m,0,m.length-1):n(e.text)&&c.setTextContent(p,""):e.text!==i.text&&c.setTextContent(p,i.text),n(f)&&n(h=f.hook)&&n(h=h.postpatch)&&h(e,i)}}}function x(e,t,i){if(a(i)&&n(e.parent))e.parent.data.pendingInsert=t;else for(var r=0;r-1,s.selected!==r&&(s.selected=r);else if(z(qi(s),a))return void(e.selectedIndex!==o&&(e.selectedIndex=o));i||(e.selectedIndex=-1)}}function Bi(e,t){return t.every((function(t){return!z(t,e)}))}function qi(e){return"_value"in e?e._value:e.value}function Ui(e){e.target.composing=!0}function Vi(e){e.target.composing&&(e.target.composing=!1,Hi(e.target,"input"))}function Hi(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function Wi(e){return!e.componentInstance||e.data&&e.data.transition?e:Wi(e.componentInstance._vnode)}var Gi={model:Fi,show:{bind:function(e,t,n){var a=t.value,i=(n=Wi(n)).data&&n.data.transition,r=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;a&&i?(n.data.show=!0,Ni(n,(function(){e.style.display=r}))):e.style.display=a?r:"none"},update:function(e,t,n){var a=t.value;!a!=!t.oldValue&&((n=Wi(n)).data&&n.data.transition?(n.data.show=!0,a?Ni(n,(function(){e.style.display=e.__vOriginalDisplay})):Pi(n,(function(){e.style.display="none"}))):e.style.display=a?e.__vOriginalDisplay:"none")},unbind:function(e,t,n,a,i){i||(e.style.display=e.__vOriginalDisplay)}}},Qi={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function Ki(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?Ki(qt(t.children)):e}function Yi(e){var t={},n=e.$options;for(var a in n.propsData)t[a]=e[a];var i=n._parentListeners;for(var r in i)t[_(r)]=i[r];return t}function Ji(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var Xi=function(e){return e.tag||Bt(e)},Zi=function(e){return"show"===e.name},er={name:"transition",props:Qi,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(Xi)).length){var a=this.mode,r=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return r;var s=Ki(r);if(!s)return r;if(this._leaving)return Ji(e,r);var o="__transition-"+this._uid+"-";s.key=null==s.key?s.isComment?o+"comment":o+s.tag:i(s.key)?0===String(s.key).indexOf(o)?s.key:o+s.key:s.key;var l=(s.data||(s.data={})).transition=Yi(this),c=this._vnode,d=Ki(c);if(s.data.directives&&s.data.directives.some(Zi)&&(s.data.show=!0),d&&d.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(s,d)&&!Bt(d)&&(!d.componentInstance||!d.componentInstance._vnode.isComment)){var u=d.data.transition=T({},l);if("out-in"===a)return this._leaving=!0,rt(u,"afterLeave",(function(){t._leaving=!1,t.$forceUpdate()})),Ji(e,r);if("in-out"===a){if(Bt(s))return c;var p,h=function(){p()};rt(l,"afterEnter",h),rt(l,"enterCancelled",h),rt(u,"delayLeave",(function(e){p=e}))}}return r}}},tr=T({tag:String,moveClass:String},Qi);function nr(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function ar(e){e.data.newPos=e.elm.getBoundingClientRect()}function ir(e){var t=e.data.pos,n=e.data.newPos,a=t.left-n.left,i=t.top-n.top;if(a||i){e.data.moved=!0;var r=e.elm.style;r.transform=r.WebkitTransform="translate("+a+"px,"+i+"px)",r.transitionDuration="0s"}}delete tr.mode;var rr={Transition:er,TransitionGroup:{props:tr,beforeMount:function(){var e=this,t=this._update;this._update=function(n,a){var i=Qt(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,i(),t.call(e,n,a)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),a=this.prevChildren=this.children,i=this.$slots.default||[],r=this.children=[],s=Yi(this),o=0;o-1?Qn[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:Qn[e]=/HTMLUnknownElement/.test(t.toString())},T(kn.options.directives,Gi),T(kn.options.components,rr),kn.prototype.__patch__=U?Ii:M,kn.prototype.$mount=function(e,t){return function(e,t,n){var a;return e.$el=t,e.$options.render||(e.$options.render=fe),Jt(e,"beforeMount"),a=function(){e._update(e._render(),n)},new dn(e,a,M,{before:function(){e._isMounted&&!e._isDestroyed&&Jt(e,"beforeUpdate")}},!0),n=!1,null==e.$vnode&&(e._isMounted=!0,Jt(e,"mounted")),e}(this,e=e&&U?Yn(e):void 0,t)},U&&setTimeout((function(){R.devtools&&ne&&ne.emit("init",kn)}),0);var sr=/\{\{((?:.|\r?\n)+?)\}\}/g,or=/[-.*+?^${}()|[\]\/\\]/g,lr=b((function(e){var t=e[0].replace(or,"\\$&"),n=e[1].replace(or,"\\$&");return new RegExp(t+"((?:.|\\n)+?)"+n,"g")}));var cr={staticKeys:["staticClass"],transformNode:function(e,t){t.warn;var n=Ea(e,"class");n&&(e.staticClass=JSON.stringify(n));var a=La(e,"class",!1);a&&(e.classBinding=a)},genData:function(e){var t="";return e.staticClass&&(t+="staticClass:"+e.staticClass+","),e.classBinding&&(t+="class:"+e.classBinding+","),t}};var dr,ur={staticKeys:["staticStyle"],transformNode:function(e,t){t.warn;var n=Ea(e,"style");n&&(e.staticStyle=JSON.stringify(ni(n)));var a=La(e,"style",!1);a&&(e.styleBinding=a)},genData:function(e){var t="";return e.staticStyle&&(t+="staticStyle:"+e.staticStyle+","),e.styleBinding&&(t+="style:("+e.styleBinding+"),"),t}},pr=function(e){return(dr=dr||document.createElement("div")).innerHTML=e,dr.textContent},hr=p("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),fr=p("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),mr=p("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),gr=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,vr=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,br="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+I.source+"]*",yr="((?:"+br+"\\:)?"+br+")",_r=new RegExp("^<"+yr),kr=/^\s*(\/?)>/,wr=new RegExp("^<\\/"+yr+"[^>]*>"),Ar=/^]+>/i,Cr=/^",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},$r=/&(?:lt|gt|quot|amp|#39);/g,Dr=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,zr=p("pre,textarea",!0),Nr=function(e,t){return e&&zr(e)&&"\n"===t[0]};function Pr(e,t){var n=t?Dr:$r;return e.replace(n,(function(e){return Mr[e]}))}var Lr,Er,Rr,Ir,Fr,Or,jr,Br,qr=/^@|^v-on:/,Ur=/^v-|^@|^:|^#/,Vr=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,Hr=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,Wr=/^\(|\)$/g,Gr=/^\[.*\]$/,Qr=/:(.*)$/,Kr=/^:|^\.|^v-bind:/,Yr=/\.[^.\]]+(?=[^\]]*$)/g,Jr=/^v-slot(:|$)|^#/,Xr=/[\r\n]/,Zr=/\s+/g,es=b(pr);function ts(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:ls(t),rawAttrsMap:{},parent:n,children:[]}}function ns(e,t){Lr=t.warn||Ta,Or=t.isPreTag||$,jr=t.mustUseProp||$,Br=t.getTagNamespace||$;t.isReservedTag;Rr=Sa(t.modules,"transformNode"),Ir=Sa(t.modules,"preTransformNode"),Fr=Sa(t.modules,"postTransformNode"),Er=t.delimiters;var n,a,i=[],r=!1!==t.preserveWhitespace,s=t.whitespace,o=!1,l=!1;function c(e){if(d(e),o||e.processed||(e=as(e,t)),i.length||e===n||n.if&&(e.elseif||e.else)&&rs(n,{exp:e.elseif,block:e}),a&&!e.forbidden)if(e.elseif||e.else)s=e,(c=function(e){for(var t=e.length;t--;){if(1===e[t].type)return e[t];e.pop()}}(a.children))&&c.if&&rs(c,{exp:s.elseif,block:s});else{if(e.slotScope){var r=e.slotTarget||'"default"';(a.scopedSlots||(a.scopedSlots={}))[r]=e}a.children.push(e),e.parent=a}var s,c;e.children=e.children.filter((function(e){return!e.slotScope})),d(e),e.pre&&(o=!1),Or(e.tag)&&(l=!1);for(var u=0;u]*>)","i")),p=e.replace(u,(function(e,n,a){return c=a.length,Tr(d)||"noscript"===d||(n=n.replace(//g,"$1").replace(//g,"$1")),Nr(d,n)&&(n=n.slice(1)),t.chars&&t.chars(n),""}));l+=e.length-p.length,e=p,T(d,l-c,l)}else{var h=e.indexOf("<");if(0===h){if(Cr.test(e)){var f=e.indexOf("--\x3e");if(f>=0){t.shouldKeepComment&&t.comment(e.substring(4,f),l,l+f+3),A(f+3);continue}}if(xr.test(e)){var m=e.indexOf("]>");if(m>=0){A(m+2);continue}}var g=e.match(Ar);if(g){A(g[0].length);continue}var v=e.match(wr);if(v){var b=l;A(v[0].length),T(v[1],b,l);continue}var y=C();if(y){x(y),Nr(y.tagName,e)&&A(1);continue}}var _=void 0,k=void 0,w=void 0;if(h>=0){for(k=e.slice(h);!(wr.test(k)||_r.test(k)||Cr.test(k)||xr.test(k)||(w=k.indexOf("<",1))<0);)h+=w,k=e.slice(h);_=e.substring(0,h)}h<0&&(_=e),_&&A(_.length),t.chars&&_&&t.chars(_,l-_.length,l)}if(e===n){t.chars&&t.chars(e);break}}function A(t){l+=t,e=e.substring(t)}function C(){var t=e.match(_r);if(t){var n,a,i={tagName:t[1],attrs:[],start:l};for(A(t[0].length);!(n=e.match(kr))&&(a=e.match(vr)||e.match(gr));)a.start=l,A(a[0].length),a.end=l,i.attrs.push(a);if(n)return i.unarySlash=n[1],A(n[0].length),i.end=l,i}}function x(e){var n=e.tagName,l=e.unarySlash;r&&("p"===a&&mr(n)&&T(a),o(n)&&a===n&&T(n));for(var c=s(n)||!!l,d=e.attrs.length,u=new Array(d),p=0;p=0&&i[s].lowerCasedTag!==o;s--);else s=0;if(s>=0){for(var c=i.length-1;c>=s;c--)t.end&&t.end(i[c].tag,n,r);i.length=s,a=s&&i[s-1].tag}else"br"===o?t.start&&t.start(e,[],!0,n,r):"p"===o&&(t.start&&t.start(e,[],!1,n,r),t.end&&t.end(e,n,r))}T()}(e,{warn:Lr,expectHTML:t.expectHTML,isUnaryTag:t.isUnaryTag,canBeLeftOpenTag:t.canBeLeftOpenTag,shouldDecodeNewlines:t.shouldDecodeNewlines,shouldDecodeNewlinesForHref:t.shouldDecodeNewlinesForHref,shouldKeepComment:t.comments,outputSourceRange:t.outputSourceRange,start:function(e,r,s,d,u){var p=a&&a.ns||Br(e);G&&"svg"===p&&(r=function(e){for(var t=[],n=0;nl&&(o.push(r=e.slice(l,i)),s.push(JSON.stringify(r)));var c=Ca(a[1].trim());s.push("_s("+c+")"),o.push({"@binding":c}),l=i+a[0].length}return l-1"+("true"===r?":("+t+")":":_q("+t+","+r+")")),Pa(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+r+"):("+s+");if(Array.isArray($$a)){var $$v="+(a?"_n("+i+")":i)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+Oa(t,"$$a.concat([$$v])")+")}else{$$i>-1&&("+Oa(t,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+Oa(t,"$$c")+"}",null,!0)}(e,a,i);else if("input"===r&&"radio"===s)!function(e,t,n){var a=n&&n.number,i=La(e,"value")||"null";Ma(e,"checked","_q("+t+","+(i=a?"_n("+i+")":i)+")"),Pa(e,"change",Oa(t,i),null,!0)}(e,a,i);else if("input"===r||"textarea"===r)!function(e,t,n){var a=e.attrsMap.type,i=n||{},r=i.lazy,s=i.number,o=i.trim,l=!r&&"range"!==a,c=r?"change":"range"===a?"__r":"input",d="$event.target.value";o&&(d="$event.target.value.trim()");s&&(d="_n("+d+")");var u=Oa(t,d);l&&(u="if($event.target.composing)return;"+u);Ma(e,"value","("+t+")"),Pa(e,c,u,null,!0),(o||s)&&Pa(e,"blur","$forceUpdate()")}(e,a,i);else if(!R.isReservedTag(r))return Fa(e,a,i),!1;return!0},text:function(e,t){t.value&&Ma(e,"textContent","_s("+t.value+")",t)},html:function(e,t){t.value&&Ma(e,"innerHTML","_s("+t.value+")",t)}},isPreTag:function(e){return"pre"===e},isUnaryTag:hr,mustUseProp:zn,canBeLeftOpenTag:fr,isReservedTag:Wn,getTagNamespace:Gn,staticKeys:function(e){return e.reduce((function(e,t){return e.concat(t.staticKeys||[])}),[]).join(",")}(ps)},gs=b((function(e){return p("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(e?","+e:""))}));function vs(e,t){e&&(hs=gs(t.staticKeys||""),fs=t.isReservedTag||$,function e(t){if(t.static=function(e){if(2===e.type)return!1;if(3===e.type)return!0;return!(!e.pre&&(e.hasBindings||e.if||e.for||h(e.tag)||!fs(e.tag)||function(e){for(;e.parent;){if("template"!==(e=e.parent).tag)return!1;if(e.for)return!0}return!1}(e)||!Object.keys(e).every(hs)))}(t),1===t.type){if(!fs(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var n=0,a=t.children.length;n|^function(?:\s+[\w$]+)?\s*\(/,ys=/\([^)]*?\);*$/,_s=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,ks={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},ws={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},As=function(e){return"if("+e+")return null;"},Cs={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:As("$event.target !== $event.currentTarget"),ctrl:As("!$event.ctrlKey"),shift:As("!$event.shiftKey"),alt:As("!$event.altKey"),meta:As("!$event.metaKey"),left:As("'button' in $event && $event.button !== 0"),middle:As("'button' in $event && $event.button !== 1"),right:As("'button' in $event && $event.button !== 2")};function xs(e,t){var n=t?"nativeOn:":"on:",a="",i="";for(var r in e){var s=Ts(e[r]);e[r]&&e[r].dynamic?i+=r+","+s+",":a+='"'+r+'":'+s+","}return a="{"+a.slice(0,-1)+"}",i?n+"_d("+a+",["+i.slice(0,-1)+"])":n+a}function Ts(e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map((function(e){return Ts(e)})).join(",")+"]";var t=_s.test(e.value),n=bs.test(e.value),a=_s.test(e.value.replace(ys,""));if(e.modifiers){var i="",r="",s=[];for(var o in e.modifiers)if(Cs[o])r+=Cs[o],ks[o]&&s.push(o);else if("exact"===o){var l=e.modifiers;r+=As(["ctrl","shift","alt","meta"].filter((function(e){return!l[e]})).map((function(e){return"$event."+e+"Key"})).join("||"))}else s.push(o);return s.length&&(i+=function(e){return"if(!$event.type.indexOf('key')&&"+e.map(Ss).join("&&")+")return null;"}(s)),r&&(i+=r),"function($event){"+i+(t?"return "+e.value+"($event)":n?"return ("+e.value+")($event)":a?"return "+e.value:e.value)+"}"}return t||n?e.value:"function($event){"+(a?"return "+e.value:e.value)+"}"}function Ss(e){var t=parseInt(e,10);if(t)return"$event.keyCode!=="+t;var n=ks[e],a=ws[e];return"_k($event.keyCode,"+JSON.stringify(e)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(a)+")"}var Ms={on:function(e,t){e.wrapListeners=function(e){return"_g("+e+","+t.value+")"}},bind:function(e,t){e.wrapData=function(n){return"_b("+n+",'"+e.tag+"',"+t.value+","+(t.modifiers&&t.modifiers.prop?"true":"false")+(t.modifiers&&t.modifiers.sync?",true":"")+")"}},cloak:M},$s=function(e){this.options=e,this.warn=e.warn||Ta,this.transforms=Sa(e.modules,"transformCode"),this.dataGenFns=Sa(e.modules,"genData"),this.directives=T(T({},Ms),e.directives);var t=e.isReservedTag||$;this.maybeComponent=function(e){return!!e.component||!t(e.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function Ds(e,t){var n=new $s(t);return{render:"with(this){return "+(e?zs(e,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function zs(e,t){if(e.parent&&(e.pre=e.pre||e.parent.pre),e.staticRoot&&!e.staticProcessed)return Ns(e,t);if(e.once&&!e.onceProcessed)return Ps(e,t);if(e.for&&!e.forProcessed)return Es(e,t);if(e.if&&!e.ifProcessed)return Ls(e,t);if("template"!==e.tag||e.slotTarget||t.pre){if("slot"===e.tag)return function(e,t){var n=e.slotName||'"default"',a=Os(e,t),i="_t("+n+(a?","+a:""),r=e.attrs||e.dynamicAttrs?qs((e.attrs||[]).concat(e.dynamicAttrs||[]).map((function(e){return{name:_(e.name),value:e.value,dynamic:e.dynamic}}))):null,s=e.attrsMap["v-bind"];!r&&!s||a||(i+=",null");r&&(i+=","+r);s&&(i+=(r?"":",null")+","+s);return i+")"}(e,t);var n;if(e.component)n=function(e,t,n){var a=t.inlineTemplate?null:Os(t,n,!0);return"_c("+e+","+Rs(t,n)+(a?","+a:"")+")"}(e.component,e,t);else{var a;(!e.plain||e.pre&&t.maybeComponent(e))&&(a=Rs(e,t));var i=e.inlineTemplate?null:Os(e,t,!0);n="_c('"+e.tag+"'"+(a?","+a:"")+(i?","+i:"")+")"}for(var r=0;r>>0}(s):"")+")"}(e,e.scopedSlots,t)+","),e.model&&(n+="model:{value:"+e.model.value+",callback:"+e.model.callback+",expression:"+e.model.expression+"},"),e.inlineTemplate){var r=function(e,t){var n=e.children[0];if(n&&1===n.type){var a=Ds(n,t.options);return"inlineTemplate:{render:function(){"+a.render+"},staticRenderFns:["+a.staticRenderFns.map((function(e){return"function(){"+e+"}"})).join(",")+"]}"}}(e,t);r&&(n+=r+",")}return n=n.replace(/,$/,"")+"}",e.dynamicAttrs&&(n="_b("+n+',"'+e.tag+'",'+qs(e.dynamicAttrs)+")"),e.wrapData&&(n=e.wrapData(n)),e.wrapListeners&&(n=e.wrapListeners(n)),n}function Is(e){return 1===e.type&&("slot"===e.tag||e.children.some(Is))}function Fs(e,t){var n=e.attrsMap["slot-scope"];if(e.if&&!e.ifProcessed&&!n)return Ls(e,t,Fs,"null");if(e.for&&!e.forProcessed)return Es(e,t,Fs);var a="_empty_"===e.slotScope?"":String(e.slotScope),i="function("+a+"){return "+("template"===e.tag?e.if&&n?"("+e.if+")?"+(Os(e,t)||"undefined")+":undefined":Os(e,t)||"undefined":zs(e,t))+"}",r=a?"":",proxy:true";return"{key:"+(e.slotTarget||'"default"')+",fn:"+i+r+"}"}function Os(e,t,n,a,i){var r=e.children;if(r.length){var s=r[0];if(1===r.length&&s.for&&"template"!==s.tag&&"slot"!==s.tag){var o=n?t.maybeComponent(s)?",1":",0":"";return""+(a||zs)(s,t)+o}var l=n?function(e,t){for(var n=0,a=0;a':'
',Gs.innerHTML.indexOf(" ")>0}var Ys=!!U&&Ks(!1),Js=!!U&&Ks(!0),Xs=b((function(e){var t=Yn(e);return t&&t.innerHTML})),Zs=kn.prototype.$mount;kn.prototype.$mount=function(e,t){if((e=e&&Yn(e))===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var a=n.template;if(a)if("string"==typeof a)"#"===a.charAt(0)&&(a=Xs(a));else{if(!a.nodeType)return this;a=a.innerHTML}else e&&(a=function(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement("div");return t.appendChild(e.cloneNode(!0)),t.innerHTML}(e));if(a){var i=Qs(a,{outputSourceRange:!1,shouldDecodeNewlines:Ys,shouldDecodeNewlinesForHref:Js,delimiters:n.delimiters,comments:n.comments},this),r=i.render,s=i.staticRenderFns;n.render=r,n.staticRenderFns=s}}return Zs.call(this,e,t)},kn.compile=Qs;const eo=io.connect(window.location.href);eo.on("connect",()=>{document.getElementById("start_app_placeholder").classList.add("loading_placeholder--hidden")});var to=new kn;function no(e,t){const{currentTarget:{dataset:{id:n}}}=t;switch(e){case"artist":to.$emit("artistTab:reset");break;case"album":case"playlist":case"spotifyplaylist":to.$emit("tracklistTab:reset")}eo.emit("getTracklist",{type:e,id:n}),ro(e,n)}function ao(e,t,n){window.windows_stack=[],window.currentStack={};const a=document.getElementsByClassName(t+"_tabcontent");for(let e=0;e{e.addEventListener("click",so)})}window.search_selected="",window.main_selected="",window.windows_stack=[],window.currentStack={};const lo={name:"the-sidebar",data:()=>({appOnline:null,activeTheme:"light",themes:["purple","dark","light"]}),mounted(){this.appOnline=navigator.onLine,window.addEventListener("online",()=>{this.appOnline=!0}),window.addEventListener("offline",()=>{this.appOnline=!1}),this.activeTheme=localStorage.getItem("selectedTheme")||"light"},methods:{changeTheme(e){e!==this.activeTheme&&(this.activeTheme=e,document.documentElement.setAttribute("data-theme",e),localStorage.setItem("selectedTheme",e),document.querySelectorAll("*").forEach(e=>{e.style.transition="all 200ms ease-in-out"}),document.documentElement.addEventListener("transitionend",(function e(){document.querySelectorAll("*").forEach(e=>{e.style.transition=""}),document.documentElement.removeEventListener("transitionend",e)})))},handleSidebarClick(e){const{target:t}=e;if(!(t.matches(".main_tablinks")||t.parentElement.matches(".main_tablinks")))return;let n=t.matches(".main_tablinks")?t:t.parentElement,a=null;switch(n.id){case"main_search_tablink":a="search_tab";break;case"main_home_tablink":a="home_tab";break;case"main_charts_tablink":a="charts_tab";break;case"main_favorites_tablink":a="favorites_tab";break;case"main_analyzer_tablink":a="analyzer_tab";break;case"main_settings_tablink":a="settings_tab";break;case"main_about_tablink":a="about_tab"}a&&ao(n,"main",a)}}};var co=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("aside",{attrs:{id:"sidebar",role:"navigation"},on:{click:e.handleSidebarClick}},[n("span",{staticClass:"main_tablinks",attrs:{id:"main_home_tablink",role:"link","aria-label":"home"}},[n("i",{staticClass:"material-icons side_icon"},[e._v("home")]),e._v(" "),n("span",{staticClass:"main_tablinks_text"},[e._v(e._s(e.$t("sidebar.home")))])]),e._v(" "),n("span",{staticClass:"main_tablinks",attrs:{id:"main_search_tablink",role:"link","aria-label":"search"}},[n("i",{staticClass:"material-icons side_icon"},[e._v("search")]),e._v(" "),n("span",{staticClass:"main_tablinks_text"},[e._v(e._s(e.$t("sidebar.search")))])]),e._v(" "),n("span",{staticClass:"main_tablinks",attrs:{id:"main_charts_tablink",role:"link","aria-label":"charts"}},[n("i",{staticClass:"material-icons side_icon"},[e._v("bubble_chart")]),e._v(" "),n("span",{staticClass:"main_tablinks_text"},[e._v(e._s(e.$t("sidebar.charts")))])]),e._v(" "),n("span",{staticClass:"main_tablinks",attrs:{id:"main_favorites_tablink",role:"link","aria-label":"favorites"}},[n("i",{staticClass:"material-icons side_icon"},[e._v("album")]),e._v(" "),n("span",{staticClass:"main_tablinks_text"},[e._v(e._s(e.$t("sidebar.favorites")))])]),e._v(" "),n("span",{staticClass:"main_tablinks",attrs:{id:"main_analyzer_tablink",role:"link","aria-label":"link analyzer"}},[n("i",{staticClass:"material-icons side_icon"},[e._v("link")]),e._v(" "),n("span",{staticClass:"main_tablinks_text"},[e._v(e._s(e.$t("sidebar.linkAnalyzer")))])]),e._v(" "),n("span",{staticClass:"main_tablinks",attrs:{id:"main_settings_tablink",role:"link","aria-label":"settings"}},[n("i",{staticClass:"material-icons side_icon"},[e._v("settings")]),e._v(" "),n("span",{staticClass:"main_tablinks_text"},[e._v(e._s(e.$t("sidebar.settings")))])]),e._v(" "),n("span",{staticClass:"main_tablinks",attrs:{id:"main_about_tablink",role:"link","aria-label":"info"}},[n("i",{staticClass:"material-icons side_icon"},[e._v("info")]),e._v(" "),n("span",{staticClass:"main_tablinks_text"},[e._v(e._s(e.$t("sidebar.about")))])]),e._v(" "),n("span",{staticClass:"main_tablinks",attrs:{id:"theme_selector",role:"link","aria-label":"theme selector"}},[n("i",{staticClass:"material-icons side_icon side_icon--theme"},[e._v("palette")]),e._v(" "),n("div",{attrs:{id:"theme_togglers"}},e._l(e.themes,(function(t){return n("div",{key:t,staticClass:"theme_toggler ",class:[{"theme_toggler--active":e.activeTheme===t},"theme_toggler--"+t],on:{click:function(n){return e.changeTheme(t)}}})})),0)]),e._v(" "),n("div",{class:{online:e.appOnline,offline:!e.appOnline},attrs:{id:"network-status"}},[e.appOnline?n("i",{staticClass:"material-icons"},[e._v("wifi")]):n("i",{staticClass:"material-icons"},[n("svg",{attrs:{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"}},[n("path",{attrs:{d:"M24 .01c0-.01 0-.01 0 0L0 0v24h24V.01zM0 0h24v24H0V0zm0 0h24v24H0V0z",fill:"none"}}),e._v(" "),n("path",{attrs:{d:"M22.99 9C19.15 5.16 13.8 3.76 8.84 4.78l2.52 2.52c3.47-.17 6.99 1.05 9.63 3.7l2-2zm-4 4c-1.29-1.29-2.84-2.13-4.49-2.56l3.53 3.53.96-.97zM2 3.05L5.07 6.1C3.6 6.82 2.22 7.78 1 9l1.99 2c1.24-1.24 2.67-2.16 4.2-2.77l2.24 2.24C7.81 10.89 6.27 11.73 5 13v.01L6.99 15c1.36-1.36 3.14-2.04 4.92-2.06L18.98 20l1.27-1.26L3.29 1.79 2 3.05zM9 17l3 3 3-3c-1.65-1.66-4.34-1.66-6 0z"}})])])])])};co._withStripped=!0;var uo=function(e,t,n,a,i,r,s,o){const l=("function"==typeof n?n.options:n)||{};l.__file="/mnt/Dati/Programmazione/DeezloaderStuff/deemix/deemix-pyweb/webui/src/components/TheSidebar.vue",l.render||(l.render=e.render,l.staticRenderFns=e.staticRenderFns,l._compiled=!0,i&&(l.functional=!0)),l._scopeId=a;{let e;if(t&&(e=function(e){t.call(this,s(e))}),void 0!==e)if(l.functional){const t=l.render;l.render=function(n,a){return e.call(a),t(n,a)}}else{const t=l.beforeCreate;l.beforeCreate=t?[].concat(t,e):[e]}}return l}({render:co,staticRenderFns:[]},(function(e){e&&e("data-v-7d8957a2_0",{source:"\n#network-status[data-v-7d8957a2] {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tposition: relative;\n\tmargin-top: auto;\n\tbottom: 0;\n}\n#network-status.online i.material-icons[data-v-7d8957a2] {\n\tcolor: hsl(151, 100%, 31%);\n}\n#network-status.offline i.material-icons svg[data-v-7d8957a2] {\n\tfill: red;\n\twidth: 1em;\n\theight: 1em;\n}\n",map:{version:3,sources:["/mnt/Dati/Programmazione/DeezloaderStuff/deemix/deemix-pyweb/webui/src/components/TheSidebar.vue"],names:[],mappings:";AA0DA;CACA,aAAA;CACA,uBAAA;CACA,mBAAA;CACA,kBAAA;CACA,gBAAA;CACA,SAAA;AACA;AAEA;CACA,0BAAA;AACA;AAEA;CACA,SAAA;CACA,UAAA;CACA,WAAA;AACA",file:"TheSidebar.vue",sourcesContent:['\n\n\n\n - - \ No newline at end of file diff --git a/src/components/ArtistTab.vue b/src/components/ArtistTab.vue index 43ace74..ba63c7e 100644 --- a/src/components/ArtistTab.vue +++ b/src/components/ArtistTab.vue @@ -69,6 +69,7 @@ {{ release.release_date }} + {{ release.nb_song }} +
+ +
+ + + + + \ No newline at end of file diff --git a/src/components/TheMainContent.vue b/src/components/TheMainContent.vue index a2e50bd..0f0a0a2 100644 --- a/src/components/TheMainContent.vue +++ b/src/components/TheMainContent.vue @@ -15,9 +15,6 @@ export default { components: { TheMiddleSection, TheDownloadTab - }, - mounted() { - console.log(this.$route) } } diff --git a/src/components/TheSettingsTab.vue b/src/components/TheSettingsTab.vue index 2bf66f4..621d23c 100644 --- a/src/components/TheSettingsTab.vue +++ b/src/components/TheSettingsTab.vue @@ -186,6 +186,7 @@
diff --git a/src/components/TracklistTab.vue b/src/components/TracklistTab.vue index 3b51ab0..bfb87a8 100644 --- a/src/components/TracklistTab.vue +++ b/src/components/TracklistTab.vue @@ -293,7 +293,6 @@ export default { } }, mounted() { - console.log('tracklist mounted') EventBus.$on('tracklistTab:reset', this.reset) EventBus.$on('tracklistTab:selectRow', this.selectRow) diff --git a/src/lang/en.js b/src/lang/en.js index 5ab0815..3bb5a5f 100644 --- a/src/lang/en.js +++ b/src/lang/en.js @@ -25,6 +25,8 @@ const en = { playlist: 'playlist | playlists', compile: 'compilation | compilations', ep: 'ep | eps', + more: 'More albums', + featured: 'Featured in', spotifyPlaylist: 'spotify playlist | spotify playlists', releaseDate: 'release date', error: 'error' @@ -51,9 +53,9 @@ const en = { officialWebuiRepo: 'Official WebUI Repository', officialSubreddit: 'Official Subreddit', newsChannel: 'News Channel', - questions: `If you have questions or problems with the app, search for a solution in the subreddit first. Then, if you don't find anything you can make a post with your issue on the subreddit.`, + questions: `If you have questions or problems with the app, search for a solution on the subreddit first. Then, if you don't find anything you can make a post with your issue on the subreddit.`, beforeReporting: `Before reporting a bug make sure you're running the latest version of the app and that what you want to report is actually a bug and not something that's wrong only on your end.`, - beSure: `Make sure the bug is reproducible on another machines and also DO NOT report a bug if it's been already reported.`, + beSure: `Make sure the bug is reproducible on other machines and also DO NOT report a bug if it's already been reported.`, duplicateReports: 'Duplicate bug reports will be closed, so keep an eye out on that.', dontOpenIssues: `DO NOT open issues for asking questions, there is a subreddit for that.`, newUI: `If you're fluent in python you could try to make a new UI for the app using the base library, or fix bugs in the library with a pull request on the repo.`, @@ -63,7 +65,7 @@ const en = { contributeWebUI: `If you know Vue.js (JavaScript), HTML or CSS you could contribute to the WebUI.`, itsFree: `You should remember that this is a free project and you should support the artists you love before supporting the developers.`, notObligated: `Don't feel obligated to donate, I appreciate you anyway!`, - lincensedUnder: `This work is licensed under a + lincensedUnder: `This work is licensed under the GNU General Public License 3.0.` @@ -78,19 +80,19 @@ const en = { ids: { invalidURL: 'URL not recognized', unsupportedURL: 'URL not supported yet', - ISRCnotOnDeezer: 'Track ISRC is not available on deezer', + ISRCnotOnDeezer: 'Track ISRC is not available on Deezer', notYourPrivatePlaylist: "You can't download others private playlists.", spotifyDisabled: 'Spotify Features is not setted up correctly.', - trackNotOnDeezer: 'Track not found on deezer!', - albumNotOnDeezer: 'Album not found on deezer!', + trackNotOnDeezer: 'Track not found on Deezer!', + albumNotOnDeezer: 'Album not found on Deezer!', notOnDeezer: 'Track not available on Deezer!', notEncoded: 'Track not yet encoded!', notEncodedNoAlternative: 'Track not yet encoded and no alternative found!', wrongBitrate: 'Track not found at desired bitrate.', wrongBitrateNoAlternative: 'Track not found at desired bitrate and no alternative found!', no360RA: 'Track is not available in Reality Audio 360.', - notAvailable: "Track not available on deezer's servers!", - notAvailableNoAlternative: "Track not available on deezer's servers and no alternative found!" + notAvailable: "Track not available on Deezer's servers!", + notAvailableNoAlternative: "Track not available on Deezer's servers and no alternative found!" } }, favorites: { @@ -109,7 +111,7 @@ const en = { } }, linkAnalyzer: { - info: 'You can use this section to find out more information about the link you are trying to download.', + info: 'You can use this section to find more information about the link you are trying to download.', useful: "This is useful if you're trying to download some tracks that are not available in your country and want to know where they are available, for instance.", linkNotSupported: 'This link is not yet supported', @@ -148,7 +150,7 @@ const en = { finishDownload: '{0} finished downloading.', allDownloaded: 'All downloads completed!', refreshFavs: 'Refresh completed!', - loggingIn: 'Logging in', + loggingIn: 'Logging in...', loggedIn: 'Logged in', alreadyLogged: 'Already logged in', loginFailed: "Couldn't log in", @@ -157,7 +159,7 @@ const en = { currentItemCancelled: 'Current item cancelled.', startAddingArtist: 'Adding {0} albums to queue', finishAddingArtist: 'Added {0} albums to queue', - startConvertingSpotifyPlaylist: 'Converting spotify tracks to deezer tracks', + startConvertingSpotifyPlaylist: 'Converting spotify tracks to Deezer tracks', finishConvertingSpotifyPlaylist: 'Spotify playlist converted', loginNeededToDownload: 'You need to log in to download tracks!' }, @@ -217,7 +219,8 @@ const en = { title: 'Should I overwrite the files?', y: 'Yes, overwrite the file', n: "No, don't overwrite the file", - t: 'Overwrite only the tags' + t: 'Overwrite only the tags', + b: 'No, keep both files and add a number to the duplicate' }, fallbackBitrate: 'Bitrate fallback', fallbackSearch: 'Search fallback', @@ -316,9 +319,9 @@ const en = { }, spotify: { title: 'Spotify Features', - clientID: 'Spotify clientID', + clientID: 'Spotify ClientID', clientSecret: 'Spotify Client Secret', - username: 'Spotify username' + username: 'Spotify Username' }, reset: 'Reset to Default', save: 'Save', diff --git a/src/lang/fr.js b/src/lang/fr.js index 2b07d51..9a0b8fb 100644 --- a/src/lang/fr.js +++ b/src/lang/fr.js @@ -9,8 +9,8 @@ const fr = { download_hint: 'Télécharger', play_hint: 'Lire', toggle_download_tab_hint: 'Développer/Réduire', - clean_queue_hint: 'Retirer les tâches terminées', - cancel_queue_hint: 'Tout annuler', + clean_queue_hint: 'Retirer Les Tâches Terminées', + cancel_queue_hint: 'Tout Annuler', listTabs: { empty: '', all: 'tout', @@ -33,7 +33,7 @@ const fr = { about: { titles: { usefulLinks: 'Liens Utiles', - bugReports: 'Rapports de Bug', + bugReports: 'Rapports De Bug', contributing: 'Contribution', donations: 'Dons', license: 'Licence' @@ -45,14 +45,14 @@ const fr = { }, usesLibrary: 'Cette application utilise la bibliothèque deemix, que vous pouvez exploiter afin de créer votre propre interface utilisateur pour deemix.', - thanks: "Merci à rtonno, uhwot et lollilol de m'avoir aidé dans ce projet ainsi qu\'à BasCurtiz et scarvimane pour avoir réalisé l'icône.", + thanks: "Merci à rtonno, uhwot et lollilol de m'avoir aidé dans ce projet ainsi qu'à BasCurtiz et scarvimane pour avoir réalisé l'icône.", upToDate: 'Restez informé des mises à jour en suivant le canal de nouveautés sur Telegram.', officialWebsite: 'Site Officiel', - officialRepo: 'Répertoire de dépôt officiel de la bibiliothèque', - officialWebuiRepo: 'Répertoire de dépôt officiel de la WebUI', - officialSubreddit: 'Subreddit officiel', - newsChannel: 'Canal de nouveautés', - questions: `Si vous avez des questions ou des problèmes avec l'application, cherchez d'abord une solution dans le subreddit. Ensuite, si vous ne trouvez rien, vous pouvez publier un message avec votre problème sur le subreddit.`, + officialRepo: 'Répertoire De Dépôt Officiel De La Bibiliothèque', + officialWebuiRepo: 'Répertoire De Dépôt Officiel De La WebUI', + officialSubreddit: 'Subreddit Officiel', + newsChannel: 'Canal De Nouveautés', + questions: `Si vous avez des questions ou des problèmes avec l'application, cherchez d'abord une solution dans le subreddit. Ensuite, si vous ne trouvez rien, vous pouvez publier un message avec votre problème dans le subreddit.`, beforeReporting: "Avant de signaler un bug, assurez-vous que vous exécutez la dernière version de l'application et que ce que vous voulez signaler est bien un bug et non quelque chose qui ne va pas de votre côté.", beSure: "Assurez-vous que le bug est reproductible sur d'autres machines et aussi de NE PAS signaler un bug si celui-ci a déjà été mentionné.", duplicateReports: 'Les doublons de rapports de bug seront supprimés, alors gardez un œil sur cela.', @@ -60,7 +60,7 @@ const fr = { newUI: `Si vous maîtrisez python, vous pouvez essayer de créer une nouvelle interface utilisateur pour l'application à l'aide de la bibliothèque de base, ou corriger des bugs dans la bibliothèque avec une requête sur le répertoire de dépôt.`, acceptFeatures: "J'accepte également les fonctionnalités, mais pas de choses complexes, car elles peuvent être implémentées directement dans l'application et non dans la bibliothèque.", otherLanguages: "Si vous maîtrisez un autre langage de programmation, vous pouvez essayer de transposer deemix dans d'autres langages de programmation !", - understandingCode: "Vous avez besoin d'aide pour comprendre le code ? Contactez simplement RemixDev sur Telegram ou Reddit.", + understandingCode: "Vous avez besoin d'aide pour comprendre le code ? Il suffit de contacter RemixDev sur Telegram ou Reddit.", contributeWebUI: `Si vous vous y connaissez en Vue.js (JavaScript), HTML ou CSS vous pouvez contribuer à la WebUI.`, itsFree: "N'oubliez pas que ceci est un projet gratuit et que vous devez soutenir les artistes que vous appréciez avant de supporter les développeurs.", notObligated: "Ne vous sentez pas obligé de faire un don, je vous apprécie quand même !", @@ -70,15 +70,15 @@ const fr = { }, charts: { title: 'Hit-Parade', - changeCountry: 'Changer de Pays', - download: 'Télécharger le Hit-Parade' + changeCountry: 'Changer De Pays', + download: 'Télécharger Le Hit-Parade' }, errors: { title: 'Erreurs pour {0}', ids: { invalidURL: "Cette URL n'est pas reconnue", unsupportedURL: "Cette URL n'est pas supportée actuellement", - ISRCnotOnDeezer: "L'ISRC de la piste n'est pas disponible sur Deezer", + ISRCnotOnDeezer: "L'ISRC de la piste est indisponible sur Deezer", notYourPrivatePlaylist: "Vous ne pouvez pas télécharger les playlists privées de quelqu'un d'autre.", spotifyDisabled: 'Les Fonctionnalités Spotify ne sont pas configurées correctement.', trackNotOnDeezer: 'La piste est introuvable sur Deezer !', @@ -88,21 +88,21 @@ const fr = { notEncodedNoAlternative: "La piste n'a pas encore été encodée et aucune alternative n'a été trouvée !", wrongBitrate: 'La piste est introuvable au débit souhaité.', wrongBitrateNoAlternative: "La piste est introuvable au débit souhaité et aucune alternative n'a été trouvée !", - no360RA: "La piste n'est pas disponible au format Reality Audio 360.", + no360RA: 'La piste est indisponible au format Reality Audio 360.', notAvailable: 'La piste est indisponible sur les serveurs de Deezer !', notAvailableNoAlternative: "La piste est indisponible sur les serveurs de Deezer et aucune alternative n'a été trouvée !" } }, favorites: { title: 'Favoris', - noPlaylists: "Aucune playlist n'a été trouvée", - noAlbums: "Aucun album favori n'a été trouvé", - noArtists: "Aucun artiste favori n'a été trouvé", - noTracks: "Aucune piste favorite n'a été trouvée" + noPlaylists: "Aucune Playlist n'a été trouvée", + noAlbums: "Aucun Album Favori n'a été trouvé", + noArtists: "Aucun Artiste Favori n'a été trouvé", + noTracks: "Aucune Piste Favorite n'a été trouvée" }, home: { - needTologin: 'Vous devez vous connecter à votre compte Deezer avant de pouvoir commencer le téléchargement.', - openSettings: 'Ouvrir les paramètres', + needTologin: 'Vous devez vous connecter à votre compte Deezer avant de pouvoir commencer les téléchargements.', + openSettings: 'Ouvrir Les Paramètres', sections: { popularPlaylists: 'Playlists populaires', popularAlbums: 'Albums les plus diffusés' @@ -120,20 +120,20 @@ const fr = { isrc: 'ISRC', upc: 'UPC', duration: 'Durée', - diskNumber: 'Numéro de disque', - trackNumber: 'Numéro de disque', - releaseDate: 'Date de parution', + diskNumber: 'Numéro De Disque', + trackNumber: 'Numéro De Disque', + releaseDate: 'Date De Parution', bpm: 'BPM', label: 'Label', - recordType: "Type d'enregistrement", + recordType: "Type d'Enregistrement", genres: 'Genres', - tracklist: 'Liste des pistes' + tracklist: 'Liste Des Pistes' } }, search: { startSearching: 'Commencer une recherche !', description: - 'Vous pouvez rechercher une piste, un album entier, un artiste, une playlist.... tout ! Vous pouvez également copier-coller un lien Deezer', + 'Vous pouvez rechercher une piste, un album entier, un artiste, une playlist... tout ! Vous pouvez également copier-coller un lien Deezer', fans: '{0} fans', noResults: 'Aucun résultat', noResultsTrack: "Aucune piste n'a été trouvée", @@ -141,7 +141,7 @@ const fr = { noResultsArtist: "Aucun artiste n'a été trouvé", noResultsPlaylist: "Aucune playlist n'a été trouvée" }, - searchbar: 'Recherchez tout ce que vous voulez (ou copier-collez simplement un lien)', + searchbar: 'Recherchez tout ce que vous voulez (ou copiez-collez simplement un lien)', downloads: 'téléchargements', toasts: { addedToQueue: "{0} ajouté à la file d'attente", @@ -149,7 +149,7 @@ const fr = { finishDownload: '{0} a été téléchargé.', allDownloaded: 'Tous les téléchargements sont terminés !', refreshFavs: 'Actualisation terminée !', - loggingIn: 'Connexion', + loggingIn: 'Connexion...', loggedIn: 'Connecté', alreadyLogged: 'Déjà connecté', loginFailed: 'Connexion impossible', @@ -178,7 +178,7 @@ const fr = { slimDownloadTab: 'Onglet de téléchargement plus petit' }, downloadPath: { - title: 'Emplacement de téléchargement' + title: 'Emplacement De Téléchargement' }, templates: { title: 'Gabarits', @@ -200,15 +200,15 @@ const fr = { }, trackTitles: { title: 'Titres de pistes', - padTracks: 'Pad tracks', - paddingSize: 'Écraser la taille du remplissage', + padTracks: "Longueur uniforme des numéros de piste (ajoute automatiquement des zéros devant le numéro initial de la piste)", + paddingSize: 'Nombre de zéros à ajouter en permanance devant le numéro initial de la piste', illegalCharacterReplacer: 'Remplacement de caractère inapproprié' }, downloads: { title: 'Téléchargements', queueConcurrency: 'Téléchargements Simultanés', maxBitrate: { - title: 'Débit préféré', + title: 'Débit Préféré', 9: 'FLAC 1411kbps', 3: 'MP3 320kbps', 1: 'MP3 128kbps' @@ -216,21 +216,22 @@ const fr = { overwriteFile: { title: 'Dois-je écraser les fichiers ?', y: 'Oui, écraser le fichier', - n: "Non, ne pas écraser le fichier", - t: 'Écraser uniquement les métadonnées' + n: 'Non, ne pas écraser le fichier', + t: 'Écraser uniquement les métadonnées', + b: 'Non, conserver les deux fichiers et ajouter un numéro au doublon' }, - fallbackBitrate: 'Débits plus faibles', + fallbackBitrate: 'Recours aux débits plus faibles', fallbackSearch: 'Rechercher un débit plus faible', logErrors: "Créer un fichier journal d'erreurs", logSearched: 'Créer un fichier journal des pistes recherchées', createM3U8File: 'Créer un fichier de playlist', syncedLyrics: 'Créer des fichiers .lyr (Paroles Synchronisées)', playlistFilenameTemplate: 'Gabarit du nom de fichier de la playlist', - saveDownloadQueue: "Enregistrer la file d'attente de téléchargement lors de la fermeture de l'application" + saveDownloadQueue: "Enregistrer la file d'attente de téléchargement à la fermeture de l'application" }, covers: { title: "Pochettes d'albums", - saveArtwork: 'Enregistrer les pochettes', + saveArtwork: 'Enregistrer Les Pochettes', coverImageTemplate: 'Gabarit pour le nom de la pochette', saveArtworkArtist: "Enregistrer l'image de l'artiste", artistImageTemplate: "Gabarit pour le nom de l'image de l'artiste", @@ -249,32 +250,32 @@ const fr = { title: 'Titre', artist: 'Artiste', album: 'Album', - cover: 'Reprise', - trackNumber: 'Numéro de piste', - trackTotal: 'Nombre de pistes', - discNumber: 'Numéro du disque', - discTotal: 'Nombre de disques', - albumArtist: "Artiste de l'album", + cover: 'Pochette', + trackNumber: 'Numéro De Piste', + trackTotal: 'Nombre De Pistes', + discNumber: 'Numéro Du Disque', + discTotal: 'Nombre De Disques', + albumArtist: "Artiste De l'Album", genre: 'Genre', year: 'Année', date: 'Date', explicit: 'Paroles Explicites', isrc: 'ISRC', - length: 'Longueur de la piste', - barcode: "Code-barres de l'album (UPC)", + length: 'Longueur De La Piste', + barcode: "Code-Barres De l'Album (UPC)", bpm: 'BPM', - replayGain: 'Gain en Relecture (Replay Gain)', - label: "Label de l'album", - lyrics: 'Paroles non-synchronisées', - copyright: "Droits d'auteur (copyright)", + replayGain: 'Gain En Relecture (Replay Gain)', + label: "Label De l'Album", + lyrics: 'Paroles Non-Synchronisées', + copyright: "Droits d'Auteur (Copyright)", composer: 'Compositeur', - involvedPeople: 'Personnes impliquées' + involvedPeople: 'Personnes Impliquées' }, other: { title: 'Autre', savePlaylistAsCompilation: 'Enregistrer les playlists en tant que compilation', useNullSeparator: 'Utiliser un séparateur nul', - saveID3v1: "Enregistrez l'ID3v1 également", + saveID3v1: 'Enregistrer également les métadonnées ID3v1', multiArtistSeparator: { title: 'Comment aimeriez-vous séparer les artistes ?', nothing: "Enregistrer uniquement l'artiste principal", @@ -283,7 +284,7 @@ const fr = { using: 'En utilisant "{0}"' }, singleAlbumArtist: "Enregistrer uniquement l'artiste principal de l'album", - albumVariousArtists: `Conserver "Various Artists" dans les artistes de l'album`, + albumVariousArtists: `Conserver "Various Artists" dans les Artistes de l'Album`, removeAlbumVersion: `Supprimer "Album Version" du titre de la piste`, removeDuplicateArtists: "Supprimer les combinaisons d'artistes", dateFormat: { diff --git a/src/lang/hr.js b/src/lang/hr.js new file mode 100644 index 0000000..70b64e8 --- /dev/null +++ b/src/lang/hr.js @@ -0,0 +1,346 @@ +const hr = { + globals: { + welcome: 'Dobrodošli u deemix', + back: 'nazad', + loading: 'učitavanje', + download: 'Preuzmi {0}', + by: 'by {0}', + in: 'u {0}', + download_hint: 'Preuzmi', + play_hint: 'Play', + toggle_download_tab_hint: 'Proširi/Smanji', + clean_queue_hint: 'Čišćenje završeno', + cancel_queue_hint: 'Zaustavi sve', + listTabs: { + empty: '', + all: 'sve', + top_result: 'Najbolji rezultat', + album: 'album | albumi', + artist: 'izvođač | izvođači', + single: 'singl | singlovi', + title: 'naslov | naslovi', + track: 'pjesma | pjesme', + trackN: '0 pjesmi | {n} pjesma | {n} pjesme', + releaseN: '0 izdanja | {n} izdanje | {n} izdanja', + playlist: 'playlista | playliste', + compile: 'kompilacija | kompilacije', + ep: 'ep | eps', + spotifyPlaylist: 'spotify playlista | spotify playliste', + releaseDate: 'datum izdavanja', + error: 'greška' + } + }, + about: { + titles: { + usefulLinks: 'Korisne poveznice', + bugReports: 'Prijave grešaka', + contributing: 'Doprinosi', + donations: 'Donacije', + license: 'Licenca' + }, + subtitles: { + bugReports: "Postoji nešto što ne radi u deemixu? Reci nam!", + contributing: 'Želiš doprinijeti ovom projektu? Možeš i to čak u više načina!', + donations: 'Želiš doprijeniti odmah? Možeš donirati!' + }, + usesLibrary: 'Ova aplikacija koristi deemix biblioteku, koju možeš koristiti i ti kako bi napravio svoj UI za demix.', + thanks: `Hvala rtonno, uhwot i lollilol što su mi pomogli s ovim projektom te BasCurtiz i scarvimane što su napravili ikonu.`, + upToDate: `Ostani u tijeku s nadogradnjama prateći kanal s novostima na Telegramu.`, + officialWebsite: 'Službena web stranica', + officialRepo: 'Službeni repozitorij biblioteke', + officialWebuiRepo: 'Službeni WebUI repozitorij', + officialSubreddit: 'Službeni subreddit', + newsChannel: 'Kanal s novostima', + questions: `Ukoliko imate pitanja o aplikaciji, prvo potražite riješenje na subreddit. Tada, ako ne pronađete ništa, možete objaviti svoj problem na subredditu.`, + beforeReporting: `Prije prijavljivanja greške provjerite imate li instaliranu zadnju verziju aplikacije i da to što želite prijaviti je ustvari pogreška, a ne nešto što samo vama ne radi.`, + beSure: `Provjerite može li se pogreška reproducirati i na drugim uređajima i također NEMOJTE prijavljivati grešku ako je već prijavljena.`, + duplicateReports: 'Duplicirane prijave o greški bit će zatvorene, tako da pripazite na to.', + dontOpenIssues: `NEMOJTE otvarati issue za postavljanje pitanja, za to postoji subreddit.`, + newUI: `Ako ste vješti u pythonu možete probati napraviti novi UI za aplikaciju koristeći osnovnu biblioteku ili ispraviti pogrešku u biblioteci sa pull zahtjevom na repozitoriju.`, + acceptFeatures: `Prihavaćam i značajke, ali bez kompleksnih stvari, jer one mogu biti implementirane direktno u aplikaciji, a ne u biblioteci.`, + otherLanguages: `Ako ste vješti u drugom programskom jezikumožete probati portati deemix u drugi programski jezik!`, + understandingCode: `Trebate pomoć s razumijevanjem koda? Samo potraži RemixDev na Telegramu ili Redditu.`, + contributeWebUI: `Ako znaš Vue.js (JavaScript), HTML ili CSS možete doprinijeti za WebUI.`, + itsFree: `Trebate zapamtiti da je ovo besplatni projekt i trebali biste podržati autore koje volite prije podržavanja developera.`, + notObligated: `Nemojte se osjećati obveznim darivati, svejedno vas cijenim!`, + lincensedUnder: `Ovaj rad licenciran je unutar + GNU General Public License 3.0.` + }, + charts: { + title: 'Ljestvice', + changeCountry: 'Promijeni državu', + download: 'Preuzmi ljestvicu' + }, + errors: { + title: 'Greške za {0}', + ids: { + invalidURL: 'URL nije prepoznat', + unsupportedURL: 'URL još nije podržan', + ISRCnotOnDeezer: 'Zapis ISRC još nije podržan na Deezeru', + notYourPrivatePlaylist: "Ne možete preuzeti tuđe privatne playliste.", + spotifyDisabled: 'Spotify značajke nisu podešene ispravno.', + trackNotOnDeezer: 'Pjesma nije pronađena na Deezeru!', + albumNotOnDeezer: 'Album nije pronađen na Deezeru!', + notOnDeezer: 'Pjesma nije dostupna na Deezeru!', + notEncoded: 'Pjesma još nije enkodirana!', + notEncodedNoAlternative: 'Pjesma još nije enkodirana i nije pronađena alternativa!', + wrongBitrate: 'Pjesma nije pronađena u željenom bitrateu.', + wrongBitrateNoAlternative: 'Pjesma nije pronađena u željenom bitrateu i nije pronađena alternativa!', + no360RA: 'Pjesma nije dostupna u Reality Audio 360.', + notAvailable: "Pjesma nije dostupna na Deezerovim serverima!", + notAvailableNoAlternative: "Pjesma nije dostupna na Deezerovim serverima i alternativa nije pronađena!" + } + }, + favorites: { + title: 'Favoriti', + noPlaylists: 'Nisu pronađene playliste', + noAlbums: 'Omiljeni albumi nisu pronađeni', + noArtists: 'Omiljeni glazbenici nisu pronađeni', + noTracks: 'Omiljene pjesme nisu pronađene' + }, + home: { + needTologin: 'Trebate se prijaviti sa svojim Deezer računom kako biste mogli početi preuzimati pjesme.', + openSettings: 'Otvori postavke', + sections: { + popularPlaylists: 'Popularne playliste', + popularAlbums: 'Najpreslušaniji album' + } + }, + linkAnalyzer: { + info: 'Ovu sekciju možete koristiti kako biste saznali više informacija o linku koji pokušavate preuzeti.', + useful: + "Ovo je korisno ako pokušavate preuzeti pjesme koje još nisu dostupne u vašoj zemlji i želite, na primjer, znati gdje su dostupne.", + linkNotSupported: 'Ovaj link još nije podržan', + linkNotSupportedYet: 'Čini se da ovaj link još nije podržan, pokušaj analizirati neki drugi.', + table: { + id: 'ID', + isrc: 'ISRC', + upc: 'UPC', + duration: 'Trajanje', + diskNumber: 'Broj diska', + trackNumber: 'Broj pjesme', + releaseDate: 'Datum izadavanja', + bpm: 'BPM', + label: 'Izdavačka kuća', + recordType: 'Vrsta zapisa', + genres: 'Žanrovi', + tracklist: 'Popis pjesama' + } + }, + search: { + startSearching: 'Počni pretraživati!', + description: + 'Možete pretražiti pjesmu, cijeli album, izvođača, playlistu... sve! Također, možete i zalijepiti Deezer link', + fans: '{0} obožavatelja', + noResults: 'Nema rezultata', + noResultsTrack: 'Pjesme nisu pronađene', + noResultsAlbum: 'Albumi nisu pronađeni', + noResultsArtist: 'Izvođači nisu pronađeni', + noResultsPlaylist: 'Playliste nisu pronađene' + }, + searchbar: 'Pretraži bilo što (ili samo zalijepi link)', + downloads: 'preuzimanja', + toasts: { + addedToQueue: '{0} dodan u red', + alreadyInQueue: '{0} je već u redu!', + finishDownload: '{0} završeno preuzimanje.', + allDownloaded: 'Sva preuzimanja završena!', + refreshFavs: 'Osvježavanje završeno!', + loggingIn: 'Prijavljivanje...', + loggedIn: 'Prijavljeni', + alreadyLogged: 'Već prijavljeni', + loginFailed: "Prijava nije bila moguća", + loggedOut: 'Odjavljeni', + cancellingCurrentItem: 'Otkazujem trenutnu stavku.', + currentItemCancelled: 'Trenutna stavka otkazana.', + startAddingArtist: 'Dodajem {0} album u red', + finishAddingArtist: 'Dodan {0} album u red', + startConvertingSpotifyPlaylist: 'Pretvaram Spotify pjesme u Deezer pjesme', + finishConvertingSpotifyPlaylist: 'Spotify playlista pretvorena', + loginNeededToDownload: 'Trebate se prijaviti kako bi preuzeli pjesme!' + }, + settings: { + title: 'Postavke', + languages: 'Jezici', + login: { + title: 'Prijava', + loggedIn: 'Prijavljeni ste kao {username}', + arl: { + question: 'Kako da dobijem svoj ARL?', + update: 'Ažuriraj ARL' + }, + logout: 'Odjavi se' + }, + appearance: { + title: 'Izgled', + slimDownloadTab: 'Tanka kartica za preuzimanje' + }, + downloadPath: { + title: 'Putanja za preuzimanja' + }, + templates: { + title: 'Predlošci', + tracknameTemplate: 'Naziv pjesme predložak', + albumTracknameTemplate: 'Pjesma albuma predložak', + playlistTracknameTemplate: 'Pjesma playliste predložak' + }, + folders: { + title: 'Mape', + createPlaylistFolder: 'Izradi mapu za playliste', + playlistNameTemplate: 'Mapa za playliste predložak', + createArtistFolder: 'Izradi mapu za izvođača', + artistNameTemplate: 'Izvođač mapa predložak', + createAlbumFolder: 'Izradi mapu za album', + albumNameTemplate: 'Album mapa predložak', + createCDFolder: 'Izradi mapu za CD', + createStructurePlaylist: 'Strkturiraj mape za playliste', + createSingleFolder: 'Strukturiraj mape za singlove' + }, + trackTitles: { + title: 'Naslovi pjesama', + padTracks: 'Pad tracks', + paddingSize: 'Prepiši veličinu paddinga', + illegalCharacterReplacer: 'Zamjena za nedozvoljeni znak' + }, + downloads: { + title: 'Preuzimanja', + queueConcurrency: 'Istovremena preuzimanja', + maxBitrate: { + title: 'Željeni bitrate', + 9: 'FLAC 1411kbps', + 3: 'MP3 320kbps', + 1: 'MP3 128kbps' + }, + overwriteFile: { + title: 'Trebam li prepisati datoteke?', + y: 'Da, prepiši datoteke', + n: "Ne, nemoj prepisati datoteke", + t: 'Prepiši samo oznake', + b: 'Ne, zadrži obje datoteke i dodaj broj duplikatu' + }, + fallbackBitrate: 'Bitrate fallback', + fallbackSearch: 'Pretraživanje fallback', + logErrors: 'Izradi zapisnik datoteku za greške', + logSearched: 'Izradi zapisnik datoteku za pretražene pjesme', + createM3U8File: 'Izradi playlist datoteku', + syncedLyrics: 'Izradi .lyr datoteke (sinkronizirani lyrics)', + playlistFilenameTemplate: 'Naziv playliste predložak', + saveDownloadQueue: 'Spremi red za preuzimanje prilikom zatvaranja aplikacije' + }, + covers: { + title: 'Omoti albuma', + saveArtwork: 'Spremi omote', + coverImageTemplate: 'Naziv omota predložak', + saveArtworkArtist: 'Spremi sliku izvođača', + artistImageTemplate: 'Slika izvođača predložak', + localArtworkSize: 'Veličina lokalnog omota', + embeddedArtworkSize: 'Veličina ugrađenog omota', + localArtworkFormat: { + title: 'U kojem formatu želite lokalni omot?', + jpg: 'Jpeg slika', + png: 'Png slika', + both: 'I jpeg i png' + }, + jpegImageQuality: 'JPEG kvaliteta slike' + }, + tags: { + head: 'Koja oznake spremam', + title: 'Naslovi', + artist: 'Izvođač', + album: 'Album', + cover: 'Omot', + trackNumber: 'Broj pjesme', + trackTotal: 'Ukupno pjesama', + discNumber: 'Broj diska', + discTotal: 'Ukupno diskova', + albumArtist: 'Izvođač albuma', + genre: 'Žanr', + year: 'Godina', + date: 'Datum', + explicit: 'Eksplicitni lyrics', + isrc: 'ISRC', + length: 'Dužina pjesme', + barcode: 'Album barkod (UPC)', + bpm: 'BPM', + replayGain: 'Replay Gain', + label: 'Izdavačka kuća albuma', + lyrics: 'Nesinkronizirani lyrics', + copyright: 'Autorska prava', + composer: 'Skladatelj', + involvedPeople: 'Uključeni ljudi' + }, + other: { + title: 'Ostalo', + savePlaylistAsCompilation: 'Spremi playliste kao kompilacije', + useNullSeparator: 'Koristi null razdvojnik', + saveID3v1: 'Spremi i ID3v1 također', + multiArtistSeparator: { + title: 'Kako biste željeli razdvojiti izvođače?', + nothing: 'Spremi samo glavnog izvođača', + default: 'Koristeći standardnu specifikaciju', + andFeat: 'Koristeći & i feat.', + using: 'Koristeći "{0}"' + }, + singleAlbumArtist: 'Spremi samo izvođača glavnog albuma', + albumVariousArtists: 'Zadrži "Various Artists" u Izvođačima albuma', + removeAlbumVersion: 'Izbriši "Album Version" iz naziva pjesme', + removeDuplicateArtists: 'Izbriši kombinacije izvođača', + dateFormat: { + title: 'Format datuma za FLAC datoteke', + year: 'YYYY', + month: 'MM', + day: 'DD' + }, + featuredToTitle: { + title: 'Što trebam napraviti s istaknutim izvođačima? (feat. i ft.)', + 0: 'Ništa', + 1: 'Izbriši ih iz naziva', + 3: 'Izbriši ih iz naziva i iz naziva albuma', + 2: 'Premjesti ih u naziv' + }, + titleCasing: 'Veličina slova naslova', + artistCasing: 'Veličina slova izvođača', + casing: { + nothing: 'Zadrži nepromijenjeno', + lower: 'sve malo', + upper: 'sve VELIKO', + start: 'Početak Svake Riječi', + sentence: 'Kao rečenica' + }, + previewVolume: 'Volumen pregleda', + executeCommand: { + title: 'Naredba za izvršenje nakon preuzimanja', + description: 'Ostavi prazno za bez akcije' + } + }, + spotify: { + title: 'Spotify značajke', + clientID: 'Spotify ClientID', + clientSecret: 'Spotify Client Secret', + username: 'Spotify korisničko ime' + }, + reset: 'Resetiraj na zadano', + save: 'Spremi', + toasts: { + init: 'Postavke učitane!', + update: 'Postavke ažurirane!', + ARLcopied: 'ARL kopiran u međuspremnik' + } + }, + sidebar: { + home: 'početna', + search: 'pretraživanje', + charts: 'ljestvice', + favorites: 'favoriti', + linkAnalyzer: 'analizator linka', + settings: 'postavke', + about: 'o programu' + }, + tracklist: { + downloadSelection: 'Preuzmi selekciju' + } +} + +export default hr diff --git a/src/lang/it.js b/src/lang/it.js index 21a5c24..9c68644 100644 --- a/src/lang/it.js +++ b/src/lang/it.js @@ -24,6 +24,8 @@ const it = { playlist: 'playlist', compile: 'compilation', ep: 'ep', + more: 'Altri album', + featured: 'Compare in', spotifyPlaylist: 'playlist spotify', releaseDate: 'data di uscita', error: 'errore', @@ -150,7 +152,7 @@ const it = { finishDownload: '{0} ha finito di scaricarsi.', allDownloaded: 'Tutti i download completati!', refreshFavs: 'Preferiti ricaricati!', - loggingIn: 'Effettuando il login', + loggingIn: 'Effettuando il login...', loggedIn: 'Login effettuato', alreadyLogged: 'Sei già loggato', loginFailed: 'Impossibile loggarsi', @@ -219,7 +221,8 @@ const it = { title: 'Dovrei sovrascrivere i file già scaricati?', y: 'Si, sovrascrivi i file', n: 'No, non sovrascrivere i file', - t: 'Sovrascrivi solo i tag' + t: 'Sovrascrivi solo i tag', + b: 'No, mantieni entrambi i file e aggiungi un numero al duplicato' }, fallbackBitrate: 'Utilizza bitrate più bassi se il bitrate preferito non è disponibile', fallbackSearch: 'Cerca il brano se il link originale non è disponibile', diff --git a/src/lang/pt-br.js b/src/lang/pt-br.js index 9d35fcb..6d9f428 100644 --- a/src/lang/pt-br.js +++ b/src/lang/pt-br.js @@ -1,6 +1,6 @@ -const ptBr = { +const pt_br = { globals: { - welcome: 'Bem vindo ao deemix', + welcome: 'bem vindo ao deemix', back: 'voltar', loading: 'carregando', download: 'Baixar {0}', @@ -8,20 +8,20 @@ in: 'em {0}', download_hint: 'Baixar', play_hint: 'Reproduzir', - toggle_download_tab_hint: 'Expandir/Recolher', - clean_queue_hint: 'Limpar os terminados', - cancel_queue_hint: 'Cancelar todos', + toggle_download_tab_hint: 'Expandir/Diminuir', + clean_queue_hint: 'Limpar', + cancel_queue_hint: 'Cancelar Todos', listTabs: { empty: '', all: 'todos', - top_result: 'Resultado principal', + top_result: 'resultado principal', album: 'álbum | álbuns', artist: 'artista | artistas', single: 'single | singles', title: 'título | títulos', track: 'faixa | faixas', trackN: '0 faixas | {n} faixa | {n} faixas', - releaseN: '0 lançamentos | {n} lançamento | {n} lançamentos', + releaseN: '0 lançamento | {n} lançamento | {n} lançamentos', playlist: 'playlist | playlists', compile: 'compilação | compilações', ep: 'ep | eps', @@ -39,253 +39,252 @@ license: 'Licença' }, subtitles: { - bugReports: 'Tem algo não funcionando no deemix? Informe-nos!', - contributing: 'Quer contribuir com este projeto? Há várias formas!', - donations: 'Quer contribuir monetariamente? Você pode fazer uma doação!' + bugReports: "Há algo não funcionando no deemix? Nos diga!", + contributing: 'Você quer contribuir para este projeto? Você pode fazer isso de diferentes maneiras!', + donations: 'Você quer contribuir monetariamente? Você pode fazer uma doação!' }, - usesLibrary: - 'Este programa usa a biblioteca deemix, no qual você pode usar para construir uma UI para o seu deemix.', - thanks: `Obrigado rtonno, uhwot e lollilol por me ajudarem com este projeto e BasCurtiz e scarvimane por fazerem o ícone.`, - upToDate: `Seja avisado quando houver novas atualizações, siga o nosso canal de notícias no Telegram.`, - officialWebsite: 'Website Oficial', + usesLibrary: 'Esse app usa a biblioteca do deemix, no qual você pode usar para criar sua própria UI para o deemix', + thanks: `Agradecimentos para rtonno, uhwot e lollilol por ajudar neste projeto, e para BasCurtiz e scarvimane por fazerem o ícone`, + upToDate: `Para mais novidades siga o news channel no Telegram.`, + officialWebsite: 'Site Oficial', officialRepo: 'Repositório da Biblioteca Oficial', officialWebuiRepo: 'Repositório da WebUI Oficial', officialSubreddit: 'Subreddit Oficial', - newsChannel: 'Canal de Notícia', - questions: `Caso houver dúvidas ou problemas com o programa, procure uma solução no subreddit. Caso não encontre nada, você pode fazer um post com a sua dúvida no subreddit.`, - beforeReporting: `Antes de reportar um bug tenha certeza de que o seu deemix esteja atualizado e que o seu relato seja realmente um bug e não um problema no seu lado de usuário.`, - beSure: `Certifique-se de que o bug ocorra em outras máquinas e NÃO relate-o caso ele já tenha sido relatado.`, - duplicateReports: 'Relatos duplicados de bug serão fechados, então fique de olho.', - dontOpenIssues: `NÃO abra uma issue para fazer questões, o subreddit é para isso.`, - newUI: `Caso seja fluente em python, você pode tentar fazer uma nova UI para o app usando a biblioteca base, ou consertar os bugs da biblioteca com uma pull request na repo do projeto.`, - acceptFeatures: `Eu aceito recursos também, mas nada muito complexo e que possa ser implementado diretamente no aplicativo e não na biblioteca.`, - otherLanguages: `Caso seja fluente em outra linguagem de programação você pode tentar portar o deemix para ela!`, - understandingCode: `Precisa de ajuda para entender o código? Contate o RemixDev no Telegram ou Reddit.`, - contributeWebUI: `Caso saiba Vue.js (JavaScript), HTML ou CSS você pode contribuir para a WebUI.`, - itsFree: `Mantenha em mente que este é um projeto gratuito e que você deve apoiar os artistas que ama antes de apoiar os desenvolvedores.`, - notObligated: `Não se sinta obrigado a doar, agradecemos da mesma forma!`, - lincensedUnder: `Este trabalho é licenciado sob a + newsChannel: 'Canal de Notícias', + questions: `Se você tiver dúvidas ou problemas com o app, procure uma solução em subreddit primeiro. Caso você não encontre, você pode fazer um post explicando seu problema no subreddit. `, + beforeReporting: `Antes de reportar um bug, tenha certeza que você está rodando a versão mais recente do app, e o que você quer reportar seja realmente um bug e não algo que esteja acontecendo especialmente com você.`, + beSure: `Certifique-se que o bug é reproduzivel em outras máquinas e também NÃO reporte um bug se ele já foi reportado.`, + duplicateReports: 'Reportes de bugs duplicados serão fechados, então fique atento a isso.', + dontOpenIssues: `NÃO abra tópicos para fazer perguntas, há o subreddit para isso.`, + newUI: `Se você é fluente em Phython, você pode tentar fazer uma nova UI para o app usando a biblioteca base, ou consertar bugs da biblioteca com um pull request em repo.`, + acceptFeatures: `Eu aceito funcionalidades extras também, mas nada de coisas complexas, desde que ela possa ser implementada no app, e não na biblioteca.`, + otherLanguages: `Se você for fluente em outra linguagem de programação, você pode tentar portar o deemix para outra linguagem!`, + understandingCode: `Você precisa de ajuda para entender o código? Mande mensagem no RemixDex pelo Telegram ou pelo Reddit.`, + contributeWebUI: `Se você souber Vue.js (JavaScript), HTML ou CSS você pode contribuir para o WebUI.`, + itsFree: `Lembre-se que este projeto é livre e você deve dar suporte aos artistas que você ama antes de dar suporte aos desenvolvedores.`, + notObligated: `Não se sinta na obrigação de doar, eu agradeço de qualquer maneira!`, + lincensedUnder: `Esse é um projeto licenciado através da GNU General Public License 3.0.` }, charts: { title: 'Charts', - changeCountry: 'Trocar o país', - download: 'Baixe a chart' + changeCountry: 'Mudar País', + download: 'Download Chart' }, errors: { title: 'Erros para {0}', ids: { - invalidURL: 'URL não reconhecida', - unsupportedURL: 'URL não suportada', - ISRCnotOnDeezer: 'ISRC da faixa não está no deezer', - notYourPrivatePlaylist: 'Você não pode baixar playlists privadas de outros usuários.', - spotifyDisabled: 'Recursos do Spotify não estão configurados corretamente.', + invalidURL: 'URL inválida', + unsupportedURL: 'URL não suportada ainda', + ISRCnotOnDeezer: 'Faixa ISRC não está disponível ainda no deezer', + notYourPrivatePlaylist: "Você não pode baixar playlists privadas.", + spotifyDisabled: 'Os Recursos do Spotify não foram configurados corretamente.', trackNotOnDeezer: 'Faixa não encontrada no deezer!', - albumNotOnDeezer: 'Álbum não encontrada no deezer!', - notOnDeezer: 'Faixa não disponível no Deezer!', - notEncoded: 'Faixa ainda não encodada!', - notEncodedNoAlternative: 'Faixa ainda não encodada e sem alternativas encontradas!', + albumNotOnDeezer: 'Album not found on deezer! Álbum não encontrado no deezer!', + notOnDeezer: 'Faixa indisponível no deezer!', + notEncoded: 'Faixa ainda não codificada!', + notEncodedNoAlternative: 'Faixa ainda não codificada e sem alternativas encontradas!', wrongBitrate: 'Faixa não encontrada no bitrate desejado.', - wrongBitrateNoAlternative: 'Faixa não encontrada no bitrate desejado e sem alternativas encontradas!', - no360RA: 'Faixa não disponível no Reality Audio 360.', - notAvailable: 'Faixa não disponível nos servidores do deezer!', - notAvailableNoAlternative: 'Faixa não disponível nos servidores do deezer e sem alternativas encontradas!' + wrongBitrateNoAlternative: 'Faixa não encontrada no bitrate desejado e nenhuma outra alternativa encontrada!', + no360RA: 'Faixa não disponível na qualidade Reality Audio 360.', + notAvailable: "Faixa não disponível nos servidores do deezer!", + notAvailableNoAlternative: "Faixa não disponível nos servidores do deezer e nenhuma outra alternativa encontrada!" } }, favorites: { - title: 'Favorites', - noPlaylists: 'Nenhuma playlists favorita encontrada', - noAlbums: 'Nenhum álbum favorito encontrado', - noArtists: 'Nenhum artista favorito encontrado', - noTracks: 'Nenhuma faixa favorita encontrada' + title: 'Favoritos', + noPlaylists: 'Nenhuma Playlist encontrada', + noAlbums: 'Nenhum Álbum Favorito encontrado', + noArtists: 'Nenhum Artista Favorito encontrado', + noTracks: 'Nenhuma Faixa Favorita encontrada' }, home: { - needTologin: 'Você precisa logar na sua conta do Deezer antes de poder começar a baixar.', - openSettings: 'Abrir configurações', + needTologin: 'Você precisa logar na sua conta do deezer antes de começar a baixar músicas.', + openSettings: 'Abrir Configurações', sections: { - popularPlaylists: 'Playlists populares', + popularPlaylists: 'Playlists Populares', popularAlbums: 'Álbuns mais ouvidos' } }, linkAnalyzer: { - info: 'Você pode usar esta seção para descobrir mais informações sobre o link que está tentando baixar.', + info: 'Você pode usar essa seção para encontrar mais informações sobre o link que você quer baixar.', useful: - 'Esta função é útil caso esteja tentando baixar algumas faixas que não estão disponíveis no seu país e você quer descobrir aonde estão disponíveis, por exemplo.', - linkNotSupported: 'Este link não é suportado ainda', - linkNotSupportedYet: 'Aparentemente este link ainda não é suportado, tente analizar algum outro.', + "Isso é útil se você está tentando baixar algumas faixas que não estão disponíveis no seu país, e quer saber onde elas estão disponíveis, por exemplo.", + linkNotSupported: 'Esse link não é suportado ainda', + linkNotSupportedYet: 'Parece que esse link não é suportado ainda, tente analizar outro.', table: { id: 'ID', isrc: 'ISRC', upc: 'UPC', duration: 'Duração', - diskNumber: 'Número do disco', - trackNumber: 'Número da faixa', - releaseDate: 'Data de lançamento', + diskNumber: 'Número do Disco', + trackNumber: 'Número da Faixa', + releaseDate: 'Data de Lançamento', bpm: 'BPM', label: 'Gravadora', - recordType: 'Tipo de gravação', + recordType: 'Tipo de Gravação', genres: 'Gêneros', - tracklist: 'Lista de faixas' + tracklist: 'Tracklist' } }, search: { - startSearching: 'Comece a procurar!', + startSearching: 'Comece pesquisando!', description: - 'Você pode procurar uma faixa, um álbum inteiro, um artista, uma playlist... tudo! Você também pode colar um link do Deezer', + 'Você pode pesquisar uma música, um álbum, um artista, uma playlist.... tudo! Você também pode colar um link do Deezer', fans: '{0} fãs', noResults: 'Sem resultados', - noResultsTrack: 'Nenhuma faixa encontrada', - noResultsAlbum: 'Nenhum álbum encontrado', - noResultsArtist: 'Nenhum artista encontrado', - noResultsPlaylist: 'Nenhuma playlist encontrada' + noResultsTrack: 'Nenhuma Faixa encontrada', + noResultsAlbum: 'Nenhum Álbum encontrado', + noResultsArtist: 'Nenhum Artista encontrado', + noResultsPlaylist: 'Nenhuma Playlist encontrada' }, - searchbar: 'Pesquise tudo o que quiser (ou simplesmente cole um link)', + searchbar: 'Pesquise algo (ou apenas cole um link)', downloads: 'downloads', toasts: { - addedToQueue: '{0} adicionado à lista de espera', - alreadyInQueue: '{0} já está na lista de espera!', - finishDownload: '{0} terminou de baixar.', - allDownloaded: 'Todos os downloads terminaram!', + addedToQueue: '{0} adicionado à fila', + alreadyInQueue: '{0} já está na fila!', + finishDownload: '{0} download terminado.', + allDownloaded: 'Todos os downloads foram feitos!', refreshFavs: 'Atualização completa!', - loggingIn: 'Entrando na conta', - loggedIn: 'Conta logada', - alreadyLogged: 'Já está na conta', - loginFailed: 'Não pode entrar na conta', - loggedOut: 'Saindo da conta', + loggingIn: 'Logando', + loggedIn: 'Logado', + alreadyLogged: 'Você já está logado', + loginFailed: "Não foi possivel entrar", + loggedOut: 'Desconectando', cancellingCurrentItem: 'Cancelando item atual.', - currentItemCancelled: 'Cancelado item atual.', - startAddingArtist: 'Adicionando {0} álbuns à lista de espera', - finishAddingArtist: '{0} álbuns adicionados à lista de espera', - startConvertingSpotifyPlaylist: 'Convertendo faixas do Spotify para faixas do Deezer', - finishConvertingSpotifyPlaylist: 'Playlist do Spotify convertida' + currentItemCancelled: 'Item atual cancelado.', + startAddingArtist: 'Adicionando {0} álbuns à fila', + finishAddingArtist: '{0} álbuns adicionados a fila', + startConvertingSpotifyPlaylist: 'Convertendo faixas do spotify para faixas do deezer', + finishConvertingSpotifyPlaylist: 'Playlists do Spotify convertidas' }, settings: { title: 'Configurações', - languages: 'Linguagens', + languages: 'Idiomas', login: { title: 'Login', - loggedIn: 'Você já está logado como {username}', + loggedIn: 'Você está logado como {username}', arl: { - question: 'Como eu pego a minha ARL?', - update: 'Atualizar a ARL' + question: 'Como eu consigo o meu ARL?', + update: 'Atualizar ARL' }, logout: 'Sair' }, appearance: { title: 'Aparência', - slimDownloadTab: 'Guia de download slim' + slimDownloadTab: 'Aba de download slim' }, downloadPath: { - title: 'Diretório de download' + title: 'Diretório de Downloads' }, templates: { title: 'Templates', - tracknameTemplate: 'Template do nome da faixa avulsa', - albumTracknameTemplate: 'Template do nome da faixa no álbum', - playlistTracknameTemplate: 'Template do nome da faixa na playlist' + tracknameTemplate: 'Template do nome da faixa', + albumTracknameTemplate: 'Template da faixa do álbum', + playlistTracknameTemplate: 'Template da faixa da playlist' }, folders: { title: 'Pastas', createPlaylistFolder: 'Criar pasta para playlists', - playlistNameTemplate: 'Template do nome da pasta da playlist', - createArtistFolder: 'Criar pasta para artistas', - artistNameTemplate: 'Template do nome da pasta do artista', + playlistNameTemplate: 'Template da pasta de playlist', + createArtistFolder: 'Criar pasta para os artistas', + artistNameTemplate: 'Template da pasta de artistas', createAlbumFolder: 'Criar pasta para álbuns', - albumNameTemplate: 'Template do nome da pasta do álbum', - createCDFolder: 'Criar pasta para discos', - createStructurePlaylist: 'Criar estrutura de pasta para playlists', - createSingleFolder: 'Criar estrutura de pasta para singles' + albumNameTemplate: 'Template da pasta de álbuns', + createCDFolder: 'Criar pasta para CDs', + createStructurePlaylist: 'Criar estrutura de pastas para playlists', + createSingleFolder: 'Criar estrutura de pastas para singles' }, trackTitles: { - title: 'Títulos das faixas', - padTracks: 'Pad das faixas', - paddingSize: 'Substituir tamanho do padding', - illegalCharacterReplacer: 'Substituto de caracter ilegal' + title: 'Título das faixas', + padTracks: 'Faixas com pad', + paddingSize: 'Sobrescrever tamanho do padding', + illegalCharacterReplacer: 'Substituir caracteres inválidos' }, downloads: { title: 'Downloads', - queueConcurrency: 'Downloads simultâneos', + queueConcurrency: 'Downloads Simultâneos', maxBitrate: { - title: 'Bitrate preferido', + title: 'Escolher Taxa de Bits', 9: 'FLAC 1411kbps', 3: 'MP3 320kbps', 1: 'MP3 128kbps' }, overwriteFile: { - title: 'Posso substituir os arquivos?', - y: 'Sim, substitua os arquivos', - n: 'Não, não substitua os arquivos', - t: 'Substitua apenas as tags' + title: 'Sobrescrever arquivos?', + y: 'Sim, sobrescrever arquivos', + n: "Não, não sobrescrever arquivos", + t: 'Sobrescrever apenas as tags' }, - fallbackBitrate: 'Bitrate reserva', - fallbackSearch: 'Pesquisa reserva', - logErrors: 'Criar log para erros', - logSearched: 'Criar log para faixas pesquisadas', + fallbackBitrate: 'Taxa de bits reserva', + fallbackSearch: 'Procurar reserva', + logErrors: 'Criar arquivos de log para erros', + logSearched: 'Criar arquivos de log para faixas pesquisadas', createM3U8File: 'Criar arquivo de playlist', - syncedLyrics: 'Criar arquivos .lyr (Letras sincronizadas)', - playlistFilenameTemplate: 'Template do nome da playlist', - saveDownloadQueue: 'Salvar lista de espera do download ao fechar o programa' + syncedLyrics: 'Criar arquivos .lyr (Letras)', + playlistFilenameTemplate: 'Template do nome do arquivo da playlist', + saveDownloadQueue: 'Salvar a fila de downloads quando fechar o app' }, covers: { title: 'Capa dos álbuns', - saveArtwork: 'Salvar as capas', + saveArtwork: 'Salvar capas', coverImageTemplate: 'Template do nome da capa', saveArtworkArtist: 'Salvar imagem do artista', artistImageTemplate: 'Template da imagem do artista', - localArtworkSize: 'Tamanho da artwork local', - embeddedArtworkSize: 'Tamanho da artwork embutida', + localArtworkSize: 'Tamanho da capa local', + embeddedArtworkSize: 'Tamanho da capa embutida', localArtworkFormat: { - title: 'Qual formato você quer que a artwork local seja?', - jpg: 'Uma imagem jpeg', - png: 'Uma imagem png', - both: 'Ambos um jpeg e um png' + title: 'Qual o formato da imagem que você quer para a capa local?', + jpg: '.jpeg', + png: '.png', + both: 'Ambas, .jpeg e .png' }, - jpegImageQuality: 'Qualidade do JPEG' + jpegImageQuality: 'Qualidade da imagem JPEG' }, tags: { head: 'Quais tags salvar', title: 'Título', artist: 'Artista', - album: 'Álbuns', + album: 'Álbum', cover: 'Capa', - trackNumber: 'Número da faixa', - trackTotal: 'Total de faixas', - discNumber: 'Número de discos', - discTotal: 'Total de discos', - albumArtist: 'Artista do álbum', + trackNumber: 'Número da Faixa', + trackTotal: 'Total de Faixas', + discNumber: 'Número de Discos', + discTotal: 'Total de Discos', + albumArtist: 'Artista do Álbum', genre: 'Gênero', year: 'Ano', date: 'Data', - explicit: 'Letras explícitas', + explicit: 'Letras Explícitas', isrc: 'ISRC', - length: 'Tamanho da faixa', - barcode: 'Barcode do álbum (UPC)', + length: 'Tamanho da Faixa', + barcode: 'Código de Barras do álbum (UPC)', bpm: 'BPM', replayGain: 'Replay Gain', - label: 'Gravadora do álbum', - lyrics: 'Letras desincronizadas', + label: 'Gravadora', + lyrics: 'Letras Dessincronizadas', copyright: 'Copyright', composer: 'Compositor', - involvedPeople: 'Pessoas involvidas' + involvedPeople: 'Pessoas Envolvidas' }, other: { title: 'Outros', - savePlaylistAsCompilation: 'Savar playlists como uma compilação', + savePlaylistAsCompilation: 'Salvar playlists como uma compilação', useNullSeparator: 'Usar separador nulo', saveID3v1: 'Salvar ID3v1', multiArtistSeparator: { - title: 'Como gostaria de separar seus artistas?', + title: 'Como você gostaria de separar os artistas?', nothing: 'Salvar apenas o artista principal', - default: 'Usando especificação padrão', - andFeat: 'Usando & e feat.', - using: 'Usando "{0}"' + default: 'Usar a especificação padrão', + andFeat: 'Usar & e feat.', + using: 'Usar "{0}"' }, - singleAlbumArtist: 'Salvar apenas o artista principal do álbum', - albumVariousArtists: 'Manter "Various Artists" em Artistas do Álbum', - removeAlbumVersion: 'Remover "Album Version" do título de faixas', - removeDuplicateArtists: 'Remover combinações de artistas', + singleAlbumArtist: 'Salvar apenas o artista principal', + albumVariousArtists: 'Manter "Various Artists" nos Artistas do Álbum', + removeAlbumVersion: 'Remover "Album Version" do título da faixa', + removeDuplicateArtists: 'Remover combinação de artistas', dateFormat: { title: 'Formato da data para arquivos FLAC', year: 'AAAA', @@ -293,43 +292,43 @@ day: 'DD' }, featuredToTitle: { - title: 'O que eu deveria fazer com os artistas feat.?', + title: 'O que devo fazer com artistas participantes?', 0: 'Nada', - 1: 'Remova-os do título da faixa', - 3: 'Remova-os do título da faixa e do álbum', - 2: 'Mova-os para o título da faixa' + 1: 'Remova do título da faixa', + 3: 'Remova do título da faixa e do álbum', + 2: 'Mover para o título da faixa' }, titleCasing: 'Formatação do título', artistCasing: 'Formatação do artista', casing: { - nothing: 'Manter intocado', + nothing: 'Manter inalterado', lower: 'minúsculo', upper: 'MAIÚSCULO', - start: 'No Começo De Cada Palavra', + start: 'Começo De Cada Palavra', sentence: 'Como uma frase' }, - previewVolume: 'Volume da prévia', + previewVolume: 'Prévia do Volume', executeCommand: { - title: 'Comando para executar depois do download', - description: 'Deixe em branco para não executar nada' + title: 'Comando para executar depois de baixar', + description: 'Deixe em branco para nenhuma ação' } }, spotify: { - title: 'Destaques do Spotify', + title: 'Recursos do Spotify', clientID: 'Spotify clientID', clientSecret: 'Spotify Client Secret', - username: 'Nome de usuário do Spotify' + username: 'usuário do Spotify' }, - reset: 'Resetar para Padrão', - save: 'Save', + reset: 'Restaurar para o padrão', + save: 'Salvar', toasts: { init: 'Configurações carregadas!', update: 'Configurações atualizadas!', - ARLcopied: 'ARL copiado para o clipboard' + ARLcopied: 'ARL copiada para a área de transferência' } }, sidebar: { - home: 'home', + home: 'início', search: 'pesquisa', charts: 'charts', favorites: 'favoritos', @@ -342,4 +341,4 @@ } } -export default ptBr +export default pt_br diff --git a/src/lang/pt-pt.js b/src/lang/pt-pt.js index 2783985..7e22fab 100644 --- a/src/lang/pt-pt.js +++ b/src/lang/pt-pt.js @@ -6,7 +6,7 @@ const pt = { download: 'Transferir {0}', by: 'por {0}', in: 'em {0}', - download_hint: 'Descarregar', + download_hint: 'Transferir', play_hint: 'Tocar', toggle_download_tab_hint: 'Expandir/Recolher', clean_queue_hint: 'Limpar Finalizados', @@ -71,7 +71,7 @@ const pt = { charts: { title: 'Tabelas', changeCountry: 'Alterar país', - download: 'Descarregar tabela' + download: 'Transferir tabela' }, errors: { title: 'Erros para {0}', @@ -79,7 +79,7 @@ const pt = { invalidURL: 'URL não reconhecido', unsupportedURL: 'URL ainda não suportado', ISRCnotOnDeezer: 'Faixa ISRC não disponível no deezer', - notYourPrivatePlaylist: "Nao podes baixar listas de reprodução privado dos outros.", + notYourPrivatePlaylist: "Nao podes baixar listas de reprodução privadas de outros.", spotifyDisabled: 'Funcionalidades do Spotify não estão definidas corretamente.', trackNotOnDeezer: 'Faixa não encontrada no deezer!', albumNotOnDeezer: 'Álbum não encontrado no deezer!', @@ -123,7 +123,7 @@ const pt = { releaseDate: 'Data de lançamento', bpm: 'BPM', label: 'Editora', - recordType: 'Tipo de Recorde', + recordType: 'Tipo de Disco', genres: 'Géneros', tracklist: 'Lista de faixas' } @@ -166,7 +166,7 @@ const pt = { loggedIn: 'Estás autenticado como {username}', arl: { question: 'Como obter o meu ARL?', - update: 'Atualizar ARL' + update: 'Actualizar ARL' }, logout: 'Sair' }, @@ -175,7 +175,7 @@ const pt = { slimDownloadTab: 'Aba de transferências estreita' }, downloadPath: { - title: 'Caminho de transferências' + title: 'Caminho das transferências' }, templates: { title: 'Formatos', @@ -199,7 +199,7 @@ const pt = { title: 'Título', padTracks: 'Bloco de Faixas', paddingSize: 'Substituir tamanho do preenchimento', - illegalCharacterReplacer: 'Substituir caractere inválidos' + illegalCharacterReplacer: 'Substituir caractere inválido' }, downloads: { title: 'Transferências', @@ -216,12 +216,12 @@ const pt = { n: 'Não substituir o ficheiro', t: 'Subescrever apenas as etiquetas' }, - fallbackBitrate: 'Reserva de taxa de bits', - fallbackSearch: 'reserva de pesquisa', + fallbackBitrate: 'Bitrate fallback', + fallbackSearch: 'Fallback de pesquisa', logErrors: 'Criar histórico para erros', logSearched: 'Criar histórico para faixas pesquisadas', createM3U8File: 'Criar ficheiro de lista de reprodução', - syncedLyrics: 'Criar ficheiro .lyr (Letras Sincronizadas)', + syncedLyrics: 'Criar ficheiro .lyr (Letra Sincronizada)', playlistFilenameTemplate: 'Formato do nome de ficheiro da lista de reprodução', saveDownloadQueue: 'Guardar fila de transferências ao fechar a aplicação' }, @@ -234,10 +234,10 @@ const pt = { localArtworkSize: 'Tamanho do trabalho artístico local', embeddedArtworkSize: 'Tamanho do trabalho artístico incorporado', localArtworkFormat: { - title: 'Que formato você deseja que o trabalho artístico local seja?', - jpg: 'Uma imagem jpeg', - png: 'Uma imagem png', - both: 'Os dois um jpeg e um png' + title: 'Em que formato desejas o trabalho artístico local?', + jpg: 'Em imagem jpeg', + png: 'Em imagem png', + both: 'Em jpeg e em png' }, jpegImageQuality: 'Qualidade de imagem JPEG' }, @@ -260,16 +260,16 @@ const pt = { length: 'Duração da faixa', barcode: 'Código de barras do álbum (UPC)', bpm: 'BPM', - replayGain: 'Ganho de Repeticao', + replayGain: 'ReplayGain', label: 'Editora do álbum', - lyrics: 'Letra da música não sincronizado', - copyright: 'Direito Autoral', + lyrics: 'Letra da música não sincronizada', + copyright: 'Direitos de Autor', composer: 'Compositor', involvedPeople: 'Pessoas envolvidas' }, other: { title: 'Outros', - savePlaylistAsCompilation: 'Guardar a lista de reproducao como uma compilacao', + savePlaylistAsCompilation: 'Guardar listas de reprodução como compilação', useNullSeparator: 'Usar separador nulo', saveID3v1: 'Também guardar ID3v1', multiArtistSeparator: { @@ -284,16 +284,16 @@ const pt = { removeAlbumVersion: 'Remover "Album Version" do título da faixa', removeDuplicateArtists: 'Remover combinação de artistas', dateFormat: { - title: 'Formtado de data nos ficheiros FLAC', + title: 'Formato de data nos ficheiros FLAC', year: 'AAAA', month: 'MM', day: 'DD' }, featuredToTitle: { - title: 'O que devo fazer com os artistas em destaque?', + title: 'O que devo fazer com artistas convidados/participações?', 0: 'Nada', 1: 'Remover do título', - 3: 'Remover do título de do título do album', + 3: 'Remover do título e do título do album', 2: 'Movê-lo para o título' }, titleCasing: 'Caixa do Título', @@ -301,11 +301,11 @@ const pt = { casing: { nothing: 'Manter inalterado', lower: 'minusculas', - upper: 'MAIÙSCULAS', - start: 'Ínicio De Cada Palavra', + upper: 'MAIÚSCULAS', + start: 'Início De Cada Palavra', sentence: 'Como uma frase' }, - previewVolume: 'Pre visualizacao do volume', + previewVolume: 'Volume de Pré-visualização', executeCommand: { title: 'Comando a executar após transferir', description: 'Deixar em branco para nenhuma acção' @@ -317,7 +317,7 @@ const pt = { clientSecret: 'Spotify Client Secret', username: 'nome de utilizador Spotify' }, - reset: 'Restaurar para o padrao', + reset: 'Repor configurações padrão', save: 'Guardar', toasts: { init: 'Configurações carregadas!', @@ -330,12 +330,12 @@ const pt = { search: 'pesquisa', charts: 'tabelas', favorites: 'favoritos', - linkAnalyzer: 'Analizador de Links', + linkAnalyzer: 'analizador de links', settings: 'definições', about: 'sobre' }, tracklist: { - downloadSelection: 'Descarregar seleccionados' + downloadSelection: 'Transferir seleccionados' } } diff --git a/src/lang/vn.js b/src/lang/vn.js new file mode 100644 index 0000000..954ccda --- /dev/null +++ b/src/lang/vn.js @@ -0,0 +1,345 @@ +const vn = { + globals: { + welcome: 'Chào mừng đến với deemix', + back: 'trở lại', + loading: 'đang tải', + download: 'Tải xuống {0}', + by: 'bởi {0}', + in: 'trong {0}', + download_hint: 'Tải xuống', + play_hint: 'Phát', + toggle_download_tab_hint: 'Mở rộng/Giấu', + clean_queue_hint: 'Xóa những file đã tải xong', + cancel_queue_hint: 'Hủy tất cả', + listTabs: { + empty: '', + all: 'tất cả', + top_result: 'kết quả hàng đầu', + album: 'album | album', + artist: 'Nghệ sĩ | Nghệ sĩ', + single: 'đơn | đơn', + title: 'tiêu đề | tiêu đề', + track: 'Bài hát | Bài hát', + trackN: '0 Bài hát | {n} Bài hát | {n} Bài hát', + releaseN: '0 sản phẩm | {n} sản phẩm | {n} sản phẩm', + playlist: 'playlist | playlist', + compile: 'tổng hợp | tổng hợp', + ep: 'ep | ep', + spotifyPlaylist: 'playlist của spotify | playlist của spotify', + releaseDate: 'ngày phát hành', + error: 'lỗi' + } + }, + about: { + titles: { + usefulLinks: 'Link hữu dụng', + bugReports: 'Báo lỗi', + contributing: 'Đóng góp', + donations: 'Quyên góp', + license: 'Bằng phép' + }, + subtitles: { + bugReports: "Bạn thấy có gì đó không hoạt động trong deemix? Xin hãy báo với chúng tôi!", + contributing: 'Bạn muốn đóng góp cho dự án này? Bạn có thể làm điều đó với nhiều cách khác nhau!', + donations: 'Bạn muốn ủng hộ kinh phí? Bạn có thể quyên góp tại đây!' + }, + usesLibrary: 'Ứng dụng này sử dụng thư viện deemix, bạn có thể dùng nó để tạo một UI riêng cho deemix.', + thanks: `Cảm ơn rtonno, uhwotlollilol đã giúp tôi với dự án này và BasCurtizscarvimane với việc thiết kế biểu tượng.`, + upToDate: `Cập nhật app bằng cách theo dõi kênh tin tức trên Telegram.`, + officialWebsite: 'Website chính thức', + officialRepo: 'Repo thư viện chính thức', + officialWebuiRepo: 'Repo WebUI chính thức', + officialSubreddit: 'Subreddit chính thức', + newsChannel: 'Kênh tin tức', + questions: `Nếu bạn có câu hỏi hoặc vấn đề về ứng dụng này, xin hãy tìm giải pháp trên subreddit trước. Sau đó, nếu bạn không tìm được gì thì bạn có thể tạo một bài đăng về vấn đề của bạn trên subreddit dó.`, + beforeReporting: `Trước khi báo lỗi hãy đảm bảo bạn đang sử dụng phiên bản mới nhất của ứng dụng và lỗi bạn đang gặp không phải là do bạn.`, + beSure: `Hãy đảm bảo là lỗi này vẫn có thể xảy ra trên các thiết bị khác và XIN ĐỪNG báo lỗi đã được báo rồi.`, + duplicateReports: 'Những bản báo lỗi trùng nhau sẽ bị đóng, xin bạn hãy để ý điều này.', + dontOpenIssues: `XIN ĐỪNG mở vấn đề để hỏi, bạn có thể dùng subreddit trên cho việc đó.`, + newUI: `Nếu bạn thành thạo với python bạn có thể tạo một UI mới bằng cách sử dụng thư viện gốc, hoặc sửa lỗi trong thư viện đó với một pull request trên repo này.`, + acceptFeatures: `Tôi có chấp nhận yêu cầu về tính năng mới nhưng không quá phức tạp bởi vì chúng có thể được triển khai trực tiếp vào ứng dụng thay vì vào thư viện.`, + otherLanguages: `Nếu bạn thành thạo với một ngôn ngữ khác, bạn có thể port deemix sang ngôn ngữ đó!`, + understandingCode: `Bạn muốn hiểu code của deemix? Xin hãy liên lạc RemixDev trên Telegram hoặc Reddit.`, + contributeWebUI: `Nếu bạn biết Vue.js (JavaScript), HTML hoặc CSS, bạn có thể góp phần phát triển WebUI.`, + itsFree: `Bạn nên nhớ rằng đây là một dự án phi lợi nhuậnbạn nên ủng hộ những Nghệ sĩ yêu thích của bạn trước khi ủng hộ nhà phát triển.`, + notObligated: `Đừng nghĩ rằng bạn phải đóng góp tiền, tôi vẫn sẽ rất biết ơn bạn!`, + lincensedUnder: `Dự án này được cấp phép bởi + GNU General Public License 3.0.` + }, + charts: { + title: 'Bảng xếp hạng', + changeCountry: 'Thay đổi quốc gia', + download: 'Tải xuống bảng xếp hạng này' + }, + errors: { + title: 'Lỗi {0}', + ids: { + invalidURL: 'Không nhận diện được URL', + unsupportedURL: 'URL này chưa được hỗ trợ', + ISRCnotOnDeezer: 'ISRC của bài hát này hiện không có trên Deezer', + notYourPrivatePlaylist: "Bạn không thể tải xuống playlist riêng của người khác.", + spotifyDisabled: 'Chức năng Spotify chưa được thiết lập đúng cách.', + trackNotOnDeezer: 'Bài hát không có trên Deezer!', + albumNotOnDeezer: 'Album không có trên Deezer!', + notOnDeezer: 'Bài hát chưa có trên Deezer!', + notEncoded: 'Bài hát chưa được encode!', + notEncodedNoAlternative: 'Bài hát chưa được encode và không có bản thay thế nào khác!', + wrongBitrate: 'Bài hát này không có ở bitrate bạn muốn.', + wrongBitrateNoAlternative: 'Bài hát này không có ở bitrate bạn muốn và không có bản thay thế nào khác!', + no360RA: 'Bài hát này không có ở dạng Reality Audio 360.', + notAvailable: "Bài hát này không có trên server của Deezer!", + notAvailableNoAlternative: "Bài hát này không có trên server của Deezer và không có bản thay thế nào khác!" + } + }, + favorites: { + title: 'Yêu thích', + noPlaylists: 'Không tìm được Playlist', + noAlbums: 'Không tìm được Album Yêu thích', + noArtists: 'Không tìm được Nghệ sĩ Yêu thích', + noTracks: 'Không tìm được Bài hát Yêu thích' + }, + home: { + needTologin: 'Bạn cần phải đăng nhập vào tài khoản Deezer trước khi bắt đầu tải xuống.', + openSettings: 'Mở Cài đặt', + sections: { + popularPlaylists: 'Playlist Nổi tiếng', + popularAlbums: 'Album được stream nhiều nhất' + } + }, + linkAnalyzer: { + info: 'Bạn có thể sử dụng chức năng này để kiếm thêm thông tin về đường link mà bạn muốn tải xuống.', + useful: + "Chức năng này rất hữu dụng nếu bạn muốn tải các bài hát hiện không có sẵn ở quốc gia của bạn và muốn biết các quốc gia được hỗ trợ.", + linkNotSupported: 'Đường link này chưa được hỗ trợ', + linkNotSupportedYet: 'Đường link này chưa được hỗ trợ, xin hãy thử lại với một đường link khác.', + table: { + id: 'ID', + isrc: 'ISRC', + upc: 'UPC', + duration: 'Thời lượng', + diskNumber: 'Số đĩa', + trackNumber: 'Số bài hát', + releaseDate: 'Ngày phát hành', + bpm: 'BPM', + label: 'Hãng', + recordType: 'Loại Thu âm', + genres: 'Thể loại', + tracklist: 'Danh sách các bài hát' + } + }, + search: { + startSearching: 'Bắt đầu tìm kiếm!', + description: + 'Bạn có thể tìm một bài hát, album, nghệ sĩ, playlist, v.v...! Bạn cũng có thể dùng link của Deezer', + fans: '{0} người hâm mộ', + noResults: 'Không có kết quả', + noResultsTrack: 'Không tìm được bài hát nào', + noResultsAlbum: 'Không tìm được album nào', + noResultsArtist: 'Không tìm được nghệ sĩ nào', + noResultsPlaylist: 'Không tìm được playlist nào' + }, + searchbar: 'Tìm những gì bạn muốn (bạn cũng có thể sữ dụng một đường link)', + downloads: 'Tải xuống', + toasts: { + addedToQueue: '{0} đã được đưa vào hàng chờ', + alreadyInQueue: '{0} đã đang trong hàng chờ!', + finishDownload: '{0} đã tải xong.', + allDownloaded: 'Tất cả các bài hát đã được tải xuống!', + refreshFavs: 'Tải lại hoàn tất!', + loggingIn: 'Đang đăng nhập', + loggedIn: 'Đăng nhập thành công', + alreadyLogged: 'Đã đăng nhập', + loginFailed: "Không thể đăng nhập", + loggedOut: 'Đăng xuất', + cancellingCurrentItem: 'Đang hủy file hiện tại.', + currentItemCancelled: 'File hiện tại đã bị hủy.', + startAddingArtist: 'Đang đưa {0} album vào hàng chờ', + finishAddingArtist: 'Đã đưa {0} album vào hàng chờ', + startConvertingSpotifyPlaylist: 'Đang chuyển đổi các bài hát từ Spotify sang Deezer', + finishConvertingSpotifyPlaylist: 'Playlist của Spotify đã được chuyển đổi', + loginNeededToDownload: 'Bạn cần phải đang nhập để tải nhạc!' + }, + settings: { + title: 'Cài đặt', + languages: 'Ngôn ngữ', + login: { + title: 'Đăng nhập', + loggedIn: 'Bạn đã đăng nhập với tên {username}', + arl: { + question: 'Làm cách nào để có ARL của tôi?', + update: 'Cập nhật ARL' + }, + logout: 'Đăng xuất' + }, + appearance: { + title: 'Giao diện', + slimDownloadTab: 'Thanh tải xuống nhỏ' + }, + downloadPath: { + title: 'Nơi tải xuống' + }, + templates: { + title: 'Bản mẫu', + tracknameTemplate: 'Bài hát mẫu', + albumTracknameTemplate: 'Bài hát trong album mẫu', + playlistTracknameTemplate: 'Bài hát trong playlist mẫu' + }, + folders: { + title: 'Thư mục', + createPlaylistFolder: 'Tạo thư mục cho playlist', + playlistNameTemplate: 'Thư mục playlist mẫu', + createArtistFolder: 'Tạo thư mục cho nghệ sĩ', + artistNameTemplate: 'Thư mục Nghệ sĩ mẫu', + createAlbumFolder: 'Tạo thư mục cho album', + albumNameTemplate: 'Thư mục cho album mẫu', + createCDFolder: 'Tạo thư mục cho đĩa CD', + createStructurePlaylist: 'Tạo thư mục có kết cấu cho playlist', + createSingleFolder: 'Tạo thư mục có kết cấu cho đĩa đơn' + }, + trackTitles: { + title: 'Tên bài hát', + padTracks: 'Đệm tên bài hát', + paddingSize: 'Ghì đè kích cỡ phần đệm', + illegalCharacterReplacer: 'Thay các kí tự không hợp lệ với' + }, + downloads: { + title: 'Tải xuống', + queueConcurrency: 'Số lượng tải xuống cùng lúc', + maxBitrate: { + title: 'Bitrate ưa thích', + 9: 'FLAC 1411kbps', + 3: 'MP3 320kbps', + 1: 'MP3 128kbps' + }, + overwriteFile: { + title: 'Tôi có nên ghi đè file này không?', + y: 'Có, hãy ghi đè file này', + n: "Không, đừng ghi đè file này", + t: 'Chỉ ghi đè các tag' + }, + fallbackBitrate: 'Bitrate dự phòng', + fallbackSearch: 'Search dự phòng', + logErrors: 'Tạo file log khi có lỗi', + logSearched: 'Tạo file log khi bạn tìm Bài hát', + createM3U8File: 'Tạo file playlist', + syncedLyrics: 'Tạo file .lyr (Lời Bài hát)', + playlistFilenameTemplate: 'Tên playlist mẫu', + saveDownloadQueue: 'Lưu hàng chờ download khi đóng ứng dụng' + }, + covers: { + title: 'Bìa album', + saveArtwork: 'Lưu bìa', + coverImageTemplate: 'Tên bìa mẫu', + saveArtworkArtist: 'Lưu hình Nghệ sĩ', + artistImageTemplate: 'Hình nghệ sĩ mẫu', + localArtworkSize: 'Kích cỡ file bìa', + embeddedArtworkSize: 'Kích cỡ bìa trong file bài hát', + localArtworkFormat: { + title: 'Bạn muốn file bìa ở định dạng nào?', + jpg: 'jpg', + png: 'png', + both: 'Cả jpg và png' + }, + jpegImageQuality: 'Chất lượng file JPEG' + }, + tags: { + head: 'Những tag sẽ được lưu', + title: 'Tiêu đề', + artist: 'Nghệ sĩ', + album: 'Album', + cover: 'Bìa', + trackNumber: 'Số bài hát', + trackTotal: 'Tổng số bài hát', + discNumber: 'Số đĩa', + discTotal: 'Tổng số đĩa', + albumArtist: 'Nghệ sĩ của album', + genre: 'Thể loại', + year: 'Năm', + date: 'Ngày', + explicit: 'Lời explicit', + isrc: 'ISRC', + length: 'Thời lượng', + barcode: 'Mã vạch của album (UPC)', + bpm: 'BPM', + replayGain: 'ReplayGain', + label: 'Nhãn hiệu album', + lyrics: 'Lời', + copyright: 'Bản quyền', + composer: 'Nhà soạn nhạc', + involvedPeople: 'Những người liên quan' + }, + other: { + title: 'Khác', + savePlaylistAsCompilation: 'Lưu playlist dưới dạng tuyển tập', + useNullSeparator: 'Dùng dải phân cách null', + saveID3v1: 'Lưu ID3v1', + multiArtistSeparator: { + title: 'Bạn muốn phân cách các nghệ sĩ như thế nào?', + nothing: 'Chỉ lưu nghệ sĩ chính', + default: 'Dùng quy cách tiêu chuẩn', + andFeat: 'Dùng & và feat.', + using: 'Dùng "{0}"' + }, + singleAlbumArtist: 'Chỉ lưu Nghệ sĩ Album chính', + albumVariousArtists: 'Giữ nguyên "Nhiều Nghệ sĩ" trong Nghệ sĩ Album', + removeAlbumVersion: 'Bỏ "Phiên bản Album" khỏi tên bài hát', + removeDuplicateArtists: 'Bỏ các tên nghệ sĩ phối hợp', + dateFormat: { + title: 'Định dạng ngày cho file FLAC ', + year: 'YYYY', + month: 'MM', + day: 'DD' + }, + featuredToTitle: { + title: 'Tôi nên làm gì với các nghệ sĩ đóng góp?', + 0: 'Không làm gì cả', + 1: 'Bỏ chúng khỏi tên bài hát', + 3: 'Bỏ chúng khỏi tên bài hát và tên album', + 2: 'Đưa chúng vào tên bài hát' + }, + titleCasing: 'Định dạng tên bài hát', + artistCasing: 'Định dạng tên nghệ sĩ', + casing: { + nothing: 'Không đổi', + lower: 'chữ thường', + upper: 'CHỮ HOA', + start: 'Viết Hoa Ở Chữ Cái Đầu Tiên Của Mỗi Từ', + sentence: 'Như một câu' + }, + previewVolume: 'Âm lượng nghe thử', + executeCommand: { + title: 'Thực hiện những lệnh này khi đã tải xuống xong', + description: 'Để trống nếu bạn không muốn thực hiện lệnh nào' + } + }, + spotify: { + title: 'Chức năng Spotify', + clientID: 'ClientID của Spotify', + clientSecret: 'Client Secret của Spotify', + username: 'Tên tài khoản của Spotify' + }, + reset: 'Quay trở lại cài đặt mặc định', + save: 'Lưu', + toasts: { + init: 'Cài đặt đã được thiết lập!', + update: 'Cài đặt cập nhật thành công!', + ARLcopied: 'ARL đã được sao chép vào clipboard' + } + }, + sidebar: { + home: 'trang chủ', + search: 'tìm kiếm', + charts: 'bảng xếp hạng', + favorites: 'yêu thích', + linkAnalyzer: 'phân tích link', + settings: 'cài đặt', + about: 'thông tin' + }, + tracklist: { + downloadSelection: 'Tải xuống những mục đã chọn' + } +} + +export default vn \ No newline at end of file diff --git a/src/plugins/i18n.js b/src/plugins/i18n.js index 3dfa8c8..4b36bf6 100644 --- a/src/plugins/i18n.js +++ b/src/plugins/i18n.js @@ -9,9 +9,11 @@ import de from '@/lang/de' import fr from '@/lang/fr' import id from '@/lang/id' import pt from '@/lang/pt-pt' -import ptBr from '@/lang/pt-br' +import pt_br from '@/lang/pt-br' import ru from '@/lang/ru' import tr from '@/lang/tr' +import vn from '@/lang/vn' +import hr from '@/lang/hr' Vue.use(VueI18n) @@ -27,9 +29,11 @@ const locales = { fr, id, pt, - ptBr, + pt_br, ru, - tr + tr, + vn, + hr } const i18n = new VueI18n({ diff --git a/src/plugins/router.js b/src/plugins/router.js index ff18b4a..1520f80 100644 --- a/src/plugins/router.js +++ b/src/plugins/router.js @@ -3,8 +3,6 @@ import VueRouter from 'vue-router' import TracklistTab from '@components/TracklistTab.vue' -console.log(TracklistTab) - Vue.use(VueRouter) const routes = [ @@ -29,7 +27,6 @@ const router = new VueRouter({ }) router.beforeEach((to, from, next) => { - console.log({ from, to }) next() }) diff --git a/src/utils/flags.js b/src/utils/flags.js index 3dad2c1..3c3205b 100644 --- a/src/utils/flags.js +++ b/src/utils/flags.js @@ -8,6 +8,8 @@ import pt from 'svg-country-flags/svg/pt.svg' import br from 'svg-country-flags/svg/br.svg' import ru from 'svg-country-flags/svg/ru.svg' import tr from 'svg-country-flags/svg/tr.svg' +import vn from 'svg-country-flags/svg/vn.svg' +import hr from 'svg-country-flags/svg/hr.svg' export default { it, @@ -17,7 +19,9 @@ export default { fr, id, pt, - ptBr: br, + pt_br: br, ru, - tr + tr, + vn, + hr } diff --git a/src/utils/toasts.js b/src/utils/toasts.js index 196ff88..eb7dfb4 100644 --- a/src/utils/toasts.js +++ b/src/utils/toasts.js @@ -44,6 +44,7 @@ export const toast = function(msg, icon = null, dismiss = true, id = null) { } if (toastObj && dismissable) { toastObj.hideToast() + if (id) delete toastsWithId[id] } } }).showToast()