diff --git a/core/templates/login.php b/core/templates/login.php index c200dfe366b5a90dcad28d63966a799f7e58fef8..221242c0dcb78dab1d18da20295a71d3f4d254cc 100644 --- a/core/templates/login.php +++ b/core/templates/login.php @@ -68,7 +68,6 @@ script('core', [ diff --git a/core/templates/twofactorshowchallenge.php b/core/templates/twofactorshowchallenge.php index 20b92be952020057f1383f2b3d9c3d396ac25def..4f3741b5dfecd4980ad244fe60a26abcbbf61ce7 100644 --- a/core/templates/twofactorshowchallenge.php +++ b/core/templates/twofactorshowchallenge.php @@ -3,6 +3,8 @@ /** @var $_ array */ /* @var $error boolean */ $error = $_['error']; +/* @var $error_message string */ +$error_message = $_['error_message']; /* @var $provider OCP\Authentication\TwoFactorAuth\IProvider */ $provider = $_['provider']; /* @var $template string */ @@ -12,7 +14,11 @@ $template = $_['template'];

getDisplayName()); ?>

-

t('Error while validating your second factor')); ?>

+ +

+ +

t('Error while validating your second factor')); ?>

+
diff --git a/core/vendor/.gitignore b/core/vendor/.gitignore index fe078fdd291841ffbbc2c5430031f4aa4fd751a2..19bd084f76effa763d70707432711ea9dd7ad883 100644 --- a/core/vendor/.gitignore +++ b/core/vendor/.gitignore @@ -1,12 +1,14 @@ test/ src/ bower.json +component.json .jshintrc .travis.yml CHANGELOG* Gemfile gruntfile.js Gruntfile.js +Gulpfile.js Makefile package.json README* @@ -156,3 +158,17 @@ autosize/** !autosize/dist/autosize.js !autosize/.bower.json !autosize/LICENCE.md + +#marked +marked/bin +marked/doc +marked/index.js +marked/lib +marked/man + +# DOMPurity +DOMPurify/** +!DOMPurify/dist +!DOMPurify/dist/purify.min.js +!DOMPurify/.bower.json +!DOMPurify/LICENSE \ No newline at end of file diff --git a/core/vendor/DOMPurify/.bower.json b/core/vendor/DOMPurify/.bower.json new file mode 100644 index 0000000000000000000000000000000000000000..45f4fa47258a72adc7fbe94b54f145d9098b473d --- /dev/null +++ b/core/vendor/DOMPurify/.bower.json @@ -0,0 +1,42 @@ +{ + "name": "DOMPurify", + "version": "0.8.4", + "homepage": "https://github.com/cure53/DOMPurify", + "author": "Cure53 ", + "description": "A DOM-only, super-fast, uber-tolerant XSS sanitizer for HTML, MathML and SVG", + "main": "src/purify.js", + "keywords": [ + "dom", + "xss", + "cross site scripting", + "html", + "svg", + "mathml", + "sanitizer", + "filter", + "sanitize", + "security", + "secure" + ], + "license": [ + "MPL-2.0", + "Apache-2.0" + ], + "ignore": [ + "**/.*", + "demos", + "scripts", + "test", + "website" + ], + "_release": "0.8.4", + "_resolution": { + "type": "version", + "tag": "0.8.4", + "commit": "9be8f9def3124ccf2db71b7711027b55f9b90f48" + }, + "_source": "https://github.com/cure53/DOMPurify.git", + "_target": "^0.8.4", + "_originalSource": "DOMPurify", + "_direct": true +} \ No newline at end of file diff --git a/core/vendor/DOMPurify/LICENSE b/core/vendor/DOMPurify/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..e099aad0f09fb9b72f50f093d356d9cca8f5b195 --- /dev/null +++ b/core/vendor/DOMPurify/LICENSE @@ -0,0 +1,378 @@ +DOMPurify +Copyright 2015 Mario Heiderich + +DOMPurify is free software; you can redistribute it and/or modify it under the +terms of either: + +a) the Apache License Version 2.0, or +b) the Mozilla Public License Version 2.0 + +----------------------------------------------------------------------------- + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +----------------------------------------------------------------------------- +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. “Contributor” + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. “Contributor Version” + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor’s Contribution. + +1.3. “Contribution” + + means Covered Software of a particular Contributor. + +1.4. “Covered Software” + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. “Incompatible With Secondary Licenses” + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of version + 1.1 or earlier of the License, but not also under the terms of a + Secondary License. + +1.6. “Executable Form” + + means any form of the work other than Source Code Form. + +1.7. “Larger Work” + + means a work that combines Covered Software with other material, in a separate + file or files, that is not Covered Software. + +1.8. “License” + + means this document. + +1.9. “Licensable” + + means having the right to grant, to the maximum extent possible, whether at the + time of the initial grant or subsequently, any and all of the rights conveyed by + this License. + +1.10. “Modifications” + + means any of the following: + + a. any file in Source Code Form that results from an addition to, deletion + from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. “Patent Claims” of a Contributor + + means any patent claim(s), including without limitation, method, process, + and apparatus claims, in any patent Licensable by such Contributor that + would be infringed, but for the grant of the License, by the making, + using, selling, offering for sale, having made, import, or transfer of + either its Contributions or its Contributor Version. + +1.12. “Secondary License” + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. “Source Code Form” + + means the form of the work preferred for making modifications. + +1.14. “You” (or “Your”) + + means an individual or a legal entity exercising rights under this + License. For legal entities, “You” includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, “control” means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or as + part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its Contributions + or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution become + effective for each Contribution on the date the Contributor first distributes + such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under this + License. No additional rights or licenses will be implied from the distribution + or licensing of Covered Software under this License. Notwithstanding Section + 2.1(b) above, no patent license is granted by a Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party’s + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of its + Contributions. + + This License does not grant any rights in the trademarks, service marks, or + logos of any Contributor (except as may be necessary to comply with the + notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this License + (see Section 10.2) or under the terms of a Secondary License (if permitted + under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its Contributions + are its original creation(s) or it has sufficient rights to grant the + rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under applicable + copyright doctrines of fair use, fair dealing, or other equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under the + terms of this License. You must inform recipients that the Source Code Form + of the Covered Software is governed by the terms of this License, and how + they can obtain a copy of this License. You may not attempt to alter or + restrict the recipients’ rights in the Source Code Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this License, + or sublicense it under different terms, provided that the license for + the Executable Form does not attempt to limit or alter the recipients’ + rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for the + Covered Software. If the Larger Work is a combination of Covered Software + with a work governed by one or more Secondary Licenses, and the Covered + Software is not Incompatible With Secondary Licenses, this License permits + You to additionally distribute such Covered Software under the terms of + such Secondary License(s), so that the recipient of the Larger Work may, at + their option, further distribute the Covered Software under the terms of + either this License or such Secondary License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices (including + copyright notices, patent notices, disclaimers of warranty, or limitations + of liability) contained within the Source Code Form of the Covered + Software, except that You may alter any license notices to the extent + required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on behalf + of any Contributor. You must make it absolutely clear that any such + warranty, support, indemnity, or liability obligation is offered by You + alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, judicial + order, or regulation then You must: (a) comply with the terms of this License + to the maximum extent possible; and (b) describe the limitations and the code + they affect. Such description must be placed in a text file included with all + distributions of the Covered Software under this License. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing basis, + if such Contributor fails to notify You of the non-compliance by some + reasonable means prior to 60 days after You have come back into compliance. + Moreover, Your grants from a particular Contributor are reinstated on an + ongoing basis if such Contributor notifies You of the non-compliance by + some reasonable means, this is the first time You have received notice of + non-compliance with this License from such Contributor, and You become + compliant prior to 30 days after Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, counter-claims, + and cross-claims) alleging that a Contributor Version directly or + indirectly infringes any patent, then the rights granted to You by any and + all Contributors for the Covered Software under Section 2.1 of this License + shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an “as is” basis, without + warranty of any kind, either expressed, implied, or statutory, including, + without limitation, warranties that the Covered Software is free of defects, + merchantable, fit for a particular purpose or non-infringing. The entire + risk as to the quality and performance of the Covered Software is with You. + Should any Covered Software prove defective in any respect, You (not any + Contributor) assume the cost of any necessary servicing, repair, or + correction. This disclaimer of warranty constitutes an essential part of this + License. No use of any Covered Software is authorized under this License + except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from such + party’s negligence to the extent applicable law prohibits such limitation. + Some jurisdictions do not allow the exclusion or limitation of incidental or + consequential damages, so this exclusion and limitation may not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts of + a jurisdiction where the defendant maintains its principal place of business + and such litigation shall be governed by laws of that jurisdiction, without + reference to its conflict-of-law provisions. Nothing in this Section shall + prevent a party’s ability to bring cross-claims or counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject matter + hereof. If any provision of this License is held to be unenforceable, such + provision shall be reformed only to the extent necessary to make it + enforceable. Any law or regulation which provides that the language of a + contract shall be construed against the drafter shall not be used to construe + this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version of + the License under which You originally received the Covered Software, or + under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a modified + version of this License if you rename the license and remove any + references to the name of the license steward (except to note that such + modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses + If You choose to distribute Source Code Form that is Incompatible With + Secondary Licenses under the terms of this version of the License, the + notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the + terms of the Mozilla Public License, v. + 2.0. If a copy of the MPL was not + distributed with this file, You can + obtain one at + http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, then +You may include the notice in a location (such as a LICENSE file in a relevant +directory) where a recipient would be likely to look for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - “Incompatible With Secondary Licenses” Notice + + This Source Code Form is “Incompatible + With Secondary Licenses”, as defined by + the Mozilla Public License, v. 2.0. + diff --git a/core/vendor/DOMPurify/dist/purify.min.js b/core/vendor/DOMPurify/dist/purify.min.js new file mode 100644 index 0000000000000000000000000000000000000000..d95d80fc231cf686c5306ffc35a2bd091c28dd2d --- /dev/null +++ b/core/vendor/DOMPurify/dist/purify.min.js @@ -0,0 +1,2 @@ +(function(e){"use strict";var t=typeof window==="undefined"?null:window;if(typeof define==="function"&&define.amd){define(function(){return e(t)})}else if(typeof module!=="undefined"){module.exports=e(t)}else{t.DOMPurify=e(t)}})(function e(t){"use strict";var r=function(t){return e(t)};r.version="0.8.4";r.removed=[];if(!t||!t.document||t.document.nodeType!==9){r.isSupported=false;return r}var n=t.document;var a=n;var i=t.DocumentFragment;var o=t.HTMLTemplateElement;var l=t.NodeFilter;var s=t.NamedNodeMap||t.MozNamedAttrMap;var f=t.Text;var c=t.Comment;var u=t.DOMParser;if(typeof o==="function"){var d=n.createElement("template");if(d.content&&d.content.ownerDocument){n=d.content.ownerDocument}}var m=n.implementation;var p=n.createNodeIterator;var v=n.getElementsByTagName;var h=n.createDocumentFragment;var g=a.importNode;var y={};r.isSupported=typeof m.createHTMLDocument!=="undefined"&&n.documentMode!==9;var b=function(e,t){var r=t.length;while(r--){if(typeof t[r]==="string"){t[r]=t[r].toLowerCase()}e[t[r]]=true}return e};var T=function(e){var t={};var r;for(r in e){if(e.hasOwnProperty(r)){t[r]=e[r]}}return t};var x=null;var k=b({},["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr","svg","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","switch","symbol","text","textpath","title","tref","tspan","view","vkern","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feMerge","feMergeNode","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmuliscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mpspace","msqrt","mystyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","#text"]);var A=null;var w=b({},["accept","action","align","alt","autocomplete","background","bgcolor","border","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","coords","datetime","default","dir","disabled","download","enctype","face","for","headers","height","hidden","high","href","hreflang","id","ismap","label","lang","list","loop","low","max","maxlength","media","method","min","multiple","name","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","rows","rowspan","spellcheck","scope","selected","shape","size","span","srclang","start","src","step","style","summary","tabindex","title","type","usemap","valign","value","width","xmlns","accent-height","accumulate","additivive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","mode","min","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","surfacescale","targetx","targety","transform","text-anchor","text-decoration","text-rendering","textlength","u1","u2","unicode","values","viewbox","visibility","vert-adv-y","vert-origin-x","vert-origin-y","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","y","y1","y2","z","zoomandpan","accent","accentunder","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","display","displaystyle","fence","frame","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]);var E=null;var S=null;var M=true;var O=false;var N=false;var L=false;var D=/\{\{[\s\S]*|[\s\S]*\}\}/gm;var _=/<%[\s\S]*|[\s\S]*%>/gm;var C=false;var z=false;var R=false;var F=false;var H=true;var B=true;var W=b({},["audio","head","math","script","style","svg","video"]);var j=b({},["audio","video","img","source"]);var G=b({},["alt","class","for","id","label","name","pattern","placeholder","summary","title","value","style","xmlns"]);var I=null;var q=n.createElement("form");var P=function(e){if(typeof e!=="object"){e={}}x="ALLOWED_TAGS"in e?b({},e.ALLOWED_TAGS):k;A="ALLOWED_ATTR"in e?b({},e.ALLOWED_ATTR):w;E="FORBID_TAGS"in e?b({},e.FORBID_TAGS):{};S="FORBID_ATTR"in e?b({},e.FORBID_ATTR):{};M=e.ALLOW_DATA_ATTR!==false;O=e.ALLOW_UNKNOWN_PROTOCOLS||false;N=e.SAFE_FOR_JQUERY||false;L=e.SAFE_FOR_TEMPLATES||false;C=e.WHOLE_DOCUMENT||false;z=e.RETURN_DOM||false;R=e.RETURN_DOM_FRAGMENT||false;F=e.RETURN_DOM_IMPORT||false;H=e.SANITIZE_DOM!==false;B=e.KEEP_CONTENT!==false;if(L){M=false}if(R){z=true}if(e.ADD_TAGS){if(x===k){x=T(x)}b(x,e.ADD_TAGS)}if(e.ADD_ATTR){if(A===w){A=T(A)}b(A,e.ADD_ATTR)}if(B){x["#text"]=true}if(Object&&"freeze"in Object){Object.freeze(e)}I=e};var U=function(e){r.removed.push({element:e});try{e.parentNode.removeChild(e)}catch(t){e.outerHTML=""}};var V=function(e,t){r.removed.push({attribute:t.getAttributeNode(e),from:t});t.removeAttribute(e)};var K=function(e){var t,r;try{t=(new u).parseFromString(e,"text/html")}catch(n){}if(!t||!t.documentElement){t=m.createHTMLDocument("");r=t.body;r.parentNode.removeChild(r.parentNode.firstElementChild);r.outerHTML=e}if(typeof t.getElementsByTagName==="function"){return t.getElementsByTagName(C?"html":"body")[0]}return v.call(t,C?"html":"body")[0]};var J=function(e){return p.call(e.ownerDocument||e,e,l.SHOW_ELEMENT|l.SHOW_COMMENT|l.SHOW_TEXT,function(){return l.FILTER_ACCEPT},false)};var Q=function(e){if(e instanceof f||e instanceof c){return false}if(typeof e.nodeName!=="string"||typeof e.textContent!=="string"||typeof e.removeChild!=="function"||!(e.attributes instanceof s)||typeof e.removeAttribute!=="function"||typeof e.setAttribute!=="function"){return true}return false};var X=function(e){var t,n;ne("beforeSanitizeElements",e,null);if(Q(e)){U(e);return true}t=e.nodeName.toLowerCase();ne("uponSanitizeElement",e,{tagName:t,allowedTags:x});if(!x[t]||E[t]){if(B&&!W[t]&&typeof e.insertAdjacentHTML==="function"){try{e.insertAdjacentHTML("AfterEnd",e.innerHTML)}catch(a){}}U(e);return true}if(N&&!e.firstElementChild&&(!e.content||!e.content.firstElementChild)&&/u){e.setAttribute("id",s.value)}}else{if(i==="id"){e.setAttribute(i,"")}V(i,e)}if(!c.keepAttr){continue}if(H&&(l==="id"||l==="name")&&(o in t||o in n||o in q)){continue}if(L){o=o.replace(D," ");o=o.replace(_," ")}if(M&&Y.test(l)){}else if(!A[l]||S[l]){continue}else if(G[l]){}else if(Z.test(o.replace(ee,""))){}else if(l==="src"&&o.indexOf("data:")===0&&j[e.nodeName.toLowerCase()]){}else if(O&&!$.test(o.replace(ee,""))){}else if(!o){}else{continue}try{e.setAttribute(i,o);r.removed.pop()}catch(d){}}ne("afterSanitizeAttributes",e,null)};var re=function(e){var t;var r=J(e);ne("beforeSanitizeShadowDOM",e,null);while(t=r.nextNode()){ne("uponSanitizeShadowNode",t,null);if(X(t)){continue}if(t.content instanceof i){re(t.content)}te(t)}ne("afterSanitizeShadowDOM",e,null)};var ne=function(e,t,n){if(!y[e]){return}y[e].forEach(function(e){e.call(r,t,n,I)})};r.sanitize=function(e,n){var o,l,s,f,c;if(!e){e=""}if(typeof e!=="string"){if(typeof e.toString!=="function"){throw new TypeError("toString is not a function")}else{e=e.toString()}}if(!r.isSupported){if(typeof t.toStaticHTML==="object"||typeof t.toStaticHTML==="function"){return t.toStaticHTML(e)}return e}P(n);r.removed=[];if(!z&&!C&&e.indexOf("<")===-1){return e}o=K(e);if(!o){return z?null:""}f=J(o);while(l=f.nextNode()){if(l.nodeType===3&&l===s){continue}if(X(l)){continue}if(l.content instanceof i){re(l.content)}te(l);s=l}if(z){if(R){c=h.call(o.ownerDocument);while(o.firstChild){c.appendChild(o.firstChild)}}else{c=o}if(F){c=g.call(a,c,true)}return c}return C?o.outerHTML:o.innerHTML};r.addHook=function(e,t){if(typeof t!=="function"){return}y[e]=y[e]||[];y[e].push(t)};r.removeHook=function(e){if(y[e]){y[e].pop()}};r.removeHooks=function(e){if(y[e]){y[e]=[]}};r.removeAllHooks=function(){y={}};return r}); +//# sourceMappingURL=./dist/purify.min.js.map \ No newline at end of file diff --git a/core/vendor/marked/.bower.json b/core/vendor/marked/.bower.json new file mode 100644 index 0000000000000000000000000000000000000000..058b951d4b7ee9a170ec2e50dce0392649c138c9 --- /dev/null +++ b/core/vendor/marked/.bower.json @@ -0,0 +1,33 @@ +{ + "name": "marked", + "version": "0.3.6", + "homepage": "https://github.com/chjj/marked", + "authors": [ + "Christopher Jeffrey " + ], + "description": "A markdown parser built for speed", + "keywords": [ + "markdown", + "markup", + "html" + ], + "main": "lib/marked.js", + "license": "MIT", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "app/bower_components", + "test", + "tests" + ], + "_release": "0.3.6", + "_resolution": { + "type": "version", + "tag": "v0.3.6", + "commit": "eddec20467c2d10c7769061ee9074e268500966f" + }, + "_source": "https://github.com/chjj/marked.git", + "_target": "0.3.6", + "_originalSource": "marked" +} \ No newline at end of file diff --git a/core/vendor/marked/LICENSE b/core/vendor/marked/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..a7b812ed618f11c4beeec45b39f9266865eb43ec --- /dev/null +++ b/core/vendor/marked/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011-2014, Christopher Jeffrey (https://github.com/chjj/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/core/vendor/marked/marked.min.js b/core/vendor/marked/marked.min.js new file mode 100644 index 0000000000000000000000000000000000000000..555c1dc1d9da18154cb48388d5e494f3f16119f8 --- /dev/null +++ b/core/vendor/marked/marked.min.js @@ -0,0 +1,6 @@ +/** + * marked - a markdown parser + * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed) + * https://github.com/chjj/marked + */ +(function(){var block={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:noop,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:noop,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:noop,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};block.bullet=/(?:[*+-]|\d+\.)/;block.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;block.item=replace(block.item,"gm")(/bull/g,block.bullet)();block.list=replace(block.list)(/bull/g,block.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+block.def.source+")")();block.blockquote=replace(block.blockquote)("def",block.def)();block._tag="(?!(?:"+"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code"+"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo"+"|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b";block.html=replace(block.html)("comment",//)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/])*?>/)(/tag/g,block._tag)();block.paragraph=replace(block.paragraph)("hr",block.hr)("heading",block.heading)("lheading",block.lheading)("blockquote",block.blockquote)("tag","<"+block._tag)("def",block.def)();block.normal=merge({},block);block.gfm=merge({},block.normal,{fences:/^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\s*\1 *(?:\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/});block.gfm.paragraph=replace(block.paragraph)("(?!","(?!"+block.gfm.fences.source.replace("\\1","\\2")+"|"+block.list.source.replace("\\1","\\3")+"|")();block.tables=merge({},block.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/});function Lexer(options){this.tokens=[];this.tokens.links={};this.options=options||marked.defaults;this.rules=block.normal;if(this.options.gfm){if(this.options.tables){this.rules=block.tables}else{this.rules=block.gfm}}}Lexer.rules=block;Lexer.lex=function(src,options){var lexer=new Lexer(options);return lexer.lex(src)};Lexer.prototype.lex=function(src){src=src.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n");return this.token(src,true)};Lexer.prototype.token=function(src,top,bq){var src=src.replace(/^ +$/gm,""),next,loose,cap,bull,b,item,space,i,l;while(src){if(cap=this.rules.newline.exec(src)){src=src.substring(cap[0].length);if(cap[0].length>1){this.tokens.push({type:"space"})}}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);cap=cap[0].replace(/^ {4}/gm,"");this.tokens.push({type:"code",text:!this.options.pedantic?cap.replace(/\n+$/,""):cap});continue}if(cap=this.rules.fences.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"code",lang:cap[2],text:cap[3]||""});continue}if(cap=this.rules.heading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[1].length,text:cap[2]});continue}if(top&&(cap=this.rules.nptable.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/\n$/,"").split("\n")};for(i=0;i ?/gm,"");this.token(cap,top,true);this.tokens.push({type:"blockquote_end"});continue}if(cap=this.rules.list.exec(src)){src=src.substring(cap[0].length);bull=cap[2];this.tokens.push({type:"list_start",ordered:bull.length>1});cap=cap[0].match(this.rules.item);next=false;l=cap.length;i=0;for(;i1&&b.length>1)){src=cap.slice(i+1).join("\n")+src;i=l-1}}loose=next||/\n\n(?!\s*$)/.test(item);if(i!==l-1){next=item.charAt(item.length-1)==="\n";if(!loose)loose=next}this.tokens.push({type:loose?"loose_item_start":"list_item_start"});this.token(item,false,bq);this.tokens.push({type:"list_item_end"})}this.tokens.push({type:"list_end"});continue}if(cap=this.rules.html.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&(cap[1]==="pre"||cap[1]==="script"||cap[1]==="style"),text:cap[0]});continue}if(!bq&&top&&(cap=this.rules.def.exec(src))){src=src.substring(cap[0].length);this.tokens.links[cap[1].toLowerCase()]={href:cap[2],title:cap[3]};continue}if(top&&(cap=this.rules.table.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/(?: *\| *)?\n$/,"").split("\n")};for(i=0;i])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:noop,tag:/^|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:noop,text:/^[\s\S]+?(?=[\\?(?:\s+['"]([\s\S]*?)['"])?\s*/;inline.link=replace(inline.link)("inside",inline._inside)("href",inline._href)();inline.reflink=replace(inline.reflink)("inside",inline._inside)();inline.normal=merge({},inline);inline.pedantic=merge({},inline.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/});inline.gfm=merge({},inline.normal,{escape:replace(inline.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:replace(inline.text)("]|","~]|")("|","|https?://|")()});inline.breaks=merge({},inline.gfm,{br:replace(inline.br)("{2,}","*")(),text:replace(inline.gfm.text)("{2,}","*")()});function InlineLexer(links,options){this.options=options||marked.defaults;this.links=links;this.rules=inline.normal;this.renderer=this.options.renderer||new Renderer;this.renderer.options=this.options;if(!this.links){throw new Error("Tokens array requires a `links` property.")}if(this.options.gfm){if(this.options.breaks){this.rules=inline.breaks}else{this.rules=inline.gfm}}else if(this.options.pedantic){this.rules=inline.pedantic}}InlineLexer.rules=inline;InlineLexer.output=function(src,links,options){var inline=new InlineLexer(links,options);return inline.output(src)};InlineLexer.prototype.output=function(src){var out="",link,text,href,cap;while(src){if(cap=this.rules.escape.exec(src)){src=src.substring(cap[0].length);out+=cap[1];continue}if(cap=this.rules.autolink.exec(src)){src=src.substring(cap[0].length);if(cap[2]==="@"){text=cap[1].charAt(6)===":"?this.mangle(cap[1].substring(7)):this.mangle(cap[1]);href=this.mangle("mailto:")+text}else{text=escape(cap[1]);href=text}out+=this.renderer.link(href,null,text);continue}if(!this.inLink&&(cap=this.rules.url.exec(src))){src=src.substring(cap[0].length);text=escape(cap[1]);href=text;out+=this.renderer.link(href,null,text);continue}if(cap=this.rules.tag.exec(src)){if(!this.inLink&&/^/i.test(cap[0])){this.inLink=false}src=src.substring(cap[0].length);out+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(cap[0]):escape(cap[0]):cap[0];continue}if(cap=this.rules.link.exec(src)){src=src.substring(cap[0].length);this.inLink=true;out+=this.outputLink(cap,{href:cap[2],title:cap[3]});this.inLink=false;continue}if((cap=this.rules.reflink.exec(src))||(cap=this.rules.nolink.exec(src))){src=src.substring(cap[0].length);link=(cap[2]||cap[1]).replace(/\s+/g," ");link=this.links[link.toLowerCase()];if(!link||!link.href){out+=cap[0].charAt(0);src=cap[0].substring(1)+src;continue}this.inLink=true;out+=this.outputLink(cap,link);this.inLink=false;continue}if(cap=this.rules.strong.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.strong(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.em.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.em(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.codespan(escape(cap[2],true));continue}if(cap=this.rules.br.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.br();continue}if(cap=this.rules.del.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.del(this.output(cap[1]));continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.text(escape(this.smartypants(cap[0])));continue}if(src){throw new Error("Infinite loop on byte: "+src.charCodeAt(0))}}return out};InlineLexer.prototype.outputLink=function(cap,link){var href=escape(link.href),title=link.title?escape(link.title):null;return cap[0].charAt(0)!=="!"?this.renderer.link(href,title,this.output(cap[1])):this.renderer.image(href,title,escape(cap[1]))};InlineLexer.prototype.smartypants=function(text){if(!this.options.smartypants)return text;return text.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…")};InlineLexer.prototype.mangle=function(text){if(!this.options.mangle)return text;var out="",l=text.length,i=0,ch;for(;i.5){ch="x"+ch.toString(16)}out+="&#"+ch+";"}return out};function Renderer(options){this.options=options||{}}Renderer.prototype.code=function(code,lang,escaped){if(this.options.highlight){var out=this.options.highlight(code,lang);if(out!=null&&out!==code){escaped=true;code=out}}if(!lang){return"
"+(escaped?code:escape(code,true))+"\n
"}return'
'+(escaped?code:escape(code,true))+"\n
\n"};Renderer.prototype.blockquote=function(quote){return"
\n"+quote+"
\n"};Renderer.prototype.html=function(html){return html};Renderer.prototype.heading=function(text,level,raw){return"'+text+"\n"};Renderer.prototype.hr=function(){return this.options.xhtml?"
\n":"
\n"};Renderer.prototype.list=function(body,ordered){var type=ordered?"ol":"ul";return"<"+type+">\n"+body+"\n"};Renderer.prototype.listitem=function(text){return"
  • "+text+"
  • \n"};Renderer.prototype.paragraph=function(text){return"

    "+text+"

    \n"};Renderer.prototype.table=function(header,body){return"\n"+"\n"+header+"\n"+"\n"+body+"\n"+"
    \n"};Renderer.prototype.tablerow=function(content){return"\n"+content+"\n"};Renderer.prototype.tablecell=function(content,flags){var type=flags.header?"th":"td";var tag=flags.align?"<"+type+' style="text-align:'+flags.align+'">':"<"+type+">";return tag+content+"\n"};Renderer.prototype.strong=function(text){return""+text+""};Renderer.prototype.em=function(text){return""+text+""};Renderer.prototype.codespan=function(text){return""+text+""};Renderer.prototype.br=function(){return this.options.xhtml?"
    ":"
    "};Renderer.prototype.del=function(text){return""+text+""};Renderer.prototype.link=function(href,title,text){if(this.options.sanitize){try{var prot=decodeURIComponent(unescape(href)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return""}if(prot.indexOf("javascript:")===0||prot.indexOf("vbscript:")===0){return""}}var out='
    ";return out};Renderer.prototype.image=function(href,title,text){var out=''+text+'":">";return out};Renderer.prototype.text=function(text){return text};function Parser(options){this.tokens=[];this.token=null;this.options=options||marked.defaults;this.options.renderer=this.options.renderer||new Renderer;this.renderer=this.options.renderer;this.renderer.options=this.options}Parser.parse=function(src,options,renderer){var parser=new Parser(options,renderer);return parser.parse(src)};Parser.prototype.parse=function(src){this.inline=new InlineLexer(src.links,this.options,this.renderer);this.tokens=src.reverse();var out="";while(this.next()){out+=this.tok()}return out};Parser.prototype.next=function(){return this.token=this.tokens.pop()};Parser.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};Parser.prototype.parseText=function(){var body=this.token.text;while(this.peek().type==="text"){body+="\n"+this.next().text}return this.inline.output(body)};Parser.prototype.tok=function(){switch(this.token.type){case"space":{return""}case"hr":{return this.renderer.hr()}case"heading":{return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text)}case"code":{return this.renderer.code(this.token.text,this.token.lang,this.token.escaped)}case"table":{var header="",body="",i,row,cell,flags,j;cell="";for(i=0;i/g,">").replace(/"/g,""").replace(/'/g,"'")}function unescape(html){return html.replace(/&([#\w]+);/g,function(_,n){n=n.toLowerCase();if(n==="colon")return":";if(n.charAt(0)==="#"){return n.charAt(1)==="x"?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1))}return""})}function replace(regex,opt){regex=regex.source;opt=opt||"";return function self(name,val){if(!name)return new RegExp(regex,opt);val=val.source||val;val=val.replace(/(^|[^\[])\^/g,"$1");regex=regex.replace(name,val);return self}}function noop(){}noop.exec=noop;function merge(obj){var i=1,target,key;for(;iAn error occured:

    "+escape(e.message+"",true)+"
    "}throw e}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,sanitizer:null,mangle:true,smartLists:false,silent:false,highlight:null,langPrefix:"lang-",smartypants:false,headerPrefix:"",renderer:new Renderer,xhtml:false};marked.Parser=Parser;marked.parser=Parser.parse;marked.Renderer=Renderer;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output;marked.parse=marked;if(typeof module!=="undefined"&&typeof exports==="object"){module.exports=marked}else if(typeof define==="function"&&define.amd){define(function(){return marked})}else{this.marked=marked}}).call(function(){return this||(typeof window!=="undefined"?window:global)}()); \ No newline at end of file diff --git a/cron.php b/cron.php index 6fdc7cb24d389a1a820bc84b59687b4308b9817c..c8eed3afbe7706063c75b03f2956cf38d6f722b2 100644 --- a/cron.php +++ b/cron.php @@ -30,6 +30,13 @@ * */ +// Show warning if a PHP version below 5.6.0 is used +if (version_compare(PHP_VERSION, '5.6.0') === -1) { + echo 'This version of Nextcloud requires at least PHP 5.6.0
    '; + echo 'You are currently running ' . PHP_VERSION . '. Please update your PHP version.'; + return; +} + try { require_once __DIR__ . '/lib/base.php'; diff --git a/lib/base.php b/lib/base.php index 7bd14de56b662bb6b2eee3b3a655da2f6b0c65e7..3ba0755eaabf48a9c0fdfa62da00172d08efc6eb 100644 --- a/lib/base.php +++ b/lib/base.php @@ -281,6 +281,7 @@ class OC { // render error page $template = new OC_Template('', 'update.user', 'guest'); OC_Util::addScript('maintenance-check'); + OC_Util::addStyle('guest'); $template->printPage(); die(); } @@ -354,6 +355,8 @@ class OC { header('Status: 503 Service Temporarily Unavailable'); header('Retry-After: 120'); + OC_Util::addStyle('guest'); + // render error page $template = new OC_Template('', 'update.use-cli', 'guest'); $template->assign('productName', 'nextcloud'); // for now @@ -373,9 +376,9 @@ class OC { $oldTheme = $systemConfig->getValue('theme'); $systemConfig->setValue('theme', ''); - \OCP\Util::addScript('config'); // needed for web root - \OCP\Util::addScript('update'); - \OCP\Util::addStyle('update'); + OC_Util::addScript('config'); // needed for web root + OC_Util::addScript('update'); + OC_Util::addStyle('guest'); /** @var \OC\App\AppManager $appManager */ $appManager = \OC::$server->getAppManager(); @@ -666,12 +669,6 @@ class OC { OC\Log\ErrorHandler::register($debug); } - // register the stream wrappers - stream_wrapper_register('fakedir', 'OC\Files\Stream\Dir'); - stream_wrapper_register('static', 'OC\Files\Stream\StaticStream'); - stream_wrapper_register('close', 'OC\Files\Stream\Close'); - stream_wrapper_register('quota', 'OC\Files\Stream\Quota'); - \OC::$server->getEventLogger()->start('init_session', 'Initialize session'); OC_App::loadApps(array('session')); if (!self::$CLI) { @@ -711,6 +708,7 @@ class OC { exit(1); } else { OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE); + OC_Util::addStyle('guest'); OC_Template::printGuestPage('', 'error', array('errors' => $errors)); exit; } @@ -750,9 +748,6 @@ class OC { self::registerCacheHooks(); self::registerFilesystemHooks(); - if ($systemConfig->getValue('enable_previews', true)) { - self::registerPreviewHooks(); - } self::registerShareHooks(); self::registerLogRotate(); self::registerEncryptionWrapper(); @@ -791,23 +786,31 @@ class OC { && !\OC::$server->getTrustedDomainHelper()->isTrustedDomain($host) && self::$server->getConfig()->getSystemValue('installed', false) ) { - header('HTTP/1.1 400 Bad Request'); - header('Status: 400 Bad Request'); + // Allow access to CSS resources + $isScssRequest = false; + if(strpos($request->getPathInfo(), '/css/') === 0) { + $isScssRequest = true; + } - \OC::$server->getLogger()->warning( + if (!$isScssRequest) { + header('HTTP/1.1 400 Bad Request'); + header('Status: 400 Bad Request'); + + \OC::$server->getLogger()->warning( 'Trusted domain error. "{remoteAddress}" tried to access using "{host}" as host.', [ 'app' => 'core', 'remoteAddress' => $request->getRemoteAddress(), 'host' => $host, ] - ); + ); - $tmpl = new OCP\Template('core', 'untrustedDomain', 'guest'); - $tmpl->assign('domain', $host); - $tmpl->printPage(); + $tmpl = new OCP\Template('core', 'untrustedDomain', 'guest'); + $tmpl->assign('domain', $host); + $tmpl->printPage(); - exit(); + exit(); + } } \OC::$server->getEventLogger()->end('boot'); } @@ -881,7 +884,7 @@ class OC { if ($systemConfig->getValue('installed', false) && $systemConfig->getValue('log_rotate_size', false) && !self::checkUpgrade(false)) { //don't try to do this before we are properly setup //use custom logfile path if defined, otherwise use default of nextcloud.log in data directory - \OCP\BackgroundJob::registerJob('OC\Log\Rotate', $systemConfig->getValue('logfile', $systemConfig->getValue('datadirectory', OC::$SERVERROOT . '/data') . '/nextcloud.log')); + \OC::$server->getJobList()->add('OC\Log\Rotate'); } } @@ -894,20 +897,6 @@ class OC { OC_Hook::connect('OC_Filesystem', 'rename', 'OC\Files\Filesystem', 'isBlacklisted'); } - /** - * register hooks for previews - */ - public static function registerPreviewHooks() { - OC_Hook::connect('OC_Filesystem', 'post_write', 'OC\Preview', 'post_write'); - OC_Hook::connect('OC_Filesystem', 'delete', 'OC\Preview', 'prepare_delete_files'); - OC_Hook::connect('\OCP\Versions', 'preDelete', 'OC\Preview', 'prepare_delete'); - OC_Hook::connect('\OCP\Trashbin', 'preDelete', 'OC\Preview', 'prepare_delete'); - OC_Hook::connect('OC_Filesystem', 'post_delete', 'OC\Preview', 'post_delete_files'); - OC_Hook::connect('\OCP\Versions', 'delete', 'OC\Preview', 'post_delete_versions'); - OC_Hook::connect('\OCP\Trashbin', 'delete', 'OC\Preview', 'post_delete'); - OC_Hook::connect('\OCP\Versions', 'rollback', 'OC\Preview', 'post_delete_versions'); - } - /** * register hooks for sharing */ diff --git a/lib/composer/autoload.php b/lib/composer/autoload.php index 610dbf34bca9674c414a523a87ccf973abeb4afa..6de0160c0b5b49b30ec4d803dcb04c3407a36020 100644 --- a/lib/composer/autoload.php +++ b/lib/composer/autoload.php @@ -2,6 +2,6 @@ // autoload.php @generated by Composer -require_once __DIR__ . '/composer' . '/autoload_real.php'; +require_once __DIR__ . '/composer/autoload_real.php'; return ComposerAutoloaderInit53792487c5a8370acc0b06b1a864ff4c::getLoader(); diff --git a/lib/composer/composer/ClassLoader.php b/lib/composer/composer/ClassLoader.php index ac67d302a1866f83aab0c3bff265cfbfe9318f51..4626994fd4d8ac4c5489670d85b09af1b6d8aab0 100644 --- a/lib/composer/composer/ClassLoader.php +++ b/lib/composer/composer/ClassLoader.php @@ -55,6 +55,7 @@ class ClassLoader private $classMap = array(); private $classMapAuthoritative = false; private $missingClasses = array(); + private $apcuPrefix; public function getPrefixes() { @@ -271,6 +272,26 @@ class ClassLoader return $this->classMapAuthoritative; } + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + /** * Registers this instance as an autoloader. * @@ -313,11 +334,6 @@ class ClassLoader */ public function findFile($class) { - // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731 - if ('\\' == $class[0]) { - $class = substr($class, 1); - } - // class map lookup if (isset($this->classMap[$class])) { return $this->classMap[$class]; @@ -325,6 +341,12 @@ class ClassLoader if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return false; } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } $file = $this->findFileWithExtension($class, '.php'); @@ -333,6 +355,10 @@ class ClassLoader $file = $this->findFileWithExtension($class, '.hh'); } + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + if (false === $file) { // Remember that this class does not exist. $this->missingClasses[$class] = true; diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index dafa46bc996fcfddd09c7450f6a3820daa56cde5..4a345ed7a6dd440e414ee10f7ef9f81672854df0 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -9,8 +9,12 @@ return array( 'OCP\\API' => $baseDir . '/lib/public/API.php', 'OCP\\Activity\\IConsumer' => $baseDir . '/lib/public/Activity/IConsumer.php', 'OCP\\Activity\\IEvent' => $baseDir . '/lib/public/Activity/IEvent.php', + 'OCP\\Activity\\IEventMerger' => $baseDir . '/lib/public/Activity/IEventMerger.php', 'OCP\\Activity\\IExtension' => $baseDir . '/lib/public/Activity/IExtension.php', + 'OCP\\Activity\\IFilter' => $baseDir . '/lib/public/Activity/IFilter.php', 'OCP\\Activity\\IManager' => $baseDir . '/lib/public/Activity/IManager.php', + 'OCP\\Activity\\IProvider' => $baseDir . '/lib/public/Activity/IProvider.php', + 'OCP\\Activity\\ISetting' => $baseDir . '/lib/public/Activity/ISetting.php', 'OCP\\App' => $baseDir . '/lib/public/App.php', 'OCP\\AppFramework\\ApiController' => $baseDir . '/lib/public/AppFramework/ApiController.php', 'OCP\\AppFramework\\App' => $baseDir . '/lib/public/AppFramework/App.php', @@ -47,10 +51,15 @@ return array( 'OCP\\AppFramework\\QueryException' => $baseDir . '/lib/public/AppFramework/QueryException.php', 'OCP\\AppFramework\\Utility\\IControllerMethodReflector' => $baseDir . '/lib/public/AppFramework/Utility/IControllerMethodReflector.php', 'OCP\\AppFramework\\Utility\\ITimeFactory' => $baseDir . '/lib/public/AppFramework/Utility/ITimeFactory.php', + 'OCP\\App\\AppPathNotFoundException' => $baseDir . '/lib/public/App/AppPathNotFoundException.php', 'OCP\\App\\IAppManager' => $baseDir . '/lib/public/App/IAppManager.php', 'OCP\\App\\ManagerEvent' => $baseDir . '/lib/public/App/ManagerEvent.php', + 'OCP\\Authentication\\Exceptions\\CredentialsUnavailableException' => $baseDir . '/lib/public/Authentication/Exceptions/CredentialsUnavailableException.php', 'OCP\\Authentication\\IApacheBackend' => $baseDir . '/lib/public/Authentication/IApacheBackend.php', + 'OCP\\Authentication\\LoginCredentials\\ICredentials' => $baseDir . '/lib/public/Authentication/LoginCredentials/ICredentials.php', + 'OCP\\Authentication\\LoginCredentials\\IStore' => $baseDir . '/lib/public/Authentication/LoginCredentials/IStore.php', 'OCP\\Authentication\\TwoFactorAuth\\IProvider' => $baseDir . '/lib/public/Authentication/TwoFactorAuth/IProvider.php', + 'OCP\\Authentication\\TwoFactorAuth\\TwoFactorException' => $baseDir . '/lib/public/Authentication/TwoFactorAuth/TwoFactorException.php', 'OCP\\AutoloadNotAllowedException' => $baseDir . '/lib/public/AutoloadNotAllowedException.php', 'OCP\\BackgroundJob' => $baseDir . '/lib/public/BackgroundJob.php', 'OCP\\BackgroundJob\\IJob' => $baseDir . '/lib/public/BackgroundJob/IJob.php', @@ -102,6 +111,7 @@ return array( 'OCP\\Files\\Config\\IMountProvider' => $baseDir . '/lib/public/Files/Config/IMountProvider.php', 'OCP\\Files\\Config\\IMountProviderCollection' => $baseDir . '/lib/public/Files/Config/IMountProviderCollection.php', 'OCP\\Files\\Config\\IUserMountCache' => $baseDir . '/lib/public/Files/Config/IUserMountCache.php', + 'OCP\\Files\\EmptyFileNameException' => $baseDir . '/lib/public/Files/EmptyFileNameException.php', 'OCP\\Files\\EntityTooLargeException' => $baseDir . '/lib/public/Files/EntityTooLargeException.php', 'OCP\\Files\\File' => $baseDir . '/lib/public/Files/File.php', 'OCP\\Files\\FileInfo' => $baseDir . '/lib/public/Files/FileInfo.php', @@ -115,6 +125,7 @@ return array( 'OCP\\Files\\IRootFolder' => $baseDir . '/lib/public/Files/IRootFolder.php', 'OCP\\Files\\InvalidCharacterInPathException' => $baseDir . '/lib/public/Files/InvalidCharacterInPathException.php', 'OCP\\Files\\InvalidContentException' => $baseDir . '/lib/public/Files/InvalidContentException.php', + 'OCP\\Files\\InvalidDirectoryException' => $baseDir . '/lib/public/Files/InvalidDirectoryException.php', 'OCP\\Files\\InvalidPathException' => $baseDir . '/lib/public/Files/InvalidPathException.php', 'OCP\\Files\\LockNotAcquiredException' => $baseDir . '/lib/public/Files/LockNotAcquiredException.php', 'OCP\\Files\\Mount\\IMountManager' => $baseDir . '/lib/public/Files/Mount/IMountManager.php', @@ -123,6 +134,9 @@ return array( 'OCP\\Files\\NotEnoughSpaceException' => $baseDir . '/lib/public/Files/NotEnoughSpaceException.php', 'OCP\\Files\\NotFoundException' => $baseDir . '/lib/public/Files/NotFoundException.php', 'OCP\\Files\\NotPermittedException' => $baseDir . '/lib/public/Files/NotPermittedException.php', + 'OCP\\Files\\Notify\\IChange' => $baseDir . '/lib/public/Files/Notify/IChange.php', + 'OCP\\Files\\Notify\\INotifyHandler' => $baseDir . '/lib/public/Files/Notify/INotifyHandler.php', + 'OCP\\Files\\Notify\\IRenameChange' => $baseDir . '/lib/public/Files/Notify/IRenameChange.php', 'OCP\\Files\\ObjectStore\\IObjectStore' => $baseDir . '/lib/public/Files/ObjectStore/IObjectStore.php', 'OCP\\Files\\ReservedWordException' => $baseDir . '/lib/public/Files/ReservedWordException.php', 'OCP\\Files\\SimpleFS\\ISimpleFile' => $baseDir . '/lib/public/Files/SimpleFS/ISimpleFile.php', @@ -157,7 +171,6 @@ return array( 'OCP\\IDBConnection' => $baseDir . '/lib/public/IDBConnection.php', 'OCP\\IDateTimeFormatter' => $baseDir . '/lib/public/IDateTimeFormatter.php', 'OCP\\IDateTimeZone' => $baseDir . '/lib/public/IDateTimeZone.php', - 'OCP\\IDb' => $baseDir . '/lib/public/IDb.php', 'OCP\\IEventSource' => $baseDir . '/lib/public/IEventSource.php', 'OCP\\IGroup' => $baseDir . '/lib/public/IGroup.php', 'OCP\\IGroupManager' => $baseDir . '/lib/public/IGroupManager.php', @@ -201,6 +214,7 @@ return array( 'OCP\\PreConditionNotMetException' => $baseDir . '/lib/public/PreConditionNotMetException.php', 'OCP\\Preview\\IProvider' => $baseDir . '/lib/public/Preview/IProvider.php', 'OCP\\Response' => $baseDir . '/lib/public/Response.php', + 'OCP\\RichObjectStrings\\Definitions' => $baseDir . '/lib/public/RichObjectStrings/Definitions.php', 'OCP\\RichObjectStrings\\IValidator' => $baseDir . '/lib/public/RichObjectStrings/IValidator.php', 'OCP\\RichObjectStrings\\InvalidObjectExeption' => $baseDir . '/lib/public/RichObjectStrings/InvalidObjectExeption.php', 'OCP\\Route\\IRoute' => $baseDir . '/lib/public/Route/IRoute.php', @@ -217,6 +231,7 @@ return array( 'OCP\\Security\\ISecureRandom' => $baseDir . '/lib/public/Security/ISecureRandom.php', 'OCP\\Security\\StringUtils' => $baseDir . '/lib/public/Security/StringUtils.php', 'OCP\\Session\\Exceptions\\SessionNotAvailableException' => $baseDir . '/lib/public/Session/Exceptions/SessionNotAvailableException.php', + 'OCP\\Settings\\IIconSection' => $baseDir . '/lib/public/Settings/IIconSection.php', 'OCP\\Settings\\IManager' => $baseDir . '/lib/public/Settings/IManager.php', 'OCP\\Settings\\ISection' => $baseDir . '/lib/public/Settings/ISection.php', 'OCP\\Settings\\ISettings' => $baseDir . '/lib/public/Settings/ISettings.php', @@ -247,13 +262,17 @@ return array( 'OCP\\WorkflowEngine\\ICheck' => $baseDir . '/lib/public/WorkflowEngine/ICheck.php', 'OCP\\WorkflowEngine\\IManager' => $baseDir . '/lib/public/WorkflowEngine/IManager.php', 'OCP\\WorkflowEngine\\IOperation' => $baseDir . '/lib/public/WorkflowEngine/IOperation.php', + 'OC\\Accounts\\AccountManager' => $baseDir . '/lib/private/Accounts/AccountManager.php', + 'OC\\Accounts\\Hooks' => $baseDir . '/lib/private/Accounts/Hooks.php', 'OC\\Activity\\Event' => $baseDir . '/lib/private/Activity/Event.php', + 'OC\\Activity\\EventMerger' => $baseDir . '/lib/private/Activity/EventMerger.php', + 'OC\\Activity\\LegacyFilter' => $baseDir . '/lib/private/Activity/LegacyFilter.php', + 'OC\\Activity\\LegacySetting' => $baseDir . '/lib/private/Activity/LegacySetting.php', 'OC\\Activity\\Manager' => $baseDir . '/lib/private/Activity/Manager.php', 'OC\\AllConfig' => $baseDir . '/lib/private/AllConfig.php', 'OC\\AppConfig' => $baseDir . '/lib/private/AppConfig.php', 'OC\\AppFramework\\App' => $baseDir . '/lib/private/AppFramework/App.php', 'OC\\AppFramework\\Core\\API' => $baseDir . '/lib/private/AppFramework/Core/API.php', - 'OC\\AppFramework\\Db\\Db' => $baseDir . '/lib/private/AppFramework/Db/Db.php', 'OC\\AppFramework\\DependencyInjection\\DIContainer' => $baseDir . '/lib/private/AppFramework/DependencyInjection/DIContainer.php', 'OC\\AppFramework\\Http' => $baseDir . '/lib/private/AppFramework/Http.php', 'OC\\AppFramework\\Http\\Dispatcher' => $baseDir . '/lib/private/AppFramework/Http/Dispatcher.php', @@ -308,6 +327,8 @@ return array( 'OC\\Authentication\\Exceptions\\PasswordlessTokenException' => $baseDir . '/lib/private/Authentication/Exceptions/PasswordlessTokenException.php', 'OC\\Authentication\\Exceptions\\TwoFactorAuthRequiredException' => $baseDir . '/lib/private/Authentication/Exceptions/TwoFactorAuthRequiredException.php', 'OC\\Authentication\\Exceptions\\UserAlreadyLoggedInException' => $baseDir . '/lib/private/Authentication/Exceptions/UserAlreadyLoggedInException.php', + 'OC\\Authentication\\LoginCredentials\\Credentials' => $baseDir . '/lib/private/Authentication/LoginCredentials/Credentials.php', + 'OC\\Authentication\\LoginCredentials\\Store' => $baseDir . '/lib/private/Authentication/LoginCredentials/Store.php', 'OC\\Authentication\\Token\\DefaultToken' => $baseDir . '/lib/private/Authentication/Token/DefaultToken.php', 'OC\\Authentication\\Token\\DefaultTokenCleanupJob' => $baseDir . '/lib/private/Authentication/Token/DefaultTokenCleanupJob.php', 'OC\\Authentication\\Token\\DefaultTokenMapper' => $baseDir . '/lib/private/Authentication/Token/DefaultTokenMapper.php', @@ -409,6 +430,7 @@ return array( 'OC\\Core\\Command\\User\\ResetPassword' => $baseDir . '/core/Command/User/ResetPassword.php', 'OC\\Core\\Command\\User\\Setting' => $baseDir . '/core/Command/User/Setting.php', 'OC\\Core\\Controller\\AvatarController' => $baseDir . '/core/Controller/AvatarController.php', + 'OC\\Core\\Controller\\CssController' => $baseDir . '/core/Controller/CssController.php', 'OC\\Core\\Controller\\LoginController' => $baseDir . '/core/Controller/LoginController.php', 'OC\\Core\\Controller\\LostController' => $baseDir . '/core/Controller/LostController.php', 'OC\\Core\\Controller\\OCJSController' => $baseDir . '/core/Controller/OCJSController.php', @@ -513,10 +535,15 @@ return array( 'OC\\Files\\Node\\NonExistingFile' => $baseDir . '/lib/private/Files/Node/NonExistingFile.php', 'OC\\Files\\Node\\NonExistingFolder' => $baseDir . '/lib/private/Files/Node/NonExistingFolder.php', 'OC\\Files\\Node\\Root' => $baseDir . '/lib/private/Files/Node/Root.php', + 'OC\\Files\\Notify\\Change' => $baseDir . '/lib/private/Files/Notify/Change.php', + 'OC\\Files\\Notify\\RenameChange' => $baseDir . '/lib/private/Files/Notify/RenameChange.php', 'OC\\Files\\ObjectStore\\HomeObjectStoreStorage' => $baseDir . '/lib/private/Files/ObjectStore/HomeObjectStoreStorage.php', 'OC\\Files\\ObjectStore\\Mapper' => $baseDir . '/lib/private/Files/ObjectStore/Mapper.php', 'OC\\Files\\ObjectStore\\NoopScanner' => $baseDir . '/lib/private/Files/ObjectStore/NoopScanner.php', 'OC\\Files\\ObjectStore\\ObjectStoreStorage' => $baseDir . '/lib/private/Files/ObjectStore/ObjectStoreStorage.php', + 'OC\\Files\\ObjectStore\\S3' => $baseDir . '/lib/private/Files/ObjectStore/S3.php', + 'OC\\Files\\ObjectStore\\S3ConnectionTrait' => $baseDir . '/lib/private/Files/ObjectStore/S3ConnectionTrait.php', + 'OC\\Files\\ObjectStore\\StorageObjectStore' => $baseDir . '/lib/private/Files/ObjectStore/StorageObjectStore.php', 'OC\\Files\\ObjectStore\\Swift' => $baseDir . '/lib/private/Files/ObjectStore/Swift.php', 'OC\\Files\\SimpleFS\\SimpleFile' => $baseDir . '/lib/private/Files/SimpleFS/SimpleFile.php', 'OC\\Files\\SimpleFS\\SimpleFolder' => $baseDir . '/lib/private/Files/SimpleFS/SimpleFolder.php', @@ -539,11 +566,8 @@ return array( 'OC\\Files\\Storage\\Wrapper\\PermissionsMask' => $baseDir . '/lib/private/Files/Storage/Wrapper/PermissionsMask.php', 'OC\\Files\\Storage\\Wrapper\\Quota' => $baseDir . '/lib/private/Files/Storage/Wrapper/Quota.php', 'OC\\Files\\Storage\\Wrapper\\Wrapper' => $baseDir . '/lib/private/Files/Storage/Wrapper/Wrapper.php', - 'OC\\Files\\Stream\\Close' => $baseDir . '/lib/private/Files/Stream/Close.php', - 'OC\\Files\\Stream\\Dir' => $baseDir . '/lib/private/Files/Stream/Dir.php', 'OC\\Files\\Stream\\Encryption' => $baseDir . '/lib/private/Files/Stream/Encryption.php', 'OC\\Files\\Stream\\Quota' => $baseDir . '/lib/private/Files/Stream/Quota.php', - 'OC\\Files\\Stream\\StaticStream' => $baseDir . '/lib/private/Files/Stream/StaticStream.php', 'OC\\Files\\Type\\Detection' => $baseDir . '/lib/private/Files/Type/Detection.php', 'OC\\Files\\Type\\Loader' => $baseDir . '/lib/private/Files/Type/Loader.php', 'OC\\Files\\Type\\TemplateManager' => $baseDir . '/lib/private/Files/Type/TemplateManager.php', @@ -593,7 +617,6 @@ return array( 'OC\\Log\\Syslog' => $baseDir . '/lib/private/Log/Syslog.php', 'OC\\Mail\\Mailer' => $baseDir . '/lib/private/Mail/Mailer.php', 'OC\\Mail\\Message' => $baseDir . '/lib/private/Mail/Message.php', - 'OC\\Memcache\\APC' => $baseDir . '/lib/private/Memcache/APC.php', 'OC\\Memcache\\APCu' => $baseDir . '/lib/private/Memcache/APCu.php', 'OC\\Memcache\\ArrayCache' => $baseDir . '/lib/private/Memcache/ArrayCache.php', 'OC\\Memcache\\CADTrait' => $baseDir . '/lib/private/Memcache/CADTrait.php', @@ -615,11 +638,9 @@ return array( 'OC\\Notification\\Notification' => $baseDir . '/lib/private/Notification/Notification.php', 'OC\\OCS\\CoreCapabilities' => $baseDir . '/lib/private/OCS/CoreCapabilities.php', 'OC\\OCS\\Exception' => $baseDir . '/lib/private/OCS/Exception.php', - 'OC\\OCS\\Person' => $baseDir . '/lib/private/OCS/Person.php', 'OC\\OCS\\PrivateData' => $baseDir . '/lib/private/OCS/PrivateData.php', 'OC\\OCS\\Provider' => $baseDir . '/lib/private/OCS/Provider.php', 'OC\\OCS\\Result' => $baseDir . '/lib/private/OCS/Result.php', - 'OC\\Preview' => $baseDir . '/lib/private/Preview.php', 'OC\\PreviewManager' => $baseDir . '/lib/private/PreviewManager.php', 'OC\\PreviewNotAvailableException' => $baseDir . '/lib/private/PreviewNotAvailableException.php', 'OC\\Preview\\BMP' => $baseDir . '/lib/private/Preview/BMP.php', @@ -655,7 +676,6 @@ return array( 'OC\\Repair' => $baseDir . '/lib/private/Repair.php', 'OC\\RepairException' => $baseDir . '/lib/private/RepairException.php', 'OC\\Repair\\AssetCache' => $baseDir . '/lib/private/Repair/AssetCache.php', - 'OC\\Repair\\AvatarPermissions' => $baseDir . '/lib/private/Repair/AvatarPermissions.php', 'OC\\Repair\\CleanTags' => $baseDir . '/lib/private/Repair/CleanTags.php', 'OC\\Repair\\Collation' => $baseDir . '/lib/private/Repair/Collation.php', 'OC\\Repair\\DropOldJobs' => $baseDir . '/lib/private/Repair/DropOldJobs.php', @@ -663,15 +683,17 @@ return array( 'OC\\Repair\\FillETags' => $baseDir . '/lib/private/Repair/FillETags.php', 'OC\\Repair\\InnoDB' => $baseDir . '/lib/private/Repair/InnoDB.php', 'OC\\Repair\\MoveUpdaterStepFile' => $baseDir . '/lib/private/Repair/MoveUpdaterStepFile.php', + 'OC\\Repair\\NC11\\CleanPreviews' => $baseDir . '/lib/private/Repair/NC11/CleanPreviews.php', + 'OC\\Repair\\NC11\\CleanPreviewsBackgroundJob' => $baseDir . '/lib/private/Repair/NC11/CleanPreviewsBackgroundJob.php', + 'OC\\Repair\\NC11\\FixMountStorages' => $baseDir . '/lib/private/Repair/NC11/FixMountStorages.php', 'OC\\Repair\\NC11\\MoveAvatars' => $baseDir . '/lib/private/Repair/NC11/MoveAvatars.php', - 'OC\\Repair\\NC11\\MoveAvatarsBackgroundJob' => $baseDir . '/lib/private/Repair/NC11/MoveAvatarBackgroundJob.php', + 'OC\\Repair\\NC11\\MoveAvatarsBackgroundJob' => $baseDir . '/lib/private/Repair/NC11/MoveAvatarsBackgroundJob.php', 'OC\\Repair\\OldGroupMembershipShares' => $baseDir . '/lib/private/Repair/OldGroupMembershipShares.php', 'OC\\Repair\\Preview' => $baseDir . '/lib/private/Repair/Preview.php', 'OC\\Repair\\RemoveGetETagEntries' => $baseDir . '/lib/private/Repair/RemoveGetETagEntries.php', 'OC\\Repair\\RemoveOldShares' => $baseDir . '/lib/private/Repair/RemoveOldShares.php', 'OC\\Repair\\RemoveRootShares' => $baseDir . '/lib/private/Repair/RemoveRootShares.php', 'OC\\Repair\\RepairInvalidShares' => $baseDir . '/lib/private/Repair/RepairInvalidShares.php', - 'OC\\Repair\\RepairLegacyStorages' => $baseDir . '/lib/private/Repair/RepairLegacyStorages.php', 'OC\\Repair\\RepairMimeTypes' => $baseDir . '/lib/private/Repair/RepairMimeTypes.php', 'OC\\Repair\\RepairUnmergedShares' => $baseDir . '/lib/private/Repair/RepairUnmergedShares.php', 'OC\\Repair\\SearchLuceneTables' => $baseDir . '/lib/private/Repair/SearchLuceneTables.php', @@ -702,6 +724,9 @@ return array( 'OC\\Security\\CredentialsManager' => $baseDir . '/lib/private/Security/CredentialsManager.php', 'OC\\Security\\Crypto' => $baseDir . '/lib/private/Security/Crypto.php', 'OC\\Security\\Hasher' => $baseDir . '/lib/private/Security/Hasher.php', + 'OC\\Security\\IdentityProof\\Key' => $baseDir . '/lib/private/Security/IdentityProof/Key.php', + 'OC\\Security\\IdentityProof\\Manager' => $baseDir . '/lib/private/Security/IdentityProof/Manager.php', + 'OC\\Security\\IdentityProof\\Signer' => $baseDir . '/lib/private/Security/IdentityProof/Signer.php', 'OC\\Security\\SecureRandom' => $baseDir . '/lib/private/Security/SecureRandom.php', 'OC\\Security\\TrustedDomainHelper' => $baseDir . '/lib/private/Security/TrustedDomainHelper.php', 'OC\\Server' => $baseDir . '/lib/private/Server.php', @@ -715,8 +740,8 @@ return array( 'OC\\Session\\Session' => $baseDir . '/lib/private/Session/Session.php', 'OC\\Settings\\Admin\\Additional' => $baseDir . '/lib/private/Settings/Admin/Additional.php', 'OC\\Settings\\Admin\\Encryption' => $baseDir . '/lib/private/Settings/Admin/Encryption.php', - 'OC\\Settings\\Admin\\Logging' => $baseDir . '/lib/private/Settings/Admin/Logging.php', 'OC\\Settings\\Admin\\Server' => $baseDir . '/lib/private/Settings/Admin/Server.php', + 'OC\\Settings\\Admin\\ServerDevNotice' => $baseDir . '/lib/private/Settings/Admin/ServerDevNotice.php', 'OC\\Settings\\Admin\\Sharing' => $baseDir . '/lib/private/Settings/Admin/Sharing.php', 'OC\\Settings\\Admin\\TipsTricks' => $baseDir . '/lib/private/Settings/Admin/TipsTricks.php', 'OC\\Settings\\Application' => $baseDir . '/settings/Application.php', @@ -730,9 +755,11 @@ return array( 'OC\\Settings\\Controller\\GroupsController' => $baseDir . '/settings/Controller/GroupsController.php', 'OC\\Settings\\Controller\\LogSettingsController' => $baseDir . '/settings/Controller/LogSettingsController.php', 'OC\\Settings\\Controller\\MailSettingsController' => $baseDir . '/settings/Controller/MailSettingsController.php', + 'OC\\Settings\\Controller\\PersonalController' => $baseDir . '/settings/Controller/PersonalController.php', 'OC\\Settings\\Controller\\SecuritySettingsController' => $baseDir . '/settings/Controller/SecuritySettingsController.php', 'OC\\Settings\\Controller\\UsersController' => $baseDir . '/settings/Controller/UsersController.php', 'OC\\Settings\\Manager' => $baseDir . '/lib/private/Settings/Manager.php', + 'OC\\Settings\\Mapper' => $baseDir . '/lib/private/Settings/Mapper.php', 'OC\\Settings\\Middleware\\SubadminMiddleware' => $baseDir . '/settings/Middleware/SubadminMiddleware.php', 'OC\\Settings\\RemoveOrphaned' => $baseDir . '/lib/private/Settings/RemoveOrphaned.php', 'OC\\Settings\\Section' => $baseDir . '/lib/private/Settings/Section.php', @@ -774,6 +801,7 @@ return array( 'OC\\Template\\JSResourceLocator' => $baseDir . '/lib/private/Template/JSResourceLocator.php', 'OC\\Template\\ResourceLocator' => $baseDir . '/lib/private/Template/ResourceLocator.php', 'OC\\Template\\ResourceNotFoundException' => $baseDir . '/lib/private/Template/ResourceNotFoundException.php', + 'OC\\Template\\SCSSCacher' => $baseDir . '/lib/private/Template/SCSSCacher.php', 'OC\\Template\\TemplateFileLocator' => $baseDir . '/lib/private/Template/TemplateFileLocator.php', 'OC\\URLGenerator' => $baseDir . '/lib/private/URLGenerator.php', 'OC\\Updater' => $baseDir . '/lib/private/Updater.php', diff --git a/lib/composer/composer/autoload_real.php b/lib/composer/composer/autoload_real.php index 43d676069541035bb86b716e1ba3b31df1dfc781..b9f89d16ad7b093f804014c17ab21c88f0a73a92 100644 --- a/lib/composer/composer/autoload_real.php +++ b/lib/composer/composer/autoload_real.php @@ -23,7 +23,7 @@ class ComposerAutoloaderInit53792487c5a8370acc0b06b1a864ff4c self::$loader = $loader = new \Composer\Autoload\ClassLoader(); spl_autoload_unregister(array('ComposerAutoloaderInit53792487c5a8370acc0b06b1a864ff4c', 'loadClassLoader')); - $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION'); + $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { require_once __DIR__ . '/autoload_static.php'; diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 5b8356785bc6c3349ae2e6a94036ddb2abf3b7e4..f8d360fec4bee0c29ceab42bb756c8851ffa14a8 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -39,8 +39,12 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OCP\\API' => __DIR__ . '/../../..' . '/lib/public/API.php', 'OCP\\Activity\\IConsumer' => __DIR__ . '/../../..' . '/lib/public/Activity/IConsumer.php', 'OCP\\Activity\\IEvent' => __DIR__ . '/../../..' . '/lib/public/Activity/IEvent.php', + 'OCP\\Activity\\IEventMerger' => __DIR__ . '/../../..' . '/lib/public/Activity/IEventMerger.php', 'OCP\\Activity\\IExtension' => __DIR__ . '/../../..' . '/lib/public/Activity/IExtension.php', + 'OCP\\Activity\\IFilter' => __DIR__ . '/../../..' . '/lib/public/Activity/IFilter.php', 'OCP\\Activity\\IManager' => __DIR__ . '/../../..' . '/lib/public/Activity/IManager.php', + 'OCP\\Activity\\IProvider' => __DIR__ . '/../../..' . '/lib/public/Activity/IProvider.php', + 'OCP\\Activity\\ISetting' => __DIR__ . '/../../..' . '/lib/public/Activity/ISetting.php', 'OCP\\App' => __DIR__ . '/../../..' . '/lib/public/App.php', 'OCP\\AppFramework\\ApiController' => __DIR__ . '/../../..' . '/lib/public/AppFramework/ApiController.php', 'OCP\\AppFramework\\App' => __DIR__ . '/../../..' . '/lib/public/AppFramework/App.php', @@ -77,10 +81,15 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OCP\\AppFramework\\QueryException' => __DIR__ . '/../../..' . '/lib/public/AppFramework/QueryException.php', 'OCP\\AppFramework\\Utility\\IControllerMethodReflector' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Utility/IControllerMethodReflector.php', 'OCP\\AppFramework\\Utility\\ITimeFactory' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Utility/ITimeFactory.php', + 'OCP\\App\\AppPathNotFoundException' => __DIR__ . '/../../..' . '/lib/public/App/AppPathNotFoundException.php', 'OCP\\App\\IAppManager' => __DIR__ . '/../../..' . '/lib/public/App/IAppManager.php', 'OCP\\App\\ManagerEvent' => __DIR__ . '/../../..' . '/lib/public/App/ManagerEvent.php', + 'OCP\\Authentication\\Exceptions\\CredentialsUnavailableException' => __DIR__ . '/../../..' . '/lib/public/Authentication/Exceptions/CredentialsUnavailableException.php', 'OCP\\Authentication\\IApacheBackend' => __DIR__ . '/../../..' . '/lib/public/Authentication/IApacheBackend.php', + 'OCP\\Authentication\\LoginCredentials\\ICredentials' => __DIR__ . '/../../..' . '/lib/public/Authentication/LoginCredentials/ICredentials.php', + 'OCP\\Authentication\\LoginCredentials\\IStore' => __DIR__ . '/../../..' . '/lib/public/Authentication/LoginCredentials/IStore.php', 'OCP\\Authentication\\TwoFactorAuth\\IProvider' => __DIR__ . '/../../..' . '/lib/public/Authentication/TwoFactorAuth/IProvider.php', + 'OCP\\Authentication\\TwoFactorAuth\\TwoFactorException' => __DIR__ . '/../../..' . '/lib/public/Authentication/TwoFactorAuth/TwoFactorException.php', 'OCP\\AutoloadNotAllowedException' => __DIR__ . '/../../..' . '/lib/public/AutoloadNotAllowedException.php', 'OCP\\BackgroundJob' => __DIR__ . '/../../..' . '/lib/public/BackgroundJob.php', 'OCP\\BackgroundJob\\IJob' => __DIR__ . '/../../..' . '/lib/public/BackgroundJob/IJob.php', @@ -132,6 +141,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OCP\\Files\\Config\\IMountProvider' => __DIR__ . '/../../..' . '/lib/public/Files/Config/IMountProvider.php', 'OCP\\Files\\Config\\IMountProviderCollection' => __DIR__ . '/../../..' . '/lib/public/Files/Config/IMountProviderCollection.php', 'OCP\\Files\\Config\\IUserMountCache' => __DIR__ . '/../../..' . '/lib/public/Files/Config/IUserMountCache.php', + 'OCP\\Files\\EmptyFileNameException' => __DIR__ . '/../../..' . '/lib/public/Files/EmptyFileNameException.php', 'OCP\\Files\\EntityTooLargeException' => __DIR__ . '/../../..' . '/lib/public/Files/EntityTooLargeException.php', 'OCP\\Files\\File' => __DIR__ . '/../../..' . '/lib/public/Files/File.php', 'OCP\\Files\\FileInfo' => __DIR__ . '/../../..' . '/lib/public/Files/FileInfo.php', @@ -145,6 +155,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OCP\\Files\\IRootFolder' => __DIR__ . '/../../..' . '/lib/public/Files/IRootFolder.php', 'OCP\\Files\\InvalidCharacterInPathException' => __DIR__ . '/../../..' . '/lib/public/Files/InvalidCharacterInPathException.php', 'OCP\\Files\\InvalidContentException' => __DIR__ . '/../../..' . '/lib/public/Files/InvalidContentException.php', + 'OCP\\Files\\InvalidDirectoryException' => __DIR__ . '/../../..' . '/lib/public/Files/InvalidDirectoryException.php', 'OCP\\Files\\InvalidPathException' => __DIR__ . '/../../..' . '/lib/public/Files/InvalidPathException.php', 'OCP\\Files\\LockNotAcquiredException' => __DIR__ . '/../../..' . '/lib/public/Files/LockNotAcquiredException.php', 'OCP\\Files\\Mount\\IMountManager' => __DIR__ . '/../../..' . '/lib/public/Files/Mount/IMountManager.php', @@ -153,6 +164,9 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OCP\\Files\\NotEnoughSpaceException' => __DIR__ . '/../../..' . '/lib/public/Files/NotEnoughSpaceException.php', 'OCP\\Files\\NotFoundException' => __DIR__ . '/../../..' . '/lib/public/Files/NotFoundException.php', 'OCP\\Files\\NotPermittedException' => __DIR__ . '/../../..' . '/lib/public/Files/NotPermittedException.php', + 'OCP\\Files\\Notify\\IChange' => __DIR__ . '/../../..' . '/lib/public/Files/Notify/IChange.php', + 'OCP\\Files\\Notify\\INotifyHandler' => __DIR__ . '/../../..' . '/lib/public/Files/Notify/INotifyHandler.php', + 'OCP\\Files\\Notify\\IRenameChange' => __DIR__ . '/../../..' . '/lib/public/Files/Notify/IRenameChange.php', 'OCP\\Files\\ObjectStore\\IObjectStore' => __DIR__ . '/../../..' . '/lib/public/Files/ObjectStore/IObjectStore.php', 'OCP\\Files\\ReservedWordException' => __DIR__ . '/../../..' . '/lib/public/Files/ReservedWordException.php', 'OCP\\Files\\SimpleFS\\ISimpleFile' => __DIR__ . '/../../..' . '/lib/public/Files/SimpleFS/ISimpleFile.php', @@ -187,7 +201,6 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OCP\\IDBConnection' => __DIR__ . '/../../..' . '/lib/public/IDBConnection.php', 'OCP\\IDateTimeFormatter' => __DIR__ . '/../../..' . '/lib/public/IDateTimeFormatter.php', 'OCP\\IDateTimeZone' => __DIR__ . '/../../..' . '/lib/public/IDateTimeZone.php', - 'OCP\\IDb' => __DIR__ . '/../../..' . '/lib/public/IDb.php', 'OCP\\IEventSource' => __DIR__ . '/../../..' . '/lib/public/IEventSource.php', 'OCP\\IGroup' => __DIR__ . '/../../..' . '/lib/public/IGroup.php', 'OCP\\IGroupManager' => __DIR__ . '/../../..' . '/lib/public/IGroupManager.php', @@ -231,6 +244,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OCP\\PreConditionNotMetException' => __DIR__ . '/../../..' . '/lib/public/PreConditionNotMetException.php', 'OCP\\Preview\\IProvider' => __DIR__ . '/../../..' . '/lib/public/Preview/IProvider.php', 'OCP\\Response' => __DIR__ . '/../../..' . '/lib/public/Response.php', + 'OCP\\RichObjectStrings\\Definitions' => __DIR__ . '/../../..' . '/lib/public/RichObjectStrings/Definitions.php', 'OCP\\RichObjectStrings\\IValidator' => __DIR__ . '/../../..' . '/lib/public/RichObjectStrings/IValidator.php', 'OCP\\RichObjectStrings\\InvalidObjectExeption' => __DIR__ . '/../../..' . '/lib/public/RichObjectStrings/InvalidObjectExeption.php', 'OCP\\Route\\IRoute' => __DIR__ . '/../../..' . '/lib/public/Route/IRoute.php', @@ -247,6 +261,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OCP\\Security\\ISecureRandom' => __DIR__ . '/../../..' . '/lib/public/Security/ISecureRandom.php', 'OCP\\Security\\StringUtils' => __DIR__ . '/../../..' . '/lib/public/Security/StringUtils.php', 'OCP\\Session\\Exceptions\\SessionNotAvailableException' => __DIR__ . '/../../..' . '/lib/public/Session/Exceptions/SessionNotAvailableException.php', + 'OCP\\Settings\\IIconSection' => __DIR__ . '/../../..' . '/lib/public/Settings/IIconSection.php', 'OCP\\Settings\\IManager' => __DIR__ . '/../../..' . '/lib/public/Settings/IManager.php', 'OCP\\Settings\\ISection' => __DIR__ . '/../../..' . '/lib/public/Settings/ISection.php', 'OCP\\Settings\\ISettings' => __DIR__ . '/../../..' . '/lib/public/Settings/ISettings.php', @@ -277,13 +292,17 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OCP\\WorkflowEngine\\ICheck' => __DIR__ . '/../../..' . '/lib/public/WorkflowEngine/ICheck.php', 'OCP\\WorkflowEngine\\IManager' => __DIR__ . '/../../..' . '/lib/public/WorkflowEngine/IManager.php', 'OCP\\WorkflowEngine\\IOperation' => __DIR__ . '/../../..' . '/lib/public/WorkflowEngine/IOperation.php', + 'OC\\Accounts\\AccountManager' => __DIR__ . '/../../..' . '/lib/private/Accounts/AccountManager.php', + 'OC\\Accounts\\Hooks' => __DIR__ . '/../../..' . '/lib/private/Accounts/Hooks.php', 'OC\\Activity\\Event' => __DIR__ . '/../../..' . '/lib/private/Activity/Event.php', + 'OC\\Activity\\EventMerger' => __DIR__ . '/../../..' . '/lib/private/Activity/EventMerger.php', + 'OC\\Activity\\LegacyFilter' => __DIR__ . '/../../..' . '/lib/private/Activity/LegacyFilter.php', + 'OC\\Activity\\LegacySetting' => __DIR__ . '/../../..' . '/lib/private/Activity/LegacySetting.php', 'OC\\Activity\\Manager' => __DIR__ . '/../../..' . '/lib/private/Activity/Manager.php', 'OC\\AllConfig' => __DIR__ . '/../../..' . '/lib/private/AllConfig.php', 'OC\\AppConfig' => __DIR__ . '/../../..' . '/lib/private/AppConfig.php', 'OC\\AppFramework\\App' => __DIR__ . '/../../..' . '/lib/private/AppFramework/App.php', 'OC\\AppFramework\\Core\\API' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Core/API.php', - 'OC\\AppFramework\\Db\\Db' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Db/Db.php', 'OC\\AppFramework\\DependencyInjection\\DIContainer' => __DIR__ . '/../../..' . '/lib/private/AppFramework/DependencyInjection/DIContainer.php', 'OC\\AppFramework\\Http' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Http.php', 'OC\\AppFramework\\Http\\Dispatcher' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Http/Dispatcher.php', @@ -338,6 +357,8 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Authentication\\Exceptions\\PasswordlessTokenException' => __DIR__ . '/../../..' . '/lib/private/Authentication/Exceptions/PasswordlessTokenException.php', 'OC\\Authentication\\Exceptions\\TwoFactorAuthRequiredException' => __DIR__ . '/../../..' . '/lib/private/Authentication/Exceptions/TwoFactorAuthRequiredException.php', 'OC\\Authentication\\Exceptions\\UserAlreadyLoggedInException' => __DIR__ . '/../../..' . '/lib/private/Authentication/Exceptions/UserAlreadyLoggedInException.php', + 'OC\\Authentication\\LoginCredentials\\Credentials' => __DIR__ . '/../../..' . '/lib/private/Authentication/LoginCredentials/Credentials.php', + 'OC\\Authentication\\LoginCredentials\\Store' => __DIR__ . '/../../..' . '/lib/private/Authentication/LoginCredentials/Store.php', 'OC\\Authentication\\Token\\DefaultToken' => __DIR__ . '/../../..' . '/lib/private/Authentication/Token/DefaultToken.php', 'OC\\Authentication\\Token\\DefaultTokenCleanupJob' => __DIR__ . '/../../..' . '/lib/private/Authentication/Token/DefaultTokenCleanupJob.php', 'OC\\Authentication\\Token\\DefaultTokenMapper' => __DIR__ . '/../../..' . '/lib/private/Authentication/Token/DefaultTokenMapper.php', @@ -439,6 +460,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Core\\Command\\User\\ResetPassword' => __DIR__ . '/../../..' . '/core/Command/User/ResetPassword.php', 'OC\\Core\\Command\\User\\Setting' => __DIR__ . '/../../..' . '/core/Command/User/Setting.php', 'OC\\Core\\Controller\\AvatarController' => __DIR__ . '/../../..' . '/core/Controller/AvatarController.php', + 'OC\\Core\\Controller\\CssController' => __DIR__ . '/../../..' . '/core/Controller/CssController.php', 'OC\\Core\\Controller\\LoginController' => __DIR__ . '/../../..' . '/core/Controller/LoginController.php', 'OC\\Core\\Controller\\LostController' => __DIR__ . '/../../..' . '/core/Controller/LostController.php', 'OC\\Core\\Controller\\OCJSController' => __DIR__ . '/../../..' . '/core/Controller/OCJSController.php', @@ -543,10 +565,15 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Files\\Node\\NonExistingFile' => __DIR__ . '/../../..' . '/lib/private/Files/Node/NonExistingFile.php', 'OC\\Files\\Node\\NonExistingFolder' => __DIR__ . '/../../..' . '/lib/private/Files/Node/NonExistingFolder.php', 'OC\\Files\\Node\\Root' => __DIR__ . '/../../..' . '/lib/private/Files/Node/Root.php', + 'OC\\Files\\Notify\\Change' => __DIR__ . '/../../..' . '/lib/private/Files/Notify/Change.php', + 'OC\\Files\\Notify\\RenameChange' => __DIR__ . '/../../..' . '/lib/private/Files/Notify/RenameChange.php', 'OC\\Files\\ObjectStore\\HomeObjectStoreStorage' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/HomeObjectStoreStorage.php', 'OC\\Files\\ObjectStore\\Mapper' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/Mapper.php', 'OC\\Files\\ObjectStore\\NoopScanner' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/NoopScanner.php', 'OC\\Files\\ObjectStore\\ObjectStoreStorage' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/ObjectStoreStorage.php', + 'OC\\Files\\ObjectStore\\S3' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/S3.php', + 'OC\\Files\\ObjectStore\\S3ConnectionTrait' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/S3ConnectionTrait.php', + 'OC\\Files\\ObjectStore\\StorageObjectStore' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/StorageObjectStore.php', 'OC\\Files\\ObjectStore\\Swift' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/Swift.php', 'OC\\Files\\SimpleFS\\SimpleFile' => __DIR__ . '/../../..' . '/lib/private/Files/SimpleFS/SimpleFile.php', 'OC\\Files\\SimpleFS\\SimpleFolder' => __DIR__ . '/../../..' . '/lib/private/Files/SimpleFS/SimpleFolder.php', @@ -569,11 +596,8 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Files\\Storage\\Wrapper\\PermissionsMask' => __DIR__ . '/../../..' . '/lib/private/Files/Storage/Wrapper/PermissionsMask.php', 'OC\\Files\\Storage\\Wrapper\\Quota' => __DIR__ . '/../../..' . '/lib/private/Files/Storage/Wrapper/Quota.php', 'OC\\Files\\Storage\\Wrapper\\Wrapper' => __DIR__ . '/../../..' . '/lib/private/Files/Storage/Wrapper/Wrapper.php', - 'OC\\Files\\Stream\\Close' => __DIR__ . '/../../..' . '/lib/private/Files/Stream/Close.php', - 'OC\\Files\\Stream\\Dir' => __DIR__ . '/../../..' . '/lib/private/Files/Stream/Dir.php', 'OC\\Files\\Stream\\Encryption' => __DIR__ . '/../../..' . '/lib/private/Files/Stream/Encryption.php', 'OC\\Files\\Stream\\Quota' => __DIR__ . '/../../..' . '/lib/private/Files/Stream/Quota.php', - 'OC\\Files\\Stream\\StaticStream' => __DIR__ . '/../../..' . '/lib/private/Files/Stream/StaticStream.php', 'OC\\Files\\Type\\Detection' => __DIR__ . '/../../..' . '/lib/private/Files/Type/Detection.php', 'OC\\Files\\Type\\Loader' => __DIR__ . '/../../..' . '/lib/private/Files/Type/Loader.php', 'OC\\Files\\Type\\TemplateManager' => __DIR__ . '/../../..' . '/lib/private/Files/Type/TemplateManager.php', @@ -623,7 +647,6 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Log\\Syslog' => __DIR__ . '/../../..' . '/lib/private/Log/Syslog.php', 'OC\\Mail\\Mailer' => __DIR__ . '/../../..' . '/lib/private/Mail/Mailer.php', 'OC\\Mail\\Message' => __DIR__ . '/../../..' . '/lib/private/Mail/Message.php', - 'OC\\Memcache\\APC' => __DIR__ . '/../../..' . '/lib/private/Memcache/APC.php', 'OC\\Memcache\\APCu' => __DIR__ . '/../../..' . '/lib/private/Memcache/APCu.php', 'OC\\Memcache\\ArrayCache' => __DIR__ . '/../../..' . '/lib/private/Memcache/ArrayCache.php', 'OC\\Memcache\\CADTrait' => __DIR__ . '/../../..' . '/lib/private/Memcache/CADTrait.php', @@ -645,11 +668,9 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Notification\\Notification' => __DIR__ . '/../../..' . '/lib/private/Notification/Notification.php', 'OC\\OCS\\CoreCapabilities' => __DIR__ . '/../../..' . '/lib/private/OCS/CoreCapabilities.php', 'OC\\OCS\\Exception' => __DIR__ . '/../../..' . '/lib/private/OCS/Exception.php', - 'OC\\OCS\\Person' => __DIR__ . '/../../..' . '/lib/private/OCS/Person.php', 'OC\\OCS\\PrivateData' => __DIR__ . '/../../..' . '/lib/private/OCS/PrivateData.php', 'OC\\OCS\\Provider' => __DIR__ . '/../../..' . '/lib/private/OCS/Provider.php', 'OC\\OCS\\Result' => __DIR__ . '/../../..' . '/lib/private/OCS/Result.php', - 'OC\\Preview' => __DIR__ . '/../../..' . '/lib/private/Preview.php', 'OC\\PreviewManager' => __DIR__ . '/../../..' . '/lib/private/PreviewManager.php', 'OC\\PreviewNotAvailableException' => __DIR__ . '/../../..' . '/lib/private/PreviewNotAvailableException.php', 'OC\\Preview\\BMP' => __DIR__ . '/../../..' . '/lib/private/Preview/BMP.php', @@ -685,7 +706,6 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Repair' => __DIR__ . '/../../..' . '/lib/private/Repair.php', 'OC\\RepairException' => __DIR__ . '/../../..' . '/lib/private/RepairException.php', 'OC\\Repair\\AssetCache' => __DIR__ . '/../../..' . '/lib/private/Repair/AssetCache.php', - 'OC\\Repair\\AvatarPermissions' => __DIR__ . '/../../..' . '/lib/private/Repair/AvatarPermissions.php', 'OC\\Repair\\CleanTags' => __DIR__ . '/../../..' . '/lib/private/Repair/CleanTags.php', 'OC\\Repair\\Collation' => __DIR__ . '/../../..' . '/lib/private/Repair/Collation.php', 'OC\\Repair\\DropOldJobs' => __DIR__ . '/../../..' . '/lib/private/Repair/DropOldJobs.php', @@ -693,15 +713,17 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Repair\\FillETags' => __DIR__ . '/../../..' . '/lib/private/Repair/FillETags.php', 'OC\\Repair\\InnoDB' => __DIR__ . '/../../..' . '/lib/private/Repair/InnoDB.php', 'OC\\Repair\\MoveUpdaterStepFile' => __DIR__ . '/../../..' . '/lib/private/Repair/MoveUpdaterStepFile.php', + 'OC\\Repair\\NC11\\CleanPreviews' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/CleanPreviews.php', + 'OC\\Repair\\NC11\\CleanPreviewsBackgroundJob' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/CleanPreviewsBackgroundJob.php', + 'OC\\Repair\\NC11\\FixMountStorages' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/FixMountStorages.php', 'OC\\Repair\\NC11\\MoveAvatars' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/MoveAvatars.php', - 'OC\\Repair\\NC11\\MoveAvatarsBackgroundJob' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/MoveAvatarBackgroundJob.php', + 'OC\\Repair\\NC11\\MoveAvatarsBackgroundJob' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/MoveAvatarsBackgroundJob.php', 'OC\\Repair\\OldGroupMembershipShares' => __DIR__ . '/../../..' . '/lib/private/Repair/OldGroupMembershipShares.php', 'OC\\Repair\\Preview' => __DIR__ . '/../../..' . '/lib/private/Repair/Preview.php', 'OC\\Repair\\RemoveGetETagEntries' => __DIR__ . '/../../..' . '/lib/private/Repair/RemoveGetETagEntries.php', 'OC\\Repair\\RemoveOldShares' => __DIR__ . '/../../..' . '/lib/private/Repair/RemoveOldShares.php', 'OC\\Repair\\RemoveRootShares' => __DIR__ . '/../../..' . '/lib/private/Repair/RemoveRootShares.php', 'OC\\Repair\\RepairInvalidShares' => __DIR__ . '/../../..' . '/lib/private/Repair/RepairInvalidShares.php', - 'OC\\Repair\\RepairLegacyStorages' => __DIR__ . '/../../..' . '/lib/private/Repair/RepairLegacyStorages.php', 'OC\\Repair\\RepairMimeTypes' => __DIR__ . '/../../..' . '/lib/private/Repair/RepairMimeTypes.php', 'OC\\Repair\\RepairUnmergedShares' => __DIR__ . '/../../..' . '/lib/private/Repair/RepairUnmergedShares.php', 'OC\\Repair\\SearchLuceneTables' => __DIR__ . '/../../..' . '/lib/private/Repair/SearchLuceneTables.php', @@ -732,6 +754,9 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Security\\CredentialsManager' => __DIR__ . '/../../..' . '/lib/private/Security/CredentialsManager.php', 'OC\\Security\\Crypto' => __DIR__ . '/../../..' . '/lib/private/Security/Crypto.php', 'OC\\Security\\Hasher' => __DIR__ . '/../../..' . '/lib/private/Security/Hasher.php', + 'OC\\Security\\IdentityProof\\Key' => __DIR__ . '/../../..' . '/lib/private/Security/IdentityProof/Key.php', + 'OC\\Security\\IdentityProof\\Manager' => __DIR__ . '/../../..' . '/lib/private/Security/IdentityProof/Manager.php', + 'OC\\Security\\IdentityProof\\Signer' => __DIR__ . '/../../..' . '/lib/private/Security/IdentityProof/Signer.php', 'OC\\Security\\SecureRandom' => __DIR__ . '/../../..' . '/lib/private/Security/SecureRandom.php', 'OC\\Security\\TrustedDomainHelper' => __DIR__ . '/../../..' . '/lib/private/Security/TrustedDomainHelper.php', 'OC\\Server' => __DIR__ . '/../../..' . '/lib/private/Server.php', @@ -745,8 +770,8 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Session\\Session' => __DIR__ . '/../../..' . '/lib/private/Session/Session.php', 'OC\\Settings\\Admin\\Additional' => __DIR__ . '/../../..' . '/lib/private/Settings/Admin/Additional.php', 'OC\\Settings\\Admin\\Encryption' => __DIR__ . '/../../..' . '/lib/private/Settings/Admin/Encryption.php', - 'OC\\Settings\\Admin\\Logging' => __DIR__ . '/../../..' . '/lib/private/Settings/Admin/Logging.php', 'OC\\Settings\\Admin\\Server' => __DIR__ . '/../../..' . '/lib/private/Settings/Admin/Server.php', + 'OC\\Settings\\Admin\\ServerDevNotice' => __DIR__ . '/../../..' . '/lib/private/Settings/Admin/ServerDevNotice.php', 'OC\\Settings\\Admin\\Sharing' => __DIR__ . '/../../..' . '/lib/private/Settings/Admin/Sharing.php', 'OC\\Settings\\Admin\\TipsTricks' => __DIR__ . '/../../..' . '/lib/private/Settings/Admin/TipsTricks.php', 'OC\\Settings\\Application' => __DIR__ . '/../../..' . '/settings/Application.php', @@ -760,9 +785,11 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Settings\\Controller\\GroupsController' => __DIR__ . '/../../..' . '/settings/Controller/GroupsController.php', 'OC\\Settings\\Controller\\LogSettingsController' => __DIR__ . '/../../..' . '/settings/Controller/LogSettingsController.php', 'OC\\Settings\\Controller\\MailSettingsController' => __DIR__ . '/../../..' . '/settings/Controller/MailSettingsController.php', + 'OC\\Settings\\Controller\\PersonalController' => __DIR__ . '/../../..' . '/settings/Controller/PersonalController.php', 'OC\\Settings\\Controller\\SecuritySettingsController' => __DIR__ . '/../../..' . '/settings/Controller/SecuritySettingsController.php', 'OC\\Settings\\Controller\\UsersController' => __DIR__ . '/../../..' . '/settings/Controller/UsersController.php', 'OC\\Settings\\Manager' => __DIR__ . '/../../..' . '/lib/private/Settings/Manager.php', + 'OC\\Settings\\Mapper' => __DIR__ . '/../../..' . '/lib/private/Settings/Mapper.php', 'OC\\Settings\\Middleware\\SubadminMiddleware' => __DIR__ . '/../../..' . '/settings/Middleware/SubadminMiddleware.php', 'OC\\Settings\\RemoveOrphaned' => __DIR__ . '/../../..' . '/lib/private/Settings/RemoveOrphaned.php', 'OC\\Settings\\Section' => __DIR__ . '/../../..' . '/lib/private/Settings/Section.php', @@ -804,6 +831,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Template\\JSResourceLocator' => __DIR__ . '/../../..' . '/lib/private/Template/JSResourceLocator.php', 'OC\\Template\\ResourceLocator' => __DIR__ . '/../../..' . '/lib/private/Template/ResourceLocator.php', 'OC\\Template\\ResourceNotFoundException' => __DIR__ . '/../../..' . '/lib/private/Template/ResourceNotFoundException.php', + 'OC\\Template\\SCSSCacher' => __DIR__ . '/../../..' . '/lib/private/Template/SCSSCacher.php', 'OC\\Template\\TemplateFileLocator' => __DIR__ . '/../../..' . '/lib/private/Template/TemplateFileLocator.php', 'OC\\URLGenerator' => __DIR__ . '/../../..' . '/lib/private/URLGenerator.php', 'OC\\Updater' => __DIR__ . '/../../..' . '/lib/private/Updater.php', diff --git a/lib/l10n/bg_BG.js b/lib/l10n/bg_BG.js new file mode 100644 index 0000000000000000000000000000000000000000..955d4e68742e4af47801cd36064980d6de07516d --- /dev/null +++ b/lib/l10n/bg_BG.js @@ -0,0 +1,177 @@ +OC.L10N.register( + "lib", + { + "Cannot write into \"config\" directory!" : "Неуспешен опит за запис в \"config\" папката!", + "This can usually be fixed by giving the webserver write access to the config directory" : "Това може да бъде решено единствено като разрешиш на уеб сървъра да пише в config папката.", + "See %s" : "Вижте %s", + "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Това обикновено може да бъде оправено като %s даде разрешение на уеб сървъра да записва в config папката %s.", + "Sample configuration detected" : "Открита е примерна конфигурация", + "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Усетено беше че примерната конфигурация е копирана. Това може да развли инсталацията ти и не се поддържа. Моля, прочети документацията преди да правиш промени на config.php", + "%1$s and %2$s" : "%1$s и %2$s", + "%1$s, %2$s and %3$s" : "%1$s, %2$s и %3$s", + "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s и %4$s", + "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s и %5$s", + "PHP %s or higher is required." : "Изисква се PHP %s или по-нова.", + "PHP with a version lower than %s is required." : "Необходим е PHP с версия по-ниска от %s.", + "Following databases are supported: %s" : "Следните бази данни са поддържани: %s", + "The command line tool %s could not be found" : "Конзолната команда %s не може да бъде намерена", + "The library %s is not available." : "Библиотеката %s не е налична", + "Library %s with a version higher than %s is required - available version %s." : "Необходима е библиотеката %s с версия по-висока от %s - налична версия %s. ", + "Library %s with a version lower than %s is required - available version %s." : "Необходима е библиотеката %s с версия по-ниска от %s - налична версия %s. ", + "Following platforms are supported: %s" : "Поддържани са следните платформи: %s", + "Unknown filetype" : "Непознат тип файл", + "Invalid image" : "Невалидно изображение.", + "today" : "днес", + "yesterday" : "вчера", + "_%n day ago_::_%n days ago_" : ["преди %n ден","преди %n дни"], + "last month" : "миналия месец", + "_%n month ago_::_%n months ago_" : ["преди %n месец","преди %n месеца"], + "last year" : "миналата година", + "_%n year ago_::_%n years ago_" : ["преди %n година","преди %n години"], + "_%n hour ago_::_%n hours ago_" : ["преди %n час","преди %n часа"], + "_%n minute ago_::_%n minutes ago_" : ["преди %n минута","преди %n минути"], + "seconds ago" : "преди секунди", + "File name contains at least one invalid character" : "Името на файла съдържа поне един невалиден символ", + "File name is too long" : "Името на файла е твърде дълго", + "APCu" : "APCu", + "Redis" : "Redis", + "Server settings" : "Настройки на сървъра", + "Sharing" : "Споделяне", + "Additional settings" : "Допълнителни настройки", + "%s enter the database username and name." : "%s въведете потребителско име и име за базата данни", + "%s enter the database username." : "%s въведете потребител за базата данни.", + "%s enter the database name." : "%s въведи име на базата данни.", + "%s you may not use dots in the database name" : "%s, не може да ползваш точки в името на базата данни.", + "Oracle username and/or password not valid" : "Невалидно Oracle потребителско име и/или парола.", + "DB Error: \"%s\"" : "Грешка в базата данни: \"%s\".", + "Offending command was: \"%s\"" : "Проблемната команда беше: \"%s\".", + "You need to enter either an existing account or the administrator." : "Необходимо е да въведеш съществуващ профил или като администратор.", + "Offending command was: \"%s\", name: %s, password: %s" : "Проблемната команда беше: \"%s\", име: %s, парола: %s.", + "PostgreSQL username and/or password not valid" : "Невалидно PostgreSQL потребителско име и/или парола.", + "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X не се подържа и %s няма да работи правилно на тази платформа. Използвайте го на свой собствен риск!", + "For the best results, please consider using a GNU/Linux server instead." : "За най-добри резултати, моля, помисли дали не бихте желали да използваште GNU/Linux сървър.", + "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Моля, премахтене настройката за open_basedir от вашия php.ini или преминете към 64-битово PHP.", + "Set an admin username." : "Задайте потребителско име за администратор.", + "Set an admin password." : "Задай парола за администратор.", + "Can't create or write into the data directory %s" : "Неуспешно създаване или записване в \"data\" папката %s", + "%s shared »%s« with you" : "%s сподели »%s« с теб", + "%s via %s" : "%s чрез %s", + "Sharing %s failed, because the backend does not allow shares from type %i" : "Неуспешно споделяне на %s , защото сървъра не позволява споделяне от тип $i.", + "Sharing %s failed, because the file does not exist" : "Неуспешно споделяне на %s, защото файлът не съществува.", + "You are not allowed to share %s" : "Не ти е разрешено да споделяш %s.", + "Sharing %s failed, because the user %s does not exist" : "Неуспешно споделяне на %s, защото потребител %s не съществува.", + "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Неуспешно споделяне на %s, защото %s не е член никоя от групите, в които е %s.", + "Sharing %s failed, because this item is already shared with %s" : "Неуспешно споделяне на %s, защото това съдържание е вече споделено с %s.", + "Sharing %s failed, because the group %s does not exist" : "Неупешно споделяне на %s, защото групата %s не съществува.", + "Sharing %s failed, because %s is not a member of the group %s" : "Неуспешно споделяне на %s, защото %s не е член на групата %s.", + "You need to provide a password to create a public link, only protected links are allowed" : "Трябва да зададеш парола, за да създадеш общодостъпен линк за споделяне, само защитени с пароли линкове са разрешени.", + "Sharing %s failed, because sharing with links is not allowed" : "Неуспешно споделяне на %s, защото споделянето посредством връзки не е разрешено.", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Неуспешно споделяне на на %s, не може бъде намерено %s. Може би сървъра в момента е недостъпен.", + "Share type %s is not valid for %s" : "Споделянето на тип %s не валидно за %s.", + "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Неуспешна промяна на правата за достъп за %s, защото промените надвишават правата на достъп дадени на %s.", + "Setting permissions for %s failed, because the item was not found" : "Неуспешна промяна на правата за достъп за %s, защото съдържанието не е открито.", + "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Неуспешно задаване на дата на изтичане. Споделни папки или файлове не могат да изтичат по-късно от %s след като са били споделени", + "Cannot set expiration date. Expiration date is in the past" : "Неуспешно задаване на дата на изтичане. Датата на изтичане е в миналото", + "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Споделянето на сървърния %s трябва да поддържа OCP\\Share_Backend интерфейс.", + "Sharing backend %s not found" : "Споделянето на сървърния %s не е открито.", + "Sharing backend for %s not found" : "Споделянето на сървъра за %s не е открито.", + "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Неуспешно споделяне на %s, защото промените надвишават правата на достъп дадени на %s.", + "Sharing %s failed, because resharing is not allowed" : "Неуспешно споделяне на %s, защото повторно споделяне не е разрешено.", + "Sharing %s failed, because the sharing backend for %s could not find its source" : "Неуспешно споделяне на %s, защото не е открит първоизточникът на %s, за да бъде споделяне по сървъра.", + "Sharing %s failed, because the file could not be found in the file cache" : "Неуспешно споделяне на %s, защото файлът не може да бъде намерен в кеша.", + "Could not find category \"%s\"" : "Невъзможно откриване на категорията \"%s\".", + "Sunday" : "неделя", + "Monday" : "понеделник", + "Tuesday" : "вторник", + "Wednesday" : "сряда", + "Thursday" : "четвъртък", + "Friday" : "петък", + "Saturday" : "събота", + "Sun." : "нед", + "Mon." : "пон", + "Tue." : "вт", + "Wed." : "ср", + "Thu." : "чет", + "Fri." : "пет", + "Sat." : "съб", + "Su" : "нд", + "Mo" : "пн", + "We" : "ср", + "Th" : "чт", + "Fr" : "пт", + "Sa" : "сб", + "January" : "януари", + "February" : "февруару", + "March" : "март", + "April" : "април", + "May" : "май", + "June" : "юни", + "July" : "юли", + "August" : "август", + "September" : "септември", + "October" : "октомври", + "November" : "ноември", + "December" : "декември", + "Jan." : "яну", + "Feb." : "фев", + "Mar." : "мар", + "Apr." : "апр", + "May." : "май", + "Jun." : "юни", + "Jul." : "юли", + "Aug." : "авг", + "Sep." : "сеп", + "Oct." : "окт", + "Nov." : "ное", + "Dec." : "дек", + "Apps" : "Приложения", + "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Потребителските имена може да съдържат следните знаци: \"a-z\", \"A-Z\", \"0-9\" и \"_.@-'\"", + "A valid username must be provided" : "Трябва да въведете валидно потребителско.", + "Username contains whitespace at the beginning or at the end" : "Потребителското име започва или завършва с интервал.", + "A valid password must be provided" : "Трябва да въведете валидна парола.", + "The username is already being used" : "Потребителското име е вече заето.", + "Help" : "Помощ", + "Personal" : "Лични", + "Users" : "Потребители", + "Admin" : "Админ", + "No app name specified" : "Не е зададено име на преложението", + "a safe home for all your data" : "безопасен дом за всички ваши данни", + "Can't read file" : "Файлът не може да бъде прочетен", + "Application is not enabled" : "Приложението не е включено", + "Authentication error" : "Проблем с идентификацията", + "Token expired. Please reload page." : "Изтекла сесия. Моля, презареди страницата.", + "Unknown user" : "Непознат потребител", + "No database drivers (sqlite, mysql, or postgresql) installed." : "Липсват инсталирани драйвери за бази данни(sqlite, mysql или postgresql).", + "Cannot write into \"config\" directory" : "Неуспешен опит за запис в \"config\" папката.", + "Cannot write into \"apps\" directory" : "Писането в папка приложения не е възможно", + "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Това обикновено може да бъде оправено като %s даде разрешение на уеб сървъра да записва в app папката %s или като изключи магазина за приложения в config файла.", + "Cannot create \"data\" directory (%s)" : "Неуспешен опит за създаване на \"data\" папката (%s).", + "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Правата за достъп обикновено могат да бъдат оправени когато %s даде права на уеб сървъра да пише в root папката %s.", + "Setting locale to %s failed" : "Неуспешно задаване на %s като настройка език-държава.", + "Please install one of these locales on your system and restart your webserver." : "Моля, инсталирай едно от следните език-държава на сървъра и рестартирай уеб сървъра.", + "Please ask your server administrator to install the module." : "Моля, помолете вашия администратор да инсталира модула.", + "PHP module %s not installed." : "PHP модулът %s не е инсталиран.", + "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Това може да се дължи на cache/accelerator като Zend OPache или eAccelerator.", + "PHP modules have been installed, but they are still listed as missing?" : "PHP модулите са инсталирани, но все още се обявяват като липсващи?", + "Please ask your server administrator to restart the web server." : "Моля, поискай от своя администратор да рестартира уеб сървъра.", + "PostgreSQL >= 9 required" : "Изисква се PostgreSQL >= 9", + "Please upgrade your database version" : "Моля, обнови базата данни.", + "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Моля, променете правата за достъп на 0770, за да не може директорията да бъде видяна от други потребители.", + "Data directory (%s) is readable by other users" : "Data папката (%s) може да бъде разгледана от други потребители", + "Data directory (%s) is invalid" : "Data папката (%s) e невалидна", + "Please check that the data directory contains a file \".ocdata\" in its root." : "Моля, увери се, че data папката съдържа файл \".ocdata\" в себе си.", + "Could not obtain lock type %d on \"%s\"." : "Неуспешен опит за ексклузивен достъп от типa %d върху \"%s\".", + "App directory already exists" : "Папката на приложението вече съществува.", + "Can't create app folder. Please fix permissions. %s" : "Папката не може да бъде създадена. Моля, коригирайте правата. %s", + "No source specified when installing app" : "Не е посочен източник при инсталацията на приложението.", + "No href specified when installing app from http" : "Липсва съдържанието на връзката за инсталиране на приложението", + "No path specified when installing app from local file" : "Не е зададен пътя до локалния файл за инсталиране на приложението.", + "Archives of type %s are not supported" : "Архиви от тип %s не се подържат", + "Failed to open archive when installing app" : "Неуспешно отваряне на архив по време на инсталацията на приложението.", + "App does not provide an info.xml file" : "Приложенението не съдържа файла info.xml", + "App can't be installed because of not allowed code in the App" : "Приложението няма да бъде инсталирано, защото съдържа неразрешен код.", + "App can't be installed because it contains the true tag which is not allowed for non shipped apps" : "Приложението няма да бъде инсталирано, защото съдържа true, таг който не е разрешен за не shiped приложения.", + "Recommended" : "Препоръчано", + "Storage not available" : "Хранилището не е налично" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/bg_BG.json b/lib/l10n/bg_BG.json new file mode 100644 index 0000000000000000000000000000000000000000..1f2bcdf9d33db46238d57a0b5764dc99de90de20 --- /dev/null +++ b/lib/l10n/bg_BG.json @@ -0,0 +1,175 @@ +{ "translations": { + "Cannot write into \"config\" directory!" : "Неуспешен опит за запис в \"config\" папката!", + "This can usually be fixed by giving the webserver write access to the config directory" : "Това може да бъде решено единствено като разрешиш на уеб сървъра да пише в config папката.", + "See %s" : "Вижте %s", + "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Това обикновено може да бъде оправено като %s даде разрешение на уеб сървъра да записва в config папката %s.", + "Sample configuration detected" : "Открита е примерна конфигурация", + "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Усетено беше че примерната конфигурация е копирана. Това може да развли инсталацията ти и не се поддържа. Моля, прочети документацията преди да правиш промени на config.php", + "%1$s and %2$s" : "%1$s и %2$s", + "%1$s, %2$s and %3$s" : "%1$s, %2$s и %3$s", + "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s и %4$s", + "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s и %5$s", + "PHP %s or higher is required." : "Изисква се PHP %s или по-нова.", + "PHP with a version lower than %s is required." : "Необходим е PHP с версия по-ниска от %s.", + "Following databases are supported: %s" : "Следните бази данни са поддържани: %s", + "The command line tool %s could not be found" : "Конзолната команда %s не може да бъде намерена", + "The library %s is not available." : "Библиотеката %s не е налична", + "Library %s with a version higher than %s is required - available version %s." : "Необходима е библиотеката %s с версия по-висока от %s - налична версия %s. ", + "Library %s with a version lower than %s is required - available version %s." : "Необходима е библиотеката %s с версия по-ниска от %s - налична версия %s. ", + "Following platforms are supported: %s" : "Поддържани са следните платформи: %s", + "Unknown filetype" : "Непознат тип файл", + "Invalid image" : "Невалидно изображение.", + "today" : "днес", + "yesterday" : "вчера", + "_%n day ago_::_%n days ago_" : ["преди %n ден","преди %n дни"], + "last month" : "миналия месец", + "_%n month ago_::_%n months ago_" : ["преди %n месец","преди %n месеца"], + "last year" : "миналата година", + "_%n year ago_::_%n years ago_" : ["преди %n година","преди %n години"], + "_%n hour ago_::_%n hours ago_" : ["преди %n час","преди %n часа"], + "_%n minute ago_::_%n minutes ago_" : ["преди %n минута","преди %n минути"], + "seconds ago" : "преди секунди", + "File name contains at least one invalid character" : "Името на файла съдържа поне един невалиден символ", + "File name is too long" : "Името на файла е твърде дълго", + "APCu" : "APCu", + "Redis" : "Redis", + "Server settings" : "Настройки на сървъра", + "Sharing" : "Споделяне", + "Additional settings" : "Допълнителни настройки", + "%s enter the database username and name." : "%s въведете потребителско име и име за базата данни", + "%s enter the database username." : "%s въведете потребител за базата данни.", + "%s enter the database name." : "%s въведи име на базата данни.", + "%s you may not use dots in the database name" : "%s, не може да ползваш точки в името на базата данни.", + "Oracle username and/or password not valid" : "Невалидно Oracle потребителско име и/или парола.", + "DB Error: \"%s\"" : "Грешка в базата данни: \"%s\".", + "Offending command was: \"%s\"" : "Проблемната команда беше: \"%s\".", + "You need to enter either an existing account or the administrator." : "Необходимо е да въведеш съществуващ профил или като администратор.", + "Offending command was: \"%s\", name: %s, password: %s" : "Проблемната команда беше: \"%s\", име: %s, парола: %s.", + "PostgreSQL username and/or password not valid" : "Невалидно PostgreSQL потребителско име и/или парола.", + "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X не се подържа и %s няма да работи правилно на тази платформа. Използвайте го на свой собствен риск!", + "For the best results, please consider using a GNU/Linux server instead." : "За най-добри резултати, моля, помисли дали не бихте желали да използваште GNU/Linux сървър.", + "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Моля, премахтене настройката за open_basedir от вашия php.ini или преминете към 64-битово PHP.", + "Set an admin username." : "Задайте потребителско име за администратор.", + "Set an admin password." : "Задай парола за администратор.", + "Can't create or write into the data directory %s" : "Неуспешно създаване или записване в \"data\" папката %s", + "%s shared »%s« with you" : "%s сподели »%s« с теб", + "%s via %s" : "%s чрез %s", + "Sharing %s failed, because the backend does not allow shares from type %i" : "Неуспешно споделяне на %s , защото сървъра не позволява споделяне от тип $i.", + "Sharing %s failed, because the file does not exist" : "Неуспешно споделяне на %s, защото файлът не съществува.", + "You are not allowed to share %s" : "Не ти е разрешено да споделяш %s.", + "Sharing %s failed, because the user %s does not exist" : "Неуспешно споделяне на %s, защото потребител %s не съществува.", + "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Неуспешно споделяне на %s, защото %s не е член никоя от групите, в които е %s.", + "Sharing %s failed, because this item is already shared with %s" : "Неуспешно споделяне на %s, защото това съдържание е вече споделено с %s.", + "Sharing %s failed, because the group %s does not exist" : "Неупешно споделяне на %s, защото групата %s не съществува.", + "Sharing %s failed, because %s is not a member of the group %s" : "Неуспешно споделяне на %s, защото %s не е член на групата %s.", + "You need to provide a password to create a public link, only protected links are allowed" : "Трябва да зададеш парола, за да създадеш общодостъпен линк за споделяне, само защитени с пароли линкове са разрешени.", + "Sharing %s failed, because sharing with links is not allowed" : "Неуспешно споделяне на %s, защото споделянето посредством връзки не е разрешено.", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Неуспешно споделяне на на %s, не може бъде намерено %s. Може би сървъра в момента е недостъпен.", + "Share type %s is not valid for %s" : "Споделянето на тип %s не валидно за %s.", + "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Неуспешна промяна на правата за достъп за %s, защото промените надвишават правата на достъп дадени на %s.", + "Setting permissions for %s failed, because the item was not found" : "Неуспешна промяна на правата за достъп за %s, защото съдържанието не е открито.", + "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Неуспешно задаване на дата на изтичане. Споделни папки или файлове не могат да изтичат по-късно от %s след като са били споделени", + "Cannot set expiration date. Expiration date is in the past" : "Неуспешно задаване на дата на изтичане. Датата на изтичане е в миналото", + "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Споделянето на сървърния %s трябва да поддържа OCP\\Share_Backend интерфейс.", + "Sharing backend %s not found" : "Споделянето на сървърния %s не е открито.", + "Sharing backend for %s not found" : "Споделянето на сървъра за %s не е открито.", + "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Неуспешно споделяне на %s, защото промените надвишават правата на достъп дадени на %s.", + "Sharing %s failed, because resharing is not allowed" : "Неуспешно споделяне на %s, защото повторно споделяне не е разрешено.", + "Sharing %s failed, because the sharing backend for %s could not find its source" : "Неуспешно споделяне на %s, защото не е открит първоизточникът на %s, за да бъде споделяне по сървъра.", + "Sharing %s failed, because the file could not be found in the file cache" : "Неуспешно споделяне на %s, защото файлът не може да бъде намерен в кеша.", + "Could not find category \"%s\"" : "Невъзможно откриване на категорията \"%s\".", + "Sunday" : "неделя", + "Monday" : "понеделник", + "Tuesday" : "вторник", + "Wednesday" : "сряда", + "Thursday" : "четвъртък", + "Friday" : "петък", + "Saturday" : "събота", + "Sun." : "нед", + "Mon." : "пон", + "Tue." : "вт", + "Wed." : "ср", + "Thu." : "чет", + "Fri." : "пет", + "Sat." : "съб", + "Su" : "нд", + "Mo" : "пн", + "We" : "ср", + "Th" : "чт", + "Fr" : "пт", + "Sa" : "сб", + "January" : "януари", + "February" : "февруару", + "March" : "март", + "April" : "април", + "May" : "май", + "June" : "юни", + "July" : "юли", + "August" : "август", + "September" : "септември", + "October" : "октомври", + "November" : "ноември", + "December" : "декември", + "Jan." : "яну", + "Feb." : "фев", + "Mar." : "мар", + "Apr." : "апр", + "May." : "май", + "Jun." : "юни", + "Jul." : "юли", + "Aug." : "авг", + "Sep." : "сеп", + "Oct." : "окт", + "Nov." : "ное", + "Dec." : "дек", + "Apps" : "Приложения", + "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Потребителските имена може да съдържат следните знаци: \"a-z\", \"A-Z\", \"0-9\" и \"_.@-'\"", + "A valid username must be provided" : "Трябва да въведете валидно потребителско.", + "Username contains whitespace at the beginning or at the end" : "Потребителското име започва или завършва с интервал.", + "A valid password must be provided" : "Трябва да въведете валидна парола.", + "The username is already being used" : "Потребителското име е вече заето.", + "Help" : "Помощ", + "Personal" : "Лични", + "Users" : "Потребители", + "Admin" : "Админ", + "No app name specified" : "Не е зададено име на преложението", + "a safe home for all your data" : "безопасен дом за всички ваши данни", + "Can't read file" : "Файлът не може да бъде прочетен", + "Application is not enabled" : "Приложението не е включено", + "Authentication error" : "Проблем с идентификацията", + "Token expired. Please reload page." : "Изтекла сесия. Моля, презареди страницата.", + "Unknown user" : "Непознат потребител", + "No database drivers (sqlite, mysql, or postgresql) installed." : "Липсват инсталирани драйвери за бази данни(sqlite, mysql или postgresql).", + "Cannot write into \"config\" directory" : "Неуспешен опит за запис в \"config\" папката.", + "Cannot write into \"apps\" directory" : "Писането в папка приложения не е възможно", + "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Това обикновено може да бъде оправено като %s даде разрешение на уеб сървъра да записва в app папката %s или като изключи магазина за приложения в config файла.", + "Cannot create \"data\" directory (%s)" : "Неуспешен опит за създаване на \"data\" папката (%s).", + "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Правата за достъп обикновено могат да бъдат оправени когато %s даде права на уеб сървъра да пише в root папката %s.", + "Setting locale to %s failed" : "Неуспешно задаване на %s като настройка език-държава.", + "Please install one of these locales on your system and restart your webserver." : "Моля, инсталирай едно от следните език-държава на сървъра и рестартирай уеб сървъра.", + "Please ask your server administrator to install the module." : "Моля, помолете вашия администратор да инсталира модула.", + "PHP module %s not installed." : "PHP модулът %s не е инсталиран.", + "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Това може да се дължи на cache/accelerator като Zend OPache или eAccelerator.", + "PHP modules have been installed, but they are still listed as missing?" : "PHP модулите са инсталирани, но все още се обявяват като липсващи?", + "Please ask your server administrator to restart the web server." : "Моля, поискай от своя администратор да рестартира уеб сървъра.", + "PostgreSQL >= 9 required" : "Изисква се PostgreSQL >= 9", + "Please upgrade your database version" : "Моля, обнови базата данни.", + "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Моля, променете правата за достъп на 0770, за да не може директорията да бъде видяна от други потребители.", + "Data directory (%s) is readable by other users" : "Data папката (%s) може да бъде разгледана от други потребители", + "Data directory (%s) is invalid" : "Data папката (%s) e невалидна", + "Please check that the data directory contains a file \".ocdata\" in its root." : "Моля, увери се, че data папката съдържа файл \".ocdata\" в себе си.", + "Could not obtain lock type %d on \"%s\"." : "Неуспешен опит за ексклузивен достъп от типa %d върху \"%s\".", + "App directory already exists" : "Папката на приложението вече съществува.", + "Can't create app folder. Please fix permissions. %s" : "Папката не може да бъде създадена. Моля, коригирайте правата. %s", + "No source specified when installing app" : "Не е посочен източник при инсталацията на приложението.", + "No href specified when installing app from http" : "Липсва съдържанието на връзката за инсталиране на приложението", + "No path specified when installing app from local file" : "Не е зададен пътя до локалния файл за инсталиране на приложението.", + "Archives of type %s are not supported" : "Архиви от тип %s не се подържат", + "Failed to open archive when installing app" : "Неуспешно отваряне на архив по време на инсталацията на приложението.", + "App does not provide an info.xml file" : "Приложенението не съдържа файла info.xml", + "App can't be installed because of not allowed code in the App" : "Приложението няма да бъде инсталирано, защото съдържа неразрешен код.", + "App can't be installed because it contains the true tag which is not allowed for non shipped apps" : "Приложението няма да бъде инсталирано, защото съдържа true, таг който не е разрешен за не shiped приложения.", + "Recommended" : "Препоръчано", + "Storage not available" : "Хранилището не е налично" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +} \ No newline at end of file diff --git a/lib/l10n/cs_CZ.js b/lib/l10n/cs_CZ.js index 9d879da521995e8f6ed06a1eec7dc43cc6e4a704..ff0b5705cea37d0c41c6805d9c7f4f2db0613498 100644 --- a/lib/l10n/cs_CZ.js +++ b/lib/l10n/cs_CZ.js @@ -8,6 +8,10 @@ OC.L10N.register( "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Soubory aplikace %$1s nebyly řádně nahrazeny. Ujistěte se, že je to verze kompatibilní se serverem.", "Sample configuration detected" : "Byla detekována vzorová konfigurace", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Pravděpodobně byla zkopírována konfigurační nastavení ze vzorových souborů. Toto není podporováno a může poškodit vaši instalaci. Nahlédněte prosím do dokumentace před prováděním změn v souboru config.php", + "%1$s and %2$s" : "%1$s a %2$s", + "%1$s, %2$s and %3$s" : "%1$s, %2$s a %3$s", + "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s a %4$s", + "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s a %5$s", "PHP %s or higher is required." : "Je vyžadováno PHP %s nebo vyšší.", "PHP with a version lower than %s is required." : "Je vyžadováno PHP ve verzi nižší než %s.", "%sbit or higher PHP required." : "Je vyžadováno PHP %sbit nebo vyšší.", @@ -224,14 +228,6 @@ OC.L10N.register( "Recommended" : "Doporučené", "Microsoft Windows Platform is not supported" : "Platforma Microsoft Windows není podporována", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Provozování Nextcloud Serveru na platformě Microsoft Windows není podporováno. Doporučujeme, abyste použili linuxový server ve virtuálním stroji, pokud nemáte možnost server migrovat.", - "Storage not available" : "Úložiště není dostupné", - "ownCloud %s or higher is required." : "Vyžadován ownCloud %s nebo vyšší.", - "ownCloud %s or lower is required." : "Vyžadován ownCloud %s nebo nižší.", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Aplikaci \"%s\" nelze nainstalovat, protože není kompatibilní s touto verzí Nextcloud.", - "App can't be installed because it is not compatible with this version of Nextcloud" : "Aplikaci nelze nainstalovat, protože není kompatibilní s touto verzí Nextcloud", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "Aplikace nemůže být nainstalována, protože verze uvedená v info.xml/version nesouhlasí s verzí hlášenou z úložiště aplikací.", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Tip: Aktualizaci můžete urychlit manuálním spuštěním následujícího SQL příkazu: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on
    %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Provozování Nextcloud Serveru na platformě Microsoft Windows není podporováno. Doporučujeme, abyste použili linuxový server ve virtuálním stroji, pokud nemáte možnost migrovat server jako takový. Linuxové balíčky i jednoduše použitelné obrazy virtuálních strojů lze nalézt na %s. Pro migraci stávajících instalací na Linux můžete nalézt tipy a migrační skript v naší dokumentaci.", - "This can usually be fixed by giving the webserver write access to the root directory." : "Toto může být obvykle opraveno nastavením přístupových práv webového serveru pro zápis do kořenového adresáře." + "Storage not available" : "Úložiště není dostupné" }, "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/lib/l10n/cs_CZ.json b/lib/l10n/cs_CZ.json index 97a1242aeef83e0cb20cea42c51d686f2bea90c4..ae66663d49c3d0b54ce7180c4e31e52cc22ab821 100644 --- a/lib/l10n/cs_CZ.json +++ b/lib/l10n/cs_CZ.json @@ -6,6 +6,10 @@ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Soubory aplikace %$1s nebyly řádně nahrazeny. Ujistěte se, že je to verze kompatibilní se serverem.", "Sample configuration detected" : "Byla detekována vzorová konfigurace", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Pravděpodobně byla zkopírována konfigurační nastavení ze vzorových souborů. Toto není podporováno a může poškodit vaši instalaci. Nahlédněte prosím do dokumentace před prováděním změn v souboru config.php", + "%1$s and %2$s" : "%1$s a %2$s", + "%1$s, %2$s and %3$s" : "%1$s, %2$s a %3$s", + "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s a %4$s", + "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s a %5$s", "PHP %s or higher is required." : "Je vyžadováno PHP %s nebo vyšší.", "PHP with a version lower than %s is required." : "Je vyžadováno PHP ve verzi nižší než %s.", "%sbit or higher PHP required." : "Je vyžadováno PHP %sbit nebo vyšší.", @@ -222,14 +226,6 @@ "Recommended" : "Doporučené", "Microsoft Windows Platform is not supported" : "Platforma Microsoft Windows není podporována", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Provozování Nextcloud Serveru na platformě Microsoft Windows není podporováno. Doporučujeme, abyste použili linuxový server ve virtuálním stroji, pokud nemáte možnost server migrovat.", - "Storage not available" : "Úložiště není dostupné", - "ownCloud %s or higher is required." : "Vyžadován ownCloud %s nebo vyšší.", - "ownCloud %s or lower is required." : "Vyžadován ownCloud %s nebo nižší.", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Aplikaci \"%s\" nelze nainstalovat, protože není kompatibilní s touto verzí Nextcloud.", - "App can't be installed because it is not compatible with this version of Nextcloud" : "Aplikaci nelze nainstalovat, protože není kompatibilní s touto verzí Nextcloud", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "Aplikace nemůže být nainstalována, protože verze uvedená v info.xml/version nesouhlasí s verzí hlášenou z úložiště aplikací.", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Tip: Aktualizaci můžete urychlit manuálním spuštěním následujícího SQL příkazu: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Provozování Nextcloud Serveru na platformě Microsoft Windows není podporováno. Doporučujeme, abyste použili linuxový server ve virtuálním stroji, pokud nemáte možnost migrovat server jako takový. Linuxové balíčky i jednoduše použitelné obrazy virtuálních strojů lze nalézt na %s. Pro migraci stávajících instalací na Linux můžete nalézt tipy a migrační skript v naší dokumentaci.", - "This can usually be fixed by giving the webserver write access to the root directory." : "Toto může být obvykle opraveno nastavením přístupových práv webového serveru pro zápis do kořenového adresáře." + "Storage not available" : "Úložiště není dostupné" },"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" } \ No newline at end of file diff --git a/lib/l10n/de.js b/lib/l10n/de.js index f5f30f707686a3107acf29df8226d0f757eea01f..79a8ee25510402f85702a11e9250c812bde259d9 100644 --- a/lib/l10n/de.js +++ b/lib/l10n/de.js @@ -228,14 +228,6 @@ OC.L10N.register( "Recommended" : "Empfohlen", "Microsoft Windows Platform is not supported" : "Microsoft Windows-Plattform wird nicht unterstützt", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Der Betrieb eines Nextcloud-Servers unter Microsoft Windows ist nicht unterstützt. Bitte ziehein Betracht einen Linux-Server im Rahmen einer virtuellen Maschine aufzusetzen, wenn du keine Möglichkeit hast, den Server selbst zu migrieren.", - "Storage not available" : "Speicher nicht verfügbar", - "ownCloud %s or higher is required." : "ownCloud %s oder höher ist erforderlich.", - "ownCloud %s or lower is required." : "ownCloud %s oder niedriger ist erforderlich.", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Die App \"%s\" kann nicht installiert werden, da sie mit dieser Version von Nextcloud nicht kompatibel ist.", - "App can't be installed because it is not compatible with this version of Nextcloud" : "Die App kann nicht installiert werden, da sie mit dieser Version von Nextcloud nicht kompatibel ist", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "App kann nicht installiert werden, da die in info.xml/version angegebene Version von der vom App-Store berichteten abweicht", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Tipp: Du kannst die Aktualisierung beschleunigen indem Du folgenden SQL-Befehl manuell ausführst: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Der Betrieb eines Nextcloud-Servers unter Microsoft Windows ist nicht unterstützt. Bitte ziehe Betracht einen Linux-Server im Rahmen einer virtuellen Maschine aufzusetzen, wenn du keine Möglichkeit hast, den Server selbst zu migrieren. Finde Linux-Pakete sowie einfach bereitzustellende Images für virtuelle Maschinen unter %s. Zur Migration existierender Installationen auf Linux findest du in unserer our Dokumentation einige Tipps und Migrationsscripts.", - "This can usually be fixed by giving the webserver write access to the root directory." : "Dies kann normalerweise repariert werden, indem dem Webserver Schreibzugriff auf das Wurzelverzeichnis gegeben wird." + "Storage not available" : "Speicher nicht verfügbar" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/de.json b/lib/l10n/de.json index f3bf892579e2b6d62591bf76d4c436c769fa289a..180680c2b97c81d423b5681c095a965db2ffd3d7 100644 --- a/lib/l10n/de.json +++ b/lib/l10n/de.json @@ -226,14 +226,6 @@ "Recommended" : "Empfohlen", "Microsoft Windows Platform is not supported" : "Microsoft Windows-Plattform wird nicht unterstützt", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Der Betrieb eines Nextcloud-Servers unter Microsoft Windows ist nicht unterstützt. Bitte ziehein Betracht einen Linux-Server im Rahmen einer virtuellen Maschine aufzusetzen, wenn du keine Möglichkeit hast, den Server selbst zu migrieren.", - "Storage not available" : "Speicher nicht verfügbar", - "ownCloud %s or higher is required." : "ownCloud %s oder höher ist erforderlich.", - "ownCloud %s or lower is required." : "ownCloud %s oder niedriger ist erforderlich.", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Die App \"%s\" kann nicht installiert werden, da sie mit dieser Version von Nextcloud nicht kompatibel ist.", - "App can't be installed because it is not compatible with this version of Nextcloud" : "Die App kann nicht installiert werden, da sie mit dieser Version von Nextcloud nicht kompatibel ist", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "App kann nicht installiert werden, da die in info.xml/version angegebene Version von der vom App-Store berichteten abweicht", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Tipp: Du kannst die Aktualisierung beschleunigen indem Du folgenden SQL-Befehl manuell ausführst: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Der Betrieb eines Nextcloud-Servers unter Microsoft Windows ist nicht unterstützt. Bitte ziehe Betracht einen Linux-Server im Rahmen einer virtuellen Maschine aufzusetzen, wenn du keine Möglichkeit hast, den Server selbst zu migrieren. Finde Linux-Pakete sowie einfach bereitzustellende Images für virtuelle Maschinen unter %s. Zur Migration existierender Installationen auf Linux findest du in unserer our Dokumentation einige Tipps und Migrationsscripts.", - "This can usually be fixed by giving the webserver write access to the root directory." : "Dies kann normalerweise repariert werden, indem dem Webserver Schreibzugriff auf das Wurzelverzeichnis gegeben wird." + "Storage not available" : "Speicher nicht verfügbar" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/lib/l10n/de_DE.js b/lib/l10n/de_DE.js index db3c63c2a32352ff929673d5522fa4cf3b3ca6dc..794e2648b2bb6fe63e164fc54a80f98c491cb66d 100644 --- a/lib/l10n/de_DE.js +++ b/lib/l10n/de_DE.js @@ -53,7 +53,7 @@ OC.L10N.register( "%s enter the database username." : "%s geben Sie den Datenbank-Benutzernamen an.", "%s enter the database name." : "%s geben Sie den Datenbank-Namen an.", "%s you may not use dots in the database name" : "%s Der Datenbank-Name darf keine Punkte enthalten", - "Oracle connection could not be established" : "Die Oracle-Verbindung konnte nicht aufgebaut werden.", + "Oracle connection could not be established" : "Die Oracle-Verbindung konnte nicht hergestellt werden.", "Oracle username and/or password not valid" : "Oracle-Benutzername und/oder -Passwort ungültig", "DB Error: \"%s\"" : "DB-Fehler: „%s“", "Offending command was: \"%s\"" : "Fehlerhafter Befehl war: „%s“", @@ -65,7 +65,7 @@ OC.L10N.register( "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Es scheint, dass diese %s-Instanz unter einer 32-Bit-PHP-Umgebung läuft und open_basedir in der Datei php.ini konfiguriert worden ist. Von einem solchen Betrieb wird dringend abgeraten, weil es dabei zu Problemen mit Dateien kommt, deren Größe 4 GB übersteigt.", "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Bitte entfernen Sie die open_basedir-Einstellung in Ihrer php.ini oder wechseln Sie zu 64-Bit-PHP.", "Set an admin username." : "Einen Administrator-Benutzernamen setzen.", - "Set an admin password." : "Setze Administrator Passwort", + "Set an admin password." : "Ein Administrator-Passwort setzen.", "Can't create or write into the data directory %s" : "Das Datenverzeichnis %s kann nicht erstellt oder es kann darin nicht geschrieben werden.", "Invalid Federated Cloud ID" : "Ungültige Federated-Cloud-ID", "%s shared »%s« with you" : "%s hat „%s“ mit Ihnen geteilt", @@ -153,7 +153,7 @@ OC.L10N.register( "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Nur die folgenden Zeichen sind im Benutzernamen erlaubt: „a-z“, „A-Z“, „0-9“, and „_.@-'“", "A valid username must be provided" : "Es muss ein gültiger Benutzername angegeben werden", "Username contains whitespace at the beginning or at the end" : "Benutzername enthält Leerzeichen am Anfang oder Ende", - "A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden", + "A valid password must be provided" : "Es muss ein gültiges Passwort eingegeben werden", "The username is already being used" : "Der Benutzername existiert bereits", "Login canceled by app" : "Anmeldung durch die App abgebrochen", "User disabled" : "Nutzer deaktiviert", @@ -167,17 +167,17 @@ OC.L10N.register( "App '%s' could not be installed!" : "'%s' - App konnte nicht installiert werden!", "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Die App „%s“ kann nicht installiert werden, da die folgenden Abhängigkeiten nicht erfüllt sind: %s", "a safe home for all your data" : "ein sicherer Ort für all Ihre Daten", - "File is currently busy, please try again later" : "Die Datei ist zur Zeit in Benutzung, bitte versuchen Sie es später noch einmal", + "File is currently busy, please try again later" : "Die Datei ist in Benutzung, bitte versuchen Sie es später noch einmal", "Can't read file" : "Datei kann nicht gelesen werden", "Application is not enabled" : "Die Anwendung ist nicht aktiviert", "Authentication error" : "Authentifizierungsfehler", "Token expired. Please reload page." : "Token abgelaufen. Bitte laden Sie die Seite neu.", "Unknown user" : "Unbekannter Benutzer", "No database drivers (sqlite, mysql, or postgresql) installed." : "Keine Datenbanktreiber (SQLite, MYSQL oder PostgreSQL) installiert.", - "Cannot write into \"config\" directory" : "Das Schreiben in das „config“-Verzeichnis ist nicht möglich", - "Cannot write into \"apps\" directory" : "Das Schreiben in das „apps“-Verzeichnis ist nicht möglich", + "Cannot write into \"config\" directory" : "Schreiben in das „config“-Verzeichnis ist nicht möglich", + "Cannot write into \"apps\" directory" : "Schreiben in das „apps“-Verzeichnis ist nicht möglich", "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Dies kann normalerweise behoben werden, %sindem dem Webserver Schreibzugriff auf das App-Verzeichnis gegeben wird%s oder der App Store in der Konfigurationsdatei deaktiviert wird.", - "Cannot create \"data\" directory (%s)" : "Das Erstellen des „data“-Verzeichnisses ist nicht möglich (%s)", + "Cannot create \"data\" directory (%s)" : "Erstellen des „data“-Verzeichnisses ist nicht möglich (%s)", "This can usually be fixed by giving the webserver write access to the root directory." : "Dies kann normalerweise repariert werden, indem dem Webserver Schreibzugriff auf das Wurzelverzeichnis gegeben wird.", "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Berechtigungen können normalerweise repariert werden, indem dem Webserver %s Schreibzugriff auf das Wurzelverzeichnis %s gegeben wird.", "Setting locale to %s failed" : "Das Setzen der Umgebungslokale auf %s fehlgeschlagen", @@ -217,7 +217,7 @@ OC.L10N.register( "No path specified when installing app from local file" : "Bei der Installation der Applikation aus einer lokalen Datei wurde kein Pfad angegeben", "Archives of type %s are not supported" : "Archive des Typs %s werden nicht unterstützt.", "Failed to open archive when installing app" : "Das Archiv konnte bei der Installation der Applikation nicht geöffnet werden", - "App does not provide an info.xml file" : "Die Applikation enthält keine info.xml Datei", + "App does not provide an info.xml file" : "Die Anwendung enthält keine info.xml Datei", "App cannot be installed because appinfo file cannot be read." : "Die Anwendung kann nicht installiert werden, weil die Anwendungsinfodatei nicht gelesen werden kann.", "Signature could not get checked. Please contact the app developer and check your admin screen." : "Signatur konnte nicht überprüft werden. Bitte kontaktieren Sie den App Entwickler und überprüfen Sie Ihren Administrationsbereich.", "App can't be installed because of not allowed code in the App" : "Die App kann nicht installiert werden, weil sie unerlaubten Code enthält", @@ -228,14 +228,6 @@ OC.L10N.register( "Recommended" : "Empfohlen", "Microsoft Windows Platform is not supported" : "Microsoft Windows-Plattform wird nicht unterstützt", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Der Betrieb eines Nextcloud Servers unter Microsoft Windows ist nicht unterstützt. Bitte ziehen Sie in Betracht einen Linux Server im Rahmen einer virtuellen Maschine aufzusetzen, wenn Sie keine Möglichkeit haben, den Server selbst zu migrieren.", - "Storage not available" : "Speicher nicht verfügbar", - "ownCloud %s or higher is required." : "ownCloud %s oder neuer erforderlich", - "ownCloud %s or lower is required." : "ownCloud %s oder älter erforderlich", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Die App \"%s\" kann nicht installiert werden, da sie mit dieser Version von Nextcloud nicht kompatibel ist.", - "App can't be installed because it is not compatible with this version of Nextcloud" : "Die App kann nicht installiert werden, da sie mit dieser Version von Nextcloud nicht kompatibel ist", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "App kann nicht installiert werden, da die in info.xml/version angegebene Version von der vom App-Store berichteten abweicht", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Tipp: Sie können die Aktualisierung beschleunigen indem Sie folgenden SQL-Befehl manuell ausführen: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Der Betrieb eines Nextcloud-Servers unter Microsoft Windows ist nicht unterstützt. Bitte ziehen Sie Betracht einen Linux-Server im Rahmen einer virtuellen Maschine aufzusetzen, wenn Sie keine Möglichkeit haben, den Server selbst zu migrieren. Finden Sie Linux-Pakete sowie einfach bereitzustellende Images für virtuelle Maschinen unter %s. Zur Migration existierender Installationen auf Linux finden Sie in unserer unserer Dokumentation einige Tipps und Migrationsscripts.", - "This can usually be fixed by giving the webserver write access to the root directory." : "Dies kann normalerweise repariert werden, indem dem Webserver Schreibzugriff auf das Wurzelverzeichnis gegeben wird." + "Storage not available" : "Speicher nicht verfügbar" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/de_DE.json b/lib/l10n/de_DE.json index 1df6854ae9b4bc00c3b7c36863b76c04ff9a62d3..6228b9645ac510677983b0a884a3c5b915b0bf54 100644 --- a/lib/l10n/de_DE.json +++ b/lib/l10n/de_DE.json @@ -51,7 +51,7 @@ "%s enter the database username." : "%s geben Sie den Datenbank-Benutzernamen an.", "%s enter the database name." : "%s geben Sie den Datenbank-Namen an.", "%s you may not use dots in the database name" : "%s Der Datenbank-Name darf keine Punkte enthalten", - "Oracle connection could not be established" : "Die Oracle-Verbindung konnte nicht aufgebaut werden.", + "Oracle connection could not be established" : "Die Oracle-Verbindung konnte nicht hergestellt werden.", "Oracle username and/or password not valid" : "Oracle-Benutzername und/oder -Passwort ungültig", "DB Error: \"%s\"" : "DB-Fehler: „%s“", "Offending command was: \"%s\"" : "Fehlerhafter Befehl war: „%s“", @@ -63,7 +63,7 @@ "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Es scheint, dass diese %s-Instanz unter einer 32-Bit-PHP-Umgebung läuft und open_basedir in der Datei php.ini konfiguriert worden ist. Von einem solchen Betrieb wird dringend abgeraten, weil es dabei zu Problemen mit Dateien kommt, deren Größe 4 GB übersteigt.", "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Bitte entfernen Sie die open_basedir-Einstellung in Ihrer php.ini oder wechseln Sie zu 64-Bit-PHP.", "Set an admin username." : "Einen Administrator-Benutzernamen setzen.", - "Set an admin password." : "Setze Administrator Passwort", + "Set an admin password." : "Ein Administrator-Passwort setzen.", "Can't create or write into the data directory %s" : "Das Datenverzeichnis %s kann nicht erstellt oder es kann darin nicht geschrieben werden.", "Invalid Federated Cloud ID" : "Ungültige Federated-Cloud-ID", "%s shared »%s« with you" : "%s hat „%s“ mit Ihnen geteilt", @@ -151,7 +151,7 @@ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Nur die folgenden Zeichen sind im Benutzernamen erlaubt: „a-z“, „A-Z“, „0-9“, and „_.@-'“", "A valid username must be provided" : "Es muss ein gültiger Benutzername angegeben werden", "Username contains whitespace at the beginning or at the end" : "Benutzername enthält Leerzeichen am Anfang oder Ende", - "A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden", + "A valid password must be provided" : "Es muss ein gültiges Passwort eingegeben werden", "The username is already being used" : "Der Benutzername existiert bereits", "Login canceled by app" : "Anmeldung durch die App abgebrochen", "User disabled" : "Nutzer deaktiviert", @@ -165,17 +165,17 @@ "App '%s' could not be installed!" : "'%s' - App konnte nicht installiert werden!", "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Die App „%s“ kann nicht installiert werden, da die folgenden Abhängigkeiten nicht erfüllt sind: %s", "a safe home for all your data" : "ein sicherer Ort für all Ihre Daten", - "File is currently busy, please try again later" : "Die Datei ist zur Zeit in Benutzung, bitte versuchen Sie es später noch einmal", + "File is currently busy, please try again later" : "Die Datei ist in Benutzung, bitte versuchen Sie es später noch einmal", "Can't read file" : "Datei kann nicht gelesen werden", "Application is not enabled" : "Die Anwendung ist nicht aktiviert", "Authentication error" : "Authentifizierungsfehler", "Token expired. Please reload page." : "Token abgelaufen. Bitte laden Sie die Seite neu.", "Unknown user" : "Unbekannter Benutzer", "No database drivers (sqlite, mysql, or postgresql) installed." : "Keine Datenbanktreiber (SQLite, MYSQL oder PostgreSQL) installiert.", - "Cannot write into \"config\" directory" : "Das Schreiben in das „config“-Verzeichnis ist nicht möglich", - "Cannot write into \"apps\" directory" : "Das Schreiben in das „apps“-Verzeichnis ist nicht möglich", + "Cannot write into \"config\" directory" : "Schreiben in das „config“-Verzeichnis ist nicht möglich", + "Cannot write into \"apps\" directory" : "Schreiben in das „apps“-Verzeichnis ist nicht möglich", "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Dies kann normalerweise behoben werden, %sindem dem Webserver Schreibzugriff auf das App-Verzeichnis gegeben wird%s oder der App Store in der Konfigurationsdatei deaktiviert wird.", - "Cannot create \"data\" directory (%s)" : "Das Erstellen des „data“-Verzeichnisses ist nicht möglich (%s)", + "Cannot create \"data\" directory (%s)" : "Erstellen des „data“-Verzeichnisses ist nicht möglich (%s)", "This can usually be fixed by giving the webserver write access to the root directory." : "Dies kann normalerweise repariert werden, indem dem Webserver Schreibzugriff auf das Wurzelverzeichnis gegeben wird.", "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Berechtigungen können normalerweise repariert werden, indem dem Webserver %s Schreibzugriff auf das Wurzelverzeichnis %s gegeben wird.", "Setting locale to %s failed" : "Das Setzen der Umgebungslokale auf %s fehlgeschlagen", @@ -215,7 +215,7 @@ "No path specified when installing app from local file" : "Bei der Installation der Applikation aus einer lokalen Datei wurde kein Pfad angegeben", "Archives of type %s are not supported" : "Archive des Typs %s werden nicht unterstützt.", "Failed to open archive when installing app" : "Das Archiv konnte bei der Installation der Applikation nicht geöffnet werden", - "App does not provide an info.xml file" : "Die Applikation enthält keine info.xml Datei", + "App does not provide an info.xml file" : "Die Anwendung enthält keine info.xml Datei", "App cannot be installed because appinfo file cannot be read." : "Die Anwendung kann nicht installiert werden, weil die Anwendungsinfodatei nicht gelesen werden kann.", "Signature could not get checked. Please contact the app developer and check your admin screen." : "Signatur konnte nicht überprüft werden. Bitte kontaktieren Sie den App Entwickler und überprüfen Sie Ihren Administrationsbereich.", "App can't be installed because of not allowed code in the App" : "Die App kann nicht installiert werden, weil sie unerlaubten Code enthält", @@ -226,14 +226,6 @@ "Recommended" : "Empfohlen", "Microsoft Windows Platform is not supported" : "Microsoft Windows-Plattform wird nicht unterstützt", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Der Betrieb eines Nextcloud Servers unter Microsoft Windows ist nicht unterstützt. Bitte ziehen Sie in Betracht einen Linux Server im Rahmen einer virtuellen Maschine aufzusetzen, wenn Sie keine Möglichkeit haben, den Server selbst zu migrieren.", - "Storage not available" : "Speicher nicht verfügbar", - "ownCloud %s or higher is required." : "ownCloud %s oder neuer erforderlich", - "ownCloud %s or lower is required." : "ownCloud %s oder älter erforderlich", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Die App \"%s\" kann nicht installiert werden, da sie mit dieser Version von Nextcloud nicht kompatibel ist.", - "App can't be installed because it is not compatible with this version of Nextcloud" : "Die App kann nicht installiert werden, da sie mit dieser Version von Nextcloud nicht kompatibel ist", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "App kann nicht installiert werden, da die in info.xml/version angegebene Version von der vom App-Store berichteten abweicht", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Tipp: Sie können die Aktualisierung beschleunigen indem Sie folgenden SQL-Befehl manuell ausführen: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Der Betrieb eines Nextcloud-Servers unter Microsoft Windows ist nicht unterstützt. Bitte ziehen Sie Betracht einen Linux-Server im Rahmen einer virtuellen Maschine aufzusetzen, wenn Sie keine Möglichkeit haben, den Server selbst zu migrieren. Finden Sie Linux-Pakete sowie einfach bereitzustellende Images für virtuelle Maschinen unter %s. Zur Migration existierender Installationen auf Linux finden Sie in unserer unserer Dokumentation einige Tipps und Migrationsscripts.", - "This can usually be fixed by giving the webserver write access to the root directory." : "Dies kann normalerweise repariert werden, indem dem Webserver Schreibzugriff auf das Wurzelverzeichnis gegeben wird." + "Storage not available" : "Speicher nicht verfügbar" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/lib/l10n/es.js b/lib/l10n/es.js index 6119a9cebb1af8ad2fddcb1ef6bde7dd05f87d27..80756b58b5cbd9c67d094f8f2a55187d875d3f25 100644 --- a/lib/l10n/es.js +++ b/lib/l10n/es.js @@ -228,14 +228,6 @@ OC.L10N.register( "Recommended" : "Recomendado", "Microsoft Windows Platform is not supported" : "La plataforma Microsoft Windows no está soportada", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Ejecutar el servidor Nextcloud en la plataforma MIcrosoft Windows no está soportado. Sugerimos usar un servidor Linux en una máquina virtual si no existe la opción de migrar el propio servidor.", - "Storage not available" : "Almacenamiento no disponible", - "ownCloud %s or higher is required." : "Se necesita la versión %s o superior.", - "ownCloud %s or lower is required." : "Se necesita la versión %s o inferior.", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "La aplicación \"%s\" no se puede instalar porque no es compatible con esta versión de Nextcloud.", - "App can't be installed because it is not compatible with this version of Nextcloud" : "La aplicación no se puede instalar porque no es compatible con esta versión de Nextcloud", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "La App no se puede instalar debido a que la versión de info.xml no es la misma que la versión informada por la app store.", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Truco: Se puede acelerar la actualización ejecutando este comando SQL de forma manual: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Ejecutar el servidor Nextcloud en la plataforma Microsoft Windows no está soportado. Sugerimos usar una servidor Linux en una máquina virtual si no existe la opción de migrar el propio servidor. Se encuentran paquetes, así como imágenes en de máquina virtual fáciles de desplegar en %s. Para migrar instalaciones existentes a Linux se pueden encontrar algunas pistas y un script de migración en nuestra documentación.", - "This can usually be fixed by giving the webserver write access to the root directory." : "Esto normalmente puede arreglarse dando al servidor web acceso de escritura al directorio raíz." + "Storage not available" : "Almacenamiento no disponible" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/es.json b/lib/l10n/es.json index 0f9d83569b76f2d112470a84306a1300b59e7eeb..2ea8a94e8ddbe6d4c39d9776e13eda4f89d75f0a 100644 --- a/lib/l10n/es.json +++ b/lib/l10n/es.json @@ -226,14 +226,6 @@ "Recommended" : "Recomendado", "Microsoft Windows Platform is not supported" : "La plataforma Microsoft Windows no está soportada", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Ejecutar el servidor Nextcloud en la plataforma MIcrosoft Windows no está soportado. Sugerimos usar un servidor Linux en una máquina virtual si no existe la opción de migrar el propio servidor.", - "Storage not available" : "Almacenamiento no disponible", - "ownCloud %s or higher is required." : "Se necesita la versión %s o superior.", - "ownCloud %s or lower is required." : "Se necesita la versión %s o inferior.", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "La aplicación \"%s\" no se puede instalar porque no es compatible con esta versión de Nextcloud.", - "App can't be installed because it is not compatible with this version of Nextcloud" : "La aplicación no se puede instalar porque no es compatible con esta versión de Nextcloud", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "La App no se puede instalar debido a que la versión de info.xml no es la misma que la versión informada por la app store.", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Truco: Se puede acelerar la actualización ejecutando este comando SQL de forma manual: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Ejecutar el servidor Nextcloud en la plataforma Microsoft Windows no está soportado. Sugerimos usar una servidor Linux en una máquina virtual si no existe la opción de migrar el propio servidor. Se encuentran paquetes, así como imágenes en de máquina virtual fáciles de desplegar en %s. Para migrar instalaciones existentes a Linux se pueden encontrar algunas pistas y un script de migración en nuestra documentación.", - "This can usually be fixed by giving the webserver write access to the root directory." : "Esto normalmente puede arreglarse dando al servidor web acceso de escritura al directorio raíz." + "Storage not available" : "Almacenamiento no disponible" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js index c938c8e8ab79eeed6dc0d330a0d9973bdfff69d6..96d77556debe4c1eb27dd54fbf11d6a52eb2f899 100644 --- a/lib/l10n/fr.js +++ b/lib/l10n/fr.js @@ -57,7 +57,7 @@ OC.L10N.register( "Oracle username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base Oracle non valide(s)", "DB Error: \"%s\"" : "Erreur de la base de données : \"%s\"", "Offending command was: \"%s\"" : "La requête en cause est : \"%s\"", - "You need to enter either an existing account or the administrator." : "Vous devez spécifier le nom d'un compte existant, ou celui de l'administrateur.", + "You need to enter either an existing account or the administrator." : "Vous devez indiquer un compte existant ou celui de l'administrateur.", "Offending command was: \"%s\", name: %s, password: %s" : "La requête en cause est : \"%s\", nom : %s, mot de passe : %s", "PostgreSQL username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base PostgreSQL non valide(s)", "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X n'est pas pris en charge et %s ne fonctionnera pas correctement sur cette plate-forme. Son utilisation est à vos risques et périls !", @@ -228,14 +228,6 @@ OC.L10N.register( "Recommended" : "Recommandée", "Microsoft Windows Platform is not supported" : "La plate-forme Microsoft Windows n'est pas prise en charge.", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "L'exécution de Nextcloud Server sur une plateforme Microsoft Windows n'est pas supportée. Nous suggérons d'utilier un serveur Linux dans une machine virtuelle si vous n'avez pas la possibilité de migrer le serveur lui-même.", - "Storage not available" : "Support de stockage non disponible", - "ownCloud %s or higher is required." : "Nextcloud %s ou supérieur est requis.", - "ownCloud %s or lower is required." : "Nextcloud %s ou inférieur est requis.", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "L'application \"%s\" ne peut être installée car elle n'est pas compatible avec cette version de Nextcloud.", - "App can't be installed because it is not compatible with this version of Nextcloud" : "L'application ne peut être installée car elle n'est pas compatible avec cette version de Nextcloud", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "L'application ne peut être installée car la version dans info.xml/version n'est pas la même que la version signalée sur l'app store", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Aide : Vous pouvez accélérer la mise à jour en exécutant manuellement la commande SQL suivante : ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Exécuter Nextcloud Server sur une plateforme Microsoft Windows n'est pas supporté. Nous vous suggérons d'utiliser un serveur Linux dans une machine virtuelle si vous n'avez pas l'option de migrer votre serveur. Trouver les paquets Linux aussi facilement que de déployer une image de machine virtuelle sur %s. Pour migrer vos installations existantes sur Linux, vous pouvez trouver plein d'astuces et un script de migration sur notre documentation.", - "This can usually be fixed by giving the webserver write access to the root directory." : "Ce problème est généralement résolu en donnant les accès en écriture dans le répertoire root." + "Storage not available" : "Support de stockage non disponible" }, "nplurals=2; plural=(n > 1);"); diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json index 09e0cfb9c463e164b514ea0c5c42021818924ac3..a9b89108b707c1f4eafa8ac39a5378aa238216d4 100644 --- a/lib/l10n/fr.json +++ b/lib/l10n/fr.json @@ -55,7 +55,7 @@ "Oracle username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base Oracle non valide(s)", "DB Error: \"%s\"" : "Erreur de la base de données : \"%s\"", "Offending command was: \"%s\"" : "La requête en cause est : \"%s\"", - "You need to enter either an existing account or the administrator." : "Vous devez spécifier le nom d'un compte existant, ou celui de l'administrateur.", + "You need to enter either an existing account or the administrator." : "Vous devez indiquer un compte existant ou celui de l'administrateur.", "Offending command was: \"%s\", name: %s, password: %s" : "La requête en cause est : \"%s\", nom : %s, mot de passe : %s", "PostgreSQL username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base PostgreSQL non valide(s)", "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X n'est pas pris en charge et %s ne fonctionnera pas correctement sur cette plate-forme. Son utilisation est à vos risques et périls !", @@ -226,14 +226,6 @@ "Recommended" : "Recommandée", "Microsoft Windows Platform is not supported" : "La plate-forme Microsoft Windows n'est pas prise en charge.", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "L'exécution de Nextcloud Server sur une plateforme Microsoft Windows n'est pas supportée. Nous suggérons d'utilier un serveur Linux dans une machine virtuelle si vous n'avez pas la possibilité de migrer le serveur lui-même.", - "Storage not available" : "Support de stockage non disponible", - "ownCloud %s or higher is required." : "Nextcloud %s ou supérieur est requis.", - "ownCloud %s or lower is required." : "Nextcloud %s ou inférieur est requis.", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "L'application \"%s\" ne peut être installée car elle n'est pas compatible avec cette version de Nextcloud.", - "App can't be installed because it is not compatible with this version of Nextcloud" : "L'application ne peut être installée car elle n'est pas compatible avec cette version de Nextcloud", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "L'application ne peut être installée car la version dans info.xml/version n'est pas la même que la version signalée sur l'app store", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Aide : Vous pouvez accélérer la mise à jour en exécutant manuellement la commande SQL suivante : ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Exécuter Nextcloud Server sur une plateforme Microsoft Windows n'est pas supporté. Nous vous suggérons d'utiliser un serveur Linux dans une machine virtuelle si vous n'avez pas l'option de migrer votre serveur. Trouver les paquets Linux aussi facilement que de déployer une image de machine virtuelle sur %s. Pour migrer vos installations existantes sur Linux, vous pouvez trouver plein d'astuces et un script de migration sur notre documentation.", - "This can usually be fixed by giving the webserver write access to the root directory." : "Ce problème est généralement résolu en donnant les accès en écriture dans le répertoire root." + "Storage not available" : "Support de stockage non disponible" },"pluralForm" :"nplurals=2; plural=(n > 1);" } \ No newline at end of file diff --git a/lib/l10n/hu_HU.js b/lib/l10n/hu_HU.js index b38cc75a14b5d26bc7b31155cf969bf249aa6081..1ca8068cf7719741487a3b65ae445c52a8b6fd95 100644 --- a/lib/l10n/hu_HU.js +++ b/lib/l10n/hu_HU.js @@ -228,14 +228,6 @@ OC.L10N.register( "Recommended" : "Ajánlott", "Microsoft Windows Platform is not supported" : "Microsoft Windows platform nem támogatott", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "A Nextcloud Server Microsoft Windows platformon való futtatása nem támogatott. Ha nincs más lehetőséged a szerver migrációjára, akkor javasoljuk, hogy Linux szervert használj virtuális gépben.", - "Storage not available" : "A tároló elérhetetlen.", - "ownCloud %s or higher is required." : "ownCloud %s vagy újabb szükséges.", - "ownCloud %s or lower is required." : "ownCloud %s vagy régebbi szükséges.", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "\"%s\" alkalmazás nem telepíthető, mert nem kompatibilis az Nextcloud ezen verziójával", - "App can't be installed because it is not compatible with this version of Nextcloud" : "Az alkalmazás nem telepíthető, mert nem kompatibilis az Nextcloud ezen verziójával", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "Az alkalmazás nem telepíthető, mert az info.xml/version részben tárolt verzió nem egyezik meg az alkalmazás boltban elérhető verzióval", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Tipp: A következő SQL parancs segítségével manuálisan felgyorsíthatod a frissítést: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "A Nextcloud Server Microsoft Windows platformon való futtatása nem támogatott. Ha nincs más lehetőséged a szerver migrációjára, akkor javasoljuk, hogy Linux szervert használj virtuális gépben. Linux csomagokat és könnyen üzembe helyezhető virtuális gép képfájlokat itt találhatsz: %s. Létező telepítések Linux migrációjához tippeket és migrációs szkriptet a dokumentációban találhatsz.", - "This can usually be fixed by giving the webserver write access to the root directory." : "Ez általában úgy javítható, hogy a webszervernek írási jogosultságot adsz a root könyvtárra." + "Storage not available" : "A tároló elérhetetlen." }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/hu_HU.json b/lib/l10n/hu_HU.json index 8ff08b4f6daed87d79509b33eeb467602a6cc9d5..a3f22bc7d5bb3fc8f6718b34f49b82f7d8400660 100644 --- a/lib/l10n/hu_HU.json +++ b/lib/l10n/hu_HU.json @@ -226,14 +226,6 @@ "Recommended" : "Ajánlott", "Microsoft Windows Platform is not supported" : "Microsoft Windows platform nem támogatott", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "A Nextcloud Server Microsoft Windows platformon való futtatása nem támogatott. Ha nincs más lehetőséged a szerver migrációjára, akkor javasoljuk, hogy Linux szervert használj virtuális gépben.", - "Storage not available" : "A tároló elérhetetlen.", - "ownCloud %s or higher is required." : "ownCloud %s vagy újabb szükséges.", - "ownCloud %s or lower is required." : "ownCloud %s vagy régebbi szükséges.", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "\"%s\" alkalmazás nem telepíthető, mert nem kompatibilis az Nextcloud ezen verziójával", - "App can't be installed because it is not compatible with this version of Nextcloud" : "Az alkalmazás nem telepíthető, mert nem kompatibilis az Nextcloud ezen verziójával", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "Az alkalmazás nem telepíthető, mert az info.xml/version részben tárolt verzió nem egyezik meg az alkalmazás boltban elérhető verzióval", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Tipp: A következő SQL parancs segítségével manuálisan felgyorsíthatod a frissítést: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "A Nextcloud Server Microsoft Windows platformon való futtatása nem támogatott. Ha nincs más lehetőséged a szerver migrációjára, akkor javasoljuk, hogy Linux szervert használj virtuális gépben. Linux csomagokat és könnyen üzembe helyezhető virtuális gép képfájlokat itt találhatsz: %s. Létező telepítések Linux migrációjához tippeket és migrációs szkriptet a dokumentációban találhatsz.", - "This can usually be fixed by giving the webserver write access to the root directory." : "Ez általában úgy javítható, hogy a webszervernek írási jogosultságot adsz a root könyvtárra." + "Storage not available" : "A tároló elérhetetlen." },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/lib/l10n/it.js b/lib/l10n/it.js index c52328211f8f81147baa3ac6d99b517b9e42873e..d061ef5068391ce3f0e6914c88cc6957ab5985fd 100644 --- a/lib/l10n/it.js +++ b/lib/l10n/it.js @@ -228,14 +228,6 @@ OC.L10N.register( "Recommended" : "Consigliata", "Microsoft Windows Platform is not supported" : "La piattaforma Microsoft Windows non è supportata", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "L'esecuzione del server Nextcloud sulla piattaforma Microsoft Windows. Ti consigliamo di utilizzare un server Linux in una macchina virtuale.", - "Storage not available" : "Archiviazione non disponibile", - "ownCloud %s or higher is required." : "È richiesta la versione %s o successiva di ownCloud.", - "ownCloud %s or lower is required." : "È richiesta la versione %s o precedente di ownCloud.", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "L'applicazione \"%s\" non può essere installata perché non è compatibile con questa versione di Nextcloud.", - "App can't be installed because it is not compatible with this version of Nextcloud" : "L'applicazione non può essere installata perché non è compatibile con questa versione di Nextcloud", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "L'applicazione non può essere installata poiché la versione nel file info.xml/version non è la stessa riportata dall'app store", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Suggerimento: puoi eseguire più velocemente l'aggiornamento eseguendo questa istruzione SQL: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "L'esecuzione del server Nextcloud sulla piattaforma Microsoft Windows non è supportato. Ti consigliamo di utilizzare un server Linux in una macchina virtuale se non hai la possibilità di migrare il server. Trovare i pacchetti per Linux è facile quanto attivare immagini di macchine virtuali su %s. Per migrare installazioni esistenti su Linux, puoi trovare alcuni consigli e uno script di migrazione nella nostra documentazione.", - "This can usually be fixed by giving the webserver write access to the root directory." : "Ciò può essere normalmente corretto fornendo al server web accesso in scrittura alla cartella radice." + "Storage not available" : "Archiviazione non disponibile" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/it.json b/lib/l10n/it.json index 4d1455e8dabcc66fe23fb5dd27f3709fe30f0ab9..2ed1ebfe337f9ccc977256e701ae12440bf9aad6 100644 --- a/lib/l10n/it.json +++ b/lib/l10n/it.json @@ -226,14 +226,6 @@ "Recommended" : "Consigliata", "Microsoft Windows Platform is not supported" : "La piattaforma Microsoft Windows non è supportata", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "L'esecuzione del server Nextcloud sulla piattaforma Microsoft Windows. Ti consigliamo di utilizzare un server Linux in una macchina virtuale.", - "Storage not available" : "Archiviazione non disponibile", - "ownCloud %s or higher is required." : "È richiesta la versione %s o successiva di ownCloud.", - "ownCloud %s or lower is required." : "È richiesta la versione %s o precedente di ownCloud.", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "L'applicazione \"%s\" non può essere installata perché non è compatibile con questa versione di Nextcloud.", - "App can't be installed because it is not compatible with this version of Nextcloud" : "L'applicazione non può essere installata perché non è compatibile con questa versione di Nextcloud", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "L'applicazione non può essere installata poiché la versione nel file info.xml/version non è la stessa riportata dall'app store", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Suggerimento: puoi eseguire più velocemente l'aggiornamento eseguendo questa istruzione SQL: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "L'esecuzione del server Nextcloud sulla piattaforma Microsoft Windows non è supportato. Ti consigliamo di utilizzare un server Linux in una macchina virtuale se non hai la possibilità di migrare il server. Trovare i pacchetti per Linux è facile quanto attivare immagini di macchine virtuali su %s. Per migrare installazioni esistenti su Linux, puoi trovare alcuni consigli e uno script di migrazione nella nostra documentazione.", - "This can usually be fixed by giving the webserver write access to the root directory." : "Ciò può essere normalmente corretto fornendo al server web accesso in scrittura alla cartella radice." + "Storage not available" : "Archiviazione non disponibile" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/lib/l10n/ja.js b/lib/l10n/ja.js index bea58917a4c12a0c2f2363e43c35f9aa057077b0..5ce196ffbbb1f4223fd02e59b8c5f390b5427513 100644 --- a/lib/l10n/ja.js +++ b/lib/l10n/ja.js @@ -228,14 +228,6 @@ OC.L10N.register( "Recommended" : "おすすめ", "Microsoft Windows Platform is not supported" : "Microsoft Windows プラットフォームはサポートしていません。", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "マイクロソフト Windowsプラットフォーム上での Nextcloudの動作をサポートしていません。サーバー丸ごと移行する方式をとれない場合は仮想マシンで Linux を動かすことをお勧めします。", - "Storage not available" : "ストレージが利用できません", - "ownCloud %s or higher is required." : "ownCloud %s 以上が必要です", - "ownCloud %s or lower is required." : "ownCloud %s 以下が必要です", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "\"%s\" アプリはこのバージョンのNextcloudと互換性がないためインストールできません。", - "App can't be installed because it is not compatible with this version of Nextcloud" : "このバージョンのNextcloudと互換性がないため、アプリケーションをインストールできません", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "info.xml/version のバージョンがアプリストアのバージョンと合っていないため、アプリはインストールされません", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "ヒント:次のSQLコマンドを手動で実行すると、アップグレードを高速化できます: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Microsoft WindowsプラットフォームでのNextcloud Serverの実行はサポートされていません。サーバー自体を移行するオプションがない場合は、仮想マシンでLinuxサーバーを使用することをお勧めします。 %s でLinuxパッケージを見つけたり、簡単に仮想マシンイメージを展開したりできます。既存のインストールをLinuxに移行するには、こちらのドキュメントにいくつかのヒントと移行スクリプトがあります。", - "This can usually be fixed by giving the webserver write access to the root directory." : "多くの場合、Webサーバーのルートディレクトリに書き込み権限を与えることで解決できます。" + "Storage not available" : "ストレージが利用できません" }, "nplurals=1; plural=0;"); diff --git a/lib/l10n/ja.json b/lib/l10n/ja.json index c62bf1bae85ee3e78f33fb7a0b6620fc7eb1e8cc..31d6ccd6b84d052b4a9a6e32977a8947c751214e 100644 --- a/lib/l10n/ja.json +++ b/lib/l10n/ja.json @@ -226,14 +226,6 @@ "Recommended" : "おすすめ", "Microsoft Windows Platform is not supported" : "Microsoft Windows プラットフォームはサポートしていません。", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "マイクロソフト Windowsプラットフォーム上での Nextcloudの動作をサポートしていません。サーバー丸ごと移行する方式をとれない場合は仮想マシンで Linux を動かすことをお勧めします。", - "Storage not available" : "ストレージが利用できません", - "ownCloud %s or higher is required." : "ownCloud %s 以上が必要です", - "ownCloud %s or lower is required." : "ownCloud %s 以下が必要です", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "\"%s\" アプリはこのバージョンのNextcloudと互換性がないためインストールできません。", - "App can't be installed because it is not compatible with this version of Nextcloud" : "このバージョンのNextcloudと互換性がないため、アプリケーションをインストールできません", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "info.xml/version のバージョンがアプリストアのバージョンと合っていないため、アプリはインストールされません", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "ヒント:次のSQLコマンドを手動で実行すると、アップグレードを高速化できます: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Microsoft WindowsプラットフォームでのNextcloud Serverの実行はサポートされていません。サーバー自体を移行するオプションがない場合は、仮想マシンでLinuxサーバーを使用することをお勧めします。 %s でLinuxパッケージを見つけたり、簡単に仮想マシンイメージを展開したりできます。既存のインストールをLinuxに移行するには、こちらのドキュメントにいくつかのヒントと移行スクリプトがあります。", - "This can usually be fixed by giving the webserver write access to the root directory." : "多くの場合、Webサーバーのルートディレクトリに書き込み権限を与えることで解決できます。" + "Storage not available" : "ストレージが利用できません" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/lib/l10n/nb_NO.js b/lib/l10n/nb_NO.js index 934aa02a1e1ea9d9eb1a48f705bcf35ddcb4e3d8..0fcaa03b24678cb41d59eb283fa503bcce78ca7c 100644 --- a/lib/l10n/nb_NO.js +++ b/lib/l10n/nb_NO.js @@ -5,8 +5,13 @@ OC.L10N.register( "This can usually be fixed by giving the webserver write access to the config directory" : "Dette kan vanligvis ordnes ved å gi web-tjeneren skrivetilgang til config-mappen", "See %s" : "Se %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dette kan vanligvis ordnes ved %så gi web-tjeneren skrivetilgang til config-mappen%s.", + "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Filene i appen %$1s ble ikke erstattet skikkelig. Sjekk at versjonen er kompatibel med tjeneren.", "Sample configuration detected" : "Eksempelkonfigurasjon oppdaget", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Det ble oppdaget at eksempelkonfigurasjonen er blitt kopiert. Dette kan ødelegge installasjonen din og støttes ikke. Les dokumentasjonen før du gjør endringer i config.php", + "%1$s and %2$s" : "%1$s og %2$s", + "%1$s, %2$s and %3$s" : "%1$s, %2$s og %3$s", + "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s og %4$s", + "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s og %5$s", "PHP %s or higher is required." : "PHP %s eller nyere kreves.", "PHP with a version lower than %s is required." : "PHP med en versjon lavere enn %s kreves.", "%sbit or higher PHP required." : "%sbit eller høyere PHP kreves", @@ -20,6 +25,7 @@ OC.L10N.register( "Server version %s or lower is required." : "Tjenerversjon %s eller lavere kreves.", "Unknown filetype" : "Ukjent filtype", "Invalid image" : "Ugyldig bilde", + "Avatar image is not square" : "Avatarbilde er ikke firkantet", "today" : "i dag", "yesterday" : "i går", "_%n day ago_::_%n days ago_" : ["%n dag siden","%n dager siden"], @@ -222,14 +228,6 @@ OC.L10N.register( "Recommended" : "Anbefalt", "Microsoft Windows Platform is not supported" : "Microsoft Windows-plattform støttes ikke", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Kjøring av Nextcloud tjeneren på en Microsoft Windows plattform er ikke støttet. Vi foreslår at du bruker en Linux tjener i en virtuell maskin hvis du ikke har mulighet til å migrere tjeneren selv.", - "Storage not available" : "Lagringsplass ikke tilgjengelig", - "ownCloud %s or higher is required." : "Nextcloud %s eller høyere er påkrevd.", - "ownCloud %s or lower is required." : "Nextcloud %s eller lavere er påkrevd.", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Appen \"%s\" kan ikke installeres da den ikke er kompatibel med denne versjonen av Nextcloud", - "App can't be installed because it is not compatible with this version of Nextcloud" : "Appen kan ikke installeres da den ikke er kompatibel med denne versjonen av Nextcloud", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "App kan ikke installeres fordi versjonen i info.xml/version ikke er den samme som versjonen som rapporteres fra app-butikken", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Hint: Du kan øke hastigheten på oppgraderingen ved å kjøre denne SQL kommandoen manuelt: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Kjøring av Nextcloud tjeneren på en Microsoft Windows plattform er ikke støttet. Vi foreslår at du bruker en Linux tjener i en virtuell maskin hvis du ikke har mulighet til å migrere selve tjeneren. Finn Linuxpakker og virtuelle maskiner på %s. For å migrere eksisterende installasjon til Linux kan du finne gode tips og migreringsskript i vår dokumentasjon.", - "This can usually be fixed by giving the webserver write access to the root directory." : "Dette fikses vanligvis ved å gi webtjeneren skrivetilgang til rotmappen." + "Storage not available" : "Lagringsplass ikke tilgjengelig" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/nb_NO.json b/lib/l10n/nb_NO.json index 13f38ee540ad29f3044e8249ac78860efb00d65f..5e745167303d6f32a19e1b0b224669d18520a9b9 100644 --- a/lib/l10n/nb_NO.json +++ b/lib/l10n/nb_NO.json @@ -3,8 +3,13 @@ "This can usually be fixed by giving the webserver write access to the config directory" : "Dette kan vanligvis ordnes ved å gi web-tjeneren skrivetilgang til config-mappen", "See %s" : "Se %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dette kan vanligvis ordnes ved %så gi web-tjeneren skrivetilgang til config-mappen%s.", + "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Filene i appen %$1s ble ikke erstattet skikkelig. Sjekk at versjonen er kompatibel med tjeneren.", "Sample configuration detected" : "Eksempelkonfigurasjon oppdaget", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Det ble oppdaget at eksempelkonfigurasjonen er blitt kopiert. Dette kan ødelegge installasjonen din og støttes ikke. Les dokumentasjonen før du gjør endringer i config.php", + "%1$s and %2$s" : "%1$s og %2$s", + "%1$s, %2$s and %3$s" : "%1$s, %2$s og %3$s", + "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s og %4$s", + "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s og %5$s", "PHP %s or higher is required." : "PHP %s eller nyere kreves.", "PHP with a version lower than %s is required." : "PHP med en versjon lavere enn %s kreves.", "%sbit or higher PHP required." : "%sbit eller høyere PHP kreves", @@ -18,6 +23,7 @@ "Server version %s or lower is required." : "Tjenerversjon %s eller lavere kreves.", "Unknown filetype" : "Ukjent filtype", "Invalid image" : "Ugyldig bilde", + "Avatar image is not square" : "Avatarbilde er ikke firkantet", "today" : "i dag", "yesterday" : "i går", "_%n day ago_::_%n days ago_" : ["%n dag siden","%n dager siden"], @@ -220,14 +226,6 @@ "Recommended" : "Anbefalt", "Microsoft Windows Platform is not supported" : "Microsoft Windows-plattform støttes ikke", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Kjøring av Nextcloud tjeneren på en Microsoft Windows plattform er ikke støttet. Vi foreslår at du bruker en Linux tjener i en virtuell maskin hvis du ikke har mulighet til å migrere tjeneren selv.", - "Storage not available" : "Lagringsplass ikke tilgjengelig", - "ownCloud %s or higher is required." : "Nextcloud %s eller høyere er påkrevd.", - "ownCloud %s or lower is required." : "Nextcloud %s eller lavere er påkrevd.", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Appen \"%s\" kan ikke installeres da den ikke er kompatibel med denne versjonen av Nextcloud", - "App can't be installed because it is not compatible with this version of Nextcloud" : "Appen kan ikke installeres da den ikke er kompatibel med denne versjonen av Nextcloud", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "App kan ikke installeres fordi versjonen i info.xml/version ikke er den samme som versjonen som rapporteres fra app-butikken", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Hint: Du kan øke hastigheten på oppgraderingen ved å kjøre denne SQL kommandoen manuelt: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Kjøring av Nextcloud tjeneren på en Microsoft Windows plattform er ikke støttet. Vi foreslår at du bruker en Linux tjener i en virtuell maskin hvis du ikke har mulighet til å migrere selve tjeneren. Finn Linuxpakker og virtuelle maskiner på %s. For å migrere eksisterende installasjon til Linux kan du finne gode tips og migreringsskript i vår dokumentasjon.", - "This can usually be fixed by giving the webserver write access to the root directory." : "Dette fikses vanligvis ved å gi webtjeneren skrivetilgang til rotmappen." + "Storage not available" : "Lagringsplass ikke tilgjengelig" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/lib/l10n/nl.js b/lib/l10n/nl.js index 6b1edec0edafd4989b2f55836f701d8ca9b59786..07569958fe655c049cd04cc0a8656a99b989926e 100644 --- a/lib/l10n/nl.js +++ b/lib/l10n/nl.js @@ -228,14 +228,6 @@ OC.L10N.register( "Recommended" : "Aanbevolen", "Microsoft Windows Platform is not supported" : "Microsoft Windows Platform wordt niet ondersteund", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Het draaien van Nextcloud server op het Microsoft Windows platform wordt niet ondersteund. We adviseren je om een Linux server op een virtuele server te gebruiken als je geen mogelijkheid hebt om een server zelf te migreren.", - "Storage not available" : "Opslag niet beschikbaar", - "ownCloud %s or higher is required." : "ownCloud %s of hoger vereist.", - "ownCloud %s or lower is required." : "ownCloud %s of lager vereist.", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "App \"%s\" kan niet worden geïnstalleerd, omdat deze niet compatible is met deze versie van Nextcloud.", - "App can't be installed because it is not compatible with this version of Nextcloud" : "App kan niet worden geïnstalleerd, omdat deze niet compatible is met deze versie van Nextcloud.", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "De app kan niet worden geïnstalleerd, omdat de versie in info.xml/version niet dezelfde is als de versie zoals die in de app store staat vermeld", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Hint: Je kunt de upgrade versnellen door dit SQL commando handmatig uit te voeren: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Het draaien van Nextcloud server op het Microsoft Windows platform wordt niet ondersteund. We adviseren je om een Linux server op een virtuele server te gebruiken als je geen mogelijkheid hebt om een server zelf te migreren. Je vind Linux packages en handig installeerbare virtual machine images op %s. Voor het migreren van bestaande installaties naar Linux vind je tips en een migratiescript in onze documentatie.", - "This can usually be fixed by giving the webserver write access to the root directory." : "Dit kan hersteld worden door de webserver schrijfrechten te geven op de hoofddirectory." + "Storage not available" : "Opslag niet beschikbaar" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/nl.json b/lib/l10n/nl.json index 006aa5121c38e4c2001825bd8aa9b3267c74610c..3478dcdfa98f5750bc4e078fc8249dbbbf3e03d0 100644 --- a/lib/l10n/nl.json +++ b/lib/l10n/nl.json @@ -226,14 +226,6 @@ "Recommended" : "Aanbevolen", "Microsoft Windows Platform is not supported" : "Microsoft Windows Platform wordt niet ondersteund", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Het draaien van Nextcloud server op het Microsoft Windows platform wordt niet ondersteund. We adviseren je om een Linux server op een virtuele server te gebruiken als je geen mogelijkheid hebt om een server zelf te migreren.", - "Storage not available" : "Opslag niet beschikbaar", - "ownCloud %s or higher is required." : "ownCloud %s of hoger vereist.", - "ownCloud %s or lower is required." : "ownCloud %s of lager vereist.", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "App \"%s\" kan niet worden geïnstalleerd, omdat deze niet compatible is met deze versie van Nextcloud.", - "App can't be installed because it is not compatible with this version of Nextcloud" : "App kan niet worden geïnstalleerd, omdat deze niet compatible is met deze versie van Nextcloud.", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "De app kan niet worden geïnstalleerd, omdat de versie in info.xml/version niet dezelfde is als de versie zoals die in de app store staat vermeld", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Hint: Je kunt de upgrade versnellen door dit SQL commando handmatig uit te voeren: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Het draaien van Nextcloud server op het Microsoft Windows platform wordt niet ondersteund. We adviseren je om een Linux server op een virtuele server te gebruiken als je geen mogelijkheid hebt om een server zelf te migreren. Je vind Linux packages en handig installeerbare virtual machine images op %s. Voor het migreren van bestaande installaties naar Linux vind je tips en een migratiescript in onze documentatie.", - "This can usually be fixed by giving the webserver write access to the root directory." : "Dit kan hersteld worden door de webserver schrijfrechten te geven op de hoofddirectory." + "Storage not available" : "Opslag niet beschikbaar" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/lib/l10n/pl.js b/lib/l10n/pl.js index c71ffa473b3ab7342557b8ef32fe691a18389494..39ced184a0fb6b95748344deef73bb282f221040 100644 --- a/lib/l10n/pl.js +++ b/lib/l10n/pl.js @@ -22,13 +22,13 @@ OC.L10N.register( "Avatar image is not square" : "Obraz awataru nie jest kwadratowy", "today" : "dziś", "yesterday" : "wczoraj", - "_%n day ago_::_%n days ago_" : ["%d dzień temu","%n dni temu","%n dni temu"], + "_%n day ago_::_%n days ago_" : ["%d dzień temu","%n dni temu","%n dni temu","%n dni temu"], "last month" : "w zeszłym miesiącu", - "_%n month ago_::_%n months ago_" : ["%n miesiąc temu","%n miesięcy temu","%n miesięcy temu"], + "_%n month ago_::_%n months ago_" : ["%n miesiąc temu","%n miesięcy temu","%n miesięcy temu","%n miesięcy temu"], "last year" : "w zeszłym roku", - "_%n year ago_::_%n years ago_" : ["%n rok temu","%n lata temu","%n lat temu"], - "_%n hour ago_::_%n hours ago_" : ["%n godzinę temu","%n godzin temu","%n godzin temu"], - "_%n minute ago_::_%n minutes ago_" : ["%n minute temu","%n minut temu","%n minut temu"], + "_%n year ago_::_%n years ago_" : ["%n rok temu","%n lata temu","%n lat temu","%n lat temu"], + "_%n hour ago_::_%n hours ago_" : ["%n godzinę temu","%n godzin temu","%n godzin temu","%n godzin temu"], + "_%n minute ago_::_%n minutes ago_" : ["%n minute temu","%n minut temu","%n minut temu","%n minut temu"], "seconds ago" : "sekund temu", "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Moduł z id: %s nie istnieje. Należy go włączyć w ustawieniach aplikacji lub skontaktować się z administratorem.", "File name is a reserved word" : "Nazwa pliku jest zarezerwowana", @@ -82,6 +82,7 @@ OC.L10N.register( "Sharing %s failed, because resharing is not allowed" : "Współdzielenie %s nie powiodło się, ponieważ ponowne współdzielenie nie jest dozwolone", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Współdzielenie %s nie powiodło się, ponieważ zaplecze współdzielenia dla %s nie mogło znaleźć jego źródła", "Sharing %s failed, because the file could not be found in the file cache" : "Współdzielenie %s nie powiodło się, ponieważ plik nie może zostać odnaleziony w buforze plików", + "Cannot increase permissions of %s" : "Nie można zwiększyć uprawnienia %s", "Expiration date is in the past" : "Data ważności jest przeszła", "Could not find category \"%s\"" : "Nie można odnaleźć kategorii \"%s\"", "Sunday" : "Niedziela", @@ -184,10 +185,6 @@ OC.L10N.register( "Logging" : "Logowanie", "Recommended" : "Polecane", "Microsoft Windows Platform is not supported" : "Platforma Microsoft Windows nie jest wspierana", - "Storage not available" : "Pamięć nie dostępna", - "ownCloud %s or higher is required." : "ownCloud %s lub wyższe jest wymagane.", - "ownCloud %s or lower is required." : "ownCloud %s lub niższe jest wymagane.", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Aplikacja \"%s\" nie może być zainstalowana ponieważ nie jest kompatybilna z tą wersją Nextcloud.", - "App can't be installed because it is not compatible with this version of Nextcloud" : "Aplikacja nie może być zainstalowana ponieważ nie jest kompatybilna z tą wersją Nextcloud." + "Storage not available" : "Pamięć nie dostępna" }, "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/lib/l10n/pl.json b/lib/l10n/pl.json index 1a4160b95c45d5939b9b96c009bccd137dc70896..22b595e87d4b181fc2a4026803f9e7e37c11acb1 100644 --- a/lib/l10n/pl.json +++ b/lib/l10n/pl.json @@ -20,13 +20,13 @@ "Avatar image is not square" : "Obraz awataru nie jest kwadratowy", "today" : "dziś", "yesterday" : "wczoraj", - "_%n day ago_::_%n days ago_" : ["%d dzień temu","%n dni temu","%n dni temu"], + "_%n day ago_::_%n days ago_" : ["%d dzień temu","%n dni temu","%n dni temu","%n dni temu"], "last month" : "w zeszłym miesiącu", - "_%n month ago_::_%n months ago_" : ["%n miesiąc temu","%n miesięcy temu","%n miesięcy temu"], + "_%n month ago_::_%n months ago_" : ["%n miesiąc temu","%n miesięcy temu","%n miesięcy temu","%n miesięcy temu"], "last year" : "w zeszłym roku", - "_%n year ago_::_%n years ago_" : ["%n rok temu","%n lata temu","%n lat temu"], - "_%n hour ago_::_%n hours ago_" : ["%n godzinę temu","%n godzin temu","%n godzin temu"], - "_%n minute ago_::_%n minutes ago_" : ["%n minute temu","%n minut temu","%n minut temu"], + "_%n year ago_::_%n years ago_" : ["%n rok temu","%n lata temu","%n lat temu","%n lat temu"], + "_%n hour ago_::_%n hours ago_" : ["%n godzinę temu","%n godzin temu","%n godzin temu","%n godzin temu"], + "_%n minute ago_::_%n minutes ago_" : ["%n minute temu","%n minut temu","%n minut temu","%n minut temu"], "seconds ago" : "sekund temu", "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Moduł z id: %s nie istnieje. Należy go włączyć w ustawieniach aplikacji lub skontaktować się z administratorem.", "File name is a reserved word" : "Nazwa pliku jest zarezerwowana", @@ -80,6 +80,7 @@ "Sharing %s failed, because resharing is not allowed" : "Współdzielenie %s nie powiodło się, ponieważ ponowne współdzielenie nie jest dozwolone", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Współdzielenie %s nie powiodło się, ponieważ zaplecze współdzielenia dla %s nie mogło znaleźć jego źródła", "Sharing %s failed, because the file could not be found in the file cache" : "Współdzielenie %s nie powiodło się, ponieważ plik nie może zostać odnaleziony w buforze plików", + "Cannot increase permissions of %s" : "Nie można zwiększyć uprawnienia %s", "Expiration date is in the past" : "Data ważności jest przeszła", "Could not find category \"%s\"" : "Nie można odnaleźć kategorii \"%s\"", "Sunday" : "Niedziela", @@ -182,10 +183,6 @@ "Logging" : "Logowanie", "Recommended" : "Polecane", "Microsoft Windows Platform is not supported" : "Platforma Microsoft Windows nie jest wspierana", - "Storage not available" : "Pamięć nie dostępna", - "ownCloud %s or higher is required." : "ownCloud %s lub wyższe jest wymagane.", - "ownCloud %s or lower is required." : "ownCloud %s lub niższe jest wymagane.", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Aplikacja \"%s\" nie może być zainstalowana ponieważ nie jest kompatybilna z tą wersją Nextcloud.", - "App can't be installed because it is not compatible with this version of Nextcloud" : "Aplikacja nie może być zainstalowana ponieważ nie jest kompatybilna z tą wersją Nextcloud." + "Storage not available" : "Pamięć nie dostępna" },"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" } \ No newline at end of file diff --git a/lib/l10n/pt_BR.js b/lib/l10n/pt_BR.js index 23635f5d47e5d149a831d7c1d512a85d81ce1c66..5a55bd7a02b22432b5814b03b0f245255001ae8d 100644 --- a/lib/l10n/pt_BR.js +++ b/lib/l10n/pt_BR.js @@ -228,14 +228,6 @@ OC.L10N.register( "Recommended" : "Recomendado", "Microsoft Windows Platform is not supported" : "Plataforma Microsoft Windows não é suportada", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "O Servidor Nextcloud não possui suporte para execução na plataforma Microsoft Windows. Sugerimos que use um servidor Linux em uma máquina virtual, caso não seja possível migrar o servidor.", - "Storage not available" : "Armazanamento não disponível", - "ownCloud %s or higher is required." : "OwnCloud %s ou mais recente é necessário", - "ownCloud %s or lower is required." : "ownCloud %s ou menor é necessário", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "App '%s\" não pode ser instalado por não ser compatível com a versão", - "App can't be installed because it is not compatible with this version of Nextcloud" : "App não pode ser instalado pois não é compatível com a versão", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "App não pode ser instalado porque a versão em info.xml/version não é a mesma versão reportada na app store", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Dica: voce pode acelerar seu upgrade executando um comando SQL: ALTERTABLE %s ADD COLUMN checksun varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Não é possível rodar nosso serviço em plataformas Microsoft, sugerimos um Linux em máquina virtual. É possível achar pacotes Linux e é bem fácil fazer dfeply das imagens virtuais em %s. Para migrar instalações existentes e achar algumas dicas de script acesse nossa documentação", - "This can usually be fixed by giving the webserver write access to the root directory." : "Isso pode ser corrigido usando fornecendo acesso de escrita ao webserver no diretório root" + "Storage not available" : "Armazanamento não disponível" }, "nplurals=2; plural=(n > 1);"); diff --git a/lib/l10n/pt_BR.json b/lib/l10n/pt_BR.json index e51fc04a66fcfdc5e8c41744b8763dce7c97e0f5..2e9db1e93bcfe4118cd109e6f05d1433cfacf2be 100644 --- a/lib/l10n/pt_BR.json +++ b/lib/l10n/pt_BR.json @@ -226,14 +226,6 @@ "Recommended" : "Recomendado", "Microsoft Windows Platform is not supported" : "Plataforma Microsoft Windows não é suportada", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "O Servidor Nextcloud não possui suporte para execução na plataforma Microsoft Windows. Sugerimos que use um servidor Linux em uma máquina virtual, caso não seja possível migrar o servidor.", - "Storage not available" : "Armazanamento não disponível", - "ownCloud %s or higher is required." : "OwnCloud %s ou mais recente é necessário", - "ownCloud %s or lower is required." : "ownCloud %s ou menor é necessário", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "App '%s\" não pode ser instalado por não ser compatível com a versão", - "App can't be installed because it is not compatible with this version of Nextcloud" : "App não pode ser instalado pois não é compatível com a versão", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "App não pode ser instalado porque a versão em info.xml/version não é a mesma versão reportada na app store", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Dica: voce pode acelerar seu upgrade executando um comando SQL: ALTERTABLE %s ADD COLUMN checksun varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Não é possível rodar nosso serviço em plataformas Microsoft, sugerimos um Linux em máquina virtual. É possível achar pacotes Linux e é bem fácil fazer dfeply das imagens virtuais em %s. Para migrar instalações existentes e achar algumas dicas de script acesse nossa documentação", - "This can usually be fixed by giving the webserver write access to the root directory." : "Isso pode ser corrigido usando fornecendo acesso de escrita ao webserver no diretório root" + "Storage not available" : "Armazanamento não disponível" },"pluralForm" :"nplurals=2; plural=(n > 1);" } \ No newline at end of file diff --git a/lib/l10n/ru.js b/lib/l10n/ru.js index 3904d0f86d1f3ba7ad0f08de36e4601bdcf2c451..869ec6055f2372b63f207447b057e46ae59f2701 100644 --- a/lib/l10n/ru.js +++ b/lib/l10n/ru.js @@ -5,8 +5,13 @@ OC.L10N.register( "This can usually be fixed by giving the webserver write access to the config directory" : "Обычно это можно исправить, предоставив веб-серверу права на запись в каталог конфигурации", "See %s" : "Смотрите %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Обычно это можно исправить %sпредоставив веб-серверу права на запись в каталоге конфигурации%s.", + "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Файлы приложения %$1s не заменены корректно. Проверьте что его версия совместима с версией сервера.", "Sample configuration detected" : "Обнаружена конфигурация из примера", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Была обнаружена конфигурация из примера. Такая конфигурация не поддерживается и может повредить вашей системе. Прочтите документацию перед внесением изменений в файл config.php", + "%1$s and %2$s" : "%1$s и %2$s", + "%1$s, %2$s and %3$s" : "%1$s, %2$s и %3$s", + "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s и %4$s", + "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s и %5$s", "PHP %s or higher is required." : "Требуется PHP %s или выше", "PHP with a version lower than %s is required." : "Требуется версия PHP ниже %s.", "%sbit or higher PHP required." : "Требуется PHP с разрядностью %s бит или более.", @@ -206,7 +211,7 @@ OC.L10N.register( "4-byte characters are not supported in file names" : "4-х байтовые символы в имени файлов не допускаются", "App directory already exists" : "Каталог приложения уже существует", "Can't create app folder. Please fix permissions. %s" : "Не удалось создать каталог приложения. Исправьте права доступа. %s", - "Archive does not contain a directory named %s" : "Архив не содержит папки с именем %s", + "Archive does not contain a directory named %s" : "Архив не содержит каталога с именем %s", "No source specified when installing app" : "Не указан источник при установке приложения", "No href specified when installing app from http" : "Не указан атрибут href при установке приложения через http", "No path specified when installing app from local file" : "Не указан путь при установке приложения из локального файла", @@ -223,14 +228,6 @@ OC.L10N.register( "Recommended" : "Рекомендовано", "Microsoft Windows Platform is not supported" : "Платформа Microsoft Windows не поддерживается", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Работа Nextcloud Server на платформе Microsoft Windows не поддерживается. Мы рекомендуем использовать Linux в качестве виртуальный машины, если у вас нет возможности перевести сам сервер.", - "Storage not available" : "Хранилище недоступно", - "ownCloud %s or higher is required." : "Требуется NextCloud версии %s или выше.", - "ownCloud %s or lower is required." : "Требуется NextCloud версии %s или ниже.", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Приложение \"%s\" не может быть установлено, так как оно несовместимо с этой версией Nextcloud.", - "App can't be installed because it is not compatible with this version of Nextcloud" : "Приложение не может быть установлено, так как оно несовместимо с этой версией Nextcloud.", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "Приложение не может быть установлено, поскольку версия в файле info.xml/version не совпадает с версией, заявленной в магазине приложений", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Совет: вы можете ускорить процесс обновления, выполнив SQL-запрос самостоятельно: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Nextcloud Server на платформе Microsoft Windows не поддерживается. Если у вас нет возможности установить на сервер Linux, рекомендуем воспользоваться виртуальной машиной. Соответствующие пакеты можно найти на странице %s. Для переноса на Linux уже имеющейся установки некоторые советы и рекомендации есть в нашей документации.", - "This can usually be fixed by giving the webserver write access to the root directory." : "Как правило, это можно исправить, предоставив веб-серверу права на запись в корневой каталог." + "Storage not available" : "Хранилище недоступно" }, "nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/lib/l10n/ru.json b/lib/l10n/ru.json index a64f3c29c980a3ca8ac176e6a233e77d97f54556..92ea68f8ac714ebbb4ba3b7bbcd65861b2672d95 100644 --- a/lib/l10n/ru.json +++ b/lib/l10n/ru.json @@ -3,8 +3,13 @@ "This can usually be fixed by giving the webserver write access to the config directory" : "Обычно это можно исправить, предоставив веб-серверу права на запись в каталог конфигурации", "See %s" : "Смотрите %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Обычно это можно исправить %sпредоставив веб-серверу права на запись в каталоге конфигурации%s.", + "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Файлы приложения %$1s не заменены корректно. Проверьте что его версия совместима с версией сервера.", "Sample configuration detected" : "Обнаружена конфигурация из примера", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Была обнаружена конфигурация из примера. Такая конфигурация не поддерживается и может повредить вашей системе. Прочтите документацию перед внесением изменений в файл config.php", + "%1$s and %2$s" : "%1$s и %2$s", + "%1$s, %2$s and %3$s" : "%1$s, %2$s и %3$s", + "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s и %4$s", + "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s и %5$s", "PHP %s or higher is required." : "Требуется PHP %s или выше", "PHP with a version lower than %s is required." : "Требуется версия PHP ниже %s.", "%sbit or higher PHP required." : "Требуется PHP с разрядностью %s бит или более.", @@ -204,7 +209,7 @@ "4-byte characters are not supported in file names" : "4-х байтовые символы в имени файлов не допускаются", "App directory already exists" : "Каталог приложения уже существует", "Can't create app folder. Please fix permissions. %s" : "Не удалось создать каталог приложения. Исправьте права доступа. %s", - "Archive does not contain a directory named %s" : "Архив не содержит папки с именем %s", + "Archive does not contain a directory named %s" : "Архив не содержит каталога с именем %s", "No source specified when installing app" : "Не указан источник при установке приложения", "No href specified when installing app from http" : "Не указан атрибут href при установке приложения через http", "No path specified when installing app from local file" : "Не указан путь при установке приложения из локального файла", @@ -221,14 +226,6 @@ "Recommended" : "Рекомендовано", "Microsoft Windows Platform is not supported" : "Платформа Microsoft Windows не поддерживается", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Работа Nextcloud Server на платформе Microsoft Windows не поддерживается. Мы рекомендуем использовать Linux в качестве виртуальный машины, если у вас нет возможности перевести сам сервер.", - "Storage not available" : "Хранилище недоступно", - "ownCloud %s or higher is required." : "Требуется NextCloud версии %s или выше.", - "ownCloud %s or lower is required." : "Требуется NextCloud версии %s или ниже.", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Приложение \"%s\" не может быть установлено, так как оно несовместимо с этой версией Nextcloud.", - "App can't be installed because it is not compatible with this version of Nextcloud" : "Приложение не может быть установлено, так как оно несовместимо с этой версией Nextcloud.", - "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "Приложение не может быть установлено, поскольку версия в файле info.xml/version не совпадает с версией, заявленной в магазине приложений", - "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Совет: вы можете ускорить процесс обновления, выполнив SQL-запрос самостоятельно: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", - "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Nextcloud Server на платформе Microsoft Windows не поддерживается. Если у вас нет возможности установить на сервер Linux, рекомендуем воспользоваться виртуальной машиной. Соответствующие пакеты можно найти на странице %s. Для переноса на Linux уже имеющейся установки некоторые советы и рекомендации есть в нашей документации.", - "This can usually be fixed by giving the webserver write access to the root directory." : "Как правило, это можно исправить, предоставив веб-серверу права на запись в корневой каталог." + "Storage not available" : "Хранилище недоступно" },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" } \ No newline at end of file diff --git a/lib/l10n/sk_SK.js b/lib/l10n/sk_SK.js new file mode 100644 index 0000000000000000000000000000000000000000..0e4854cdef03c217024dfe7b7fe83cd84c8e8408 --- /dev/null +++ b/lib/l10n/sk_SK.js @@ -0,0 +1,215 @@ +OC.L10N.register( + "lib", + { + "Cannot write into \"config\" directory!" : "Nie je možné zapisovat do priečinka \"config\"!", + "This can usually be fixed by giving the webserver write access to the config directory" : "To je zvyčajne možné opraviť tým, že udelíte webovému serveru oprávnenie na zápis do priečinka s konfiguráciou.", + "See %s" : "Pozri %s", + "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "To je zvyčajne možné opraviť tým, že %s udelíte webovému serveru oprávnenie na zápis k adresáru s konfiguráciou%s.", + "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Súbory aplikácie %$1s nebolo možné úspešne nahradiť. Uistite sa, že verzia je kompatibilná s verziou servera.", + "Sample configuration detected" : "Detekovaná bola vzorová konfigurácia", + "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Zistilo sa, že konfigurácia bola skopírovaná zo vzorových súborov. Takáto konfigurácia nie je podporovaná a môže poškodiť vašu inštaláciu. Prečítajte si dokumentáciu pred vykonaním zmien v config.php", + "PHP %s or higher is required." : "Požadovaná verzia PHP %s alebo vyššia.", + "PHP with a version lower than %s is required." : "PHP je vyžadované vo vyššej verzii ako %s.", + "Following databases are supported: %s" : "Podporované sú tieto databázy: %s", + "The command line tool %s could not be found" : "Nástroj príkazového riadka %s nebol nájdený", + "The library %s is not available." : "Knižnica %s je nedostupná.", + "Library %s with a version higher than %s is required - available version %s." : "Požadovaná je knižnica %s vo vyššej verzii ako %s - dostupná verzia %s.", + "Library %s with a version lower than %s is required - available version %s." : "Požadovaná je knižnica %s v nižšej verzii ako %s - dostupná verzia %s.", + "Following platforms are supported: %s" : "Podporované sú nasledovné systémy: %s", + "Server version %s or higher is required." : "Je vyžadovaná verzia servera %s alebo vyššia.", + "Server version %s or lower is required." : "Je vyžadovaná verzia servera %s alebo nižšia.", + "Unknown filetype" : "Neznámy typ súboru", + "Invalid image" : "Chybný obrázok", + "today" : "dnes", + "yesterday" : "včera", + "_%n day ago_::_%n days ago_" : ["včera","pred %n dňami","pred %n dňami"], + "last month" : "minulý mesiac", + "_%n month ago_::_%n months ago_" : ["pred %n mesiacom","pred %n mesiacmi","pred %n mesiacmi"], + "last year" : "minulý rok", + "_%n year ago_::_%n years ago_" : ["vlani","pred %n rokmi","pred %n rokmi"], + "_%n hour ago_::_%n hours ago_" : ["pred %n hodinou","pred %n hodinami","pred %n hodinami"], + "_%n minute ago_::_%n minutes ago_" : ["pred %n minútou","pred %n minútami","pred %n minútami"], + "seconds ago" : "pred sekundami", + "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Modul s ID: %s neexistuje. Povoľte ho prosím vo vašom nastavení aplikácií alebo konaktujte správcu.", + "File name is a reserved word" : "Názov súboru je rezervované slovo.", + "File name contains at least one invalid character" : "Názov súboru obsahuje nepovolené znaky.", + "File name is too long" : "Meno súboru je veľmi dlhé.", + "Dot files are not allowed" : "Názov súboru začínajúci bodkou nie je povolený.", + "Empty filename is not allowed" : "Prázdny názov súboru nie je povolený", + "APCu" : "APCu", + "Redis" : "Redis", + "Server settings" : "Nastavenia servera", + "Sharing" : "Sprístupnenie", + "Encryption" : "Šifrovanie", + "Additional settings" : "Ďalšie nastavenia", + "Tips & tricks" : "Tipy a triky", + "%s enter the database username." : "Zadajte používateľské meno %s databázy.", + "%s enter the database name." : "Zadajte názov databázy pre %s databázy.", + "%s you may not use dots in the database name" : "V názve databázy %s nemôžete používať bodky", + "Oracle connection could not be established" : "Nie je možné pripojiť sa k Oracle", + "Oracle username and/or password not valid" : "Používateľské meno a/alebo heslo pre Oracle databázu je neplatné", + "DB Error: \"%s\"" : "Chyba DB: \"%s\"", + "Offending command was: \"%s\"" : "Podozrivý príkaz bol: \"%s\"", + "You need to enter either an existing account or the administrator." : "Musíte zadať jestvujúci účet alebo administrátora.", + "Offending command was: \"%s\", name: %s, password: %s" : "Podozrivý príkaz bol: \"%s\", meno: %s, heslo: %s", + "PostgreSQL username and/or password not valid" : "Používateľské meno a/alebo heslo pre PostgreSQL databázu je neplatné", + "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nie je podporovaný a %s nebude správne fungovať na tejto platforme. Použite ho na vlastné riziko!", + "For the best results, please consider using a GNU/Linux server instead." : "Pre dosiahnutie najlepších výsledkov, prosím zvážte použitie GNU/Linux servera.", + "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Zdá sa, že táto inštancia %s beží v 32-bitovom prostredí PHP a v php.ini bola nastavená voľba open_basedir. To bude zdrojom problémov so súbormi väčšími ako 4GB a dôrazne sa neodporúča.", + "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Prosím, odstráňte nastavenie open_basedir vo vašom php.ini alebo prejdite na 64-bit PHP.", + "Set an admin username." : "Zadajte používateľské meno administrátora.", + "Set an admin password." : "Zadajte heslo administrátora.", + "Can't create or write into the data directory %s" : "Nemožno vytvoriť alebo zapisovať do priečinka dát %s", + "Invalid Federated Cloud ID" : "Neplatné združené Cloud ID", + "%s shared »%s« with you" : "%s vám sprístupnil »%s«", + "%s via %s" : "%s cez %s", + "Sharing %s failed, because the backend does not allow shares from type %i" : "Sprístupnenie %s zlyhalo, backend nepodporuje typ sprístupnenia %i", + "Sharing %s failed, because the file does not exist" : "Nie je možné sprístupniť %s, súbor neexistuje", + "You are not allowed to share %s" : "Nemôžete sprístupniť %s", + "Sharing %s failed, because you can not share with yourself" : "Sprístupnenie %s zlyhalo, nieje možné sprístupniť obsah so sebou samým", + "Sharing %s failed, because the user %s does not exist" : "Sprístupnenie %s zlyhalo, používateľ %s neexistuje", + "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Sprístupnenie %s zlyhalo, používateľ %s nie je členom žiadnej skupiny spoločnej s používateľom %s", + "Sharing %s failed, because this item is already shared with %s" : "Sprístupnenie %s zlyhalo, pretože táto položka už je prístupná pre %s", + "Sharing %s failed, because this item is already shared with user %s" : "Sprístupnenie %s zlyhalo, táto položka už je používateľovi %s prístupná", + "Sharing %s failed, because the group %s does not exist" : "Sprístupnenie %s zlyhalo, skupina %s neexistuje", + "Sharing %s failed, because %s is not a member of the group %s" : "Sprístupnenie %s zlyhalo, %s nie je členom skupiny %s", + "You need to provide a password to create a public link, only protected links are allowed" : "Musíte zadať heslo ak chcete vytvoriť verejný odkaz, lebo iba odkazy chránené heslom sú povolené", + "Sharing %s failed, because sharing with links is not allowed" : "%s nie je možné sprístupniť, sprístupnenie prostredníctvom odkazu nie je povolené", + "Not allowed to create a federated share with the same user" : "Nie je možné vytvoriť združené sprístupnenie so sebou samým", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Sprístupňovanie %s zlyhalo, nepodarilo sa nájsť %s, možno je server dočasne nedostupný.", + "Share type %s is not valid for %s" : "Typ sprístupnenia %s nie je možný pre %s", + "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Nastavenie povolení pre %s zlyhalo, pretože povolenia prekračujú povolenia udelené %s", + "Setting permissions for %s failed, because the item was not found" : "Nastavenie povolení pre %s zlyhalo, pretože položka sa nenašla", + "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Sprístupnenie nemôže byť ukončené skôr, ako po %s dňoch.", + "Cannot set expiration date. Expiration date is in the past" : "Nie je možné nastaviť dátum konca platnosti. Dátum konca platnosti je v minulosti.", + "Cannot clear expiration date. Shares are required to have an expiration date." : "Nemožno vymazať čas expirácie. Pri sprístupnení je čas exspirácie vyžadovaný.", + "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Backend pre sprístupnenie %s musí implementovať rozhranie OCP\\Share_Backend", + "Sharing backend %s not found" : "Backend sprístupnenia %s nebol nájdený", + "Sharing backend for %s not found" : "Backend sprístupnenia pre %s nebol nájdený", + "Sharing failed, because the user %s is the original sharer" : "Sprístupnenie zlyhalo, pretože používateľ %s je pôvodný spoločný používateľ", + "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Sprístupnenie %s zlyhalo, pretože povolenia prekračujú povolenia udelené %s", + "Sharing %s failed, because resharing is not allowed" : "Nie je možné sprístupniť %s ďalším osobám", + "Sharing %s failed, because the sharing backend for %s could not find its source" : "Sprístupnenie %s zlyhalo, backend nenašiel zdrojový %s", + "Sharing %s failed, because the file could not be found in the file cache" : "Sprístupnenie %s zlyhalo, pretože súbor sa nenachádza vo vyrovnávacej pamäti súborov", + "Expiration date is in the past" : "Dátum konca platnosti je v minulosti", + "Cannot set expiration date more than %s days in the future" : "Nie je možné nastaviť dátum konca platnosti viac ako %s dní v budúcnosti", + "Could not find category \"%s\"" : "Nemožno nájsť danú kategóriu \"%s\"", + "Sunday" : "Nedeľa", + "Monday" : "Pondelok", + "Tuesday" : "Utorok", + "Wednesday" : "Streda", + "Thursday" : "Štvrtok", + "Friday" : "Piatok", + "Saturday" : "Sobota", + "Sun." : "Ned.", + "Mon." : "Pon.", + "Tue." : "Uto.", + "Wed." : "Str.", + "Thu." : "Štv.", + "Fri." : "Pia.", + "Sat." : "Sob.", + "Su" : "Ne", + "Mo" : "Po", + "Tu" : "Ut", + "We" : "St", + "Th" : "Št", + "Fr" : "Pi", + "Sa" : "So", + "January" : "Január", + "February" : "Február", + "March" : "Marec", + "April" : "Apríl", + "May" : "Máj", + "June" : "Jún", + "July" : "Júl", + "August" : "August", + "September" : "September", + "October" : "Október", + "November" : "November", + "December" : "December", + "Jan." : "Jan.", + "Feb." : "Feb.", + "Mar." : "Mar.", + "Apr." : "Apr.", + "May." : "Máj.", + "Jun." : "Jún.", + "Jul." : "Júl.", + "Aug." : "Aug.", + "Sep." : "Sep.", + "Oct." : "Okt.", + "Nov." : "Nov.", + "Dec." : "Dec.", + "Apps" : "Aplikácie", + "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "V mene používateľa je možné použiť iba nasledovné znaky: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"", + "A valid username must be provided" : "Musíte zadať platné používateľské meno", + "Username contains whitespace at the beginning or at the end" : "Meno používateľa obsahuje na začiatku, alebo na konci medzeru", + "A valid password must be provided" : "Musíte zadať platné heslo", + "The username is already being used" : "Meno používateľa je už použité", + "Login canceled by app" : "Prihlásenie bolo zrušené aplikáciou", + "User disabled" : "Používateľ zakázaný", + "Help" : "Pomoc", + "Personal" : "Osobné", + "Users" : "Používatelia", + "Admin" : "Administrátor", + "App \"%s\" cannot be installed because appinfo file cannot be read." : "Aplikáciu \"%s\" nie je možné nainštalovať, lebo nebolo možné načítať súbor s informáciami o aplikácií.", + "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Aplikácia \"%s\" nie je kompatibilná s verziou servera, preto nemôže byť nainštalovaná.", + "No app name specified" : "Nešpecifikované meno aplikácie", + "App '%s' could not be installed!" : "Aplikáciu '%s' nebolo možné nainštalovať!", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Aplikáciu \"%s\" nie je možné inštalovať, pretože nie sú splnené nasledovné závislosti: %s", + "a safe home for all your data" : "bezpečný domov pre všetky vaše dáta", + "File is currently busy, please try again later" : "Súbor sa práve používa, skúste prosím neskôr", + "Can't read file" : "Nemožno čítať súbor.", + "Application is not enabled" : "Aplikácia nie je zapnutá", + "Authentication error" : "Chyba autentifikácie", + "Token expired. Please reload page." : "Token vypršal. Obnovte, prosím, stránku.", + "Unknown user" : "Neznámy používateľ", + "No database drivers (sqlite, mysql, or postgresql) installed." : "Ovládače databázy (sqlite, mysql, alebo postgresql) nie sú nainštalované.", + "Cannot write into \"config\" directory" : "Nie je možné zapisovať do priečinka \"config\"", + "Cannot write into \"apps\" directory" : "Nie je možné zapisovať do priečinka \"apps\"", + "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Toto je zvyčajne možné opraviť tým, že %s udelíte webovému serveru oprávnenie na zápis do priečinka aplikácií %s alebo vypnete obchod s aplikáciami v konfiguračnom súbore.", + "Cannot create \"data\" directory (%s)" : "Nie je možné vytvoriť priečinok \"data\" (%s)", + "This can usually be fixed by giving the webserver write access to the root directory." : "To je zvyčajne možné opraviť tým že udelíte webovému serveru oprávnenie na zápis do koreňového priečinka.", + "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Oprávnenia je zvyčajne možné opraviť tým, že %sudelíte webovému serveru oprávnenie na zápis do koreňového priečinka%s.", + "Setting locale to %s failed" : "Nastavenie locale na %s zlyhalo", + "Please install one of these locales on your system and restart your webserver." : "Prosím, nainštalujte si aspoň jeden z týchto jazykov so svojho systému a reštartujte webserver.", + "Please ask your server administrator to install the module." : "Prosím, požiadajte administrátora vášho servera o inštaláciu modulu.", + "PHP module %s not installed." : "PHP modul %s nie je nainštalovaný.", + "PHP setting \"%s\" is not set to \"%s\"." : "Voľba PHP „%s“ nie je nastavená na „%s“.", + "Adjusting this setting in php.ini will make Nextcloud run again" : "Použitím týchto nastavení v php.ini dovolí Nextcloudu sa znova spustiť", + "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload je nastavený na \"%s\", namiesto predpokladanej hodnoty \"0\"", + "To fix this issue set mbstring.func_overload to 0 in your php.ini" : "Oprava problému spočíva v nastavení mbstring.func_overload na 0 vo vašom php.ini", + "libxml2 2.7.0 is at least required. Currently %s is installed." : "Vyžadovaná verzia libxml2 je 2.7.0 a vyššia. Momentálne je nainštalovaná verzia %s.", + "To fix this issue update your libxml2 version and restart your web server." : "Pre vyriešenie tohto problému aktualizujte prosím verziu libxml2 a reštartujte webový server.", + "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP je zjavne nastavené, aby odstraňovalo bloky vloženej dokumentácie. To zneprístupní niekoľko základných aplikácií.", + "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "To je pravdepodobne spôsobené cache/akcelerátorom ako napr. Zend OPcache alebo eAccelerator.", + "PHP modules have been installed, but they are still listed as missing?" : "PHP moduly boli nainštalované, ale stále sa tvária, že chýbajú?", + "Please ask your server administrator to restart the web server." : "Prosím, požiadajte administrátora vášho servera o reštartovanie webového servera.", + "PostgreSQL >= 9 required" : "Vyžadované PostgreSQL >= 9", + "Please upgrade your database version" : "Prosím, aktualizujte verziu svojej databázy", + "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Prosím, zmeňte oprávnenia na 0770, aby tento priečinok nemohli ostatní používatelia otvoriť.", + "Data directory (%s) is readable by other users" : "Priečinok dát (%s) je prístupný na čítanie ostatným používateľom", + "Data directory (%s) must be an absolute path" : "Priečinok dát (%s) musí byť zadaný ako absolútna cesta", + "Check the value of \"datadirectory\" in your configuration" : "Skontrolujte hodnotu \"datadirectory\" vo vašej konfigurácii", + "Data directory (%s) is invalid" : "Priečinok dát (%s) je neplatný", + "Please check that the data directory contains a file \".ocdata\" in its root." : "Prosím, skontrolujte, či priečinok dát obsahuje súbor \".ocdata\".", + "Could not obtain lock type %d on \"%s\"." : "Nepodarilo sa získať zámok typu %d na „%s“.", + "4-byte characters are not supported in file names" : "V názve súbou nie sú podporované 4-bajtové znaky.", + "App directory already exists" : "Aplikačný priečinok už existuje", + "Can't create app folder. Please fix permissions. %s" : "Nemožno vytvoriť aplikačný priečinok. Prosím upravte povolenia. %s", + "Archive does not contain a directory named %s" : "Archív neobsahuje priečinok zvaný %s", + "No source specified when installing app" : "Nešpecifikovaný zdroj pri inštalácii aplikácie", + "No href specified when installing app from http" : "Nešpecifikovaný atribút \"href\" pri inštalácii aplikácie pomocou protokolu \"http\"", + "No path specified when installing app from local file" : "Nešpecifikovaná cesta pri inštalácii aplikácie z lokálneho súboru", + "Archives of type %s are not supported" : "Tento typ archívu %s nie je podporovaný", + "Failed to open archive when installing app" : "Zlyhanie pri otváraní archívu počas inštalácie aplikácie", + "App does not provide an info.xml file" : "Aplikácia neposkytuje súbor info.xml", + "App cannot be installed because appinfo file cannot be read." : "Aplikáciu nie je možné nainštalovať, lebo nebolo možné načítať súbor s informáciami o aplikácií.", + "Signature could not get checked. Please contact the app developer and check your admin screen." : "Nebolo možné skontrolovať podpis aplikácie. Kontaktujte prosím vývojára aplikácie a skontrolujte administrátorské nastavenia.", + "App can't be installed because of not allowed code in the App" : "Aplikácia nemôže byť nainštalovaná pre nepovolený kód v aplikácii", + "App can't be installed because it is not compatible with this version of the server" : "Aplikácia nie je kompatibilná s verziou servera, preto nemôže byť nainštalovaná", + "App can't be installed because it contains the true tag which is not allowed for non shipped apps" : "Aplikácia nemôže byť nainštalovaná pretože obsahuje značkutrue, ktorá nie je povolená pre nedodávané aplikácie", + "Recommended" : "Odporúčané", + "Microsoft Windows Platform is not supported" : "Microsoft Windows platforma nieje podporovaná", + "Storage not available" : "Úložisko nie je dostupné" +}, +"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/lib/l10n/sk_SK.json b/lib/l10n/sk_SK.json new file mode 100644 index 0000000000000000000000000000000000000000..ddd42d62b8ed44653e9db542ae3be965b22df964 --- /dev/null +++ b/lib/l10n/sk_SK.json @@ -0,0 +1,213 @@ +{ "translations": { + "Cannot write into \"config\" directory!" : "Nie je možné zapisovat do priečinka \"config\"!", + "This can usually be fixed by giving the webserver write access to the config directory" : "To je zvyčajne možné opraviť tým, že udelíte webovému serveru oprávnenie na zápis do priečinka s konfiguráciou.", + "See %s" : "Pozri %s", + "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "To je zvyčajne možné opraviť tým, že %s udelíte webovému serveru oprávnenie na zápis k adresáru s konfiguráciou%s.", + "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Súbory aplikácie %$1s nebolo možné úspešne nahradiť. Uistite sa, že verzia je kompatibilná s verziou servera.", + "Sample configuration detected" : "Detekovaná bola vzorová konfigurácia", + "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Zistilo sa, že konfigurácia bola skopírovaná zo vzorových súborov. Takáto konfigurácia nie je podporovaná a môže poškodiť vašu inštaláciu. Prečítajte si dokumentáciu pred vykonaním zmien v config.php", + "PHP %s or higher is required." : "Požadovaná verzia PHP %s alebo vyššia.", + "PHP with a version lower than %s is required." : "PHP je vyžadované vo vyššej verzii ako %s.", + "Following databases are supported: %s" : "Podporované sú tieto databázy: %s", + "The command line tool %s could not be found" : "Nástroj príkazového riadka %s nebol nájdený", + "The library %s is not available." : "Knižnica %s je nedostupná.", + "Library %s with a version higher than %s is required - available version %s." : "Požadovaná je knižnica %s vo vyššej verzii ako %s - dostupná verzia %s.", + "Library %s with a version lower than %s is required - available version %s." : "Požadovaná je knižnica %s v nižšej verzii ako %s - dostupná verzia %s.", + "Following platforms are supported: %s" : "Podporované sú nasledovné systémy: %s", + "Server version %s or higher is required." : "Je vyžadovaná verzia servera %s alebo vyššia.", + "Server version %s or lower is required." : "Je vyžadovaná verzia servera %s alebo nižšia.", + "Unknown filetype" : "Neznámy typ súboru", + "Invalid image" : "Chybný obrázok", + "today" : "dnes", + "yesterday" : "včera", + "_%n day ago_::_%n days ago_" : ["včera","pred %n dňami","pred %n dňami"], + "last month" : "minulý mesiac", + "_%n month ago_::_%n months ago_" : ["pred %n mesiacom","pred %n mesiacmi","pred %n mesiacmi"], + "last year" : "minulý rok", + "_%n year ago_::_%n years ago_" : ["vlani","pred %n rokmi","pred %n rokmi"], + "_%n hour ago_::_%n hours ago_" : ["pred %n hodinou","pred %n hodinami","pred %n hodinami"], + "_%n minute ago_::_%n minutes ago_" : ["pred %n minútou","pred %n minútami","pred %n minútami"], + "seconds ago" : "pred sekundami", + "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Modul s ID: %s neexistuje. Povoľte ho prosím vo vašom nastavení aplikácií alebo konaktujte správcu.", + "File name is a reserved word" : "Názov súboru je rezervované slovo.", + "File name contains at least one invalid character" : "Názov súboru obsahuje nepovolené znaky.", + "File name is too long" : "Meno súboru je veľmi dlhé.", + "Dot files are not allowed" : "Názov súboru začínajúci bodkou nie je povolený.", + "Empty filename is not allowed" : "Prázdny názov súboru nie je povolený", + "APCu" : "APCu", + "Redis" : "Redis", + "Server settings" : "Nastavenia servera", + "Sharing" : "Sprístupnenie", + "Encryption" : "Šifrovanie", + "Additional settings" : "Ďalšie nastavenia", + "Tips & tricks" : "Tipy a triky", + "%s enter the database username." : "Zadajte používateľské meno %s databázy.", + "%s enter the database name." : "Zadajte názov databázy pre %s databázy.", + "%s you may not use dots in the database name" : "V názve databázy %s nemôžete používať bodky", + "Oracle connection could not be established" : "Nie je možné pripojiť sa k Oracle", + "Oracle username and/or password not valid" : "Používateľské meno a/alebo heslo pre Oracle databázu je neplatné", + "DB Error: \"%s\"" : "Chyba DB: \"%s\"", + "Offending command was: \"%s\"" : "Podozrivý príkaz bol: \"%s\"", + "You need to enter either an existing account or the administrator." : "Musíte zadať jestvujúci účet alebo administrátora.", + "Offending command was: \"%s\", name: %s, password: %s" : "Podozrivý príkaz bol: \"%s\", meno: %s, heslo: %s", + "PostgreSQL username and/or password not valid" : "Používateľské meno a/alebo heslo pre PostgreSQL databázu je neplatné", + "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nie je podporovaný a %s nebude správne fungovať na tejto platforme. Použite ho na vlastné riziko!", + "For the best results, please consider using a GNU/Linux server instead." : "Pre dosiahnutie najlepších výsledkov, prosím zvážte použitie GNU/Linux servera.", + "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Zdá sa, že táto inštancia %s beží v 32-bitovom prostredí PHP a v php.ini bola nastavená voľba open_basedir. To bude zdrojom problémov so súbormi väčšími ako 4GB a dôrazne sa neodporúča.", + "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Prosím, odstráňte nastavenie open_basedir vo vašom php.ini alebo prejdite na 64-bit PHP.", + "Set an admin username." : "Zadajte používateľské meno administrátora.", + "Set an admin password." : "Zadajte heslo administrátora.", + "Can't create or write into the data directory %s" : "Nemožno vytvoriť alebo zapisovať do priečinka dát %s", + "Invalid Federated Cloud ID" : "Neplatné združené Cloud ID", + "%s shared »%s« with you" : "%s vám sprístupnil »%s«", + "%s via %s" : "%s cez %s", + "Sharing %s failed, because the backend does not allow shares from type %i" : "Sprístupnenie %s zlyhalo, backend nepodporuje typ sprístupnenia %i", + "Sharing %s failed, because the file does not exist" : "Nie je možné sprístupniť %s, súbor neexistuje", + "You are not allowed to share %s" : "Nemôžete sprístupniť %s", + "Sharing %s failed, because you can not share with yourself" : "Sprístupnenie %s zlyhalo, nieje možné sprístupniť obsah so sebou samým", + "Sharing %s failed, because the user %s does not exist" : "Sprístupnenie %s zlyhalo, používateľ %s neexistuje", + "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Sprístupnenie %s zlyhalo, používateľ %s nie je členom žiadnej skupiny spoločnej s používateľom %s", + "Sharing %s failed, because this item is already shared with %s" : "Sprístupnenie %s zlyhalo, pretože táto položka už je prístupná pre %s", + "Sharing %s failed, because this item is already shared with user %s" : "Sprístupnenie %s zlyhalo, táto položka už je používateľovi %s prístupná", + "Sharing %s failed, because the group %s does not exist" : "Sprístupnenie %s zlyhalo, skupina %s neexistuje", + "Sharing %s failed, because %s is not a member of the group %s" : "Sprístupnenie %s zlyhalo, %s nie je členom skupiny %s", + "You need to provide a password to create a public link, only protected links are allowed" : "Musíte zadať heslo ak chcete vytvoriť verejný odkaz, lebo iba odkazy chránené heslom sú povolené", + "Sharing %s failed, because sharing with links is not allowed" : "%s nie je možné sprístupniť, sprístupnenie prostredníctvom odkazu nie je povolené", + "Not allowed to create a federated share with the same user" : "Nie je možné vytvoriť združené sprístupnenie so sebou samým", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Sprístupňovanie %s zlyhalo, nepodarilo sa nájsť %s, možno je server dočasne nedostupný.", + "Share type %s is not valid for %s" : "Typ sprístupnenia %s nie je možný pre %s", + "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Nastavenie povolení pre %s zlyhalo, pretože povolenia prekračujú povolenia udelené %s", + "Setting permissions for %s failed, because the item was not found" : "Nastavenie povolení pre %s zlyhalo, pretože položka sa nenašla", + "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Sprístupnenie nemôže byť ukončené skôr, ako po %s dňoch.", + "Cannot set expiration date. Expiration date is in the past" : "Nie je možné nastaviť dátum konca platnosti. Dátum konca platnosti je v minulosti.", + "Cannot clear expiration date. Shares are required to have an expiration date." : "Nemožno vymazať čas expirácie. Pri sprístupnení je čas exspirácie vyžadovaný.", + "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Backend pre sprístupnenie %s musí implementovať rozhranie OCP\\Share_Backend", + "Sharing backend %s not found" : "Backend sprístupnenia %s nebol nájdený", + "Sharing backend for %s not found" : "Backend sprístupnenia pre %s nebol nájdený", + "Sharing failed, because the user %s is the original sharer" : "Sprístupnenie zlyhalo, pretože používateľ %s je pôvodný spoločný používateľ", + "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Sprístupnenie %s zlyhalo, pretože povolenia prekračujú povolenia udelené %s", + "Sharing %s failed, because resharing is not allowed" : "Nie je možné sprístupniť %s ďalším osobám", + "Sharing %s failed, because the sharing backend for %s could not find its source" : "Sprístupnenie %s zlyhalo, backend nenašiel zdrojový %s", + "Sharing %s failed, because the file could not be found in the file cache" : "Sprístupnenie %s zlyhalo, pretože súbor sa nenachádza vo vyrovnávacej pamäti súborov", + "Expiration date is in the past" : "Dátum konca platnosti je v minulosti", + "Cannot set expiration date more than %s days in the future" : "Nie je možné nastaviť dátum konca platnosti viac ako %s dní v budúcnosti", + "Could not find category \"%s\"" : "Nemožno nájsť danú kategóriu \"%s\"", + "Sunday" : "Nedeľa", + "Monday" : "Pondelok", + "Tuesday" : "Utorok", + "Wednesday" : "Streda", + "Thursday" : "Štvrtok", + "Friday" : "Piatok", + "Saturday" : "Sobota", + "Sun." : "Ned.", + "Mon." : "Pon.", + "Tue." : "Uto.", + "Wed." : "Str.", + "Thu." : "Štv.", + "Fri." : "Pia.", + "Sat." : "Sob.", + "Su" : "Ne", + "Mo" : "Po", + "Tu" : "Ut", + "We" : "St", + "Th" : "Št", + "Fr" : "Pi", + "Sa" : "So", + "January" : "Január", + "February" : "Február", + "March" : "Marec", + "April" : "Apríl", + "May" : "Máj", + "June" : "Jún", + "July" : "Júl", + "August" : "August", + "September" : "September", + "October" : "Október", + "November" : "November", + "December" : "December", + "Jan." : "Jan.", + "Feb." : "Feb.", + "Mar." : "Mar.", + "Apr." : "Apr.", + "May." : "Máj.", + "Jun." : "Jún.", + "Jul." : "Júl.", + "Aug." : "Aug.", + "Sep." : "Sep.", + "Oct." : "Okt.", + "Nov." : "Nov.", + "Dec." : "Dec.", + "Apps" : "Aplikácie", + "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "V mene používateľa je možné použiť iba nasledovné znaky: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"", + "A valid username must be provided" : "Musíte zadať platné používateľské meno", + "Username contains whitespace at the beginning or at the end" : "Meno používateľa obsahuje na začiatku, alebo na konci medzeru", + "A valid password must be provided" : "Musíte zadať platné heslo", + "The username is already being used" : "Meno používateľa je už použité", + "Login canceled by app" : "Prihlásenie bolo zrušené aplikáciou", + "User disabled" : "Používateľ zakázaný", + "Help" : "Pomoc", + "Personal" : "Osobné", + "Users" : "Používatelia", + "Admin" : "Administrátor", + "App \"%s\" cannot be installed because appinfo file cannot be read." : "Aplikáciu \"%s\" nie je možné nainštalovať, lebo nebolo možné načítať súbor s informáciami o aplikácií.", + "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Aplikácia \"%s\" nie je kompatibilná s verziou servera, preto nemôže byť nainštalovaná.", + "No app name specified" : "Nešpecifikované meno aplikácie", + "App '%s' could not be installed!" : "Aplikáciu '%s' nebolo možné nainštalovať!", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Aplikáciu \"%s\" nie je možné inštalovať, pretože nie sú splnené nasledovné závislosti: %s", + "a safe home for all your data" : "bezpečný domov pre všetky vaše dáta", + "File is currently busy, please try again later" : "Súbor sa práve používa, skúste prosím neskôr", + "Can't read file" : "Nemožno čítať súbor.", + "Application is not enabled" : "Aplikácia nie je zapnutá", + "Authentication error" : "Chyba autentifikácie", + "Token expired. Please reload page." : "Token vypršal. Obnovte, prosím, stránku.", + "Unknown user" : "Neznámy používateľ", + "No database drivers (sqlite, mysql, or postgresql) installed." : "Ovládače databázy (sqlite, mysql, alebo postgresql) nie sú nainštalované.", + "Cannot write into \"config\" directory" : "Nie je možné zapisovať do priečinka \"config\"", + "Cannot write into \"apps\" directory" : "Nie je možné zapisovať do priečinka \"apps\"", + "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Toto je zvyčajne možné opraviť tým, že %s udelíte webovému serveru oprávnenie na zápis do priečinka aplikácií %s alebo vypnete obchod s aplikáciami v konfiguračnom súbore.", + "Cannot create \"data\" directory (%s)" : "Nie je možné vytvoriť priečinok \"data\" (%s)", + "This can usually be fixed by giving the webserver write access to the root directory." : "To je zvyčajne možné opraviť tým že udelíte webovému serveru oprávnenie na zápis do koreňového priečinka.", + "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Oprávnenia je zvyčajne možné opraviť tým, že %sudelíte webovému serveru oprávnenie na zápis do koreňového priečinka%s.", + "Setting locale to %s failed" : "Nastavenie locale na %s zlyhalo", + "Please install one of these locales on your system and restart your webserver." : "Prosím, nainštalujte si aspoň jeden z týchto jazykov so svojho systému a reštartujte webserver.", + "Please ask your server administrator to install the module." : "Prosím, požiadajte administrátora vášho servera o inštaláciu modulu.", + "PHP module %s not installed." : "PHP modul %s nie je nainštalovaný.", + "PHP setting \"%s\" is not set to \"%s\"." : "Voľba PHP „%s“ nie je nastavená na „%s“.", + "Adjusting this setting in php.ini will make Nextcloud run again" : "Použitím týchto nastavení v php.ini dovolí Nextcloudu sa znova spustiť", + "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload je nastavený na \"%s\", namiesto predpokladanej hodnoty \"0\"", + "To fix this issue set mbstring.func_overload to 0 in your php.ini" : "Oprava problému spočíva v nastavení mbstring.func_overload na 0 vo vašom php.ini", + "libxml2 2.7.0 is at least required. Currently %s is installed." : "Vyžadovaná verzia libxml2 je 2.7.0 a vyššia. Momentálne je nainštalovaná verzia %s.", + "To fix this issue update your libxml2 version and restart your web server." : "Pre vyriešenie tohto problému aktualizujte prosím verziu libxml2 a reštartujte webový server.", + "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP je zjavne nastavené, aby odstraňovalo bloky vloženej dokumentácie. To zneprístupní niekoľko základných aplikácií.", + "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "To je pravdepodobne spôsobené cache/akcelerátorom ako napr. Zend OPcache alebo eAccelerator.", + "PHP modules have been installed, but they are still listed as missing?" : "PHP moduly boli nainštalované, ale stále sa tvária, že chýbajú?", + "Please ask your server administrator to restart the web server." : "Prosím, požiadajte administrátora vášho servera o reštartovanie webového servera.", + "PostgreSQL >= 9 required" : "Vyžadované PostgreSQL >= 9", + "Please upgrade your database version" : "Prosím, aktualizujte verziu svojej databázy", + "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Prosím, zmeňte oprávnenia na 0770, aby tento priečinok nemohli ostatní používatelia otvoriť.", + "Data directory (%s) is readable by other users" : "Priečinok dát (%s) je prístupný na čítanie ostatným používateľom", + "Data directory (%s) must be an absolute path" : "Priečinok dát (%s) musí byť zadaný ako absolútna cesta", + "Check the value of \"datadirectory\" in your configuration" : "Skontrolujte hodnotu \"datadirectory\" vo vašej konfigurácii", + "Data directory (%s) is invalid" : "Priečinok dát (%s) je neplatný", + "Please check that the data directory contains a file \".ocdata\" in its root." : "Prosím, skontrolujte, či priečinok dát obsahuje súbor \".ocdata\".", + "Could not obtain lock type %d on \"%s\"." : "Nepodarilo sa získať zámok typu %d na „%s“.", + "4-byte characters are not supported in file names" : "V názve súbou nie sú podporované 4-bajtové znaky.", + "App directory already exists" : "Aplikačný priečinok už existuje", + "Can't create app folder. Please fix permissions. %s" : "Nemožno vytvoriť aplikačný priečinok. Prosím upravte povolenia. %s", + "Archive does not contain a directory named %s" : "Archív neobsahuje priečinok zvaný %s", + "No source specified when installing app" : "Nešpecifikovaný zdroj pri inštalácii aplikácie", + "No href specified when installing app from http" : "Nešpecifikovaný atribút \"href\" pri inštalácii aplikácie pomocou protokolu \"http\"", + "No path specified when installing app from local file" : "Nešpecifikovaná cesta pri inštalácii aplikácie z lokálneho súboru", + "Archives of type %s are not supported" : "Tento typ archívu %s nie je podporovaný", + "Failed to open archive when installing app" : "Zlyhanie pri otváraní archívu počas inštalácie aplikácie", + "App does not provide an info.xml file" : "Aplikácia neposkytuje súbor info.xml", + "App cannot be installed because appinfo file cannot be read." : "Aplikáciu nie je možné nainštalovať, lebo nebolo možné načítať súbor s informáciami o aplikácií.", + "Signature could not get checked. Please contact the app developer and check your admin screen." : "Nebolo možné skontrolovať podpis aplikácie. Kontaktujte prosím vývojára aplikácie a skontrolujte administrátorské nastavenia.", + "App can't be installed because of not allowed code in the App" : "Aplikácia nemôže byť nainštalovaná pre nepovolený kód v aplikácii", + "App can't be installed because it is not compatible with this version of the server" : "Aplikácia nie je kompatibilná s verziou servera, preto nemôže byť nainštalovaná", + "App can't be installed because it contains the true tag which is not allowed for non shipped apps" : "Aplikácia nemôže byť nainštalovaná pretože obsahuje značkutrue, ktorá nie je povolená pre nedodávané aplikácie", + "Recommended" : "Odporúčané", + "Microsoft Windows Platform is not supported" : "Microsoft Windows platforma nieje podporovaná", + "Storage not available" : "Úložisko nie je dostupné" +},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" +} \ No newline at end of file diff --git a/lib/l10n/sq.js b/lib/l10n/sq.js new file mode 100644 index 0000000000000000000000000000000000000000..97f60522df5353ad8c615b0703d027235c5f891e --- /dev/null +++ b/lib/l10n/sq.js @@ -0,0 +1,233 @@ +OC.L10N.register( + "lib", + { + "Cannot write into \"config\" directory!" : "Nuk shkruhet dot te drejtoria \"config\"!", + "This can usually be fixed by giving the webserver write access to the config directory" : "Zakonisht kjo mund të ndreqet duke i akorduar shërbyesit web të drejta shkrimi mbi drejtorinë e formësimeve", + "See %s" : "Shihni %s", + "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Zakonisht kjo mund të ndreqet duke %si akorduar shërbyesit web të drejta shkrimi mbi drejtorinë e formësimeve%s.", + "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Skedarët e aplikacionit %$1s nuk u zëvëndësuan në mënyrë korrekte. Sigurohuni që është një version që përputhet me serverin.", + "Sample configuration detected" : "U gjet formësim shembull", + "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "U pa se është kopjuar shembulli për formësime. Kjo mund të prishë instalimin tuaj dhe nuk mbulohet. Ju lutemi, lexoni dokumentimin, përpara se të kryeni ndryshime te config.php", + "%1$s and %2$s" : "%1$s dhe %2$s", + "%1$s, %2$s and %3$s" : "%1$s, %2$s dhe %3$s", + "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s dhe %4$s", + "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s dhe %5$s", + "PHP %s or higher is required." : "Kërkohet PHP %s ose më sipër.", + "PHP with a version lower than %s is required." : "Lypset PHP me një version më të ulët se sa %s.", + "%sbit or higher PHP required." : "Lypset PHP %sbit ose më i ri.", + "Following databases are supported: %s" : "Mbulohen bazat vijuese të të dhënave: %s", + "The command line tool %s could not be found" : "Mjeti rresht urdhrash %s s’u gjet dot", + "The library %s is not available." : "Libraria %s s’është e passhme.", + "Library %s with a version higher than %s is required - available version %s." : "Kërkohet librari %s me një version më të madh se %s - version gati %s.", + "Library %s with a version lower than %s is required - available version %s." : "Lypset librari %s me një version më të vogël se %s - version gati %s.", + "Following platforms are supported: %s" : "Mbulohen platformat vijuese: %s", + "Server version %s or higher is required." : "Versioni i serverit kërkohet %s ose më lartë", + "Server version %s or lower is required." : "Versioni i serverit kërkohet %s ose më poshtë", + "Unknown filetype" : "Lloj i panjohur skedari", + "Invalid image" : "Figurë e pavlefshme", + "Avatar image is not square" : "Imazhi avatar nuk është katror", + "today" : "sot", + "yesterday" : "dje", + "_%n day ago_::_%n days ago_" : ["%n ditë më parë","%n ditë më parë"], + "last month" : "muajin e shkuar", + "_%n month ago_::_%n months ago_" : ["%n muaj më parë","%n muaj më parë"], + "last year" : "vitin e shkuar", + "_%n year ago_::_%n years ago_" : ["%n vit më parë","%n vjet më parë"], + "_%n hour ago_::_%n hours ago_" : ["%n orë më parë","%n orë më parë"], + "_%n minute ago_::_%n minutes ago_" : ["%n minutë më parë","%n minuta më parë"], + "seconds ago" : "sekonda më parë", + "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "S’ka modul me id: %s. Ju lutemi, aktivizojeni te rregullimet tuaja për aplikacionin ose lidhuni me përgjegjësin tuaj.", + "File name is a reserved word" : "Emri i kartelës është një emër i rezervuar", + "File name contains at least one invalid character" : "Emri i kartelës përmban të paktën një shenjë të pavlefshme", + "File name is too long" : "Emri i kartelës është shumë i gjatë", + "Dot files are not allowed" : "Nuk lejohen kartela të fshehura", + "Empty filename is not allowed" : "Nuk lejohen emra të zbrazët kartelash", + "APCu" : "APCu", + "Redis" : "Redis", + "Server settings" : "Konfigurimi i serverit", + "Sharing" : "Ndarja", + "Encryption" : "Enkriptimi", + "Additional settings" : "Konfigurime shtesë", + "Tips & tricks" : "Këshilla dhe rrengje", + "%s enter the database username and name." : "%s jepni emrin e bazës së të dhënave dhe emrin e përdoruesit për të.", + "%s enter the database username." : "%s jepni emrin e përdoruesit të bazës së të dhënave.", + "%s enter the database name." : "%s jepni emrin e bazës së të dhënave.", + "%s you may not use dots in the database name" : "%s s’mund të përdorni pika te emri i bazës së të dhënave", + "Oracle connection could not be established" : "S’u vendos dot lidhje me Oracle", + "Oracle username and/or password not valid" : "Emër përdoruesi dhe/ose fjalëkalim Oracle-i i pavlefshëm", + "DB Error: \"%s\"" : "Gabim DB-je: \"%s\"", + "Offending command was: \"%s\"" : "Urdhri shkaktar qe: \"%s\"", + "You need to enter either an existing account or the administrator." : "Lypset të jepni ose një llogari ekzistuese, ose llogarinë e përgjegjësit.", + "Offending command was: \"%s\", name: %s, password: %s" : "Urdhri shkaktar qe: \"%s\", emër: %s, fjalëkalim: %s", + "PostgreSQL username and/or password not valid" : "Emër përdoruesi dhe/ose fjalëkalim PostgreSQL jo të vlefshëm", + "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nuk mbulohet dhe %s s’do të funksionojë si duhet në këtë platformë. Përdoreni nën përgjegjësinë tuaj! ", + "For the best results, please consider using a GNU/Linux server instead." : "Për përfundimet më të mira, ju lutemi, më mirë konsideroni përdorimin e një shërbyesi GNU/Linux.", + "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Duket se kjo instancë %s xhiron një mjedis PHP 32-bitësh dhe open_basedir është e formësuar, te php.ini. Kjo do të shpjerë në probleme me kartela më të mëdha se 4 GB dhe këshillohet me forcë të mos ndodhë.", + "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Ju lutemi, hiqeni rregullimin open_basedir nga php.ini juaj ose hidhuni te PHP për 64-bit.", + "Set an admin username." : "Caktoni një emër përdoruesi për përgjegjësin.", + "Set an admin password." : "Caktoni një fjalëkalim për përgjegjësin.", + "Can't create or write into the data directory %s" : "S’e krijon ose s’shkruan dot te drejtoria e të dhënave %s", + "Invalid Federated Cloud ID" : "ID Federated Cloud e pavlefshme", + "%s shared »%s« with you" : "%s ndau me ju »%s«", + "%s via %s" : "%s përmes %s", + "Sharing %s failed, because the backend does not allow shares from type %i" : "Ndarja e %s dështoi, ngaqë pjesa përgjegjëse e shërbyesit nuk lejon ndarje prej llojit %i", + "Sharing %s failed, because the file does not exist" : "Ndarja e %s me të tjerët dështoi, ngaqë kartela s’ekziston", + "You are not allowed to share %s" : "Nuk ju lejohet ta ndani %s me të tjerët", + "Sharing %s failed, because you can not share with yourself" : "Ndarja e %s dështoi, ngaqë s’mund të ndani gjëra me vetveten", + "Sharing %s failed, because the user %s does not exist" : "Ndarja e %s me të tjerët dështoi, ngaqë përdoruesi %s nuk ekziston", + "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Ndarja për %s dështoi, ngaqë përdoruesi %s s’është anëtar i ndonjë grupi ku %s është anëtar", + "Sharing %s failed, because this item is already shared with %s" : "Ndarja për %s dështoi, ngaqë ky objekt është ndarë një herë me %s", + "Sharing %s failed, because this item is already shared with user %s" : "Ndarja e %s me të tjerët dështoi, ngaqë ky objekt është ndarë tashmë me përdoruesin %s", + "Sharing %s failed, because the group %s does not exist" : "Ndarja e %s me të tjerët dështoi, ngaqë grupi %s nuk ekziston", + "Sharing %s failed, because %s is not a member of the group %s" : "Ndarja e %s me të tjerët dështoi, ngaqë %s s’është anëtar i grupit %s", + "You need to provide a password to create a public link, only protected links are allowed" : "Lypset të jepni një fjalëkalim që të krijoni një lidhje publike, lejohen vetëm lidhje të mbrojtura", + "Sharing %s failed, because sharing with links is not allowed" : "Ndarja e %s me të tjerët dështoi, ngaqë nuk lejohet ndarja me lidhje", + "Not allowed to create a federated share with the same user" : "S’i lejohet të krijojë një ndarje të federuar me të njëjtin përdorues", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Ndarja për %s dështoi, s’u gjet dot %s, ndoshta shërbyesi është hëpërhë jashtë pune.", + "Share type %s is not valid for %s" : "Lloji i ndarjes %s s’është i vlefshëm për %s", + "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Caktimi i lejeve për %s dështoi, ngaqë lejet tejkalojnë lejet e akorduara për %s", + "Setting permissions for %s failed, because the item was not found" : "Caktimi i lejeve për %s dështoi, ngaqë s’u gjet objekti", + "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "S’caktohet dot data e skadimit. Ndarjet s’mund të skadojnë më vonë se %s pasi të jenë ofruar", + "Cannot set expiration date. Expiration date is in the past" : "S’caktohet dot data e skadimit. Data e skadimit bie në të kaluarën", + "Cannot clear expiration date. Shares are required to have an expiration date." : "S’hiqet dot data e skadimit. Ndarjet lypse të kenë një datë skadimi.", + "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Mekanizmi i shërbimit për ndarje %s duhet të sendërtojë ndërfaqen OCP\\Share_Backend", + "Sharing backend %s not found" : "S’u gjet mekanizmi i shërbimit për ndarje %s", + "Sharing backend for %s not found" : "S’u gjet mekanizmi i shërbimit për ndarje për %s", + "Sharing failed, because the user %s is the original sharer" : "Ndarja dështoi, ngaqë përdoruesi %s është ai që e ndau fillimisht", + "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Ndarja e %s me të tjerët dështoi, ngaqë lejet tejkalojnë lejet e akorduara për %s", + "Sharing %s failed, because resharing is not allowed" : "Ndarja e %s me të tjerët dështoi, ngaqë nuk lejohen rindarje", + "Sharing %s failed, because the sharing backend for %s could not find its source" : "Ndarja e %s dështoi, ngaqë mekanizmi i shërbimit për ndarje për %s s’gjeti dot burimin për të", + "Sharing %s failed, because the file could not be found in the file cache" : "Ndarja e %s me të tjerët dështoi, ngaqë kartela s’u gjet dot te fshehtina e kartelave", + "Cannot increase permissions of %s" : "S’mund të shtohen lejet për %s", + "Files can't be shared with delete permissions" : "Kartelat s’mund të ndahen me leje fshirjeje", + "Files can't be shared with create permissions" : "Kartelat s’mund të ndahen me leje krijimi", + "Expiration date is in the past" : "Data e skadimit bie në të kaluarën", + "Cannot set expiration date more than %s days in the future" : "S’mund të caktohet data e skadimit më shumë se %s ditë në të ardhmen", + "Could not find category \"%s\"" : "S’u gjet kategori \"%s\"", + "Sunday" : "E diel", + "Monday" : "E hënë", + "Tuesday" : "E martë", + "Wednesday" : "E mërkurë", + "Thursday" : "E enjte", + "Friday" : "E premte", + "Saturday" : "E shtunë", + "Sun." : "Die.", + "Mon." : "Hën.", + "Tue." : "Mar.", + "Wed." : "Mër.", + "Thu." : "Enj.", + "Fri." : "Pre.", + "Sat." : "Sht.", + "Su" : "Di", + "Mo" : "Hë", + "Tu" : "Ma", + "We" : "Më", + "Th" : "En", + "Fr" : "Pr", + "Sa" : "Sh", + "January" : "Janar", + "February" : "Shkurt", + "March" : "Mars", + "April" : "Prill", + "May" : "Maj", + "June" : "Qershor", + "July" : "Korrik", + "August" : "Gusht", + "September" : "Shtator", + "October" : "Tetor", + "November" : "Nëntor", + "December" : "Dhjetor", + "Jan." : "Jan.", + "Feb." : "Shk.", + "Mar." : "Mar.", + "Apr." : "Pri.", + "May." : "Maj.", + "Jun." : "Qer.", + "Jul." : "Kor.", + "Aug." : "Gus.", + "Sep." : "Sht.", + "Oct." : "Tet.", + "Nov." : "Nën.", + "Dec." : "Dhj.", + "Apps" : "Aplikacione", + "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Në një emër përdoruesi lejohen vetëm shenjat vijuese: \"a-z\", \"A-Z\", \"0-9\", dhe \"_.@-\"", + "A valid username must be provided" : "Duhet dhënë një emër i vlefshëm përdoruesi", + "Username contains whitespace at the beginning or at the end" : "Emri i përdoruesit përmban hapësirë në fillim ose në fund", + "A valid password must be provided" : "Duhet dhënë një fjalëkalim i vlefshëm", + "The username is already being used" : "Emri i përdoruesit është tashmë i përdorur", + "Login canceled by app" : "Hyrja u anulua nga aplikacioni", + "User disabled" : "Përdorues i çaktivizuar", + "Help" : "Ndihmë", + "Personal" : "Personale", + "Users" : "Përdorues", + "Admin" : "Admin", + "App \"%s\" cannot be installed because appinfo file cannot be read." : "Aplikacioni \"%s\" s’mund të instalohet, ngaqë s’lexohet dot kartela appinfo.", + "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Aplikacioni \"%s\" nuk mund të instalohet sepse nuk përputhet me këtë version të serverit.", + "No app name specified" : "S’u dha emër aplikacioni", + "App '%s' could not be installed!" : "Aplikacioni \"%s\" nuk mund të instalohet!", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Përditësimi \"%s\" s’instalohet dot, ngaqë s’plotësohen varësitë vijuese: %s.", + "a safe home for all your data" : "Një shtëpi e sigurt për të dhënat e tua", + "File is currently busy, please try again later" : "Kartela tani është e zënë, ju lutemi, riprovoni më vonë.", + "Can't read file" : "S'lexohet dot kartela", + "Application is not enabled" : "Aplikacioni s’është aktivizuar", + "Authentication error" : "Gabim mirëfilltësimi", + "Token expired. Please reload page." : "Token-i ka skaduar. Ju lutemi, ringarkoni faqen.", + "Unknown user" : "Përdorues i panjohur", + "No database drivers (sqlite, mysql, or postgresql) installed." : "S’ka baza të dhënash (sqlite, mysql, ose postgresql) të instaluara.", + "Cannot write into \"config\" directory" : "S’shkruhet dot te drejtoria \"config\"", + "Cannot write into \"apps\" directory" : "S’shkruhet dot te drejtoria \"apps\"", + "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Zakonisht kjo mund të ndreqet duke %si akorduar shërbyesit web të drejta shkrimi mbi drejtorinë e aplikacionit%s ose duke e çaktivizuar appstore-in te kartela e formësimit.", + "Cannot create \"data\" directory (%s)" : "S’krijohet dot drejtoria \"data\" (%s)", + "This can usually be fixed by giving the webserver write access to the root directory." : "Zakonisht kjo mund të ndreqet duke i akorduar shërbyesit web të drejta shkrimi mbi drejtorinë rrënjë.", + "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Zakonisht lejet mund të ndreqen duke %si akorduar shërbyesit web të drejta shkrimi mbi drejtorinë rrënjë%s.", + "Setting locale to %s failed" : "Caktimi i gjuhës si %s dështoi", + "Please install one of these locales on your system and restart your webserver." : "Ju lutemi, instaloni te sistemi juaj një prej këtyre vendoreve dhe rinisni shërbyesin tuaj web.", + "Please ask your server administrator to install the module." : "Ju lutemi, kërkojini përgjegjësit të shërbyesit ta instalojë modulin.", + "PHP module %s not installed." : "Moduli PHP %s s’është i instaluar.", + "PHP setting \"%s\" is not set to \"%s\"." : "Rregullimi PHP \"%s\" s’është vënë si \"%s\".", + "Adjusting this setting in php.ini will make Nextcloud run again" : "Përshtatja e këtij konfigurimi në php.ini do e bëjë Nextcloud të punoj përsëri", + "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload është caktuar si \"%s\", në vend të vlerës së pritshme \"0\"", + "To fix this issue set mbstring.func_overload to 0 in your php.ini" : "Për ta ndrequr këtë problem, caktoni për mbstring.func_overload vlerën 0 te php.ini juaj", + "libxml2 2.7.0 is at least required. Currently %s is installed." : "Lypset të paktën libxml2 2.7.0. Hëpërhë e instaluar është %s.", + "To fix this issue update your libxml2 version and restart your web server." : "Për të ndrequr këtë problem, përditësoni libxml2 dhe rinisni shërbyesin tuaj web.", + "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "Me sa duket, PHP-ja është rregulluar që të heqë blloqe të brendshëm dokumentimi. Kjo do t’i nxjerrë nga funksionimi disa aplikacione bazë.", + "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Kjo ka gjasa të jetë shkaktuar nga një fshehtinë/përshpejtues i tillë si Zend OPcache ose eAccelerator.", + "PHP modules have been installed, but they are still listed as missing?" : "Modulet PHP janë instaluar, por tregohen ende sikur mungojnë?", + "Please ask your server administrator to restart the web server." : "Ju lutemi, kërkojini përgjegjësit të shërbyesit tuaj të rinisë shërbyesin web.", + "PostgreSQL >= 9 required" : "Lypset PostgreSQL >= 9", + "Please upgrade your database version" : "Ju lutemi, përmirësoni bazën tuaj të të dhënave me një version më të ri.", + "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Ju lutemi, kalojani lejet në 0770, që kështu atë drejtori të mos mund ta shfaqin përdorues të tjerë.", + "Data directory (%s) is readable by other users" : "Drejtoria e të dhënave (%s) është e lexueshme nga përdorues të tjerë", + "Data directory (%s) must be an absolute path" : "Drejtoria e të dhënave (%s) duhet të jepë një shteg absolut", + "Check the value of \"datadirectory\" in your configuration" : "Kontrolloni vlerën e \"datadirectory\" te formësimi juaj", + "Data directory (%s) is invalid" : "Drejtoria e të dhënave (%s) është e pavlefshme", + "Please check that the data directory contains a file \".ocdata\" in its root." : "Ju lutemi, kontrolloni që drejtoria e të dhënave përmban në rrënjën e saj një kartelë \".ocdata\".", + "Could not obtain lock type %d on \"%s\"." : "S’u mor dot lloj kyçjeje %d në \"%s\".", + "Storage unauthorized. %s" : "Depozitë e paautorizuar. %s", + "Storage incomplete configuration. %s" : "Formësim jo i plotë i depozitës. %s", + "Storage connection error. %s" : "Gabim lidhje te depozita. %s", + "Storage is temporarily not available" : "Hapsira ruajtëse nuk është në dispozicion përkohësisht", + "Storage connection timeout. %s" : "Mbarim kohe lidhjeje për depozitën. %s", + "4-byte characters are not supported in file names" : "Shenjat 4-bajtshe nuk mbulohet në emra kartelash", + "App directory already exists" : "Drejtoria e aplikacionit ekziston tashmë", + "Can't create app folder. Please fix permissions. %s" : "S’krijohet dot dosje aplikacioni. Ju lutemi, ndreqni lejet. %s", + "Archive does not contain a directory named %s" : "Arkivi s’përmban një drejtori të quajtur %s", + "No source specified when installing app" : "S’u dha burim gjatë instalimit të aplikacionit", + "No href specified when installing app from http" : "S’u tregua href gjatë instalimit të aplikacionit nga http", + "No path specified when installing app from local file" : "S’u caktua shteg gjatë instalimit të aplikacionit prej kartele vendore", + "Archives of type %s are not supported" : "Nuk mbulohen arkivat e llojit %s", + "Failed to open archive when installing app" : "Dështoi në hapje arkivi teksa instalohej aplikacioni", + "App does not provide an info.xml file" : "Aplikacioni s’ofron kartele të vlefshme .xml", + "App cannot be installed because appinfo file cannot be read." : "Aplikacioni s’mund të instalohet, ngaqë s’lexohet dot kartela appinfo.", + "Signature could not get checked. Please contact the app developer and check your admin screen." : "Nënshkrimi s’u kontrollua dot. Ju lutemi, lidhuni me zhvilluesin e aplikacionit dhe kontrolloni te skena juaj e përgjegjësit.", + "App can't be installed because of not allowed code in the App" : "Aplikacioni s’mund të instalohet, për shkak kodi të palejuar te Aplikacioni", + "App can't be installed because it is not compatible with this version of the server" : "Aplikacioni nuk mund të instalohet sepse nuk përputhet me këtë version të serverit.", + "App can't be installed because it contains the true tag which is not allowed for non shipped apps" : "Aplikacioni s’mund të instalohet, ngaqë përmban etiketën true e cila nuk lejohet për aplikacione që s’janë hedhur në qarkullim", + "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Aplikacioni s’mund të instalohet, ngaqë versioni te info.xml s’është i njëjti me versionin e treguar nga shitorja e aplikacioneve", + "Logging" : "Duke u lidhur", + "Recommended" : "E rekomanduar", + "Microsoft Windows Platform is not supported" : "Microsoft Windows Platform nuk mbulohet", + "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Përdorimi i Serverit Nextcloud në një platformë Microsoft Windows nuk mbështetet. Ne ju sugjerojmë të përdorni një server Linux në një makinë virtuale nëse nuk e keni mundësinë që të migroni vetë serverin.", + "Storage not available" : "Pa depozitë gati" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/sq.json b/lib/l10n/sq.json new file mode 100644 index 0000000000000000000000000000000000000000..2adce922b4147a60e255a1a229b378cbb369fa51 --- /dev/null +++ b/lib/l10n/sq.json @@ -0,0 +1,231 @@ +{ "translations": { + "Cannot write into \"config\" directory!" : "Nuk shkruhet dot te drejtoria \"config\"!", + "This can usually be fixed by giving the webserver write access to the config directory" : "Zakonisht kjo mund të ndreqet duke i akorduar shërbyesit web të drejta shkrimi mbi drejtorinë e formësimeve", + "See %s" : "Shihni %s", + "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Zakonisht kjo mund të ndreqet duke %si akorduar shërbyesit web të drejta shkrimi mbi drejtorinë e formësimeve%s.", + "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Skedarët e aplikacionit %$1s nuk u zëvëndësuan në mënyrë korrekte. Sigurohuni që është një version që përputhet me serverin.", + "Sample configuration detected" : "U gjet formësim shembull", + "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "U pa se është kopjuar shembulli për formësime. Kjo mund të prishë instalimin tuaj dhe nuk mbulohet. Ju lutemi, lexoni dokumentimin, përpara se të kryeni ndryshime te config.php", + "%1$s and %2$s" : "%1$s dhe %2$s", + "%1$s, %2$s and %3$s" : "%1$s, %2$s dhe %3$s", + "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s dhe %4$s", + "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s dhe %5$s", + "PHP %s or higher is required." : "Kërkohet PHP %s ose më sipër.", + "PHP with a version lower than %s is required." : "Lypset PHP me një version më të ulët se sa %s.", + "%sbit or higher PHP required." : "Lypset PHP %sbit ose më i ri.", + "Following databases are supported: %s" : "Mbulohen bazat vijuese të të dhënave: %s", + "The command line tool %s could not be found" : "Mjeti rresht urdhrash %s s’u gjet dot", + "The library %s is not available." : "Libraria %s s’është e passhme.", + "Library %s with a version higher than %s is required - available version %s." : "Kërkohet librari %s me një version më të madh se %s - version gati %s.", + "Library %s with a version lower than %s is required - available version %s." : "Lypset librari %s me një version më të vogël se %s - version gati %s.", + "Following platforms are supported: %s" : "Mbulohen platformat vijuese: %s", + "Server version %s or higher is required." : "Versioni i serverit kërkohet %s ose më lartë", + "Server version %s or lower is required." : "Versioni i serverit kërkohet %s ose më poshtë", + "Unknown filetype" : "Lloj i panjohur skedari", + "Invalid image" : "Figurë e pavlefshme", + "Avatar image is not square" : "Imazhi avatar nuk është katror", + "today" : "sot", + "yesterday" : "dje", + "_%n day ago_::_%n days ago_" : ["%n ditë më parë","%n ditë më parë"], + "last month" : "muajin e shkuar", + "_%n month ago_::_%n months ago_" : ["%n muaj më parë","%n muaj më parë"], + "last year" : "vitin e shkuar", + "_%n year ago_::_%n years ago_" : ["%n vit më parë","%n vjet më parë"], + "_%n hour ago_::_%n hours ago_" : ["%n orë më parë","%n orë më parë"], + "_%n minute ago_::_%n minutes ago_" : ["%n minutë më parë","%n minuta më parë"], + "seconds ago" : "sekonda më parë", + "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "S’ka modul me id: %s. Ju lutemi, aktivizojeni te rregullimet tuaja për aplikacionin ose lidhuni me përgjegjësin tuaj.", + "File name is a reserved word" : "Emri i kartelës është një emër i rezervuar", + "File name contains at least one invalid character" : "Emri i kartelës përmban të paktën një shenjë të pavlefshme", + "File name is too long" : "Emri i kartelës është shumë i gjatë", + "Dot files are not allowed" : "Nuk lejohen kartela të fshehura", + "Empty filename is not allowed" : "Nuk lejohen emra të zbrazët kartelash", + "APCu" : "APCu", + "Redis" : "Redis", + "Server settings" : "Konfigurimi i serverit", + "Sharing" : "Ndarja", + "Encryption" : "Enkriptimi", + "Additional settings" : "Konfigurime shtesë", + "Tips & tricks" : "Këshilla dhe rrengje", + "%s enter the database username and name." : "%s jepni emrin e bazës së të dhënave dhe emrin e përdoruesit për të.", + "%s enter the database username." : "%s jepni emrin e përdoruesit të bazës së të dhënave.", + "%s enter the database name." : "%s jepni emrin e bazës së të dhënave.", + "%s you may not use dots in the database name" : "%s s’mund të përdorni pika te emri i bazës së të dhënave", + "Oracle connection could not be established" : "S’u vendos dot lidhje me Oracle", + "Oracle username and/or password not valid" : "Emër përdoruesi dhe/ose fjalëkalim Oracle-i i pavlefshëm", + "DB Error: \"%s\"" : "Gabim DB-je: \"%s\"", + "Offending command was: \"%s\"" : "Urdhri shkaktar qe: \"%s\"", + "You need to enter either an existing account or the administrator." : "Lypset të jepni ose një llogari ekzistuese, ose llogarinë e përgjegjësit.", + "Offending command was: \"%s\", name: %s, password: %s" : "Urdhri shkaktar qe: \"%s\", emër: %s, fjalëkalim: %s", + "PostgreSQL username and/or password not valid" : "Emër përdoruesi dhe/ose fjalëkalim PostgreSQL jo të vlefshëm", + "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nuk mbulohet dhe %s s’do të funksionojë si duhet në këtë platformë. Përdoreni nën përgjegjësinë tuaj! ", + "For the best results, please consider using a GNU/Linux server instead." : "Për përfundimet më të mira, ju lutemi, më mirë konsideroni përdorimin e një shërbyesi GNU/Linux.", + "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Duket se kjo instancë %s xhiron një mjedis PHP 32-bitësh dhe open_basedir është e formësuar, te php.ini. Kjo do të shpjerë në probleme me kartela më të mëdha se 4 GB dhe këshillohet me forcë të mos ndodhë.", + "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Ju lutemi, hiqeni rregullimin open_basedir nga php.ini juaj ose hidhuni te PHP për 64-bit.", + "Set an admin username." : "Caktoni një emër përdoruesi për përgjegjësin.", + "Set an admin password." : "Caktoni një fjalëkalim për përgjegjësin.", + "Can't create or write into the data directory %s" : "S’e krijon ose s’shkruan dot te drejtoria e të dhënave %s", + "Invalid Federated Cloud ID" : "ID Federated Cloud e pavlefshme", + "%s shared »%s« with you" : "%s ndau me ju »%s«", + "%s via %s" : "%s përmes %s", + "Sharing %s failed, because the backend does not allow shares from type %i" : "Ndarja e %s dështoi, ngaqë pjesa përgjegjëse e shërbyesit nuk lejon ndarje prej llojit %i", + "Sharing %s failed, because the file does not exist" : "Ndarja e %s me të tjerët dështoi, ngaqë kartela s’ekziston", + "You are not allowed to share %s" : "Nuk ju lejohet ta ndani %s me të tjerët", + "Sharing %s failed, because you can not share with yourself" : "Ndarja e %s dështoi, ngaqë s’mund të ndani gjëra me vetveten", + "Sharing %s failed, because the user %s does not exist" : "Ndarja e %s me të tjerët dështoi, ngaqë përdoruesi %s nuk ekziston", + "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Ndarja për %s dështoi, ngaqë përdoruesi %s s’është anëtar i ndonjë grupi ku %s është anëtar", + "Sharing %s failed, because this item is already shared with %s" : "Ndarja për %s dështoi, ngaqë ky objekt është ndarë një herë me %s", + "Sharing %s failed, because this item is already shared with user %s" : "Ndarja e %s me të tjerët dështoi, ngaqë ky objekt është ndarë tashmë me përdoruesin %s", + "Sharing %s failed, because the group %s does not exist" : "Ndarja e %s me të tjerët dështoi, ngaqë grupi %s nuk ekziston", + "Sharing %s failed, because %s is not a member of the group %s" : "Ndarja e %s me të tjerët dështoi, ngaqë %s s’është anëtar i grupit %s", + "You need to provide a password to create a public link, only protected links are allowed" : "Lypset të jepni një fjalëkalim që të krijoni një lidhje publike, lejohen vetëm lidhje të mbrojtura", + "Sharing %s failed, because sharing with links is not allowed" : "Ndarja e %s me të tjerët dështoi, ngaqë nuk lejohet ndarja me lidhje", + "Not allowed to create a federated share with the same user" : "S’i lejohet të krijojë një ndarje të federuar me të njëjtin përdorues", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Ndarja për %s dështoi, s’u gjet dot %s, ndoshta shërbyesi është hëpërhë jashtë pune.", + "Share type %s is not valid for %s" : "Lloji i ndarjes %s s’është i vlefshëm për %s", + "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Caktimi i lejeve për %s dështoi, ngaqë lejet tejkalojnë lejet e akorduara për %s", + "Setting permissions for %s failed, because the item was not found" : "Caktimi i lejeve për %s dështoi, ngaqë s’u gjet objekti", + "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "S’caktohet dot data e skadimit. Ndarjet s’mund të skadojnë më vonë se %s pasi të jenë ofruar", + "Cannot set expiration date. Expiration date is in the past" : "S’caktohet dot data e skadimit. Data e skadimit bie në të kaluarën", + "Cannot clear expiration date. Shares are required to have an expiration date." : "S’hiqet dot data e skadimit. Ndarjet lypse të kenë një datë skadimi.", + "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Mekanizmi i shërbimit për ndarje %s duhet të sendërtojë ndërfaqen OCP\\Share_Backend", + "Sharing backend %s not found" : "S’u gjet mekanizmi i shërbimit për ndarje %s", + "Sharing backend for %s not found" : "S’u gjet mekanizmi i shërbimit për ndarje për %s", + "Sharing failed, because the user %s is the original sharer" : "Ndarja dështoi, ngaqë përdoruesi %s është ai që e ndau fillimisht", + "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Ndarja e %s me të tjerët dështoi, ngaqë lejet tejkalojnë lejet e akorduara për %s", + "Sharing %s failed, because resharing is not allowed" : "Ndarja e %s me të tjerët dështoi, ngaqë nuk lejohen rindarje", + "Sharing %s failed, because the sharing backend for %s could not find its source" : "Ndarja e %s dështoi, ngaqë mekanizmi i shërbimit për ndarje për %s s’gjeti dot burimin për të", + "Sharing %s failed, because the file could not be found in the file cache" : "Ndarja e %s me të tjerët dështoi, ngaqë kartela s’u gjet dot te fshehtina e kartelave", + "Cannot increase permissions of %s" : "S’mund të shtohen lejet për %s", + "Files can't be shared with delete permissions" : "Kartelat s’mund të ndahen me leje fshirjeje", + "Files can't be shared with create permissions" : "Kartelat s’mund të ndahen me leje krijimi", + "Expiration date is in the past" : "Data e skadimit bie në të kaluarën", + "Cannot set expiration date more than %s days in the future" : "S’mund të caktohet data e skadimit më shumë se %s ditë në të ardhmen", + "Could not find category \"%s\"" : "S’u gjet kategori \"%s\"", + "Sunday" : "E diel", + "Monday" : "E hënë", + "Tuesday" : "E martë", + "Wednesday" : "E mërkurë", + "Thursday" : "E enjte", + "Friday" : "E premte", + "Saturday" : "E shtunë", + "Sun." : "Die.", + "Mon." : "Hën.", + "Tue." : "Mar.", + "Wed." : "Mër.", + "Thu." : "Enj.", + "Fri." : "Pre.", + "Sat." : "Sht.", + "Su" : "Di", + "Mo" : "Hë", + "Tu" : "Ma", + "We" : "Më", + "Th" : "En", + "Fr" : "Pr", + "Sa" : "Sh", + "January" : "Janar", + "February" : "Shkurt", + "March" : "Mars", + "April" : "Prill", + "May" : "Maj", + "June" : "Qershor", + "July" : "Korrik", + "August" : "Gusht", + "September" : "Shtator", + "October" : "Tetor", + "November" : "Nëntor", + "December" : "Dhjetor", + "Jan." : "Jan.", + "Feb." : "Shk.", + "Mar." : "Mar.", + "Apr." : "Pri.", + "May." : "Maj.", + "Jun." : "Qer.", + "Jul." : "Kor.", + "Aug." : "Gus.", + "Sep." : "Sht.", + "Oct." : "Tet.", + "Nov." : "Nën.", + "Dec." : "Dhj.", + "Apps" : "Aplikacione", + "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Në një emër përdoruesi lejohen vetëm shenjat vijuese: \"a-z\", \"A-Z\", \"0-9\", dhe \"_.@-\"", + "A valid username must be provided" : "Duhet dhënë një emër i vlefshëm përdoruesi", + "Username contains whitespace at the beginning or at the end" : "Emri i përdoruesit përmban hapësirë në fillim ose në fund", + "A valid password must be provided" : "Duhet dhënë një fjalëkalim i vlefshëm", + "The username is already being used" : "Emri i përdoruesit është tashmë i përdorur", + "Login canceled by app" : "Hyrja u anulua nga aplikacioni", + "User disabled" : "Përdorues i çaktivizuar", + "Help" : "Ndihmë", + "Personal" : "Personale", + "Users" : "Përdorues", + "Admin" : "Admin", + "App \"%s\" cannot be installed because appinfo file cannot be read." : "Aplikacioni \"%s\" s’mund të instalohet, ngaqë s’lexohet dot kartela appinfo.", + "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Aplikacioni \"%s\" nuk mund të instalohet sepse nuk përputhet me këtë version të serverit.", + "No app name specified" : "S’u dha emër aplikacioni", + "App '%s' could not be installed!" : "Aplikacioni \"%s\" nuk mund të instalohet!", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Përditësimi \"%s\" s’instalohet dot, ngaqë s’plotësohen varësitë vijuese: %s.", + "a safe home for all your data" : "Një shtëpi e sigurt për të dhënat e tua", + "File is currently busy, please try again later" : "Kartela tani është e zënë, ju lutemi, riprovoni më vonë.", + "Can't read file" : "S'lexohet dot kartela", + "Application is not enabled" : "Aplikacioni s’është aktivizuar", + "Authentication error" : "Gabim mirëfilltësimi", + "Token expired. Please reload page." : "Token-i ka skaduar. Ju lutemi, ringarkoni faqen.", + "Unknown user" : "Përdorues i panjohur", + "No database drivers (sqlite, mysql, or postgresql) installed." : "S’ka baza të dhënash (sqlite, mysql, ose postgresql) të instaluara.", + "Cannot write into \"config\" directory" : "S’shkruhet dot te drejtoria \"config\"", + "Cannot write into \"apps\" directory" : "S’shkruhet dot te drejtoria \"apps\"", + "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Zakonisht kjo mund të ndreqet duke %si akorduar shërbyesit web të drejta shkrimi mbi drejtorinë e aplikacionit%s ose duke e çaktivizuar appstore-in te kartela e formësimit.", + "Cannot create \"data\" directory (%s)" : "S’krijohet dot drejtoria \"data\" (%s)", + "This can usually be fixed by giving the webserver write access to the root directory." : "Zakonisht kjo mund të ndreqet duke i akorduar shërbyesit web të drejta shkrimi mbi drejtorinë rrënjë.", + "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Zakonisht lejet mund të ndreqen duke %si akorduar shërbyesit web të drejta shkrimi mbi drejtorinë rrënjë%s.", + "Setting locale to %s failed" : "Caktimi i gjuhës si %s dështoi", + "Please install one of these locales on your system and restart your webserver." : "Ju lutemi, instaloni te sistemi juaj një prej këtyre vendoreve dhe rinisni shërbyesin tuaj web.", + "Please ask your server administrator to install the module." : "Ju lutemi, kërkojini përgjegjësit të shërbyesit ta instalojë modulin.", + "PHP module %s not installed." : "Moduli PHP %s s’është i instaluar.", + "PHP setting \"%s\" is not set to \"%s\"." : "Rregullimi PHP \"%s\" s’është vënë si \"%s\".", + "Adjusting this setting in php.ini will make Nextcloud run again" : "Përshtatja e këtij konfigurimi në php.ini do e bëjë Nextcloud të punoj përsëri", + "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload është caktuar si \"%s\", në vend të vlerës së pritshme \"0\"", + "To fix this issue set mbstring.func_overload to 0 in your php.ini" : "Për ta ndrequr këtë problem, caktoni për mbstring.func_overload vlerën 0 te php.ini juaj", + "libxml2 2.7.0 is at least required. Currently %s is installed." : "Lypset të paktën libxml2 2.7.0. Hëpërhë e instaluar është %s.", + "To fix this issue update your libxml2 version and restart your web server." : "Për të ndrequr këtë problem, përditësoni libxml2 dhe rinisni shërbyesin tuaj web.", + "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "Me sa duket, PHP-ja është rregulluar që të heqë blloqe të brendshëm dokumentimi. Kjo do t’i nxjerrë nga funksionimi disa aplikacione bazë.", + "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Kjo ka gjasa të jetë shkaktuar nga një fshehtinë/përshpejtues i tillë si Zend OPcache ose eAccelerator.", + "PHP modules have been installed, but they are still listed as missing?" : "Modulet PHP janë instaluar, por tregohen ende sikur mungojnë?", + "Please ask your server administrator to restart the web server." : "Ju lutemi, kërkojini përgjegjësit të shërbyesit tuaj të rinisë shërbyesin web.", + "PostgreSQL >= 9 required" : "Lypset PostgreSQL >= 9", + "Please upgrade your database version" : "Ju lutemi, përmirësoni bazën tuaj të të dhënave me një version më të ri.", + "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Ju lutemi, kalojani lejet në 0770, që kështu atë drejtori të mos mund ta shfaqin përdorues të tjerë.", + "Data directory (%s) is readable by other users" : "Drejtoria e të dhënave (%s) është e lexueshme nga përdorues të tjerë", + "Data directory (%s) must be an absolute path" : "Drejtoria e të dhënave (%s) duhet të jepë një shteg absolut", + "Check the value of \"datadirectory\" in your configuration" : "Kontrolloni vlerën e \"datadirectory\" te formësimi juaj", + "Data directory (%s) is invalid" : "Drejtoria e të dhënave (%s) është e pavlefshme", + "Please check that the data directory contains a file \".ocdata\" in its root." : "Ju lutemi, kontrolloni që drejtoria e të dhënave përmban në rrënjën e saj një kartelë \".ocdata\".", + "Could not obtain lock type %d on \"%s\"." : "S’u mor dot lloj kyçjeje %d në \"%s\".", + "Storage unauthorized. %s" : "Depozitë e paautorizuar. %s", + "Storage incomplete configuration. %s" : "Formësim jo i plotë i depozitës. %s", + "Storage connection error. %s" : "Gabim lidhje te depozita. %s", + "Storage is temporarily not available" : "Hapsira ruajtëse nuk është në dispozicion përkohësisht", + "Storage connection timeout. %s" : "Mbarim kohe lidhjeje për depozitën. %s", + "4-byte characters are not supported in file names" : "Shenjat 4-bajtshe nuk mbulohet në emra kartelash", + "App directory already exists" : "Drejtoria e aplikacionit ekziston tashmë", + "Can't create app folder. Please fix permissions. %s" : "S’krijohet dot dosje aplikacioni. Ju lutemi, ndreqni lejet. %s", + "Archive does not contain a directory named %s" : "Arkivi s’përmban një drejtori të quajtur %s", + "No source specified when installing app" : "S’u dha burim gjatë instalimit të aplikacionit", + "No href specified when installing app from http" : "S’u tregua href gjatë instalimit të aplikacionit nga http", + "No path specified when installing app from local file" : "S’u caktua shteg gjatë instalimit të aplikacionit prej kartele vendore", + "Archives of type %s are not supported" : "Nuk mbulohen arkivat e llojit %s", + "Failed to open archive when installing app" : "Dështoi në hapje arkivi teksa instalohej aplikacioni", + "App does not provide an info.xml file" : "Aplikacioni s’ofron kartele të vlefshme .xml", + "App cannot be installed because appinfo file cannot be read." : "Aplikacioni s’mund të instalohet, ngaqë s’lexohet dot kartela appinfo.", + "Signature could not get checked. Please contact the app developer and check your admin screen." : "Nënshkrimi s’u kontrollua dot. Ju lutemi, lidhuni me zhvilluesin e aplikacionit dhe kontrolloni te skena juaj e përgjegjësit.", + "App can't be installed because of not allowed code in the App" : "Aplikacioni s’mund të instalohet, për shkak kodi të palejuar te Aplikacioni", + "App can't be installed because it is not compatible with this version of the server" : "Aplikacioni nuk mund të instalohet sepse nuk përputhet me këtë version të serverit.", + "App can't be installed because it contains the true tag which is not allowed for non shipped apps" : "Aplikacioni s’mund të instalohet, ngaqë përmban etiketën true e cila nuk lejohet për aplikacione që s’janë hedhur në qarkullim", + "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Aplikacioni s’mund të instalohet, ngaqë versioni te info.xml s’është i njëjti me versionin e treguar nga shitorja e aplikacioneve", + "Logging" : "Duke u lidhur", + "Recommended" : "E rekomanduar", + "Microsoft Windows Platform is not supported" : "Microsoft Windows Platform nuk mbulohet", + "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Përdorimi i Serverit Nextcloud në një platformë Microsoft Windows nuk mbështetet. Ne ju sugjerojmë të përdorni një server Linux në një makinë virtuale nëse nuk e keni mundësinë që të migroni vetë serverin.", + "Storage not available" : "Pa depozitë gati" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +} \ No newline at end of file diff --git a/lib/l10n/sv.js b/lib/l10n/sv.js new file mode 100644 index 0000000000000000000000000000000000000000..af52142692ce509c5cffa33f3f7b86b194834dad --- /dev/null +++ b/lib/l10n/sv.js @@ -0,0 +1,233 @@ +OC.L10N.register( + "lib", + { + "Cannot write into \"config\" directory!" : "Kan inte skriva till \"config\" katalogen!", + "This can usually be fixed by giving the webserver write access to the config directory" : "Detta kan vanligtvis åtgärdas genom att ge skrivrättigheter till config katalgogen", + "See %s" : "Se %s", + "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Detta kan vanligtvis åtgärdas genom att %s ger webbservern skrivrättigheter till konfigurations-katalogen %s.", + "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Filerna i appen %$1s ersattes inte korrekt. Se till att det är en version som är kompatibel med servern.", + "Sample configuration detected" : "Exempel-konfiguration detekterad", + "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Det har detekterats att exempel-konfigurationen har kopierats. Detta kan förstöra din installation och stöds ej. Vänligen läs dokumentationen innan ändringar på config.php utförs", + "%1$s and %2$s" : "%1$s och %2$s", + "%1$s, %2$s and %3$s" : "%1$s, %2$s och %3$s", + "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s och %4$s", + "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s och %5$s", + "PHP %s or higher is required." : "PHP %s eller högre krävs.", + "PHP with a version lower than %s is required." : "PHP med version lägre än %s krävs.", + "%sbit or higher PHP required." : "%sbit eller nyare PHP-version krävs.", + "Following databases are supported: %s" : "Följande databastyper stödjs: %s", + "The command line tool %s could not be found" : "Kommandoradsverktyget %s hittades inte.", + "The library %s is not available." : "Biblioteket %s är inte tillgängligt.", + "Library %s with a version higher than %s is required - available version %s." : "Bibliotek %s med version högre än %s krävs - tillgänglig version %s.", + "Library %s with a version lower than %s is required - available version %s." : "Bibliotek %s med version lägre än %s krävs - tillgänglig version %s.", + "Following platforms are supported: %s" : "Följande plattformar stödjs: %s", + "Server version %s or higher is required." : "Serverversion %s eller nyare krävs.", + "Server version %s or lower is required." : "Serverversion %s eller äldre krävs.", + "Unknown filetype" : "Okänd filtyp", + "Invalid image" : "Ogiltig bild", + "Avatar image is not square" : "Profilbilden är inte fyrkantig/kvadrat", + "today" : "i dag", + "yesterday" : "i går", + "_%n day ago_::_%n days ago_" : ["%n dag sedan","%n dagar sedan"], + "last month" : "förra månaden", + "_%n month ago_::_%n months ago_" : ["%n månad sedan","%n månader sedan"], + "last year" : "förra året", + "_%n year ago_::_%n years ago_" : ["%n år sedan","%n år sedan"], + "_%n hour ago_::_%n hours ago_" : ["%n timme sedan","%n timmar sedan"], + "_%n minute ago_::_%n minutes ago_" : ["%n minut sedan","%n minuter sedan"], + "seconds ago" : "sekunder sedan", + "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Modulen med id: %s finns inte. Vänligen aktivera det i dina app-inställningar eller kontakta din administratör.", + "File name is a reserved word" : "Filnamnet är ett reserverat ord", + "File name contains at least one invalid character" : "Filnamnet innehåller minst ett ogiltigt tecken", + "File name is too long" : "Filnamnet är för långt", + "Dot files are not allowed" : "Dot filer är inte tillåtna", + "Empty filename is not allowed" : "Tomma filnamn är inte tillåtna", + "APCu" : "APCu", + "Redis" : "Redis", + "Server settings" : "Serverinställningar", + "Sharing" : "Delning", + "Encryption" : "Kryptering", + "Additional settings" : "Övriga inställningar", + "Tips & tricks" : "Knep & Trick", + "%s enter the database username and name." : "%s ange användarnamn och namn för databasen.", + "%s enter the database username." : "%s ange databasanvändare.", + "%s enter the database name." : "%s ange databasnamn", + "%s you may not use dots in the database name" : "%s du får inte använda punkter i databasnamnet", + "Oracle connection could not be established" : "Oracle-anslutning kunde inte etableras", + "Oracle username and/or password not valid" : "Oracle-användarnamnet och/eller lösenordet är felaktigt", + "DB Error: \"%s\"" : "DB fel: \"%s\"", + "Offending command was: \"%s\"" : "Det felaktiga kommandot var: \"%s\"", + "You need to enter either an existing account or the administrator." : "Du måste antingen ange ett befintligt konto eller administratör.", + "Offending command was: \"%s\", name: %s, password: %s" : "Det felande kommandot var: \"%s\", name: %s, password: %s", + "PostgreSQL username and/or password not valid" : "PostgreSQL-användarnamnet och/eller lösenordet är felaktigt", + "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X stöds inte och %s kommer inte att fungera korrekt på denna plattform. Använd på egen risk!", + "For the best results, please consider using a GNU/Linux server instead." : "För bästa resultat, överväg att använda en GNU/Linux server istället.", + "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Det verkar som om denna %s instans körs på en 32-bitars PHP miljö och open_basedir har konfigurerats i php.ini. Detta kommer att leda till problem med filer över 4 GB och är verkligen inte rekommenderat!", + "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Ta bort open_basedir i din php.ini eller byt till 64-bitars PHP.", + "Set an admin username." : "Ange ett användarnamn för administratören.", + "Set an admin password." : "Ange ett administratörslösenord.", + "Can't create or write into the data directory %s" : "Kan inte skapa eller skriva till data-katalogen %s", + "Invalid Federated Cloud ID" : "Ogiltigt Federarat Moln-ID", + "%s shared »%s« with you" : "%s delade »%s« med dig", + "%s via %s" : "%s via %s", + "Sharing %s failed, because the backend does not allow shares from type %i" : "Misslyckades dela ut %s då backend inte tillåter delningar från typ %i", + "Sharing %s failed, because the file does not exist" : "Delning av %s misslyckades på grund av att filen inte existerar", + "You are not allowed to share %s" : "Du har inte rätt att dela %s", + "Sharing %s failed, because you can not share with yourself" : "Delning %s misslyckades därför att du inte kan dela med dig själv.", + "Sharing %s failed, because the user %s does not exist" : "Delning %s misslyckades därför att användaren %s inte existerar", + "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Delning %s misslyckades därför att användaren %s inte är medlem i någon utav de grupper som %s är medlem i", + "Sharing %s failed, because this item is already shared with %s" : "Delning %s misslyckades därför att objektet redan är delat med %s", + "Sharing %s failed, because this item is already shared with user %s" : "Delning %s misslyckades därför att detta redan är delat med användaren %s", + "Sharing %s failed, because the group %s does not exist" : "Delning %s misslyckades därför att gruppen %s inte existerar", + "Sharing %s failed, because %s is not a member of the group %s" : "Delning %s misslyckades därför att %s inte ingår i gruppen %s", + "You need to provide a password to create a public link, only protected links are allowed" : "Du måste ange ett lösenord för att skapa en offentlig länk, endast skyddade länkar är tillåtna", + "Sharing %s failed, because sharing with links is not allowed" : "Delning %s misslyckades därför att delning utav länkar inte är tillåtet", + "Not allowed to create a federated share with the same user" : "Ej tillåtet att skapa en förbundsdelning med samma användare", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Misslyckades dela ut %s, kan inte hitta %s, kanske är servern inte åtkomlig för närvarande.", + "Share type %s is not valid for %s" : "Delningstyp %s är inte giltig för %s", + "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Misslyckades att sätta rättigheter för %s därför att rättigheterna överskrider de som är tillåtna för %s", + "Setting permissions for %s failed, because the item was not found" : "Att sätta rättigheterna för %s misslyckades därför att objektet inte hittades", + "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Kan inte sätta utgångsdatum. Utdelningar kan inte utgå senare än %s efter de har delats ut", + "Cannot set expiration date. Expiration date is in the past" : "Kan inte sätta utgångsdatum. Utgångsdatumet är i det förflutna.", + "Cannot clear expiration date. Shares are required to have an expiration date." : "Kan ej ta bort utgångsdatumet. Delningen kräver att det finns ett utgångsdatum.", + "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Delningsgränssnittet %s måste implementera gränssnittet OCP\\Share_Backend", + "Sharing backend %s not found" : "Delningsgränssnittet %s hittades inte", + "Sharing backend for %s not found" : "Delningsgränssnittet för %s hittades inte", + "Sharing failed, because the user %s is the original sharer" : "Delning misslyckades eftersom användaren %s redan är den som har delat detta.", + "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Delning %s misslyckades därför att rättigheterna överskrider de rättigheter som är tillåtna för %s", + "Sharing %s failed, because resharing is not allowed" : "Delning %s misslyckades därför att vidaredelning inte är tillåten", + "Sharing %s failed, because the sharing backend for %s could not find its source" : "Delning %s misslyckades därför att delningsgränsnittet för %s inte kunde hitta sin källa", + "Sharing %s failed, because the file could not be found in the file cache" : "Delning %s misslyckades därför att filen inte kunde hittas i filcachen", + "Cannot increase permissions of %s" : "Kan ej öka behörigheterna för %s", + "Files can't be shared with delete permissions" : "Filerna kan ej delas med \"radera behörigheter\"", + "Files can't be shared with create permissions" : "Filerna kan ej delas med \"skapa behörigheter\"", + "Expiration date is in the past" : "Utgångsdatum är i det förflutna", + "Cannot set expiration date more than %s days in the future" : "Kan ej välja ett utgångsdatum längre fram än %s dagar", + "Could not find category \"%s\"" : "Kunde inte hitta kategorin \"%s\"", + "Sunday" : "Söndag", + "Monday" : "Måndag", + "Tuesday" : "Tisdag", + "Wednesday" : "Onsdag", + "Thursday" : "Torsdag", + "Friday" : "Fredag", + "Saturday" : "Lördag", + "Sun." : "Sön.", + "Mon." : "Mån.", + "Tue." : "Tis.", + "Wed." : "Ons.", + "Thu." : "Tors.", + "Fri." : "Fre.", + "Sat." : "Lör.", + "Su" : "Sö", + "Mo" : "Må", + "Tu" : "Ti", + "We" : "On", + "Th" : "To", + "Fr" : "Fr", + "Sa" : "Lö", + "January" : "Januari", + "February" : "Februari", + "March" : "Mars", + "April" : "April", + "May" : "Maj", + "June" : "Juni", + "July" : "Juli", + "August" : "Augusti", + "September" : "September", + "October" : "Oktober", + "November" : "November", + "December" : "December", + "Jan." : "Jan.", + "Feb." : "Feb.", + "Mar." : "Mar.", + "Apr." : "Apr.", + "May." : "Maj.", + "Jun." : "Jun.", + "Jul." : "Jul.", + "Aug." : "Aug.", + "Sep." : "Sep.", + "Oct." : "Okt.", + "Nov." : "Nov.", + "Dec." : "Dec.", + "Apps" : "Applikationer", + "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Endast följande tecken är tillåtna i användarnamnet: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"", + "A valid username must be provided" : "Ett giltigt användarnamn måste anges", + "Username contains whitespace at the beginning or at the end" : "Användarnamnet består av ett mellanslag i början eller i slutet", + "A valid password must be provided" : "Ett giltigt lösenord måste anges", + "The username is already being used" : "Användarnamnet används redan", + "Login canceled by app" : "Inloggningen avbruten av appen", + "User disabled" : "Användare inaktiverad", + "Help" : "Hjälp", + "Personal" : "Personliga Inställningar", + "Users" : "Användare", + "Admin" : "Administration", + "App \"%s\" cannot be installed because appinfo file cannot be read." : "Applikationen \"%s\" kan ej installeras eftersom informationen från appen ej kunde läsas.", + "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Applikationen \"%s\" kan ej installeras eftersom den inte är kompatibel med denna serverversion.", + "No app name specified" : "Inget appnamn angivet", + "App '%s' could not be installed!" : "Applikationen \"%s\" gick inte att installera!", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Applikationen \"%s\" kan ej installeras eftersom följande kriterier inte är uppfyllda: %s", + "a safe home for all your data" : "En säker plats för dina filer och data", + "File is currently busy, please try again later" : "Filen är för tillfället upptagen, vänligen försök igen senare", + "Can't read file" : "Kan ej läsa filen", + "Application is not enabled" : "Applikationen är inte aktiverad", + "Authentication error" : "Fel vid autentisering", + "Token expired. Please reload page." : "Ogiltig token. Ladda om sidan.", + "Unknown user" : "Okänd användare", + "No database drivers (sqlite, mysql, or postgresql) installed." : "Inga databasdrivrutiner (sqlite, mysql, eller postgresql) installerade.", + "Cannot write into \"config\" directory" : "Kan inte skriva till \"config\" katalogen", + "Cannot write into \"apps\" directory" : "Kan inte skriva till \"apps\" katalogen!", + "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Detta kan vanligtvis åtgärdas genom att %s ger webbservern skrivrättigheter till applikationskatalogen %s eller stänga av app-butik i konfigurationsfilen.", + "Cannot create \"data\" directory (%s)" : "Kan inte skapa \"data\" katalog (%s)", + "This can usually be fixed by giving the webserver write access to the root directory." : "Detta kan vanligtvis åtgärdas genom att ge webbserver skrivåtkomst till rotkatalogen .", + "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Rättigheterna kan vanligtvis åtgärdas genom att %s ger webbservern skrivrättigheter till rootkatalogen %s.", + "Setting locale to %s failed" : "Sätta locale till %s misslyckades", + "Please install one of these locales on your system and restart your webserver." : "Vänligen installera en av dessa locale på din server och starta om dinn webbserver,", + "Please ask your server administrator to install the module." : "Vänligen be din administratör att installera modulen.", + "PHP module %s not installed." : "PHP modulen %s är inte installerad.", + "PHP setting \"%s\" is not set to \"%s\"." : "PHP inställning \"%s\" är inte inställd på \"%s\".", + "Adjusting this setting in php.ini will make Nextcloud run again" : "Att ändra denna inställning i php.ini kommer göra så att Nextcloud fungerar igen", + "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload är satt till \"%s\" istället för det förväntade värdet \"0\"", + "To fix this issue set mbstring.func_overload to 0 in your php.ini" : "För att åtgärda detta problem sätt värdet mbstring.func_overload till 0 i din php.ini", + "libxml2 2.7.0 is at least required. Currently %s is installed." : "libxml2 2.7.0 är det minsta som krävs. För närvarande är %s installerat.", + "To fix this issue update your libxml2 version and restart your web server." : "För att åtgärda detta problem uppdatera libxml2 versionen och starta om din webbserver.", + "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP är tydligen inställt för att tömma \"inline doc blocks\". Detta kommer att göra flera kärnprogram otillgängliga.", + "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Detta orsakas troligtvis av en cache/accelerator som t ex Zend OPchache eller eAccelerator.", + "PHP modules have been installed, but they are still listed as missing?" : "PHP-moduler har installerats, men de listas fortfarande som saknade?", + "Please ask your server administrator to restart the web server." : "Vänligen be din serveradministratör att starta om webservern.", + "PostgreSQL >= 9 required" : "PostgreSQL >= 9 krävs", + "Please upgrade your database version" : "Vänligen uppgradera din databas-version", + "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Vänligen ändra rättigheterna till 0770 så att katalogen inte kan listas utav andra användare.", + "Data directory (%s) is readable by other users" : "Datakatalogen (%s) kan läsas av andra användare", + "Data directory (%s) must be an absolute path" : "Datakatalogen (%s) måste vara hela sökvägen", + "Check the value of \"datadirectory\" in your configuration" : "Kontrollera värdet av \"datakatalog\" i din konfiguration", + "Data directory (%s) is invalid" : "Datakatlogen (%s) är ogiltig", + "Please check that the data directory contains a file \".ocdata\" in its root." : "Vänligen kontrollera att datakatalogen innehåller filen \".ocdata\" i rooten.", + "Could not obtain lock type %d on \"%s\"." : "Kunde inte hämta låstyp %d på \"%s\".", + "Storage unauthorized. %s" : "Lagringsutrymme ej tillåtet. %s", + "Storage incomplete configuration. %s" : "Lagringsutrymme felaktigt inställt. %s", + "Storage connection error. %s" : "Lagringsutrymme lyckas inte ansluta. %s", + "Storage is temporarily not available" : "Lagringsutrymme är för tillfället inte tillgängligt", + "Storage connection timeout. %s" : "Lagringsutrymme lyckas inte ansluta \"timeout\". %s", + "4-byte characters are not supported in file names" : "4-bitars tecken är inte tillåtet i filnamn", + "App directory already exists" : "Appens mapp finns redan", + "Can't create app folder. Please fix permissions. %s" : "Kan inte skapa appens mapp. Var god åtgärda rättigheterna. %s", + "Archive does not contain a directory named %s" : "Arkivet innehåller inte en mapp vid namn %s", + "No source specified when installing app" : "Ingen källa angiven vid installation av app ", + "No href specified when installing app from http" : "Ingen href angiven vid installation av app från http", + "No path specified when installing app from local file" : "Ingen sökväg angiven vid installation av app från lokal fil", + "Archives of type %s are not supported" : "Arkiv av typen %s stöds ej", + "Failed to open archive when installing app" : "Kunde inte öppna arkivet när appen skulle installeras", + "App does not provide an info.xml file" : "Appen har ingen info.xml fil", + "App cannot be installed because appinfo file cannot be read." : "Appen kan inte installeras eftersom app-informationen inte kan läsas i filen.", + "Signature could not get checked. Please contact the app developer and check your admin screen." : "Signaturen kunde inte kontrolleras. Vänligen kontakta appens utvecklare och kontrollera administratörsinställningarna.", + "App can't be installed because of not allowed code in the App" : "Appen kan inte installeras eftersom att den innehåller otillåten kod", + "App can't be installed because it is not compatible with this version of the server" : "Appen kan inte installeras eftersom den inte är förenlig med den här versionen av servern", + "App can't be installed because it contains the true tag which is not allowed for non shipped apps" : "Appen kan inte installeras eftersom att den innehåller etiketten true vilket inte är tillåtet för icke inkluderade appar", + "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Appen kan inte installeras eftersom det är fel version på info.xml och stämmer inte överens med versionen från \"App Store\"", + "Logging" : "Loggning", + "Recommended" : "Rekomenderad", + "Microsoft Windows Platform is not supported" : "Microsoft Windows-plattformen stöds inte", + "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Att köra en Nextcloud-Server på Microsoft Windows-plattformen stöds inte. Vi föreslår att du använder en Linux-server i en virtuell maskin om du inte har möjlighet att migrera själva servern.", + "Storage not available" : "Lagringsutrymme ej tillgängligt" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/sv.json b/lib/l10n/sv.json new file mode 100644 index 0000000000000000000000000000000000000000..ac8d56e125f6531159d804bc14892907d9525572 --- /dev/null +++ b/lib/l10n/sv.json @@ -0,0 +1,231 @@ +{ "translations": { + "Cannot write into \"config\" directory!" : "Kan inte skriva till \"config\" katalogen!", + "This can usually be fixed by giving the webserver write access to the config directory" : "Detta kan vanligtvis åtgärdas genom att ge skrivrättigheter till config katalgogen", + "See %s" : "Se %s", + "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Detta kan vanligtvis åtgärdas genom att %s ger webbservern skrivrättigheter till konfigurations-katalogen %s.", + "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Filerna i appen %$1s ersattes inte korrekt. Se till att det är en version som är kompatibel med servern.", + "Sample configuration detected" : "Exempel-konfiguration detekterad", + "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Det har detekterats att exempel-konfigurationen har kopierats. Detta kan förstöra din installation och stöds ej. Vänligen läs dokumentationen innan ändringar på config.php utförs", + "%1$s and %2$s" : "%1$s och %2$s", + "%1$s, %2$s and %3$s" : "%1$s, %2$s och %3$s", + "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s och %4$s", + "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s och %5$s", + "PHP %s or higher is required." : "PHP %s eller högre krävs.", + "PHP with a version lower than %s is required." : "PHP med version lägre än %s krävs.", + "%sbit or higher PHP required." : "%sbit eller nyare PHP-version krävs.", + "Following databases are supported: %s" : "Följande databastyper stödjs: %s", + "The command line tool %s could not be found" : "Kommandoradsverktyget %s hittades inte.", + "The library %s is not available." : "Biblioteket %s är inte tillgängligt.", + "Library %s with a version higher than %s is required - available version %s." : "Bibliotek %s med version högre än %s krävs - tillgänglig version %s.", + "Library %s with a version lower than %s is required - available version %s." : "Bibliotek %s med version lägre än %s krävs - tillgänglig version %s.", + "Following platforms are supported: %s" : "Följande plattformar stödjs: %s", + "Server version %s or higher is required." : "Serverversion %s eller nyare krävs.", + "Server version %s or lower is required." : "Serverversion %s eller äldre krävs.", + "Unknown filetype" : "Okänd filtyp", + "Invalid image" : "Ogiltig bild", + "Avatar image is not square" : "Profilbilden är inte fyrkantig/kvadrat", + "today" : "i dag", + "yesterday" : "i går", + "_%n day ago_::_%n days ago_" : ["%n dag sedan","%n dagar sedan"], + "last month" : "förra månaden", + "_%n month ago_::_%n months ago_" : ["%n månad sedan","%n månader sedan"], + "last year" : "förra året", + "_%n year ago_::_%n years ago_" : ["%n år sedan","%n år sedan"], + "_%n hour ago_::_%n hours ago_" : ["%n timme sedan","%n timmar sedan"], + "_%n minute ago_::_%n minutes ago_" : ["%n minut sedan","%n minuter sedan"], + "seconds ago" : "sekunder sedan", + "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Modulen med id: %s finns inte. Vänligen aktivera det i dina app-inställningar eller kontakta din administratör.", + "File name is a reserved word" : "Filnamnet är ett reserverat ord", + "File name contains at least one invalid character" : "Filnamnet innehåller minst ett ogiltigt tecken", + "File name is too long" : "Filnamnet är för långt", + "Dot files are not allowed" : "Dot filer är inte tillåtna", + "Empty filename is not allowed" : "Tomma filnamn är inte tillåtna", + "APCu" : "APCu", + "Redis" : "Redis", + "Server settings" : "Serverinställningar", + "Sharing" : "Delning", + "Encryption" : "Kryptering", + "Additional settings" : "Övriga inställningar", + "Tips & tricks" : "Knep & Trick", + "%s enter the database username and name." : "%s ange användarnamn och namn för databasen.", + "%s enter the database username." : "%s ange databasanvändare.", + "%s enter the database name." : "%s ange databasnamn", + "%s you may not use dots in the database name" : "%s du får inte använda punkter i databasnamnet", + "Oracle connection could not be established" : "Oracle-anslutning kunde inte etableras", + "Oracle username and/or password not valid" : "Oracle-användarnamnet och/eller lösenordet är felaktigt", + "DB Error: \"%s\"" : "DB fel: \"%s\"", + "Offending command was: \"%s\"" : "Det felaktiga kommandot var: \"%s\"", + "You need to enter either an existing account or the administrator." : "Du måste antingen ange ett befintligt konto eller administratör.", + "Offending command was: \"%s\", name: %s, password: %s" : "Det felande kommandot var: \"%s\", name: %s, password: %s", + "PostgreSQL username and/or password not valid" : "PostgreSQL-användarnamnet och/eller lösenordet är felaktigt", + "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X stöds inte och %s kommer inte att fungera korrekt på denna plattform. Använd på egen risk!", + "For the best results, please consider using a GNU/Linux server instead." : "För bästa resultat, överväg att använda en GNU/Linux server istället.", + "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Det verkar som om denna %s instans körs på en 32-bitars PHP miljö och open_basedir har konfigurerats i php.ini. Detta kommer att leda till problem med filer över 4 GB och är verkligen inte rekommenderat!", + "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Ta bort open_basedir i din php.ini eller byt till 64-bitars PHP.", + "Set an admin username." : "Ange ett användarnamn för administratören.", + "Set an admin password." : "Ange ett administratörslösenord.", + "Can't create or write into the data directory %s" : "Kan inte skapa eller skriva till data-katalogen %s", + "Invalid Federated Cloud ID" : "Ogiltigt Federarat Moln-ID", + "%s shared »%s« with you" : "%s delade »%s« med dig", + "%s via %s" : "%s via %s", + "Sharing %s failed, because the backend does not allow shares from type %i" : "Misslyckades dela ut %s då backend inte tillåter delningar från typ %i", + "Sharing %s failed, because the file does not exist" : "Delning av %s misslyckades på grund av att filen inte existerar", + "You are not allowed to share %s" : "Du har inte rätt att dela %s", + "Sharing %s failed, because you can not share with yourself" : "Delning %s misslyckades därför att du inte kan dela med dig själv.", + "Sharing %s failed, because the user %s does not exist" : "Delning %s misslyckades därför att användaren %s inte existerar", + "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Delning %s misslyckades därför att användaren %s inte är medlem i någon utav de grupper som %s är medlem i", + "Sharing %s failed, because this item is already shared with %s" : "Delning %s misslyckades därför att objektet redan är delat med %s", + "Sharing %s failed, because this item is already shared with user %s" : "Delning %s misslyckades därför att detta redan är delat med användaren %s", + "Sharing %s failed, because the group %s does not exist" : "Delning %s misslyckades därför att gruppen %s inte existerar", + "Sharing %s failed, because %s is not a member of the group %s" : "Delning %s misslyckades därför att %s inte ingår i gruppen %s", + "You need to provide a password to create a public link, only protected links are allowed" : "Du måste ange ett lösenord för att skapa en offentlig länk, endast skyddade länkar är tillåtna", + "Sharing %s failed, because sharing with links is not allowed" : "Delning %s misslyckades därför att delning utav länkar inte är tillåtet", + "Not allowed to create a federated share with the same user" : "Ej tillåtet att skapa en förbundsdelning med samma användare", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Misslyckades dela ut %s, kan inte hitta %s, kanske är servern inte åtkomlig för närvarande.", + "Share type %s is not valid for %s" : "Delningstyp %s är inte giltig för %s", + "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Misslyckades att sätta rättigheter för %s därför att rättigheterna överskrider de som är tillåtna för %s", + "Setting permissions for %s failed, because the item was not found" : "Att sätta rättigheterna för %s misslyckades därför att objektet inte hittades", + "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Kan inte sätta utgångsdatum. Utdelningar kan inte utgå senare än %s efter de har delats ut", + "Cannot set expiration date. Expiration date is in the past" : "Kan inte sätta utgångsdatum. Utgångsdatumet är i det förflutna.", + "Cannot clear expiration date. Shares are required to have an expiration date." : "Kan ej ta bort utgångsdatumet. Delningen kräver att det finns ett utgångsdatum.", + "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Delningsgränssnittet %s måste implementera gränssnittet OCP\\Share_Backend", + "Sharing backend %s not found" : "Delningsgränssnittet %s hittades inte", + "Sharing backend for %s not found" : "Delningsgränssnittet för %s hittades inte", + "Sharing failed, because the user %s is the original sharer" : "Delning misslyckades eftersom användaren %s redan är den som har delat detta.", + "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Delning %s misslyckades därför att rättigheterna överskrider de rättigheter som är tillåtna för %s", + "Sharing %s failed, because resharing is not allowed" : "Delning %s misslyckades därför att vidaredelning inte är tillåten", + "Sharing %s failed, because the sharing backend for %s could not find its source" : "Delning %s misslyckades därför att delningsgränsnittet för %s inte kunde hitta sin källa", + "Sharing %s failed, because the file could not be found in the file cache" : "Delning %s misslyckades därför att filen inte kunde hittas i filcachen", + "Cannot increase permissions of %s" : "Kan ej öka behörigheterna för %s", + "Files can't be shared with delete permissions" : "Filerna kan ej delas med \"radera behörigheter\"", + "Files can't be shared with create permissions" : "Filerna kan ej delas med \"skapa behörigheter\"", + "Expiration date is in the past" : "Utgångsdatum är i det förflutna", + "Cannot set expiration date more than %s days in the future" : "Kan ej välja ett utgångsdatum längre fram än %s dagar", + "Could not find category \"%s\"" : "Kunde inte hitta kategorin \"%s\"", + "Sunday" : "Söndag", + "Monday" : "Måndag", + "Tuesday" : "Tisdag", + "Wednesday" : "Onsdag", + "Thursday" : "Torsdag", + "Friday" : "Fredag", + "Saturday" : "Lördag", + "Sun." : "Sön.", + "Mon." : "Mån.", + "Tue." : "Tis.", + "Wed." : "Ons.", + "Thu." : "Tors.", + "Fri." : "Fre.", + "Sat." : "Lör.", + "Su" : "Sö", + "Mo" : "Må", + "Tu" : "Ti", + "We" : "On", + "Th" : "To", + "Fr" : "Fr", + "Sa" : "Lö", + "January" : "Januari", + "February" : "Februari", + "March" : "Mars", + "April" : "April", + "May" : "Maj", + "June" : "Juni", + "July" : "Juli", + "August" : "Augusti", + "September" : "September", + "October" : "Oktober", + "November" : "November", + "December" : "December", + "Jan." : "Jan.", + "Feb." : "Feb.", + "Mar." : "Mar.", + "Apr." : "Apr.", + "May." : "Maj.", + "Jun." : "Jun.", + "Jul." : "Jul.", + "Aug." : "Aug.", + "Sep." : "Sep.", + "Oct." : "Okt.", + "Nov." : "Nov.", + "Dec." : "Dec.", + "Apps" : "Applikationer", + "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Endast följande tecken är tillåtna i användarnamnet: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"", + "A valid username must be provided" : "Ett giltigt användarnamn måste anges", + "Username contains whitespace at the beginning or at the end" : "Användarnamnet består av ett mellanslag i början eller i slutet", + "A valid password must be provided" : "Ett giltigt lösenord måste anges", + "The username is already being used" : "Användarnamnet används redan", + "Login canceled by app" : "Inloggningen avbruten av appen", + "User disabled" : "Användare inaktiverad", + "Help" : "Hjälp", + "Personal" : "Personliga Inställningar", + "Users" : "Användare", + "Admin" : "Administration", + "App \"%s\" cannot be installed because appinfo file cannot be read." : "Applikationen \"%s\" kan ej installeras eftersom informationen från appen ej kunde läsas.", + "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Applikationen \"%s\" kan ej installeras eftersom den inte är kompatibel med denna serverversion.", + "No app name specified" : "Inget appnamn angivet", + "App '%s' could not be installed!" : "Applikationen \"%s\" gick inte att installera!", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Applikationen \"%s\" kan ej installeras eftersom följande kriterier inte är uppfyllda: %s", + "a safe home for all your data" : "En säker plats för dina filer och data", + "File is currently busy, please try again later" : "Filen är för tillfället upptagen, vänligen försök igen senare", + "Can't read file" : "Kan ej läsa filen", + "Application is not enabled" : "Applikationen är inte aktiverad", + "Authentication error" : "Fel vid autentisering", + "Token expired. Please reload page." : "Ogiltig token. Ladda om sidan.", + "Unknown user" : "Okänd användare", + "No database drivers (sqlite, mysql, or postgresql) installed." : "Inga databasdrivrutiner (sqlite, mysql, eller postgresql) installerade.", + "Cannot write into \"config\" directory" : "Kan inte skriva till \"config\" katalogen", + "Cannot write into \"apps\" directory" : "Kan inte skriva till \"apps\" katalogen!", + "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Detta kan vanligtvis åtgärdas genom att %s ger webbservern skrivrättigheter till applikationskatalogen %s eller stänga av app-butik i konfigurationsfilen.", + "Cannot create \"data\" directory (%s)" : "Kan inte skapa \"data\" katalog (%s)", + "This can usually be fixed by giving the webserver write access to the root directory." : "Detta kan vanligtvis åtgärdas genom att ge webbserver skrivåtkomst till rotkatalogen .", + "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Rättigheterna kan vanligtvis åtgärdas genom att %s ger webbservern skrivrättigheter till rootkatalogen %s.", + "Setting locale to %s failed" : "Sätta locale till %s misslyckades", + "Please install one of these locales on your system and restart your webserver." : "Vänligen installera en av dessa locale på din server och starta om dinn webbserver,", + "Please ask your server administrator to install the module." : "Vänligen be din administratör att installera modulen.", + "PHP module %s not installed." : "PHP modulen %s är inte installerad.", + "PHP setting \"%s\" is not set to \"%s\"." : "PHP inställning \"%s\" är inte inställd på \"%s\".", + "Adjusting this setting in php.ini will make Nextcloud run again" : "Att ändra denna inställning i php.ini kommer göra så att Nextcloud fungerar igen", + "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload är satt till \"%s\" istället för det förväntade värdet \"0\"", + "To fix this issue set mbstring.func_overload to 0 in your php.ini" : "För att åtgärda detta problem sätt värdet mbstring.func_overload till 0 i din php.ini", + "libxml2 2.7.0 is at least required. Currently %s is installed." : "libxml2 2.7.0 är det minsta som krävs. För närvarande är %s installerat.", + "To fix this issue update your libxml2 version and restart your web server." : "För att åtgärda detta problem uppdatera libxml2 versionen och starta om din webbserver.", + "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP är tydligen inställt för att tömma \"inline doc blocks\". Detta kommer att göra flera kärnprogram otillgängliga.", + "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Detta orsakas troligtvis av en cache/accelerator som t ex Zend OPchache eller eAccelerator.", + "PHP modules have been installed, but they are still listed as missing?" : "PHP-moduler har installerats, men de listas fortfarande som saknade?", + "Please ask your server administrator to restart the web server." : "Vänligen be din serveradministratör att starta om webservern.", + "PostgreSQL >= 9 required" : "PostgreSQL >= 9 krävs", + "Please upgrade your database version" : "Vänligen uppgradera din databas-version", + "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Vänligen ändra rättigheterna till 0770 så att katalogen inte kan listas utav andra användare.", + "Data directory (%s) is readable by other users" : "Datakatalogen (%s) kan läsas av andra användare", + "Data directory (%s) must be an absolute path" : "Datakatalogen (%s) måste vara hela sökvägen", + "Check the value of \"datadirectory\" in your configuration" : "Kontrollera värdet av \"datakatalog\" i din konfiguration", + "Data directory (%s) is invalid" : "Datakatlogen (%s) är ogiltig", + "Please check that the data directory contains a file \".ocdata\" in its root." : "Vänligen kontrollera att datakatalogen innehåller filen \".ocdata\" i rooten.", + "Could not obtain lock type %d on \"%s\"." : "Kunde inte hämta låstyp %d på \"%s\".", + "Storage unauthorized. %s" : "Lagringsutrymme ej tillåtet. %s", + "Storage incomplete configuration. %s" : "Lagringsutrymme felaktigt inställt. %s", + "Storage connection error. %s" : "Lagringsutrymme lyckas inte ansluta. %s", + "Storage is temporarily not available" : "Lagringsutrymme är för tillfället inte tillgängligt", + "Storage connection timeout. %s" : "Lagringsutrymme lyckas inte ansluta \"timeout\". %s", + "4-byte characters are not supported in file names" : "4-bitars tecken är inte tillåtet i filnamn", + "App directory already exists" : "Appens mapp finns redan", + "Can't create app folder. Please fix permissions. %s" : "Kan inte skapa appens mapp. Var god åtgärda rättigheterna. %s", + "Archive does not contain a directory named %s" : "Arkivet innehåller inte en mapp vid namn %s", + "No source specified when installing app" : "Ingen källa angiven vid installation av app ", + "No href specified when installing app from http" : "Ingen href angiven vid installation av app från http", + "No path specified when installing app from local file" : "Ingen sökväg angiven vid installation av app från lokal fil", + "Archives of type %s are not supported" : "Arkiv av typen %s stöds ej", + "Failed to open archive when installing app" : "Kunde inte öppna arkivet när appen skulle installeras", + "App does not provide an info.xml file" : "Appen har ingen info.xml fil", + "App cannot be installed because appinfo file cannot be read." : "Appen kan inte installeras eftersom app-informationen inte kan läsas i filen.", + "Signature could not get checked. Please contact the app developer and check your admin screen." : "Signaturen kunde inte kontrolleras. Vänligen kontakta appens utvecklare och kontrollera administratörsinställningarna.", + "App can't be installed because of not allowed code in the App" : "Appen kan inte installeras eftersom att den innehåller otillåten kod", + "App can't be installed because it is not compatible with this version of the server" : "Appen kan inte installeras eftersom den inte är förenlig med den här versionen av servern", + "App can't be installed because it contains the true tag which is not allowed for non shipped apps" : "Appen kan inte installeras eftersom att den innehåller etiketten true vilket inte är tillåtet för icke inkluderade appar", + "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Appen kan inte installeras eftersom det är fel version på info.xml och stämmer inte överens med versionen från \"App Store\"", + "Logging" : "Loggning", + "Recommended" : "Rekomenderad", + "Microsoft Windows Platform is not supported" : "Microsoft Windows-plattformen stöds inte", + "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Att köra en Nextcloud-Server på Microsoft Windows-plattformen stöds inte. Vi föreslår att du använder en Linux-server i en virtuell maskin om du inte har möjlighet att migrera själva servern.", + "Storage not available" : "Lagringsutrymme ej tillgängligt" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +} \ No newline at end of file diff --git a/lib/l10n/zh_CN.js b/lib/l10n/zh_CN.js new file mode 100644 index 0000000000000000000000000000000000000000..e2c683b68bb3f21879d7887f145dfa10634b7c8c --- /dev/null +++ b/lib/l10n/zh_CN.js @@ -0,0 +1,233 @@ +OC.L10N.register( + "lib", + { + "Cannot write into \"config\" directory!" : "无法写入 \"config\" 目录!", + "This can usually be fixed by giving the webserver write access to the config directory" : "您可以设置 Web 服务器对 config 目录的写权限修复这个问题", + "See %s" : "查看 %s", + "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "您可以由 %s 设置 Web 服务器对 config 目录 %s 的写权限修复这个问题", + "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "应用 %$1s 的文件替换不正确. 请确认版本与当前服务器兼容.", + "Sample configuration detected" : "示例配置检测", + "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "您似乎直接把 config.php 的样例文件直接复制使用. 这可能会破坏您的安装. 在对 config.php 进行修改之前请先阅读相关文档.", + "%1$s and %2$s" : "%1$s 和 %2$s", + "%1$s, %2$s and %3$s" : "%1$s, %2$s 和 %3$s", + "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s 和 %4$s", + "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s 和 %5$s", + "PHP %s or higher is required." : "要求 PHP 版本 %s 或者更高。", + "PHP with a version lower than %s is required." : "需要版本低于 %s 的PHP.", + "%sbit or higher PHP required." : "需要 %s 或更高版本的 PHP", + "Following databases are supported: %s" : "支持以下数据库: %s", + "The command line tool %s could not be found" : "命令行工具 %s 未找到", + "The library %s is not available." : "库文件 %s 不可用", + "Library %s with a version higher than %s is required - available version %s." : "%s 需要 %s 或更高的版本 - 可用版本 %s.", + "Library %s with a version lower than %s is required - available version %s." : "%s 需要 %s 或更低的版本 - 可用版本 %s.", + "Following platforms are supported: %s" : "支持以下平台:%s", + "Server version %s or higher is required." : "需要服务器版本 %s 或更高版本。", + "Server version %s or lower is required." : "需要服务器版本 %s 或更低版本。", + "Unknown filetype" : "未知的文件类型", + "Invalid image" : "无效的图像", + "Avatar image is not square" : "头像图像不是正方形", + "today" : "今天", + "yesterday" : "昨天", + "_%n day ago_::_%n days ago_" : ["%n 天前"], + "last month" : "上月", + "_%n month ago_::_%n months ago_" : ["%n 月前"], + "last year" : "去年", + "_%n year ago_::_%n years ago_" : ["%n 年前"], + "_%n hour ago_::_%n hours ago_" : ["%n 小时前"], + "_%n minute ago_::_%n minutes ago_" : ["%n 分钟前"], + "seconds ago" : "秒前", + "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "ID 为 %s 的模块不存在. 请在应用设置中启用或联系您的管理员.", + "File name is a reserved word" : "文件名包含敏感字符", + "File name contains at least one invalid character" : "文件名中存在至少一个非法字符", + "File name is too long" : "文件名过长", + "Dot files are not allowed" : ".文件 不被允许", + "Empty filename is not allowed" : "不允许使用空名称。", + "APCu" : "APCu", + "Redis" : "Redis", + "Server settings" : "服务器设置", + "Sharing" : "分享", + "Encryption" : "加密", + "Additional settings" : "其他设置", + "Tips & tricks" : "小提示", + "%s enter the database username and name." : "%s 输入数据库用户名和名称.", + "%s enter the database username." : "%s 输入数据库用户名。", + "%s enter the database name." : "%s 输入数据库名称。", + "%s you may not use dots in the database name" : "%s 您不能在数据库名称中使用英文句号。", + "Oracle connection could not be established" : "不能建立甲骨文连接", + "Oracle username and/or password not valid" : "Oracle 数据库用户名和/或密码无效", + "DB Error: \"%s\"" : "数据库错误:\"%s\"", + "Offending command was: \"%s\"" : "冲突命令为:\"%s\"", + "You need to enter either an existing account or the administrator." : "你需要输入一个数据库中已有的账户或管理员账户。", + "Offending command was: \"%s\", name: %s, password: %s" : "冲突命令为:\"%s\",名称:%s,密码:%s", + "PostgreSQL username and/or password not valid" : "PostgreSQL 数据库用户名和/或密码无效", + "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X 不被支持并且 %s 在这个平台上无法正常工作。请自行承担风险!", + "For the best results, please consider using a GNU/Linux server instead." : "为了达到最好的效果,请考虑使用 GNU/Linux 服务器。", + "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "看起来这个 %s 实例运行在32位PHP环境中并且已在php.ini中配置open_basedir。这将在文件超过4GB时出现问题,我们极力反对这样做。", + "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "请删除php.ini中的open_basedir设置或切换到64位PHP。", + "Set an admin username." : "请设置一个管理员用户名。", + "Set an admin password." : "请设置一个管理员密码。", + "Can't create or write into the data directory %s" : "无法创建或写入数据目录 %s", + "Invalid Federated Cloud ID" : "无效的联合云ID", + "%s shared »%s« with you" : "%s 向您分享了 »%s«", + "%s via %s" : "%s 通过 %s", + "Sharing %s failed, because the backend does not allow shares from type %i" : "分享 %s 失败, 因为后端不允许分享 %i 类型", + "Sharing %s failed, because the file does not exist" : "分享 %s 失败, 因为文件不存在.", + "You are not allowed to share %s" : "您无权分享 %s", + "Sharing %s failed, because you can not share with yourself" : "分享 %s 失败, 因为您不能分享给自己", + "Sharing %s failed, because the user %s does not exist" : "分享 %s 失败, 因为用户 %s 不存在", + "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "分享 %s 失败, 因为用户 %s 不是 %s 所属的任何组的用户", + "Sharing %s failed, because this item is already shared with %s" : "分享 %s 失败, 因为该项已经分享给用户 %s", + "Sharing %s failed, because this item is already shared with user %s" : "分享 %s 失败, 因为该项已经分享给用户 %s", + "Sharing %s failed, because the group %s does not exist" : "分享 %s 失败, 因为 %s 分组不存在", + "Sharing %s failed, because %s is not a member of the group %s" : "分享 %s 失败, 因为 %s 不是 %s 分组的成员", + "You need to provide a password to create a public link, only protected links are allowed" : "链接分享需要密码, 您需要提供一个密码以创建公开连接", + "Sharing %s failed, because sharing with links is not allowed" : "分享 %s 失败, 因为不允许使用链接分享", + "Not allowed to create a federated share with the same user" : "不能给你自己分享文件", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "分享 %s 失败, 无法找到 %s, 该服务当前无法连接.", + "Share type %s is not valid for %s" : "%s 不是 %s 的合法共享类型", + "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "设置 %s 权限失败,因为权限超出了 %s 已有权限。", + "Setting permissions for %s failed, because the item was not found" : "设置 %s 的权限失败,因为未找到到对应项", + "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "无法设置过期时间. 过期时间不能晚于其分享时间 %s", + "Cannot set expiration date. Expiration date is in the past" : "无法设置过期时间. 过期时间不能为过去", + "Cannot clear expiration date. Shares are required to have an expiration date." : "无法清除过期时间. 每个分享必须有一个过期时间", + "Sharing backend %s must implement the interface OCP\\Share_Backend" : "分享后端 %s 必须实现 OCP\\Share_Backend 接口", + "Sharing backend %s not found" : "%s 的分享后端未找到", + "Sharing backend for %s not found" : "%s 的分享后端未找到", + "Sharing failed, because the user %s is the original sharer" : "分享失败, 因为用户 %s 是原始的分享者.", + "Sharing %s failed, because the permissions exceed permissions granted to %s" : "分享 %s 失败, 因为权限超过了 %s 的已有权限", + "Sharing %s failed, because resharing is not allowed" : "分享 %s 失败, 因为不允许二次共享", + "Sharing %s failed, because the sharing backend for %s could not find its source" : "分享 %s 失败, 因为无法找到 %s 分享后端的来源", + "Sharing %s failed, because the file could not be found in the file cache" : "分享 %s 失败, 因为文件缓存中找不到该文件", + "Cannot increase permissions of %s" : "无法提升 %s 的权限", + "Files can't be shared with delete permissions" : "无法分享有删除权限的文件", + "Files can't be shared with create permissions" : "无法分享有创建权限的文件", + "Expiration date is in the past" : "到期日期已过.", + "Cannot set expiration date more than %s days in the future" : "无法将过期日期设置为超过 %s 天.", + "Could not find category \"%s\"" : "无法找到分类 \"%s\"", + "Sunday" : "星期日", + "Monday" : "星期一", + "Tuesday" : "星期二", + "Wednesday" : "星期三", + "Thursday" : "星期四", + "Friday" : "星期五", + "Saturday" : "星期六", + "Sun." : "周日", + "Mon." : "周一", + "Tue." : "周二", + "Wed." : "周三", + "Thu." : "周四", + "Fri." : "周五", + "Sat." : "周六", + "Su" : "日", + "Mo" : "一", + "Tu" : "二", + "We" : "三", + "Th" : "四", + "Fr" : "五", + "Sa" : "六", + "January" : "一月", + "February" : "二月", + "March" : "三月", + "April" : "四月", + "May" : "五月", + "June" : "六月", + "July" : "七月", + "August" : "八月", + "September" : "九月", + "October" : "十月", + "November" : "十一月", + "December" : "十二月", + "Jan." : "一月", + "Feb." : "二月", + "Mar." : "三月", + "Apr." : "四月", + "May." : "五月", + "Jun." : "六月", + "Jul." : "七月", + "Aug." : "八月", + "Sep." : "九月", + "Oct." : "十月", + "Nov." : "十一月", + "Dec." : "十二月", + "Apps" : "应用", + "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "在用户名中只允许使用以下字符:“a-z”,“A-Z”,“0-9”和\"_.@-'\"", + "A valid username must be provided" : "必须提供合法的用户名", + "Username contains whitespace at the beginning or at the end" : "用户名在开头或结尾处包含空格", + "A valid password must be provided" : "必须提供合法的密码", + "The username is already being used" : "用户名已被使用", + "Login canceled by app" : "已通过应用取消登录", + "User disabled" : "用户已禁用", + "Help" : "帮助", + "Personal" : "个人", + "Users" : "用户", + "Admin" : "管理", + "App \"%s\" cannot be installed because appinfo file cannot be read." : "无法安装应用\"%s\",因为无法读取appinfo文件.", + "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "应用程式 \"%s\" 无法安装,因为它与这个版本的服务器不兼容.", + "No app name specified" : "没有指定的 App 名称", + "App '%s' could not be installed!" : "应用程序 '%s' 无法被安装!", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "应用程序 \"%s\" 无法被安装,因为为满足下列依赖关系: %s", + "a safe home for all your data" : "给您所有的数据一个安全的家", + "File is currently busy, please try again later" : "文件当前正忙,请稍后再试", + "Can't read file" : "无法读取文件", + "Application is not enabled" : "应用程序未启用", + "Authentication error" : "认证出错", + "Token expired. Please reload page." : "Token 过期,请刷新页面。", + "Unknown user" : "未知用户", + "No database drivers (sqlite, mysql, or postgresql) installed." : "没有安装数据库驱动 (SQLite、MySQL 或 PostgreSQL)。", + "Cannot write into \"config\" directory" : "无法写入“config”目录", + "Cannot write into \"apps\" directory" : "无法写入“apps”目录", + "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "您可以由 %s 设置 Web 服务器对应用目录 %s 的写权限或在配置文件中禁用应用商店可以修复这个问题.", + "Cannot create \"data\" directory (%s)" : "无法创建“apps”目录 (%s)", + "This can usually be fixed by giving the webserver write access to the root directory." : "点击 设置 Web 服务器对根目录的写入权限 可修复这个问题.", + "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "您可以由 %s 设置 Web 服务器对根目录 %s 的写权限可以修复这个问题.", + "Setting locale to %s failed" : "设置语言为 %s 失败", + "Please install one of these locales on your system and restart your webserver." : "请在您的系统中安装下述一种语言并重启 Web 服务器.", + "Please ask your server administrator to install the module." : "请联系服务器管理员安装模块.", + "PHP module %s not installed." : "PHP %s 模块未安装.", + "PHP setting \"%s\" is not set to \"%s\"." : "PHP 选项 \"%s\" 未设置为 \"%s\".", + "Adjusting this setting in php.ini will make Nextcloud run again" : "在 php.ini 中调整该设置将导致 Nextcloud 重新运行", + "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload 当前设置为 \"%s\", 预期值为 \"0\"", + "To fix this issue set mbstring.func_overload to 0 in your php.ini" : "请在 php.ini 中设置 mbstring.func_overload0 以解决该问题", + "libxml2 2.7.0 is at least required. Currently %s is installed." : "至少需要 libxml2 2.7.0. 当前安装 %s.", + "To fix this issue update your libxml2 version and restart your web server." : "升级您的 libxml2 版本然后重启 Web 服务器以解决该问题.", + "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP 被设置为移除内联块, 这将导致多个核心应用无法访问.", + "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "这可能由缓存/加速器导致的, 例如 Zend OPcache 或 eAccelerator.", + "PHP modules have been installed, but they are still listed as missing?" : "PHP 模块已经安装, 但仍然显示未安装?", + "Please ask your server administrator to restart the web server." : "请联系服务器管理员重启 Web 服务器.", + "PostgreSQL >= 9 required" : "要求 PostgreSQL >= 9", + "Please upgrade your database version" : "请升级您的数据库版本", + "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "请更改权限为 0770 以避免其他用户查看目录.", + "Data directory (%s) is readable by other users" : "数据目录 (%s) 能被其他用户读取", + "Data directory (%s) must be an absolute path" : "数据目录 (%s) 必须为绝对路径", + "Check the value of \"datadirectory\" in your configuration" : "请检查配置文件中 \"datadirectory\" 的值", + "Data directory (%s) is invalid" : "数据目录 (%s) 无效", + "Please check that the data directory contains a file \".ocdata\" in its root." : "请检查根目录下 data 目录中包含名为 \".ocdata\" 的文件.", + "Could not obtain lock type %d on \"%s\"." : "无法在 \"%s\" 上获取锁类型 %d.", + "Storage unauthorized. %s" : "存储认证失败. %s", + "Storage incomplete configuration. %s" : "存储未完成配置. %s", + "Storage connection error. %s" : "存储连接错误. %s", + "Storage is temporarily not available" : "存储暂时不可用", + "Storage connection timeout. %s" : "存储连接超时. %s", + "4-byte characters are not supported in file names" : "文件名中不支持 4 字节字符", + "App directory already exists" : "应用目录已经存在", + "Can't create app folder. Please fix permissions. %s" : "无法创建应用文件夹. 请修改权限. %s", + "Archive does not contain a directory named %s" : "压缩文件中不包含目录 %s", + "No source specified when installing app" : "安装应用时未指定来源", + "No href specified when installing app from http" : "从 http 安装应用时未指定链接", + "No path specified when installing app from local file" : "从本地文件安装应用时未指定路径", + "Archives of type %s are not supported" : "不支持 %s 的压缩格式", + "Failed to open archive when installing app" : "安装应用时打开文件失败", + "App does not provide an info.xml file" : "应用未提供 info.xml 文件", + "App cannot be installed because appinfo file cannot be read." : "无法安装应用, 因为无法读取应用信息文件", + "Signature could not get checked. Please contact the app developer and check your admin screen." : "签名检查失败. 请联系应用开发者并检查您的管理界面", + "App can't be installed because of not allowed code in the App" : "无法安装应用, 因为应用中包含不允许的代码", + "App can't be installed because it is not compatible with this version of the server" : "无法安装应用, 因为应用不兼容当前服务器的版本", + "App can't be installed because it contains the true tag which is not allowed for non shipped apps" : "无法安装应用, 因为应用包含 true 标签", + "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "无法安装应用, 因为 info.xml 中的版本与应用市场中的版本不同", + "Logging" : "日志", + "Recommended" : "推荐", + "Microsoft Windows Platform is not supported" : "不支持 Microsoft Windows 平台", + "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "不支持在 Microsoft Windows 平台运行 Nextcloud 服务器. 如果您没有迁移服务器的计划, 我们建议您在虚拟机中使用 Linux 服务器.", + "Storage not available" : "存储空间不可用" +}, +"nplurals=1; plural=0;"); diff --git a/lib/l10n/zh_CN.json b/lib/l10n/zh_CN.json new file mode 100644 index 0000000000000000000000000000000000000000..f5b88f87ad909ddf1688d195ecb0bfd4645dc87a --- /dev/null +++ b/lib/l10n/zh_CN.json @@ -0,0 +1,231 @@ +{ "translations": { + "Cannot write into \"config\" directory!" : "无法写入 \"config\" 目录!", + "This can usually be fixed by giving the webserver write access to the config directory" : "您可以设置 Web 服务器对 config 目录的写权限修复这个问题", + "See %s" : "查看 %s", + "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "您可以由 %s 设置 Web 服务器对 config 目录 %s 的写权限修复这个问题", + "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "应用 %$1s 的文件替换不正确. 请确认版本与当前服务器兼容.", + "Sample configuration detected" : "示例配置检测", + "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "您似乎直接把 config.php 的样例文件直接复制使用. 这可能会破坏您的安装. 在对 config.php 进行修改之前请先阅读相关文档.", + "%1$s and %2$s" : "%1$s 和 %2$s", + "%1$s, %2$s and %3$s" : "%1$s, %2$s 和 %3$s", + "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s 和 %4$s", + "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s 和 %5$s", + "PHP %s or higher is required." : "要求 PHP 版本 %s 或者更高。", + "PHP with a version lower than %s is required." : "需要版本低于 %s 的PHP.", + "%sbit or higher PHP required." : "需要 %s 或更高版本的 PHP", + "Following databases are supported: %s" : "支持以下数据库: %s", + "The command line tool %s could not be found" : "命令行工具 %s 未找到", + "The library %s is not available." : "库文件 %s 不可用", + "Library %s with a version higher than %s is required - available version %s." : "%s 需要 %s 或更高的版本 - 可用版本 %s.", + "Library %s with a version lower than %s is required - available version %s." : "%s 需要 %s 或更低的版本 - 可用版本 %s.", + "Following platforms are supported: %s" : "支持以下平台:%s", + "Server version %s or higher is required." : "需要服务器版本 %s 或更高版本。", + "Server version %s or lower is required." : "需要服务器版本 %s 或更低版本。", + "Unknown filetype" : "未知的文件类型", + "Invalid image" : "无效的图像", + "Avatar image is not square" : "头像图像不是正方形", + "today" : "今天", + "yesterday" : "昨天", + "_%n day ago_::_%n days ago_" : ["%n 天前"], + "last month" : "上月", + "_%n month ago_::_%n months ago_" : ["%n 月前"], + "last year" : "去年", + "_%n year ago_::_%n years ago_" : ["%n 年前"], + "_%n hour ago_::_%n hours ago_" : ["%n 小时前"], + "_%n minute ago_::_%n minutes ago_" : ["%n 分钟前"], + "seconds ago" : "秒前", + "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "ID 为 %s 的模块不存在. 请在应用设置中启用或联系您的管理员.", + "File name is a reserved word" : "文件名包含敏感字符", + "File name contains at least one invalid character" : "文件名中存在至少一个非法字符", + "File name is too long" : "文件名过长", + "Dot files are not allowed" : ".文件 不被允许", + "Empty filename is not allowed" : "不允许使用空名称。", + "APCu" : "APCu", + "Redis" : "Redis", + "Server settings" : "服务器设置", + "Sharing" : "分享", + "Encryption" : "加密", + "Additional settings" : "其他设置", + "Tips & tricks" : "小提示", + "%s enter the database username and name." : "%s 输入数据库用户名和名称.", + "%s enter the database username." : "%s 输入数据库用户名。", + "%s enter the database name." : "%s 输入数据库名称。", + "%s you may not use dots in the database name" : "%s 您不能在数据库名称中使用英文句号。", + "Oracle connection could not be established" : "不能建立甲骨文连接", + "Oracle username and/or password not valid" : "Oracle 数据库用户名和/或密码无效", + "DB Error: \"%s\"" : "数据库错误:\"%s\"", + "Offending command was: \"%s\"" : "冲突命令为:\"%s\"", + "You need to enter either an existing account or the administrator." : "你需要输入一个数据库中已有的账户或管理员账户。", + "Offending command was: \"%s\", name: %s, password: %s" : "冲突命令为:\"%s\",名称:%s,密码:%s", + "PostgreSQL username and/or password not valid" : "PostgreSQL 数据库用户名和/或密码无效", + "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X 不被支持并且 %s 在这个平台上无法正常工作。请自行承担风险!", + "For the best results, please consider using a GNU/Linux server instead." : "为了达到最好的效果,请考虑使用 GNU/Linux 服务器。", + "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "看起来这个 %s 实例运行在32位PHP环境中并且已在php.ini中配置open_basedir。这将在文件超过4GB时出现问题,我们极力反对这样做。", + "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "请删除php.ini中的open_basedir设置或切换到64位PHP。", + "Set an admin username." : "请设置一个管理员用户名。", + "Set an admin password." : "请设置一个管理员密码。", + "Can't create or write into the data directory %s" : "无法创建或写入数据目录 %s", + "Invalid Federated Cloud ID" : "无效的联合云ID", + "%s shared »%s« with you" : "%s 向您分享了 »%s«", + "%s via %s" : "%s 通过 %s", + "Sharing %s failed, because the backend does not allow shares from type %i" : "分享 %s 失败, 因为后端不允许分享 %i 类型", + "Sharing %s failed, because the file does not exist" : "分享 %s 失败, 因为文件不存在.", + "You are not allowed to share %s" : "您无权分享 %s", + "Sharing %s failed, because you can not share with yourself" : "分享 %s 失败, 因为您不能分享给自己", + "Sharing %s failed, because the user %s does not exist" : "分享 %s 失败, 因为用户 %s 不存在", + "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "分享 %s 失败, 因为用户 %s 不是 %s 所属的任何组的用户", + "Sharing %s failed, because this item is already shared with %s" : "分享 %s 失败, 因为该项已经分享给用户 %s", + "Sharing %s failed, because this item is already shared with user %s" : "分享 %s 失败, 因为该项已经分享给用户 %s", + "Sharing %s failed, because the group %s does not exist" : "分享 %s 失败, 因为 %s 分组不存在", + "Sharing %s failed, because %s is not a member of the group %s" : "分享 %s 失败, 因为 %s 不是 %s 分组的成员", + "You need to provide a password to create a public link, only protected links are allowed" : "链接分享需要密码, 您需要提供一个密码以创建公开连接", + "Sharing %s failed, because sharing with links is not allowed" : "分享 %s 失败, 因为不允许使用链接分享", + "Not allowed to create a federated share with the same user" : "不能给你自己分享文件", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "分享 %s 失败, 无法找到 %s, 该服务当前无法连接.", + "Share type %s is not valid for %s" : "%s 不是 %s 的合法共享类型", + "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "设置 %s 权限失败,因为权限超出了 %s 已有权限。", + "Setting permissions for %s failed, because the item was not found" : "设置 %s 的权限失败,因为未找到到对应项", + "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "无法设置过期时间. 过期时间不能晚于其分享时间 %s", + "Cannot set expiration date. Expiration date is in the past" : "无法设置过期时间. 过期时间不能为过去", + "Cannot clear expiration date. Shares are required to have an expiration date." : "无法清除过期时间. 每个分享必须有一个过期时间", + "Sharing backend %s must implement the interface OCP\\Share_Backend" : "分享后端 %s 必须实现 OCP\\Share_Backend 接口", + "Sharing backend %s not found" : "%s 的分享后端未找到", + "Sharing backend for %s not found" : "%s 的分享后端未找到", + "Sharing failed, because the user %s is the original sharer" : "分享失败, 因为用户 %s 是原始的分享者.", + "Sharing %s failed, because the permissions exceed permissions granted to %s" : "分享 %s 失败, 因为权限超过了 %s 的已有权限", + "Sharing %s failed, because resharing is not allowed" : "分享 %s 失败, 因为不允许二次共享", + "Sharing %s failed, because the sharing backend for %s could not find its source" : "分享 %s 失败, 因为无法找到 %s 分享后端的来源", + "Sharing %s failed, because the file could not be found in the file cache" : "分享 %s 失败, 因为文件缓存中找不到该文件", + "Cannot increase permissions of %s" : "无法提升 %s 的权限", + "Files can't be shared with delete permissions" : "无法分享有删除权限的文件", + "Files can't be shared with create permissions" : "无法分享有创建权限的文件", + "Expiration date is in the past" : "到期日期已过.", + "Cannot set expiration date more than %s days in the future" : "无法将过期日期设置为超过 %s 天.", + "Could not find category \"%s\"" : "无法找到分类 \"%s\"", + "Sunday" : "星期日", + "Monday" : "星期一", + "Tuesday" : "星期二", + "Wednesday" : "星期三", + "Thursday" : "星期四", + "Friday" : "星期五", + "Saturday" : "星期六", + "Sun." : "周日", + "Mon." : "周一", + "Tue." : "周二", + "Wed." : "周三", + "Thu." : "周四", + "Fri." : "周五", + "Sat." : "周六", + "Su" : "日", + "Mo" : "一", + "Tu" : "二", + "We" : "三", + "Th" : "四", + "Fr" : "五", + "Sa" : "六", + "January" : "一月", + "February" : "二月", + "March" : "三月", + "April" : "四月", + "May" : "五月", + "June" : "六月", + "July" : "七月", + "August" : "八月", + "September" : "九月", + "October" : "十月", + "November" : "十一月", + "December" : "十二月", + "Jan." : "一月", + "Feb." : "二月", + "Mar." : "三月", + "Apr." : "四月", + "May." : "五月", + "Jun." : "六月", + "Jul." : "七月", + "Aug." : "八月", + "Sep." : "九月", + "Oct." : "十月", + "Nov." : "十一月", + "Dec." : "十二月", + "Apps" : "应用", + "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "在用户名中只允许使用以下字符:“a-z”,“A-Z”,“0-9”和\"_.@-'\"", + "A valid username must be provided" : "必须提供合法的用户名", + "Username contains whitespace at the beginning or at the end" : "用户名在开头或结尾处包含空格", + "A valid password must be provided" : "必须提供合法的密码", + "The username is already being used" : "用户名已被使用", + "Login canceled by app" : "已通过应用取消登录", + "User disabled" : "用户已禁用", + "Help" : "帮助", + "Personal" : "个人", + "Users" : "用户", + "Admin" : "管理", + "App \"%s\" cannot be installed because appinfo file cannot be read." : "无法安装应用\"%s\",因为无法读取appinfo文件.", + "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "应用程式 \"%s\" 无法安装,因为它与这个版本的服务器不兼容.", + "No app name specified" : "没有指定的 App 名称", + "App '%s' could not be installed!" : "应用程序 '%s' 无法被安装!", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "应用程序 \"%s\" 无法被安装,因为为满足下列依赖关系: %s", + "a safe home for all your data" : "给您所有的数据一个安全的家", + "File is currently busy, please try again later" : "文件当前正忙,请稍后再试", + "Can't read file" : "无法读取文件", + "Application is not enabled" : "应用程序未启用", + "Authentication error" : "认证出错", + "Token expired. Please reload page." : "Token 过期,请刷新页面。", + "Unknown user" : "未知用户", + "No database drivers (sqlite, mysql, or postgresql) installed." : "没有安装数据库驱动 (SQLite、MySQL 或 PostgreSQL)。", + "Cannot write into \"config\" directory" : "无法写入“config”目录", + "Cannot write into \"apps\" directory" : "无法写入“apps”目录", + "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "您可以由 %s 设置 Web 服务器对应用目录 %s 的写权限或在配置文件中禁用应用商店可以修复这个问题.", + "Cannot create \"data\" directory (%s)" : "无法创建“apps”目录 (%s)", + "This can usually be fixed by giving the webserver write access to the root directory." : "点击 设置 Web 服务器对根目录的写入权限 可修复这个问题.", + "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "您可以由 %s 设置 Web 服务器对根目录 %s 的写权限可以修复这个问题.", + "Setting locale to %s failed" : "设置语言为 %s 失败", + "Please install one of these locales on your system and restart your webserver." : "请在您的系统中安装下述一种语言并重启 Web 服务器.", + "Please ask your server administrator to install the module." : "请联系服务器管理员安装模块.", + "PHP module %s not installed." : "PHP %s 模块未安装.", + "PHP setting \"%s\" is not set to \"%s\"." : "PHP 选项 \"%s\" 未设置为 \"%s\".", + "Adjusting this setting in php.ini will make Nextcloud run again" : "在 php.ini 中调整该设置将导致 Nextcloud 重新运行", + "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload 当前设置为 \"%s\", 预期值为 \"0\"", + "To fix this issue set mbstring.func_overload to 0 in your php.ini" : "请在 php.ini 中设置 mbstring.func_overload0 以解决该问题", + "libxml2 2.7.0 is at least required. Currently %s is installed." : "至少需要 libxml2 2.7.0. 当前安装 %s.", + "To fix this issue update your libxml2 version and restart your web server." : "升级您的 libxml2 版本然后重启 Web 服务器以解决该问题.", + "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP 被设置为移除内联块, 这将导致多个核心应用无法访问.", + "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "这可能由缓存/加速器导致的, 例如 Zend OPcache 或 eAccelerator.", + "PHP modules have been installed, but they are still listed as missing?" : "PHP 模块已经安装, 但仍然显示未安装?", + "Please ask your server administrator to restart the web server." : "请联系服务器管理员重启 Web 服务器.", + "PostgreSQL >= 9 required" : "要求 PostgreSQL >= 9", + "Please upgrade your database version" : "请升级您的数据库版本", + "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "请更改权限为 0770 以避免其他用户查看目录.", + "Data directory (%s) is readable by other users" : "数据目录 (%s) 能被其他用户读取", + "Data directory (%s) must be an absolute path" : "数据目录 (%s) 必须为绝对路径", + "Check the value of \"datadirectory\" in your configuration" : "请检查配置文件中 \"datadirectory\" 的值", + "Data directory (%s) is invalid" : "数据目录 (%s) 无效", + "Please check that the data directory contains a file \".ocdata\" in its root." : "请检查根目录下 data 目录中包含名为 \".ocdata\" 的文件.", + "Could not obtain lock type %d on \"%s\"." : "无法在 \"%s\" 上获取锁类型 %d.", + "Storage unauthorized. %s" : "存储认证失败. %s", + "Storage incomplete configuration. %s" : "存储未完成配置. %s", + "Storage connection error. %s" : "存储连接错误. %s", + "Storage is temporarily not available" : "存储暂时不可用", + "Storage connection timeout. %s" : "存储连接超时. %s", + "4-byte characters are not supported in file names" : "文件名中不支持 4 字节字符", + "App directory already exists" : "应用目录已经存在", + "Can't create app folder. Please fix permissions. %s" : "无法创建应用文件夹. 请修改权限. %s", + "Archive does not contain a directory named %s" : "压缩文件中不包含目录 %s", + "No source specified when installing app" : "安装应用时未指定来源", + "No href specified when installing app from http" : "从 http 安装应用时未指定链接", + "No path specified when installing app from local file" : "从本地文件安装应用时未指定路径", + "Archives of type %s are not supported" : "不支持 %s 的压缩格式", + "Failed to open archive when installing app" : "安装应用时打开文件失败", + "App does not provide an info.xml file" : "应用未提供 info.xml 文件", + "App cannot be installed because appinfo file cannot be read." : "无法安装应用, 因为无法读取应用信息文件", + "Signature could not get checked. Please contact the app developer and check your admin screen." : "签名检查失败. 请联系应用开发者并检查您的管理界面", + "App can't be installed because of not allowed code in the App" : "无法安装应用, 因为应用中包含不允许的代码", + "App can't be installed because it is not compatible with this version of the server" : "无法安装应用, 因为应用不兼容当前服务器的版本", + "App can't be installed because it contains the true tag which is not allowed for non shipped apps" : "无法安装应用, 因为应用包含 true 标签", + "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "无法安装应用, 因为 info.xml 中的版本与应用市场中的版本不同", + "Logging" : "日志", + "Recommended" : "推荐", + "Microsoft Windows Platform is not supported" : "不支持 Microsoft Windows 平台", + "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "不支持在 Microsoft Windows 平台运行 Nextcloud 服务器. 如果您没有迁移服务器的计划, 我们建议您在虚拟机中使用 Linux 服务器.", + "Storage not available" : "存储空间不可用" +},"pluralForm" :"nplurals=1; plural=0;" +} \ No newline at end of file diff --git a/lib/l10n/zh_TW.js b/lib/l10n/zh_TW.js index bdf63be8b5f24389eb1c134572328044db0d7b4b..f03e9849cb9beef8378083273998d7fff68ef6d1 100644 --- a/lib/l10n/zh_TW.js +++ b/lib/l10n/zh_TW.js @@ -221,8 +221,6 @@ OC.L10N.register( "Recommended" : "建議", "Microsoft Windows Platform is not supported" : "不支援微軟Windows系統", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "微軟Windows不支援Nextcloud伺服器,如果您一定要使用,我們建議您在虛擬機中安裝Linux版本伺服器。", - "Storage not available" : "無法存取儲存空間", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "應用程式 \"%s\" 無法安裝,因為與此版本 Nextcloud 不相容", - "App can't be installed because it is not compatible with this version of Nextcloud" : "應用程式無法安裝,因為與此版本 Nextcloud 不相容" + "Storage not available" : "無法存取儲存空間" }, "nplurals=1; plural=0;"); diff --git a/lib/l10n/zh_TW.json b/lib/l10n/zh_TW.json index e2f39b8c3b10242e7f6078601ba04f51cd908b51..7857eb4a7ea3db4b66f2e3fa0215abb4008386e1 100644 --- a/lib/l10n/zh_TW.json +++ b/lib/l10n/zh_TW.json @@ -219,8 +219,6 @@ "Recommended" : "建議", "Microsoft Windows Platform is not supported" : "不支援微軟Windows系統", "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "微軟Windows不支援Nextcloud伺服器,如果您一定要使用,我們建議您在虛擬機中安裝Linux版本伺服器。", - "Storage not available" : "無法存取儲存空間", - "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "應用程式 \"%s\" 無法安裝,因為與此版本 Nextcloud 不相容", - "App can't be installed because it is not compatible with this version of Nextcloud" : "應用程式無法安裝,因為與此版本 Nextcloud 不相容" + "Storage not available" : "無法存取儲存空間" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/lib/private/AllConfig.php b/lib/private/AllConfig.php index 4e13d70371b7fd526b0c9ce8d11c03b7cf7ad663..1f59e677a542fe12ac505cd47b6e00e8554fb0e0 100644 --- a/lib/private/AllConfig.php +++ b/lib/private/AllConfig.php @@ -68,7 +68,7 @@ class AllConfig implements \OCP\IConfig { /** * @param SystemConfig $systemConfig */ - function __construct(SystemConfig $systemConfig) { + public function __construct(SystemConfig $systemConfig) { $this->userCache = new CappedMemoryCache(); $this->systemConfig = $systemConfig; } @@ -358,12 +358,17 @@ class AllConfig implements \OCP\IConfig { * ] */ private function getUserValues($userId) { - // TODO - FIXME - $this->fixDIInit(); - if (isset($this->userCache[$userId])) { return $this->userCache[$userId]; } + if ($userId === null || $userId === '') { + $this->userCache[$userId]=array(); + return $this->userCache[$userId]; + } + + // TODO - FIXME + $this->fixDIInit(); + $data = array(); $query = 'SELECT `appid`, `configkey`, `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?'; $result = $this->connection->executeQuery($query, array($userId)); diff --git a/lib/private/App/AppManager.php b/lib/private/App/AppManager.php index fca5c9b87ac202245f3d9c196567aac7d0edf815..6b819ef7ac14ac5d4b506c16509b7bd62a8e3f29 100644 --- a/lib/private/App/AppManager.php +++ b/lib/private/App/AppManager.php @@ -220,6 +220,21 @@ class AppManager implements IAppManager { $this->clearAppsCache(); } + /** + * Whether a list of types contains a protected app type + * + * @param string[] $types + * @return bool + */ + public function hasProtectedAppType($types) { + if (empty($types)) { + return false; + } + + $protectedTypes = array_intersect($this->protectedAppTypes, $types); + return !empty($protectedTypes); + } + /** * Enable an app only for specific groups * diff --git a/lib/private/App/AppStore/Fetcher/AppFetcher.php b/lib/private/App/AppStore/Fetcher/AppFetcher.php index bbe75c723d53c0291cb84d7da5e0583a00d5d091..7c5efafc92facef3a67c98c85988fb92b04a96b9 100644 --- a/lib/private/App/AppStore/Fetcher/AppFetcher.php +++ b/lib/private/App/AppStore/Fetcher/AppFetcher.php @@ -28,9 +28,6 @@ use OCP\Http\Client\IClientService; use OCP\IConfig; class AppFetcher extends Fetcher { - /** @var IConfig */ - private $config; - /** * @param IAppData $appData * @param IClientService $clientService @@ -44,13 +41,13 @@ class AppFetcher extends Fetcher { parent::__construct( $appData, $clientService, - $timeFactory + $timeFactory, + $config ); $this->fileName = 'apps.json'; - $this->config = $config; - $versionArray = \OC_Util::getVersion(); + $versionArray = explode('.', $this->config->getSystemValue('version')); $this->endpointUrl = sprintf( 'https://apps.nextcloud.com/api/v1/platform/%d.%d.%d/apps.json', $versionArray[0], @@ -62,15 +59,14 @@ class AppFetcher extends Fetcher { /** * Only returns the latest compatible app release in the releases array * + * @param string $ETag + * @param string $content + * * @return array */ - protected function fetch() { - $client = $this->clientService->newClient(); - $response = $client->get($this->endpointUrl); - $responseJson = []; - $responseJson['data'] = json_decode($response->getBody(), true); - $responseJson['timestamp'] = $this->timeFactory->getTime(); - $response = $responseJson; + protected function fetch($ETag, $content) { + /** @var mixed[] $response */ + $response = parent::fetch($ETag, $content); $ncVersion = $this->config->getSystemValue('version'); $ncMajorVersion = explode('.', $ncVersion)[0]; diff --git a/lib/private/App/AppStore/Fetcher/CategoryFetcher.php b/lib/private/App/AppStore/Fetcher/CategoryFetcher.php index 74201ec37379145efe9119a822b5368b438a15a5..8b79259a66af3fddcf169b730b6be1326a571c21 100644 --- a/lib/private/App/AppStore/Fetcher/CategoryFetcher.php +++ b/lib/private/App/AppStore/Fetcher/CategoryFetcher.php @@ -24,20 +24,24 @@ namespace OC\App\AppStore\Fetcher; use OCP\AppFramework\Utility\ITimeFactory; use OCP\Files\IAppData; use OCP\Http\Client\IClientService; +use OCP\IConfig; class CategoryFetcher extends Fetcher { /** * @param IAppData $appData * @param IClientService $clientService * @param ITimeFactory $timeFactory + * @param IConfig $config */ public function __construct(IAppData $appData, IClientService $clientService, - ITimeFactory $timeFactory) { + ITimeFactory $timeFactory, + IConfig $config) { parent::__construct( $appData, $clientService, - $timeFactory + $timeFactory, + $config ); $this->fileName = 'categories.json'; $this->endpointUrl = 'https://apps.nextcloud.com/api/v1/categories.json'; diff --git a/lib/private/App/AppStore/Fetcher/Fetcher.php b/lib/private/App/AppStore/Fetcher/Fetcher.php index f82e1a253f69d8dd3294f1e152d7d3c63b3d66ab..dab79e11821dd5bb43cd7118f67d0bf20142c1d0 100644 --- a/lib/private/App/AppStore/Fetcher/Fetcher.php +++ b/lib/private/App/AppStore/Fetcher/Fetcher.php @@ -21,10 +21,12 @@ namespace OC\App\AppStore\Fetcher; +use OCP\AppFramework\Http; use OCP\AppFramework\Utility\ITimeFactory; use OCP\Files\IAppData; use OCP\Files\NotFoundException; use OCP\Http\Client\IClientService; +use OCP\IConfig; abstract class Fetcher { const INVALIDATE_AFTER_SECONDS = 300; @@ -35,6 +37,8 @@ abstract class Fetcher { protected $clientService; /** @var ITimeFactory */ protected $timeFactory; + /** @var IConfig */ + protected $config; /** @var string */ protected $fileName; /** @var string */ @@ -44,26 +48,52 @@ abstract class Fetcher { * @param IAppData $appData * @param IClientService $clientService * @param ITimeFactory $timeFactory + * @param IConfig $config */ public function __construct(IAppData $appData, IClientService $clientService, - ITimeFactory $timeFactory) { + ITimeFactory $timeFactory, + IConfig $config) { $this->appData = $appData; $this->clientService = $clientService; $this->timeFactory = $timeFactory; + $this->config = $config; } /** * Fetches the response from the server * + * @param string $ETag + * @param string $content + * * @return array */ - protected function fetch() { + protected function fetch($ETag, $content) { + $options = []; + + if ($ETag !== '') { + $options['headers'] = [ + 'If-None-Match' => $ETag, + ]; + } + $client = $this->clientService->newClient(); - $response = $client->get($this->endpointUrl); + $response = $client->get($this->endpointUrl, $options); + $responseJson = []; - $responseJson['data'] = json_decode($response->getBody(), true); + if ($response->getStatusCode() === Http::STATUS_NOT_MODIFIED) { + $responseJson['data'] = json_decode($content, true); + } else { + $responseJson['data'] = json_decode($response->getBody(), true); + $ETag = $response->getHeader('ETag'); + } + $responseJson['timestamp'] = $this->timeFactory->getTime(); + $responseJson['ncversion'] = $this->config->getSystemValue('version'); + if ($ETag !== '') { + $responseJson['ETag'] = $ETag; + } + return $responseJson; } @@ -75,15 +105,27 @@ abstract class Fetcher { public function get() { $rootFolder = $this->appData->getFolder('/'); + $ETag = ''; + $content = ''; + try { // File does already exists $file = $rootFolder->getFile($this->fileName); $jsonBlob = json_decode($file->getContent(), true); if(is_array($jsonBlob)) { - // If the timestamp is older than 300 seconds request the files new - if((int)$jsonBlob['timestamp'] > ($this->timeFactory->getTime() - self::INVALIDATE_AFTER_SECONDS)) { + /* + * If the timestamp is older than 300 seconds request the files new + * If the version changed (update!) also refresh + */ + if((int)$jsonBlob['timestamp'] > ($this->timeFactory->getTime() - self::INVALIDATE_AFTER_SECONDS) && + isset($jsonBlob['ncversion']) && $jsonBlob['ncversion'] === $this->config->getSystemValue('version', '0.0.0')) { return $jsonBlob['data']; } + + if (isset($jsonBlob['ETag'])) { + $ETag = $jsonBlob['ETag']; + $content = json_encode($jsonBlob['data']); + } } } catch (NotFoundException $e) { // File does not already exists @@ -92,7 +134,7 @@ abstract class Fetcher { // Refresh the file content try { - $responseJson = $this->fetch(); + $responseJson = $this->fetch($ETag, $content); $file->putContent(json_encode($responseJson)); return json_decode($file->getContent(), true)['data']; } catch (\Exception $e) { diff --git a/lib/private/AppConfig.php b/lib/private/AppConfig.php index d92e8965b5cc292f5793fac03beab2d8fcf0bdda..4e102522550b85e830e2addcd63f4e00bba72c01 100644 --- a/lib/private/AppConfig.php +++ b/lib/private/AppConfig.php @@ -1,5 +1,6 @@ * @copyright Copyright (c) 2016, ownCloud, Inc. * * @author Arthur Schiwon @@ -29,7 +30,9 @@ namespace OC; +use OC\DB\OracleConnection; use OCP\IAppConfig; +use OCP\IConfig; use OCP\IDBConnection; /** @@ -37,12 +40,25 @@ use OCP\IDBConnection; * database. */ class AppConfig implements IAppConfig { - /** - * @var \OCP\IDBConnection $conn - */ + + /** @var array[] */ + protected $sensitiveValues = [ + 'spreed' => [ + 'turn_server_secret', + ], + 'user_ldap' => [ + 'ldap_agent_password', + ], + ]; + + /** @var \OCP\IDBConnection */ protected $conn; - private $cache = array(); + /** @var array[] */ + private $cache = []; + + /** @var bool */ + private $configLoaded = false; /** * @param IDBConnection $conn @@ -85,6 +101,7 @@ class AppConfig implements IAppConfig { * * @param string $app the app we are looking for * @return array an array of key names + * @deprecated 8.0.0 use method getAppKeys of \OCP\IConfig * * This function gets all keys of an app. Please note that the values are * not returned. @@ -112,6 +129,7 @@ class AppConfig implements IAppConfig { * @param string $key key * @param string $default = null, default value if the key does not exist * @return string the value or $default + * @deprecated 8.0.0 use method getAppValue of \OCP\IConfig * * This function gets a value from the appconfig table. If the key does * not exist the default value will be returned @@ -146,6 +164,7 @@ class AppConfig implements IAppConfig { * @param string $key key * @param string|float|int $value value * @return bool True if the value was inserted or updated, false if the value was the same + * @deprecated 8.0.0 use method setAppValue of \OCP\IConfig */ public function setValue($app, $key, $value) { if (!$this->hasKey($app, $key)) { @@ -182,7 +201,7 @@ class AppConfig implements IAppConfig { * http://docs.oracle.com/cd/E11882_01/server.112/e26088/conditions002.htm#i1033286 * > Large objects (LOBs) are not supported in comparison conditions. */ - if (!($this->conn instanceof \OC\DB\OracleConnection)) { + if (!($this->conn instanceof OracleConnection)) { // Only update the value when it is not the same $sql->andWhere($sql->expr()->neq('configvalue', $sql->createParameter('configvalue'))) ->setParameter('configvalue', $value); @@ -200,7 +219,8 @@ class AppConfig implements IAppConfig { * * @param string $app app * @param string $key key - * @return boolean|null + * @return boolean + * @deprecated 8.0.0 use method deleteAppValue of \OCP\IConfig */ public function deleteKey($app, $key) { $this->loadConfigValues(); @@ -214,13 +234,15 @@ class AppConfig implements IAppConfig { $sql->execute(); unset($this->cache[$app][$key]); + return false; } /** * Remove app from appconfig * * @param string $app app - * @return boolean|null + * @return boolean + * @deprecated 8.0.0 use method deleteAppValue of \OCP\IConfig * * Removes all keys in appconfig belonging to the app. */ @@ -234,6 +256,7 @@ class AppConfig implements IAppConfig { $sql->execute(); unset($this->cache[$app]); + return false; } /** @@ -261,11 +284,31 @@ class AppConfig implements IAppConfig { } } + /** + * get all values of the app or and filters out sensitive data + * + * @param string $app + * @return array + */ + public function getFilteredValues($app) { + $values = $this->getValues($app, false); + + foreach ($this->sensitiveValues[$app] as $sensitiveKey) { + if (isset($values[$sensitiveKey])) { + $values[$sensitiveKey] = IConfig::SENSITIVE_VALUE; + } + } + + return $values; + } + /** * Load all the app config values */ protected function loadConfigValues() { - if ($this->configLoaded) return; + if ($this->configLoaded) { + return; + } $this->cache = []; diff --git a/lib/private/AppFramework/Db/Db.php b/lib/private/AppFramework/Db/Db.php deleted file mode 100644 index 5aacdc517a2f30eacda33927504c3359cf62e33d..0000000000000000000000000000000000000000 --- a/lib/private/AppFramework/Db/Db.php +++ /dev/null @@ -1,314 +0,0 @@ - - * @author Joas Schilling - * @author Morris Jobke - * @author Robin Appelman - * @author Robin McCorkell - * @author Thomas Müller - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see - * - */ - -namespace OC\AppFramework\Db; - -use OCP\DB\QueryBuilder\IQueryBuilder; -use OCP\IDb; -use OCP\IDBConnection; -use OCP\PreConditionNotMetException; -use Doctrine\DBAL\Platforms\MySqlPlatform; - -/** - * @deprecated use IDBConnection directly, will be removed in ownCloud 10 - * Small Facade for being able to inject the database connection for tests - */ -class Db implements IDb { - /** - * @var IDBConnection - */ - protected $connection; - - /** - * @param IDBConnection $connection - */ - public function __construct(IDBConnection $connection) { - $this->connection = $connection; - } - - /** - * Gets the ExpressionBuilder for the connection. - * - * @return \OCP\DB\QueryBuilder\IQueryBuilder - */ - public function getQueryBuilder() { - return $this->connection->getQueryBuilder(); - } - - /** - * Used to abstract the ownCloud database access away - * - * @param string $sql the sql query with ? placeholder for params - * @param int $limit the maximum number of rows - * @param int $offset from which row we want to start - * @deprecated use prepare instead, will be removed in ownCloud 10 - * @return \OC_DB_StatementWrapper prepared SQL query - */ - public function prepareQuery($sql, $limit = null, $offset = null) { - $isManipulation = \OC_DB::isManipulation($sql); - $statement = $this->connection->prepare($sql, $limit, $offset); - return new \OC_DB_StatementWrapper($statement, $isManipulation); - } - - - /** - * Used to get the id of the just inserted element - * - * @deprecated use lastInsertId instead, will be removed in ownCloud 10 - * @param string $tableName the name of the table where we inserted the item - * @return int the id of the inserted element - */ - public function getInsertId($tableName) { - return $this->connection->lastInsertId($tableName); - } - - /** - * Used to abstract the ownCloud database access away - * @param string $sql the sql query with ? placeholder for params - * @param int $limit the maximum number of rows - * @param int $offset from which row we want to start - * @return \Doctrine\DBAL\Driver\Statement The prepared statement. - */ - public function prepare($sql, $limit=null, $offset=null) { - return $this->connection->prepare($sql, $limit, $offset); - } - - /** - * Executes an, optionally parameterized, SQL query. - * - * If the query is parameterized, a prepared statement is used. - * If an SQLLogger is configured, the execution is logged. - * - * @param string $query The SQL query to execute. - * @param string[] $params The parameters to bind to the query, if any. - * @param array $types The types the previous parameters are in. - * @return \Doctrine\DBAL\Driver\Statement The executed statement. - */ - public function executeQuery($query, array $params = array(), $types = array()) { - return $this->connection->executeQuery($query, $params, $types); - } - - /** - * Executes an SQL INSERT/UPDATE/DELETE query with the given parameters - * and returns the number of affected rows. - * - * This method supports PDO binding types as well as DBAL mapping types. - * - * @param string $query The SQL query. - * @param array $params The query parameters. - * @param array $types The parameter types. - * @return integer The number of affected rows. - */ - public function executeUpdate($query, array $params = array(), array $types = array()) { - return $this->connection->executeUpdate($query, $params, $types); - } - - /** - * Used to get the id of the just inserted element - * @param string $table the name of the table where we inserted the item - * @return int the id of the inserted element - */ - public function lastInsertId($table = null) { - return $this->connection->lastInsertId($table); - } - - /** - * Insert a row if the matching row does not exists. - * - * @param string $table The table name (will replace *PREFIX* with the actual prefix) - * @param array $input data that should be inserted into the table (column name => value) - * @param array|null $compare List of values that should be checked for "if not exists" - * If this is null or an empty array, all keys of $input will be compared - * Please note: text fields (clob) must not be used in the compare array - * @return int number of inserted rows - * @throws \Doctrine\DBAL\DBALException - */ - public function insertIfNotExist($table, $input, array $compare = null) { - return $this->connection->insertIfNotExist($table, $input, $compare); - } - - /** - * Insert or update a row value - * - * @param string $table - * @param array $keys (column name => value) - * @param array $values (column name => value) - * @param array $updatePreconditionValues ensure values match preconditions (column name => value) - * @return int number of new rows - * @throws \Doctrine\DBAL\DBALException - * @throws PreConditionNotMetException - */ - public function setValues($table, array $keys, array $values, array $updatePreconditionValues = []) { - return $this->connection->setValues($table, $keys, $values, $updatePreconditionValues); - } - - /** - * @inheritdoc - */ - public function lockTable($tableName) { - $this->connection->lockTable($tableName); - } - - /** - * @inheritdoc - */ - public function unlockTable() { - $this->connection->unlockTable(); - } - - /** - * Start a transaction - */ - public function beginTransaction() { - $this->connection->beginTransaction(); - } - - /** - * Check if a transaction is active - * - * @return bool - */ - public function inTransaction() { - return $this->connection->inTransaction(); - } - - /** - * Commit the database changes done during a transaction that is in progress - */ - public function commit() { - $this->connection->commit(); - } - - /** - * Rollback the database changes done during a transaction that is in progress - */ - public function rollBack() { - $this->connection->rollBack(); - } - - /** - * Gets the error code and message as a string for logging - * @return string - */ - public function getError() { - return $this->connection->getError(); - } - - /** - * Fetch the SQLSTATE associated with the last database operation. - * - * @return integer The last error code. - */ - public function errorCode() { - return $this->connection->errorCode(); - } - - /** - * Fetch extended error information associated with the last database operation. - * - * @return array The last error information. - */ - public function errorInfo() { - return $this->connection->errorInfo(); - } - - /** - * Establishes the connection with the database. - * - * @return bool - */ - public function connect() { - return $this->connection->connect(); - } - - /** - * Close the database connection - */ - public function close() { - $this->connection->close(); - } - - /** - * Quotes a given input parameter. - * - * @param mixed $input Parameter to be quoted. - * @param int $type Type of the parameter. - * @return string The quoted parameter. - */ - public function quote($input, $type = IQueryBuilder::PARAM_STR) { - return $this->connection->quote($input, $type); - } - - /** - * Gets the DatabasePlatform instance that provides all the metadata about - * the platform this driver connects to. - * - * @return \Doctrine\DBAL\Platforms\AbstractPlatform The database platform. - */ - public function getDatabasePlatform() { - return $this->connection->getDatabasePlatform(); - } - - /** - * Drop a table from the database if it exists - * - * @param string $table table name without the prefix - */ - public function dropTable($table) { - $this->connection->dropTable($table); - } - - /** - * Check if a table exists - * - * @param string $table table name without the prefix - * @return bool - */ - public function tableExists($table) { - return $this->connection->tableExists($table); - } - - /** - * Espace a parameter to be used in a LIKE query - * - * @param string $param - * @return string - */ - public function escapeLikeParameter($param) { - return $this->connection->escapeLikeParameter($param); - } - - /** - * Check whether or not the current database support 4byte wide unicode - * - * @return bool - * @since 11.0.0 - */ - public function supports4ByteText() { - return $this->connection->supports4ByteText(); - } -} diff --git a/lib/private/AppFramework/DependencyInjection/DIContainer.php b/lib/private/AppFramework/DependencyInjection/DIContainer.php index 148a15172ac3da4664b88e0a5eb14ec8ebcae7a6..0879b3e9330e12f584b90abb98f6610f12e425d1 100644 --- a/lib/private/AppFramework/DependencyInjection/DIContainer.php +++ b/lib/private/AppFramework/DependencyInjection/DIContainer.php @@ -43,8 +43,10 @@ use OC\AppFramework\Middleware\OCSMiddleware; use OC\AppFramework\Middleware\Security\SecurityMiddleware; use OC\AppFramework\Middleware\SessionMiddleware; use OC\AppFramework\Utility\SimpleContainer; +use OC\AppFramework\Utility\TimeFactory; use OC\Core\Middleware\TwoFactorMiddleware; use OC\RichObjectStrings\Validator; +use OC\Security\Bruteforce\Throttler; use OCP\AppFramework\IApi; use OCP\AppFramework\IAppContainer; use OCP\Files\IAppData; @@ -91,6 +93,10 @@ class DIContainer extends SimpleContainer implements IAppContainer { return new Output($this->getServer()->getWebRoot()); }); + $this->registerService(\OCP\Authentication\LoginCredentials\IStore::class, function() { + return $this->getServer()->query(\OCP\Authentication\LoginCredentials\IStore::class); + }); + $this->registerService('OCP\\IAvatarManager', function($c) { return $this->getServer()->getAvatarManager(); }); @@ -134,10 +140,6 @@ class DIContainer extends SimpleContainer implements IAppContainer { return $this->getServer()->getDateTimeFormatter(); }); - $this->registerService('OCP\\IDb', function($c) { - return $this->getServer()->getDb(); - }); - $this->registerService('OCP\\IDBConnection', function($c) { return $this->getServer()->getDatabaseConnection(); }); @@ -380,20 +382,25 @@ class DIContainer extends SimpleContainer implements IAppContainer { */ $app = $this; $this->registerService('SecurityMiddleware', function($c) use ($app){ + /** @var \OC\Server $server */ + $server = $app->getServer(); + return new SecurityMiddleware( $c['Request'], $c['ControllerMethodReflector'], - $app->getServer()->getNavigationManager(), - $app->getServer()->getURLGenerator(), - $app->getServer()->getLogger(), - $app->getServer()->getSession(), + $server->getNavigationManager(), + $server->getURLGenerator(), + $server->getLogger(), + $server->getSession(), $c['AppName'], $app->isLoggedIn(), $app->isAdminUser(), - $app->getServer()->getContentSecurityPolicyManager(), - $app->getServer()->getCsrfTokenManager(), - $app->getServer()->getContentSecurityPolicyNonceManager() + $server->getContentSecurityPolicyManager(), + $server->getCsrfTokenManager(), + $server->getContentSecurityPolicyNonceManager(), + $server->getBruteForceThrottler() ); + }); $this->registerService('CORSMiddleware', function($c) { diff --git a/lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php b/lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php index d60d5749d571662740026f086c1b690d8d09b8dd..edba6a3e75928b8459f7bc8aeb21711e65718331 100644 --- a/lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php +++ b/lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php @@ -36,6 +36,7 @@ use OC\AppFramework\Middleware\Security\Exceptions\NotConfirmedException; use OC\AppFramework\Middleware\Security\Exceptions\NotLoggedInException; use OC\AppFramework\Middleware\Security\Exceptions\StrictCookieMissingException; use OC\AppFramework\Utility\ControllerMethodReflector; +use OC\Security\Bruteforce\Throttler; use OC\Security\CSP\ContentSecurityPolicyManager; use OC\Security\CSP\ContentSecurityPolicyNonceManager; use OC\Security\CSRF\CsrfTokenManager; @@ -87,6 +88,8 @@ class SecurityMiddleware extends Middleware { private $csrfTokenManager; /** @var ContentSecurityPolicyNonceManager */ private $cspNonceManager; + /** @var Throttler */ + private $throttler; /** * @param IRequest $request @@ -101,6 +104,7 @@ class SecurityMiddleware extends Middleware { * @param ContentSecurityPolicyManager $contentSecurityPolicyManager * @param CSRFTokenManager $csrfTokenManager * @param ContentSecurityPolicyNonceManager $cspNonceManager + * @param Throttler $throttler */ public function __construct(IRequest $request, ControllerMethodReflector $reflector, @@ -113,7 +117,8 @@ class SecurityMiddleware extends Middleware { $isAdminUser, ContentSecurityPolicyManager $contentSecurityPolicyManager, CsrfTokenManager $csrfTokenManager, - ContentSecurityPolicyNonceManager $cspNonceManager) { + ContentSecurityPolicyNonceManager $cspNonceManager, + Throttler $throttler) { $this->navigationManager = $navigationManager; $this->request = $request; $this->reflector = $reflector; @@ -126,6 +131,7 @@ class SecurityMiddleware extends Middleware { $this->contentSecurityPolicyManager = $contentSecurityPolicyManager; $this->csrfTokenManager = $csrfTokenManager; $this->cspNonceManager = $cspNonceManager; + $this->throttler = $throttler; } @@ -185,6 +191,12 @@ class SecurityMiddleware extends Middleware { } } + if($this->reflector->hasAnnotation('BruteForceProtection')) { + $action = $this->reflector->getAnnotationParameter('BruteForceProtection'); + $this->throttler->sleepDelay($this->request->getRemoteAddress(), $action); + $this->throttler->registerAttempt($action, $this->request->getRemoteAddress()); + } + /** * FIXME: Use DI once available * Checks if app is enabled (also includes a check whether user is allowed to access the resource) diff --git a/lib/private/AppFramework/Utility/ControllerMethodReflector.php b/lib/private/AppFramework/Utility/ControllerMethodReflector.php index 33a117d812178df647b2d6113c9f1ae7502ac447..034fc3a17590756bd02efb2d15746c6723cf2ed3 100644 --- a/lib/private/AppFramework/Utility/ControllerMethodReflector.php +++ b/lib/private/AppFramework/Utility/ControllerMethodReflector.php @@ -55,8 +55,10 @@ class ControllerMethodReflector implements IControllerMethodReflector{ $docs = $reflection->getDocComment(); // extract everything prefixed by @ and first letter uppercase - preg_match_all('/@([A-Z]\w+)/', $docs, $matches); - $this->annotations = $matches[1]; + preg_match_all('/^\h+\*\h+@(?P[A-Z]\w+)(\h+(?P\w+))?$/m', $docs, $matches); + foreach($matches['annotation'] as $key => $annontation) { + $this->annotations[$annontation] = $matches['parameter'][$key]; + } // extract type parameter information preg_match_all('/@param\h+(?P\w+)\h+\$(?P\w+)/', $docs, $matches); @@ -112,7 +114,22 @@ class ControllerMethodReflector implements IControllerMethodReflector{ * @return bool true if the annotation is found */ public function hasAnnotation($name){ - return in_array($name, $this->annotations); + return array_key_exists($name, $this->annotations); + } + + + /** + * Get optional annotation parameter + * @param string $name the name of the annotation + * @return string + */ + public function getAnnotationParameter($name){ + $parameter = ''; + if($this->hasAnnotation($name)) { + $parameter = $this->annotations[$name]; + } + + return $parameter; } diff --git a/lib/private/Archive/TAR.php b/lib/private/Archive/TAR.php index bbd24bd05a1fe203077b890b4a058fdaa6f36a54..07ccd09f3996f767af0cc2413c59bb5e315515c8 100644 --- a/lib/private/Archive/TAR.php +++ b/lib/private/Archive/TAR.php @@ -33,6 +33,8 @@ namespace OC\Archive; +use Icewind\Streams\CallbackWrapper; + class TAR extends Archive { const PLAIN = 0; const GZIP = 1; @@ -359,22 +361,19 @@ class TAR extends Archive { if ($mode == 'r' or $mode == 'rb') { return fopen($tmpFile, $mode); } else { - \OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack')); - self::$tempFiles[$tmpFile] = $path; - return fopen('close://' . $tmpFile, $mode); + $handle = fopen($tmpFile, $mode); + return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) { + $this->writeBack($tmpFile, $path); + }); } } - private static $tempFiles = array(); - /** * write back temporary files */ - function writeBack($tmpFile) { - if (isset(self::$tempFiles[$tmpFile])) { - $this->addFile(self::$tempFiles[$tmpFile], $tmpFile); - unlink($tmpFile); - } + function writeBack($tmpFile, $path) { + $this->addFile($path, $tmpFile); + unlink($tmpFile); } /** diff --git a/lib/private/Archive/ZIP.php b/lib/private/Archive/ZIP.php index 9e9fe40b2b471728bc7f3162d5bf1e51d88a4c66..0ed0f48acc4599375f3b4c92e9a4e87ed0311e04 100644 --- a/lib/private/Archive/ZIP.php +++ b/lib/private/Archive/ZIP.php @@ -31,6 +31,8 @@ namespace OC\Archive; +use Icewind\Streams\CallbackWrapper; + class ZIP extends Archive{ /** * @var \ZipArchive zip @@ -198,24 +200,22 @@ class ZIP extends Archive{ $ext=''; } $tmpFile=\OCP\Files::tmpFile($ext); - \OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack')); if($this->fileExists($path)) { $this->extractFile($path, $tmpFile); } - self::$tempFiles[$tmpFile]=$path; - return fopen('close://'.$tmpFile, $mode); + $handle = fopen($tmpFile, $mode); + return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) { + $this->writeBack($tmpFile, $path); + }); } } - private static $tempFiles=array(); /** * write back temporary files */ - function writeBack($tmpFile) { - if(isset(self::$tempFiles[$tmpFile])) { - $this->addFile(self::$tempFiles[$tmpFile], $tmpFile); - unlink($tmpFile); - } + function writeBack($tmpFile, $path) { + $this->addFile($path, $tmpFile); + unlink($tmpFile); } /** diff --git a/lib/private/Authentication/LoginCredentials/Credentials.php b/lib/private/Authentication/LoginCredentials/Credentials.php new file mode 100644 index 0000000000000000000000000000000000000000..9314b7489dbc98392aeeda393997e1299059724d --- /dev/null +++ b/lib/private/Authentication/LoginCredentials/Credentials.php @@ -0,0 +1,72 @@ + + * + * @author 2016 Christoph Wurst + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OC\Authentication\LoginCredentials; + +use OCP\Authentication\LoginCredentials\ICredentials; + +class Credentials implements ICredentials { + + /** @var string */ + private $uid; + + /** @var string */ + private $loginName; + + /** @var string */ + private $password; + + /** + * @param string $uid + * @param string $loginName + * @param string $password + */ + public function __construct($uid, $loginName, $password) { + $this->uid = $uid; + $this->loginName = $loginName; + $this->password = $password; + } + + /** + * @return string + */ + public function getUID() { + return $this->uid; + } + + /** + * @return string + */ + public function getLoginName() { + return $this->loginName; + } + + /** + * @return string + */ + public function getPassword() { + return $this->password; + } + +} diff --git a/lib/private/Authentication/LoginCredentials/Store.php b/lib/private/Authentication/LoginCredentials/Store.php new file mode 100644 index 0000000000000000000000000000000000000000..e44c88c7aea291416401755dbfe8e3da4bf1913a --- /dev/null +++ b/lib/private/Authentication/LoginCredentials/Store.php @@ -0,0 +1,120 @@ + + * + * @author 2016 Christoph Wurst + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OC\Authentication\LoginCredentials; + +use OC\Authentication\Exceptions\InvalidTokenException; +use OC\Authentication\Exceptions\PasswordlessTokenException; +use OC\Authentication\Token\IProvider; +use OCP\Authentication\Exceptions\CredentialsUnavailableException; +use OCP\Authentication\LoginCredentials\ICredentials; +use OCP\Authentication\LoginCredentials\IStore; +use OCP\ILogger; +use OCP\ISession; +use OCP\Session\Exceptions\SessionNotAvailableException; +use OCP\Util; + +class Store implements IStore { + + /** @var ISession */ + private $session; + + /** @var ILogger */ + private $logger; + + /** @var IProvider|null */ + private $tokenProvider; + + /** + * @param ISession $session + * @param ILogger $logger + * @param IProvider $tokenProvider + */ + public function __construct(ISession $session, ILogger $logger, IProvider $tokenProvider = null) { + $this->session = $session; + $this->logger = $logger; + $this->tokenProvider = $tokenProvider; + + Util::connectHook('OC_User', 'post_login', $this, 'authenticate'); + } + + /** + * Hook listener on post login + * + * @param array $params + */ + public function authenticate(array $params) { + $this->session->set('login_credentials', json_encode($params)); + } + + /** + * Replace the session implementation + * + * @param ISession $session + */ + public function setSession(ISession $session) { + $this->session = $session; + } + + /** + * @since 12 + * + * @return ICredentials the login credentials of the current user + * @throws CredentialsUnavailableException + */ + public function getLoginCredentials() { + if (is_null($this->tokenProvider)) { + throw new CredentialsUnavailableException(); + } + + $trySession = false; + try { + $sessionId = $this->session->getId(); + $token = $this->tokenProvider->getToken($sessionId); + + $uid = $token->getUID(); + $user = $token->getLoginName(); + $password = $this->tokenProvider->getPassword($token, $sessionId); + + return new Credentials($uid, $user, $password); + } catch (SessionNotAvailableException $ex) { + $this->logger->debug('could not get login credentials because session is unavailable', ['app' => 'core']); + } catch (InvalidTokenException $ex) { + $this->logger->debug('could not get login credentials because the token is invalid', ['app' => 'core']); + $trySession = true; + } catch (PasswordlessTokenException $ex) { + $this->logger->debug('could not get login credentials because the token has no password', ['app' => 'core']); + $trySession = true; + } + + if ($trySession && $this->session->exists('login_credentials')) { + $creds = json_decode($this->session->get('login_credentials')); + return new Credentials($creds->uid, $creds->uid, $creds->password); + } + + // If we reach this line, an exception was thrown. + throw new CredentialsUnavailableException(); + } + +} diff --git a/lib/private/Authentication/TwoFactorAuth/Manager.php b/lib/private/Authentication/TwoFactorAuth/Manager.php index 48792aa685b1efc5f0c648742cc5fea4125e36e2..1d0deada69657c3b9ceef349213b8e2bb9dffa85 100644 --- a/lib/private/Authentication/TwoFactorAuth/Manager.php +++ b/lib/private/Authentication/TwoFactorAuth/Manager.php @@ -1,4 +1,5 @@ appManager = $appManager; $this->session = $session; $this->config = $config; + $this->activityManager = $activityManager; + $this->logger = $logger; } /** @@ -184,10 +198,39 @@ class Manager { } $this->session->remove(self::SESSION_UID_KEY); $this->session->remove(self::REMEMBER_LOGIN); + + $this->publishEvent($user, 'twofactor_success', [ + 'provider' => $provider->getDisplayName(), + ]); + } else { + $this->publishEvent($user, 'twofactor_failed', [ + 'provider' => $provider->getDisplayName(), + ]); } return $passed; } + /** + * Push a 2fa event the user's activity stream + * + * @param IUser $user + * @param string $event + */ + private function publishEvent(IUser $user, $event, array $params) { + $activity = $this->activityManager->generateEvent(); + $activity->setApp('twofactor_generic') + ->setType('twofactor') + ->setAuthor($user->getUID()) + ->setAffectedUser($user->getUID()) + ->setSubject($event, $params); + try { + $this->activityManager->publish($activity); + } catch (Exception $e) { + $this->logger->warning('could not publish backup code creation activity', ['app' => 'twofactor_backupcodes']); + $this->logger->logException($e, ['app' => 'twofactor_backupcodes']); + } + } + /** * Check if the currently logged in user needs to pass 2FA * diff --git a/lib/private/Console/TimestampFormatter.php b/lib/private/Console/TimestampFormatter.php index 5b292439a4c3643a0ef598937a58163973ef9825..66dd38e6ac32510fd3abd3cee73f5583480e6fc3 100644 --- a/lib/private/Console/TimestampFormatter.php +++ b/lib/private/Console/TimestampFormatter.php @@ -97,11 +97,11 @@ class TimestampFormatter implements OutputFormatterInterface { */ public function format($message) { - $timeZone = $this->config->getSystemValue('logtimezone', null); + $timeZone = $this->config->getSystemValue('logtimezone', 'UTC'); $timeZone = $timeZone !== null ? new \DateTimeZone($timeZone) : null; $time = new \DateTime('now', $timeZone); - $timestampInfo = $time->format($this->config->getSystemValue('logdateformat', 'c')); + $timestampInfo = $time->format($this->config->getSystemValue('logdateformat', \DateTime::ATOM)); return $timestampInfo . ' ' . $this->formatter->format($message); } diff --git a/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php b/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php index f9170e97a025765f51f365f336436a6ed5cea37d..f172260df79e8d6b1516efb8bb39b8ec9ecbfd8b 100644 --- a/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php +++ b/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php @@ -30,6 +30,8 @@ use OC\DB\QueryBuilder\Literal; use OC\DB\QueryBuilder\QueryFunction; use OC\DB\QueryBuilder\QuoteHelper; use OCP\DB\QueryBuilder\IExpressionBuilder; +use OCP\DB\QueryBuilder\ILiteral; +use OCP\DB\QueryBuilder\IQueryFunction; use OCP\IDBConnection; class ExpressionBuilder implements IExpressionBuilder { @@ -39,12 +41,16 @@ class ExpressionBuilder implements IExpressionBuilder { /** @var QuoteHelper */ protected $helper; + /** @var IDBConnection */ + protected $connection; + /** * Initializes a new ExpressionBuilder. * * @param \OCP\IDBConnection $connection */ public function __construct(IDBConnection $connection) { + $this->connection = $connection; $this->helper = new QuoteHelper(); $this->expressionBuilder = new DoctrineExpressionBuilder($connection); } @@ -344,13 +350,43 @@ class ExpressionBuilder implements IExpressionBuilder { return $this->expressionBuilder->notIn($x, $y); } + /** + * Binary AND Operator copies a bit to the result if it exists in both operands. + * + * @param string|ILiteral $x The field or value to check + * @param int $y Bitmap that must be set + * @return IQueryFunction + * @since 12.0.0 + */ + public function bitwiseAnd($x, $y) { + return new QueryFunction($this->connection->getDatabasePlatform()->getBitAndComparisonExpression( + $this->helper->quoteColumnName($x), + $y + )); + } + + /** + * Binary OR Operator copies a bit if it exists in either operand. + * + * @param string|ILiteral $x The field or value to check + * @param int $y Bitmap that must be set + * @return IQueryFunction + * @since 12.0.0 + */ + public function bitwiseOr($x, $y) { + return new QueryFunction($this->connection->getDatabasePlatform()->getBitOrComparisonExpression( + $this->helper->quoteColumnName($x), + $y + )); + } + /** * Quotes a given input parameter. * * @param mixed $input The parameter to be quoted. * @param mixed|null $type One of the IQueryBuilder::PARAM_* constants * - * @return Literal + * @return ILiteral */ public function literal($input, $type = null) { return new Literal($this->expressionBuilder->literal($input, $type)); diff --git a/lib/private/Encryption/Keys/Storage.php b/lib/private/Encryption/Keys/Storage.php index 8149ffe9dcefb8364e6b6820d638eae8476d0a41..e8d152581fe193906498c8acdac064e8fb5021e5 100644 --- a/lib/private/Encryption/Keys/Storage.php +++ b/lib/private/Encryption/Keys/Storage.php @@ -51,6 +51,9 @@ class Storage implements IStorage { /** @var string */ private $encryption_base_dir; + /** @var string */ + private $backup_base_dir; + /** @var array */ private $keyCache = []; @@ -64,6 +67,7 @@ class Storage implements IStorage { $this->encryption_base_dir = '/files_encryption'; $this->keys_base_dir = $this->encryption_base_dir .'/keys'; + $this->backup_base_dir = $this->encryption_base_dir .'/backup'; $this->root_dir = $this->util->getKeyStorageRoot(); } @@ -286,6 +290,37 @@ class Storage implements IStorage { return false; } + /** + * backup keys of a given encryption module + * + * @param string $encryptionModuleId + * @param string $purpose + * @param string $uid + * @return bool + * @since 12.0.0 + */ + public function backupUserKeys($encryptionModuleId, $purpose, $uid) { + $source = $uid . $this->encryption_base_dir . '/' . $encryptionModuleId; + $backupDir = $uid . $this->backup_base_dir; + if (!$this->view->file_exists($backupDir)) { + $this->view->mkdir($backupDir); + } + + $backupDir = $backupDir . '/' . $purpose . '.' . $encryptionModuleId . '.' . $this->getTimestamp(); + $this->view->mkdir($backupDir); + + return $this->view->copy($source, $backupDir); + } + + /** + * get the current timestamp + * + * @return int + */ + protected function getTimestamp() { + return time(); + } + /** * get system wide path and detect mount points * diff --git a/lib/private/Files/Cache/Cache.php b/lib/private/Files/Cache/Cache.php index 3a3f51488e6c701238ae5f4b5d897fd7aeb85c55..a966d621c58d4e617c461b2545b24ff1e250a0af 100644 --- a/lib/private/Files/Cache/Cache.php +++ b/lib/private/Files/Cache/Cache.php @@ -142,7 +142,7 @@ class Cache implements ICache { } return $data; } else { - return self::cacheEntryFromData($data, $this->storageId, $this->mimetypeLoader); + return self::cacheEntryFromData($data, $this->mimetypeLoader); } } @@ -150,11 +150,10 @@ class Cache implements ICache { * Create a CacheEntry from database row * * @param array $data - * @param string $storageId * @param IMimeTypeLoader $mimetypeLoader * @return CacheEntry */ - public static function cacheEntryFromData($data, $storageId, IMimeTypeLoader $mimetypeLoader) { + public static function cacheEntryFromData($data, IMimeTypeLoader $mimetypeLoader) { //fix types $data['fileid'] = (int)$data['fileid']; $data['parent'] = (int)$data['parent']; @@ -163,7 +162,7 @@ class Cache implements ICache { $data['storage_mtime'] = (int)$data['storage_mtime']; $data['encryptedVersion'] = (int)$data['encrypted']; $data['encrypted'] = (bool)$data['encrypted']; - $data['storage'] = $storageId; + $data['storage_id'] = $data['storage']; $data['mimetype'] = $mimetypeLoader->getMimetypeById($data['mimetype']); $data['mimepart'] = $mimetypeLoader->getMimetypeById($data['mimepart']); if ($data['storage_mtime'] == 0) { diff --git a/lib/private/Files/Config/UserMountCache.php b/lib/private/Files/Config/UserMountCache.php index c9a701d24b6a7dd21f60db88c93041e045cb51d3..423eb5c423dfbece0ed0f15c35ae17925911cff5 100644 --- a/lib/private/Files/Config/UserMountCache.php +++ b/lib/private/Files/Config/UserMountCache.php @@ -141,7 +141,11 @@ class UserMountCache implements IUserMountCache { foreach ($cachedMounts as $cachedMount) { if ( $newMount->getRootId() === $cachedMount->getRootId() && - ($newMount->getMountPoint() !== $cachedMount->getMountPoint() || $newMount->getMountId() !== $cachedMount->getMountId()) + ( + $newMount->getMountPoint() !== $cachedMount->getMountPoint() || + $newMount->getStorageId() !== $cachedMount->getStorageId() || + $newMount->getMountId() !== $cachedMount->getMountId() + ) ) { $changed[] = $newMount; } @@ -169,6 +173,7 @@ class UserMountCache implements IUserMountCache { $builder = $this->connection->getQueryBuilder(); $query = $builder->update('mounts') + ->set('storage_id', $builder->createNamedParameter($mount->getStorageId())) ->set('mount_point', $builder->createNamedParameter($mount->getMountPoint())) ->set('mount_id', $builder->createNamedParameter($mount->getMountId(), IQueryBuilder::PARAM_INT)) ->where($builder->expr()->eq('user_id', $builder->createNamedParameter($mount->getUser()->getUID()))) diff --git a/lib/private/Files/Mount/LocalHomeMountProvider.php b/lib/private/Files/Mount/LocalHomeMountProvider.php index 23bbfcd5ffad3efde2f3c802eac165d587484cbb..9057f62995f31efb0113f22ab26021bb8df65a88 100644 --- a/lib/private/Files/Mount/LocalHomeMountProvider.php +++ b/lib/private/Files/Mount/LocalHomeMountProvider.php @@ -39,9 +39,6 @@ class LocalHomeMountProvider implements IHomeMountProvider { */ public function getHomeMountForUser(IUser $user, IStorageFactory $loader) { $arguments = ['user' => $user]; - if (\OC\Files\Cache\Storage::exists('local::' . $user->getHome() . '/')) { - $arguments['legacy'] = true; - } return new MountPoint('\OC\Files\Storage\Home', '/' . $user->getUID(), $arguments, $loader); } } diff --git a/lib/private/Files/Node/File.php b/lib/private/Files/Node/File.php index c4430b9181daf0bd2fc68f9685326c3039c4d66d..4bfa5d583f78938abf86fec10c3601dfe6a52eef 100644 --- a/lib/private/Files/Node/File.php +++ b/lib/private/Files/Node/File.php @@ -29,6 +29,16 @@ namespace OC\Files\Node; use OCP\Files\NotPermittedException; class File extends Node implements \OCP\Files\File { + /** + * Creates a Folder that represents a non-existing path + * + * @param string $path path + * @return string non-existing node class + */ + protected function createNonExistingNode($path) { + return new NonExistingFile($this->root, $this->view, $path); + } + /** * @return string * @throws \OCP\Files\NotPermittedException @@ -113,52 +123,6 @@ class File extends Node implements \OCP\Files\File { } } - /** - * @param string $targetPath - * @throws \OCP\Files\NotPermittedException - * @return \OC\Files\Node\Node - */ - public function copy($targetPath) { - $targetPath = $this->normalizePath($targetPath); - $parent = $this->root->get(dirname($targetPath)); - if ($parent instanceof Folder and $this->isValidPath($targetPath) and $parent->isCreatable()) { - $nonExisting = new NonExistingFile($this->root, $this->view, $targetPath); - $this->root->emit('\OC\Files', 'preCopy', array($this, $nonExisting)); - $this->root->emit('\OC\Files', 'preWrite', array($nonExisting)); - $this->view->copy($this->path, $targetPath); - $targetNode = $this->root->get($targetPath); - $this->root->emit('\OC\Files', 'postCopy', array($this, $targetNode)); - $this->root->emit('\OC\Files', 'postWrite', array($targetNode)); - return $targetNode; - } else { - throw new NotPermittedException(); - } - } - - /** - * @param string $targetPath - * @throws \OCP\Files\NotPermittedException - * @return \OC\Files\Node\Node - */ - public function move($targetPath) { - $targetPath = $this->normalizePath($targetPath); - $parent = $this->root->get(dirname($targetPath)); - if ($parent instanceof Folder and $this->isValidPath($targetPath) and $parent->isCreatable()) { - $nonExisting = new NonExistingFile($this->root, $this->view, $targetPath); - $this->root->emit('\OC\Files', 'preRename', array($this, $nonExisting)); - $this->root->emit('\OC\Files', 'preWrite', array($nonExisting)); - $this->view->rename($this->path, $targetPath); - $targetNode = $this->root->get($targetPath); - $this->root->emit('\OC\Files', 'postRename', array($this, $targetNode)); - $this->root->emit('\OC\Files', 'postWrite', array($targetNode)); - $this->path = $targetPath; - $this->fileInfo = null; - return $targetNode; - } else { - throw new NotPermittedException(); - } - } - /** * @param string $type * @param bool $raw diff --git a/lib/private/Files/Node/Folder.php b/lib/private/Files/Node/Folder.php index 288a02ef2071807962b520a6fc28167158101fa0..fd907f708f39376810c7dba042780c2aca568c83 100644 --- a/lib/private/Files/Node/Folder.php +++ b/lib/private/Files/Node/Folder.php @@ -35,6 +35,16 @@ use OCP\Files\NotFoundException; use OCP\Files\NotPermittedException; class Folder extends Node implements \OCP\Files\Folder { + /** + * Creates a Folder that represents a non-existing path + * + * @param string $path path + * @return string non-existing node class + */ + protected function createNonExistingNode($path) { + return new NonExistingFolder($this->root, $this->view, $path); + } + /** * @param string $path path relative to the folder * @return string @@ -325,51 +335,6 @@ class Folder extends Node implements \OCP\Files\Folder { } } - /** - * @param string $targetPath - * @throws \OCP\Files\NotPermittedException - * @return \OC\Files\Node\Node - */ - public function copy($targetPath) { - $targetPath = $this->normalizePath($targetPath); - $parent = $this->root->get(dirname($targetPath)); - if ($parent instanceof Folder and $this->isValidPath($targetPath) and $parent->isCreatable()) { - $nonExisting = new NonExistingFolder($this->root, $this->view, $targetPath); - $this->root->emit('\OC\Files', 'preCopy', array($this, $nonExisting)); - $this->root->emit('\OC\Files', 'preWrite', array($nonExisting)); - $this->view->copy($this->path, $targetPath); - $targetNode = $this->root->get($targetPath); - $this->root->emit('\OC\Files', 'postCopy', array($this, $targetNode)); - $this->root->emit('\OC\Files', 'postWrite', array($targetNode)); - return $targetNode; - } else { - throw new NotPermittedException('No permission to copy to path'); - } - } - - /** - * @param string $targetPath - * @throws \OCP\Files\NotPermittedException - * @return \OC\Files\Node\Node - */ - public function move($targetPath) { - $targetPath = $this->normalizePath($targetPath); - $parent = $this->root->get(dirname($targetPath)); - if ($parent instanceof Folder and $this->isValidPath($targetPath) and $parent->isCreatable()) { - $nonExisting = new NonExistingFolder($this->root, $this->view, $targetPath); - $this->root->emit('\OC\Files', 'preRename', array($this, $nonExisting)); - $this->root->emit('\OC\Files', 'preWrite', array($nonExisting)); - $this->view->rename($this->path, $targetPath); - $targetNode = $this->root->get($targetPath); - $this->root->emit('\OC\Files', 'postRename', array($this, $targetNode)); - $this->root->emit('\OC\Files', 'postWrite', array($targetNode)); - $this->path = $targetPath; - return $targetNode; - } else { - throw new NotPermittedException('No permission to move to path'); - } - } - /** * Add a suffix to the name in case the file exists * diff --git a/lib/private/Files/Node/Node.php b/lib/private/Files/Node/Node.php index 226c182622f2b9a953acf5d80c93fe41261f517b..e00debe69032663af17f80359b19a33d79d90be8 100644 --- a/lib/private/Files/Node/Node.php +++ b/lib/private/Files/Node/Node.php @@ -33,6 +33,7 @@ use OCP\Files\InvalidPathException; use OCP\Files\NotFoundException; use OCP\Files\NotPermittedException; +// FIXME: this class really should be abstract class Node implements \OCP\Files\Node { /** * @var \OC\Files\View $view @@ -56,7 +57,7 @@ class Node implements \OCP\Files\Node { /** * @param \OC\Files\View $view - * @param \OC\Files\Node\Root $root + * @param \OCP\Files\IRootFolder $root * @param string $path * @param FileInfo $fileInfo */ @@ -67,6 +68,16 @@ class Node implements \OCP\Files\Node { $this->fileInfo = $fileInfo; } + /** + * Creates a Node of the same type that represents a non-existing path + * + * @param string $path path + * @return string non-existing node class + */ + protected function createNonExistingNode($path) { + throw new \Exception('Must be implemented by subclasses'); + } + /** * Returns the matching file info * @@ -106,27 +117,10 @@ class Node implements \OCP\Files\Node { return ($this->getPermissions() & $permissions) === $permissions; } - /** - * @param string $targetPath - * @throws \OCP\Files\NotPermittedException - * @return \OC\Files\Node\Node - */ - public function move($targetPath) { - return; - } - public function delete() { return; } - /** - * @param string $targetPath - * @return \OC\Files\Node\Node - */ - public function copy($targetPath) { - return; - } - /** * @param int $mtime * @throws \OCP\Files\NotPermittedException @@ -381,4 +375,54 @@ class Node implements \OCP\Files\Node { public function unlock($type) { $this->view->unlockFile($this->path, $type); } + + /** + * @param string $targetPath + * @throws \OCP\Files\NotPermittedException if copy not allowed or failed + * @return \OC\Files\Node\Node + */ + public function copy($targetPath) { + $targetPath = $this->normalizePath($targetPath); + $parent = $this->root->get(dirname($targetPath)); + if ($parent instanceof Folder and $this->isValidPath($targetPath) and $parent->isCreatable()) { + $nonExisting = $this->createNonExistingNode($targetPath); + $this->root->emit('\OC\Files', 'preCopy', [$this, $nonExisting]); + $this->root->emit('\OC\Files', 'preWrite', [$nonExisting]); + if (!$this->view->copy($this->path, $targetPath)) { + throw new NotPermittedException('Could not copy ' . $this->path . ' to ' . $targetPath); + } + $targetNode = $this->root->get($targetPath); + $this->root->emit('\OC\Files', 'postCopy', [$this, $targetNode]); + $this->root->emit('\OC\Files', 'postWrite', [$targetNode]); + return $targetNode; + } else { + throw new NotPermittedException('No permission to copy to path ' . $targetPath); + } + } + + /** + * @param string $targetPath + * @throws \OCP\Files\NotPermittedException if move not allowed or failed + * @return \OC\Files\Node\Node + */ + public function move($targetPath) { + $targetPath = $this->normalizePath($targetPath); + $parent = $this->root->get(dirname($targetPath)); + if ($parent instanceof Folder and $this->isValidPath($targetPath) and $parent->isCreatable()) { + $nonExisting = $this->createNonExistingNode($targetPath); + $this->root->emit('\OC\Files', 'preRename', [$this, $nonExisting]); + $this->root->emit('\OC\Files', 'preWrite', [$nonExisting]); + if (!$this->view->rename($this->path, $targetPath)) { + throw new NotPermittedException('Could not move ' . $this->path . ' to ' . $targetPath); + } + $targetNode = $this->root->get($targetPath); + $this->root->emit('\OC\Files', 'postRename', [$this, $targetNode]); + $this->root->emit('\OC\Files', 'postWrite', [$targetNode]); + $this->path = $targetPath; + return $targetNode; + } else { + throw new NotPermittedException('No permission to move to path ' . $targetPath); + } + } + } diff --git a/lib/private/Files/Notify/Change.php b/lib/private/Files/Notify/Change.php new file mode 100644 index 0000000000000000000000000000000000000000..78cc007b27dad2c0ac4a62274db9e631196be133 --- /dev/null +++ b/lib/private/Files/Notify/Change.php @@ -0,0 +1,65 @@ + + * + * @author Robin Appelman + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OC\Files\Notify; + +use OCP\Files\Notify\IChange; + +class Change implements IChange { + /** @var int */ + private $type; + + /** @var string */ + private $path; + + /** + * Change constructor. + * + * @param int $type + * @param string $path + */ + public function __construct($type, $path) { + $this->type = $type; + $this->path = $path; + } + + /** + * Get the type of the change + * + * @return int IChange::ADDED, IChange::REMOVED, IChange::MODIFIED or IChange::RENAMED + */ + public function getType() { + return $this->type; + } + + /** + * Get the path of the file that was changed relative to the root of the storage + * + * Note, for rename changes this path is the old path for the file + * + * @return mixed + */ + public function getPath() { + return $this->path; + } +} diff --git a/lib/private/Files/Notify/RenameChange.php b/lib/private/Files/Notify/RenameChange.php new file mode 100644 index 0000000000000000000000000000000000000000..b83dffa0cb2d8667b5cf236bb88e7f86dfa8e9dd --- /dev/null +++ b/lib/private/Files/Notify/RenameChange.php @@ -0,0 +1,52 @@ + + * + * @author Robin Appelman + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OC\Files\Notify; + +use OCP\Files\Notify\IRenameChange; + +class RenameChange extends Change implements IRenameChange { + /** @var string */ + private $targetPath; + + /** + * Change constructor. + * + * @param int $type + * @param string $path + * @param string $targetPath + */ + public function __construct($type, $path, $targetPath) { + parent::__construct($type, $path); + $this->targetPath = $targetPath; + } + + /** + * Get the new path of the renamed file relative to the storage root + * + * @return string + */ + public function getTargetPath() { + return $this->targetPath; + } +} diff --git a/lib/private/Files/ObjectStore/ObjectStoreStorage.php b/lib/private/Files/ObjectStore/ObjectStoreStorage.php index 2dcf830cc1e7f06d9bf1163c9b9685059ea3ee06..ab77c21e6c4830137419c7612374440f086f98e8 100644 --- a/lib/private/Files/ObjectStore/ObjectStoreStorage.php +++ b/lib/private/Files/ObjectStore/ObjectStoreStorage.php @@ -25,16 +25,12 @@ namespace OC\Files\ObjectStore; +use Icewind\Streams\CallbackWrapper; use Icewind\Streams\IteratorDirectory; use OC\Files\Cache\CacheEntry; use OCP\Files\ObjectStore\IObjectStore; class ObjectStoreStorage extends \OC\Files\Storage\Common { - - /** - * @var array - */ - private static $tmpFiles = array(); /** * @var \OCP\Files\ObjectStore\IObjectStore $objectStore */ @@ -291,14 +287,14 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common { $ext = ''; } $tmpFile = \OC::$server->getTempManager()->getTemporaryFile($ext); - \OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack')); if ($this->file_exists($path)) { $source = $this->fopen($path, 'r'); file_put_contents($tmpFile, $source); } - self::$tmpFiles[$tmpFile] = $path; - - return fopen('close://' . $tmpFile, $mode); + $handle = fopen($tmpFile, $mode); + return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) { + $this->writeBack($tmpFile, $path); + }); } return false; } @@ -368,12 +364,7 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common { return true; } - public function writeBack($tmpFile) { - if (!isset(self::$tmpFiles[$tmpFile])) { - return; - } - - $path = self::$tmpFiles[$tmpFile]; + public function writeBack($tmpFile, $path) { $stat = $this->stat($path); if (empty($stat)) { // create new file diff --git a/lib/private/Files/Storage/Common.php b/lib/private/Files/Storage/Common.php index 5561f6a889b8b359d7c93d658b5641c94503c326..f3e3cb9e58c6d587a58febcca99b9d8a1d97061a 100644 --- a/lib/private/Files/Storage/Common.php +++ b/lib/private/Files/Storage/Common.php @@ -436,10 +436,14 @@ abstract class Common implements Storage, ILockingStorage { * @return bool */ public function test() { - if ($this->stat('')) { - return true; + try { + if ($this->stat('')) { + return true; + } + return false; + } catch (\Exception $e) { + return false; } - return false; } /** diff --git a/lib/private/Files/Storage/DAV.php b/lib/private/Files/Storage/DAV.php index ea4bbba2748c03320749857182def651e5d200b3..3b89a66d6a2ceab97f346bbd03b03df7edf72d82 100644 --- a/lib/private/Files/Storage/DAV.php +++ b/lib/private/Files/Storage/DAV.php @@ -36,6 +36,7 @@ namespace OC\Files\Storage; use Exception; use GuzzleHttp\Exception\RequestException; use GuzzleHttp\Message\ResponseInterface; +use Icewind\Streams\CallbackWrapper; use OC\Files\Filesystem; use OC\Files\Stream\Close; use Icewind\Streams\IteratorDirectory; @@ -48,7 +49,6 @@ use OCP\Files\StorageInvalidException; use OCP\Files\StorageNotAvailableException; use OCP\Util; use Sabre\DAV\Client; -use Sabre\DAV\Exception\NotFound; use Sabre\DAV\Xml\Property\ResourceType; use Sabre\HTTP\ClientException; use Sabre\HTTP\ClientHttpException; @@ -77,8 +77,6 @@ class DAV extends Common { private $client; /** @var ArrayCache */ private $statCache; - /** @var array */ - private static $tempFiles = []; /** @var \OCP\Http\Client\IClientService */ private $httpClientService; @@ -203,13 +201,15 @@ class DAV extends Common { $this->init(); $path = $this->cleanPath($path); try { - $response = $this->client->propfind( + $response = $this->client->propFind( $this->encodePath($path), - array(), + [], 1 ); - $id = md5('webdav' . $this->root . $path); - $content = array(); + if ($response === false) { + return false; + } + $content = []; $files = array_keys($response); array_shift($files); //the first entry is the current directory @@ -226,13 +226,6 @@ class DAV extends Common { $content[] = $file; } return IteratorDirectory::wrap($content); - } catch (ClientHttpException $e) { - if ($e->getHttpStatus() === 404) { - $this->statCache->clear($path . '/'); - $this->statCache->set($path, false); - return false; - } - $this->convertException($e, $path); } catch (\Exception $e) { $this->convertException($e, $path); } @@ -247,22 +240,18 @@ class DAV extends Common { * * @param string $path path to propfind * - * @return array propfind response + * @return array|boolean propfind response or false if the entry was not found * - * @throws NotFound + * @throws ClientHttpException */ protected function propfind($path) { $path = $this->cleanPath($path); $cachedResponse = $this->statCache->get($path); - if ($cachedResponse === false) { - // we know it didn't exist - throw new NotFound(); - } // we either don't know it, or we know it exists but need more details if (is_null($cachedResponse) || $cachedResponse === true) { $this->init(); try { - $response = $this->client->propfind( + $response = $this->client->propFind( $this->encodePath($path), array( '{DAV:}getlastmodified', @@ -275,11 +264,15 @@ class DAV extends Common { ) ); $this->statCache->set($path, $response); - } catch (NotFound $e) { - // remember that this path did not exist - $this->statCache->clear($path . '/'); - $this->statCache->set($path, false); - throw $e; + } catch (ClientHttpException $e) { + if ($e->getHttpStatus() === 404) { + $this->statCache->clear($path . '/'); + $this->statCache->set($path, false); + return false; + } + $this->convertException($e, $path); + } catch (\Exception $e) { + $this->convertException($e, $path); } } else { $response = $cachedResponse; @@ -291,17 +284,15 @@ class DAV extends Common { public function filetype($path) { try { $response = $this->propfind($path); - $responseType = array(); + if ($response === false) { + return false; + } + $responseType = []; if (isset($response["{DAV:}resourcetype"])) { /** @var ResourceType[] $response */ $responseType = $response["{DAV:}resourcetype"]->getValue(); } return (count($responseType) > 0 and $responseType[0] == "{DAV:}collection") ? 'dir' : 'file'; - } catch (ClientHttpException $e) { - if ($e->getHttpStatus() === 404) { - return false; - } - $this->convertException($e, $path); } catch (\Exception $e) { $this->convertException($e, $path); } @@ -320,13 +311,7 @@ class DAV extends Common { return true; } // need to get from server - $this->propfind($path); - return true; //no 404 exception - } catch (ClientHttpException $e) { - if ($e->getHttpStatus() === 404) { - return false; - } - $this->convertException($e, $path); + return ($this->propfind($path) !== false); } catch (\Exception $e) { $this->convertException($e, $path); } @@ -409,20 +394,19 @@ class DAV extends Common { } $tmpFile = $tempManager->getTemporaryFile($ext); } - Close::registerCallback($tmpFile, array($this, 'writeBack')); - self::$tempFiles[$tmpFile] = $path; - return fopen('close://' . $tmpFile, $mode); + $handle = fopen($tmpFile, $mode); + return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) { + $this->writeBack($tmpFile, $path); + }); } } /** * @param string $tmpFile */ - public function writeBack($tmpFile) { - if (isset(self::$tempFiles[$tmpFile])) { - $this->uploadFile($tmpFile, self::$tempFiles[$tmpFile]); - unlink($tmpFile); - } + public function writeBack($tmpFile, $path) { + $this->uploadFile($tmpFile, $path); + unlink($tmpFile); } /** {@inheritdoc} */ @@ -431,7 +415,10 @@ class DAV extends Common { $path = $this->cleanPath($path); try { // TODO: cacheable ? - $response = $this->client->propfind($this->encodePath($path), array('{DAV:}quota-available-bytes')); + $response = $this->client->propfind($this->encodePath($path), ['{DAV:}quota-available-bytes']); + if ($response === false) { + return FileInfo::SPACE_UNKNOWN; + } if (isset($response['{DAV:}quota-available-bytes'])) { return (int)$response['{DAV:}quota-available-bytes']; } else { @@ -457,6 +444,9 @@ class DAV extends Common { $this->client->proppatch($this->encodePath($path), ['{DAV:}lastmodified' => $mtime]); // non-owncloud clients might not have accepted the property, need to recheck it $response = $this->client->propfind($this->encodePath($path), ['{DAV:}getlastmodified'], 0); + if ($response === false) { + return false; + } if (isset($response['{DAV:}getlastmodified'])) { $remoteMtime = strtotime($response['{DAV:}getlastmodified']); if ($remoteMtime !== $mtime) { @@ -579,15 +569,13 @@ class DAV extends Common { public function stat($path) { try { $response = $this->propfind($path); - return array( + if (!$response) { + return false; + } + return [ 'mtime' => strtotime($response['{DAV:}getlastmodified']), 'size' => (int)isset($response['{DAV:}getcontentlength']) ? $response['{DAV:}getcontentlength'] : 0, - ); - } catch (ClientHttpException $e) { - if ($e->getHttpStatus() === 404) { - return array(); - } - $this->convertException($e, $path); + ]; } catch (\Exception $e) { $this->convertException($e, $path); } @@ -598,7 +586,10 @@ class DAV extends Common { public function getMimeType($path) { try { $response = $this->propfind($path); - $responseType = array(); + if ($response === false) { + return false; + } + $responseType = []; if (isset($response["{DAV:}resourcetype"])) { /** @var ResourceType[] $response */ $responseType = $response["{DAV:}resourcetype"]->getValue(); @@ -611,11 +602,6 @@ class DAV extends Common { } else { return false; } - } catch (ClientHttpException $e) { - if ($e->getHttpStatus() === 404) { - return false; - } - $this->convertException($e, $path); } catch (\Exception $e) { $this->convertException($e, $path); } @@ -706,6 +692,9 @@ class DAV extends Common { $this->init(); $path = $this->cleanPath($path); $response = $this->propfind($path); + if ($response === false) { + return 0; + } if (isset($response['{http://owncloud.org/ns}permissions'])) { return $this->parsePermissions($response['{http://owncloud.org/ns}permissions']); } else if ($this->is_dir($path)) { @@ -722,6 +711,9 @@ class DAV extends Common { $this->init(); $path = $this->cleanPath($path); $response = $this->propfind($path); + if ($response === false) { + return null; + } if (isset($response['{DAV:}getetag'])) { return trim($response['{DAV:}getetag'], '"'); } @@ -765,6 +757,13 @@ class DAV extends Common { // force refresh for $path $this->statCache->remove($path); $response = $this->propfind($path); + if ($response === false) { + if ($path === '') { + // if root is gone it means the storage is not available + throw new StorageNotAvailableException(get_class($e) . ': ' . $e->getMessage()); + } + return false; + } if (isset($response['{DAV:}getetag'])) { $cachedData = $this->getCache()->get($path); $etag = null; @@ -787,7 +786,7 @@ class DAV extends Common { return $remoteMtime > $time; } } catch (ClientHttpException $e) { - if ($e->getHttpStatus() === 404 || $e->getHttpStatus() === 405) { + if ($e->getHttpStatus() === 405) { if ($path === '') { // if root is gone it means the storage is not available throw new StorageNotAvailableException(get_class($e) . ': ' . $e->getMessage()); diff --git a/lib/private/Files/Storage/Home.php b/lib/private/Files/Storage/Home.php index e5ba0f9dfe43329b6ea97a13690f83688e600c1f..57b3234932406715d3b5ed043336476852b05746 100644 --- a/lib/private/Files/Storage/Home.php +++ b/lib/private/Files/Storage/Home.php @@ -44,19 +44,12 @@ class Home extends Local implements \OCP\Files\IHomeStorage { /** * Construct a Home storage instance * @param array $arguments array with "user" containing the - * storage owner and "legacy" containing "true" if the storage is - * a legacy storage with "local::" URL instead of the new "home::" one. + * storage owner */ public function __construct($arguments) { $this->user = $arguments['user']; $datadir = $this->user->getHome(); - if (isset($arguments['legacy']) && $arguments['legacy']) { - // legacy home id (<= 5.0.12) - $this->id = 'local::' . $datadir . '/'; - } - else { - $this->id = 'home::' . $this->user->getUID(); - } + $this->id = 'home::' . $this->user->getUID(); parent::__construct(array('datadir' => $datadir)); } diff --git a/lib/private/Files/Storage/Local.php b/lib/private/Files/Storage/Local.php index 4fe7dcafbbfcb44263dee0604845f9d2555a5b97..80d48680be13841bc2a0c95d77c818a87c00035a 100644 --- a/lib/private/Files/Storage/Local.php +++ b/lib/private/Files/Storage/Local.php @@ -205,18 +205,7 @@ class Local extends \OC\Files\Storage\Common { } public function file_get_contents($path) { - // file_get_contents() has a memory leak: https://bugs.php.net/bug.php?id=61961 - $fileName = $this->getSourcePath($path); - - $fileSize = filesize($fileName); - if ($fileSize === 0) { - return ''; - } - - $handle = fopen($fileName, 'rb'); - $content = fread($handle, $fileSize); - fclose($handle); - return $content; + return file_get_contents($this->getSourcePath($path)); } public function file_put_contents($path, $data) { diff --git a/lib/private/Files/Stream/Close.php b/lib/private/Files/Stream/Close.php deleted file mode 100644 index 7cc9903c9124bf713929752a9a8b9b1cc2c4f728..0000000000000000000000000000000000000000 --- a/lib/private/Files/Stream/Close.php +++ /dev/null @@ -1,119 +0,0 @@ - - * @author Morris Jobke - * @author Robin Appelman - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see - * - */ - -namespace OC\Files\Stream; - -/** - * stream wrapper that provides a callback on stream close - */ -class Close { - private static $callBacks = array(); - private $path = ''; - private $source; - private static $open = array(); - - public function stream_open($path, $mode, $options, &$opened_path) { - $path = substr($path, strlen('close://')); - $this->path = $path; - $this->source = fopen($path, $mode); - if (is_resource($this->source)) { - $this->meta = stream_get_meta_data($this->source); - } - self::$open[] = $path; - return is_resource($this->source); - } - - public function stream_seek($offset, $whence = SEEK_SET) { - return fseek($this->source, $offset, $whence) === 0; - } - - public function stream_tell() { - return ftell($this->source); - } - - public function stream_read($count) { - return fread($this->source, $count); - } - - public function stream_write($data) { - return fwrite($this->source, $data); - } - - public function stream_set_option($option, $arg1, $arg2) { - switch ($option) { - case STREAM_OPTION_BLOCKING: - stream_set_blocking($this->source, $arg1); - break; - case STREAM_OPTION_READ_TIMEOUT: - stream_set_timeout($this->source, $arg1, $arg2); - break; - case STREAM_OPTION_WRITE_BUFFER: - stream_set_write_buffer($this->source, $arg1, $arg2); - } - } - - public function stream_stat() { - return fstat($this->source); - } - - public function stream_lock($mode) { - flock($this->source, $mode); - } - - public function stream_flush() { - return fflush($this->source); - } - - public function stream_eof() { - return feof($this->source); - } - - public function url_stat($path) { - $path = substr($path, strlen('close://')); - if (file_exists($path)) { - return stat($path); - } else { - return false; - } - } - - public function stream_close() { - fclose($this->source); - if (isset(self::$callBacks[$this->path])) { - call_user_func(self::$callBacks[$this->path], $this->path); - } - } - - public function unlink($path) { - $path = substr($path, strlen('close://')); - return unlink($path); - } - - /** - * @param string $path - */ - public static function registerCallback($path, $callback) { - self::$callBacks[$path] = $callback; - } -} diff --git a/lib/private/Files/Stream/Dir.php b/lib/private/Files/Stream/Dir.php deleted file mode 100644 index f8f6b1fa89a18158af7e20ec3c3b296e80de0ec1..0000000000000000000000000000000000000000 --- a/lib/private/Files/Stream/Dir.php +++ /dev/null @@ -1,67 +0,0 @@ - - * @author Morris Jobke - * @author Robin Appelman - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see - * - */ - -namespace OC\Files\Stream; - -class Dir { - private static $dirs = array(); - private $name; - private $index; - - public function dir_opendir($path, $options) { - $this->name = substr($path, strlen('fakedir://')); - $this->index = 0; - if (!isset(self::$dirs[$this->name])) { - self::$dirs[$this->name] = array(); - } - return true; - } - - public function dir_readdir() { - if ($this->index >= count(self::$dirs[$this->name])) { - return false; - } - $filename = self::$dirs[$this->name][$this->index]; - $this->index++; - return $filename; - } - - public function dir_closedir() { - $this->name = ''; - return true; - } - - public function dir_rewinddir() { - $this->index = 0; - return true; - } - - /** - * @param string $path - * @param string[] $content - */ - public static function register($path, $content) { - self::$dirs[$path] = $content; - } -} diff --git a/lib/private/Files/Stream/Quota.php b/lib/private/Files/Stream/Quota.php index f064ca6c0112d77b573593aa11cba63b36df8c0c..624a2021b9cd58990bed8012989a40385323926a 100644 --- a/lib/private/Files/Stream/Quota.php +++ b/lib/private/Files/Stream/Quota.php @@ -25,61 +25,44 @@ namespace OC\Files\Stream; +use Icewind\Streams\Wrapper; + /** * stream wrapper limits the amount of data that can be written to a stream * - * usage: void \OC\Files\Stream\Quota::register($id, $stream, $limit) - * or: resource \OC\Files\Stream\Quota::wrap($stream, $limit) + * usage: resource \OC\Files\Stream\Quota::wrap($stream, $limit) */ -class Quota { - private static $streams = array(); - - /** - * @var resource $source - */ - private $source; - +class Quota extends Wrapper { /** * @var int $limit */ private $limit; - /** - * @param string $id - * @param resource $stream - * @param int $limit - */ - public static function register($id, $stream, $limit) { - self::$streams[$id] = array($stream, $limit); - } - - /** - * remove all registered streams - */ - public static function clear() { - self::$streams = array(); - } - /** * @param resource $stream * @param int $limit * @return resource */ static public function wrap($stream, $limit) { - $id = uniqid(); - self::register($id, $stream, $limit); - $meta = stream_get_meta_data($stream); - return fopen('quota://' . $id, $meta['mode']); + $context = stream_context_create(array( + 'quota' => array( + 'source' => $stream, + 'limit' => $limit + ) + )); + return Wrapper::wrapSource($stream, $context, 'quota', self::class); } public function stream_open($path, $mode, $options, &$opened_path) { - $id = substr($path, strlen('quota://')); - if (isset(self::$streams[$id])) { - list($this->source, $this->limit) = self::$streams[$id]; - return true; - } else { - return false; - } + $context = $this->loadContext('quota'); + $this->source = $context['source']; + $this->limit = $context['limit']; + + return true; + } + + public function dir_opendir($path, $options) { + return false; } public function stream_seek($offset, $whence = SEEK_SET) { @@ -103,10 +86,6 @@ class Quota { return fseek($this->source, $offset, $whence) === 0; } - public function stream_tell() { - return ftell($this->source); - } - public function stream_read($count) { $this->limit -= $count; return fread($this->source, $count); @@ -121,37 +100,4 @@ class Quota { $this->limit -= $size; return fwrite($this->source, $data); } - - public function stream_set_option($option, $arg1, $arg2) { - switch ($option) { - case STREAM_OPTION_BLOCKING: - stream_set_blocking($this->source, $arg1); - break; - case STREAM_OPTION_READ_TIMEOUT: - stream_set_timeout($this->source, $arg1, $arg2); - break; - case STREAM_OPTION_WRITE_BUFFER: - stream_set_write_buffer($this->source, $arg1, $arg2); - } - } - - public function stream_stat() { - return fstat($this->source); - } - - public function stream_lock($mode) { - return flock($this->source, $mode); - } - - public function stream_flush() { - return fflush($this->source); - } - - public function stream_eof() { - return feof($this->source); - } - - public function stream_close() { - fclose($this->source); - } } diff --git a/lib/private/Files/Stream/StaticStream.php b/lib/private/Files/Stream/StaticStream.php deleted file mode 100644 index 3c91b23fd36f556378a33c690bf5e34b3b65fc5c..0000000000000000000000000000000000000000 --- a/lib/private/Files/Stream/StaticStream.php +++ /dev/null @@ -1,171 +0,0 @@ - - * @author Robin Appelman - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see - * - */ - -namespace OC\Files\Stream; - -class StaticStream { - const MODE_FILE = 0100000; - - public $context; - protected static $data = array(); - - protected $path = ''; - protected $pointer = 0; - protected $writable = false; - - public function stream_close() { - } - - public function stream_eof() { - return $this->pointer >= strlen(self::$data[$this->path]); - } - - public function stream_flush() { - } - - public static function clear() { - self::$data = array(); - } - - public function stream_open($path, $mode, $options, &$opened_path) { - switch ($mode[0]) { - case 'r': - if (!isset(self::$data[$path])) return false; - $this->path = $path; - $this->writable = isset($mode[1]) && $mode[1] == '+'; - break; - case 'w': - self::$data[$path] = ''; - $this->path = $path; - $this->writable = true; - break; - case 'a': - if (!isset(self::$data[$path])) self::$data[$path] = ''; - $this->path = $path; - $this->writable = true; - $this->pointer = strlen(self::$data[$path]); - break; - case 'x': - if (isset(self::$data[$path])) return false; - $this->path = $path; - $this->writable = true; - break; - case 'c': - if (!isset(self::$data[$path])) self::$data[$path] = ''; - $this->path = $path; - $this->writable = true; - break; - default: - return false; - } - $opened_path = $this->path; - return true; - } - - public function stream_read($count) { - $bytes = min(strlen(self::$data[$this->path]) - $this->pointer, $count); - $data = substr(self::$data[$this->path], $this->pointer, $bytes); - $this->pointer += $bytes; - return $data; - } - - public function stream_seek($offset, $whence = SEEK_SET) { - $len = strlen(self::$data[$this->path]); - switch ($whence) { - case SEEK_SET: - if ($offset <= $len) { - $this->pointer = $offset; - return true; - } - break; - case SEEK_CUR: - if ($this->pointer + $offset <= $len) { - $this->pointer += $offset; - return true; - } - break; - case SEEK_END: - if ($len + $offset <= $len) { - $this->pointer = $len + $offset; - return true; - } - break; - } - return false; - } - - public function stream_stat() { - return $this->url_stat($this->path); - } - - public function stream_tell() { - return $this->pointer; - } - - public function stream_write($data) { - if (!$this->writable) return 0; - $size = strlen($data); - if ($this->stream_eof()) { - self::$data[$this->path] .= $data; - } else { - self::$data[$this->path] = substr_replace( - self::$data[$this->path], - $data, - $this->pointer - ); - } - $this->pointer += $size; - return $size; - } - - public function unlink($path) { - if (isset(self::$data[$path])) { - unset(self::$data[$path]); - } - return true; - } - - public function url_stat($path) { - if (isset(self::$data[$path])) { - $size = strlen(self::$data[$path]); - $time = time(); - $data = array( - 'dev' => 0, - 'ino' => 0, - 'mode' => self::MODE_FILE | 0777, - 'nlink' => 1, - 'uid' => 0, - 'gid' => 0, - 'rdev' => '', - 'size' => $size, - 'atime' => $time, - 'mtime' => $time, - 'ctime' => $time, - 'blksize' => -1, - 'blocks' => -1, - ); - return array_values($data) + $data; - } - return false; - } -} diff --git a/lib/private/Files/Type/Detection.php b/lib/private/Files/Type/Detection.php index 84d727ebb0e9a8e21c97729eaa886053645aef3e..cd4ddc2f06745313dce2c6360697410599d4ca7e 100644 --- a/lib/private/Files/Type/Detection.php +++ b/lib/private/Files/Type/Detection.php @@ -167,6 +167,10 @@ class Detection implements IMimeTypeDetector { $this->loadMappings(); $fileName = basename($path); + + // remove leading dot on hidden files with a file extension + $fileName = ltrim($fileName, '.'); + // note: leading dot doesn't qualify as extension if (strpos($fileName, '.') > 0) { //try to guess the type by the file extension diff --git a/lib/private/Files/Utils/Scanner.php b/lib/private/Files/Utils/Scanner.php index d26c601be1aed3497b86036abe0c561a4c62e1bb..98e2c3c8ca2a655a1fb5ddb5d19966e8b106975a 100644 --- a/lib/private/Files/Utils/Scanner.php +++ b/lib/private/Files/Utils/Scanner.php @@ -31,6 +31,7 @@ use OC\Files\Filesystem; use OC\ForbiddenException; use OC\Hooks\PublicEmitter; use OC\Lock\DBLockingProvider; +use OCA\Files_Sharing\SharedStorage; use OCP\Files\Storage\IStorage; use OCP\Files\StorageNotAvailableException; use OCP\ILogger; @@ -118,14 +119,19 @@ class Scanner extends PublicEmitter { public function backgroundScan($dir) { $mounts = $this->getMounts($dir); foreach ($mounts as $mount) { - if (is_null($mount->getStorage())) { + $storage = $mount->getStorage(); + if (is_null($storage)) { continue; } // don't scan the root storage - if ($mount->getStorage()->instanceOfStorage('\OC\Files\Storage\Local') && $mount->getMountPoint() === '/') { + if ($storage->instanceOfStorage('\OC\Files\Storage\Local') && $mount->getMountPoint() === '/') { + continue; + } + + // don't scan received local shares, these can be scanned when scanning the owner's storage + if ($storage->instanceOfStorage(SharedStorage::class)) { continue; } - $storage = $mount->getStorage(); $scanner = $storage->getScanner(); $this->attachListener($mount); @@ -156,10 +162,10 @@ class Scanner extends PublicEmitter { } $mounts = $this->getMounts($dir); foreach ($mounts as $mount) { - if (is_null($mount->getStorage())) { + $storage = $mount->getStorage(); + if (is_null($storage)) { continue; } - $storage = $mount->getStorage(); // if the home storage isn't writable then the scanner is run as the wrong user if ($storage->instanceOfStorage('\OC\Files\Storage\Home') and (!$storage->isCreatable('') or !$storage->isCreatable('files')) @@ -171,6 +177,11 @@ class Scanner extends PublicEmitter { } } + + // don't scan received local shares, these can be scanned when scanning the owner's storage + if ($storage->instanceOfStorage(SharedStorage::class)) { + continue; + } $relativePath = $mount->getInternalPath($dir); $scanner = $storage->getScanner(); $scanner->setUseTransactions(false); diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php index 6facc7b9462caa771d18b395503fef7b0fc0956b..db21d400b39ea20f573fe2134e058d2fad7d0a89 100644 --- a/lib/private/Files/View.php +++ b/lib/private/Files/View.php @@ -931,39 +931,36 @@ class View { /** * @param string $path - * @param string $mode + * @param string $mode 'r' or 'w' * @return resource */ public function fopen($path, $mode) { + $mode = str_replace('b', '', $mode); // the binary flag is a windows only feature which we do not support $hooks = array(); switch ($mode) { case 'r': - case 'rb': $hooks[] = 'read'; break; case 'r+': - case 'rb+': case 'w+': - case 'wb+': case 'x+': - case 'xb+': case 'a+': - case 'ab+': $hooks[] = 'read'; $hooks[] = 'write'; break; case 'w': - case 'wb': case 'x': - case 'xb': case 'a': - case 'ab': $hooks[] = 'write'; break; default: \OCP\Util::writeLog('core', 'invalid mode (' . $mode . ') for ' . $path, \OCP\Util::ERROR); } + if ($mode !== 'r' && $mode !== 'w') { + \OC::$server->getLogger()->info('Trying to open a file with a mode other than "r" or "w" can cause severe performance issues with some backends'); + } + return $this->basicOperation('fopen', $path, $hooks, $mode); } @@ -1005,7 +1002,7 @@ class View { // Create the directories if any if (!$this->file_exists($filePath)) { $result = $this->createParentDirectories($filePath); - if($result === false) { + if ($result === false) { return false; } } @@ -1149,6 +1146,8 @@ class View { $unlockLater = false; if ($this->lockingEnabled && $operation === 'fopen' && is_resource($result)) { $unlockLater = true; + // make sure our unlocking callback will still be called if connection is aborted + ignore_user_abort(true); $result = CallbackWrapper::wrap($result, null, null, function () use ($hooks, $path) { if (in_array('write', $hooks)) { $this->unlockFile($path, ILockingProvider::LOCK_EXCLUSIVE); @@ -1357,7 +1356,7 @@ class View { //add the sizes of other mount points to the folder $extOnly = ($includeMountPoints === 'ext'); $mounts = Filesystem::getMountManager()->findIn($path); - $info->setSubMounts(array_filter($mounts, function(IMountPoint $mount) use ($extOnly) { + $info->setSubMounts(array_filter($mounts, function (IMountPoint $mount) use ($extOnly) { $subStorage = $mount->getStorage(); return !($extOnly && $subStorage instanceof \OCA\Files_Sharing\SharedStorage); })); @@ -2106,13 +2105,13 @@ class View { private function createParentDirectories($filePath) { $directoryParts = explode('/', $filePath); $directoryParts = array_filter($directoryParts); - foreach($directoryParts as $key => $part) { + foreach ($directoryParts as $key => $part) { $currentPathElements = array_slice($directoryParts, 0, $key); $currentPath = '/' . implode('/', $currentPathElements); - if($this->is_file($currentPath)) { + if ($this->is_file($currentPath)) { return false; } - if(!$this->file_exists($currentPath)) { + if (!$this->file_exists($currentPath)) { $this->mkdir($currentPath); } } diff --git a/lib/private/Group/Backend.php b/lib/private/Group/Backend.php index 14c36d934225a57b80015e84cea41565d773b2a4..1e8d62f5e42cb64f8ed23d65b6f7bebcddec9031 100644 --- a/lib/private/Group/Backend.php +++ b/lib/private/Group/Backend.php @@ -31,23 +31,14 @@ abstract class Backend implements \OCP\GroupInterface { */ const NOT_IMPLEMENTED = -501; - /** - * actions that user backends can define - */ - const CREATE_GROUP = 0x00000001; - const DELETE_GROUP = 0x00000010; - const ADD_TO_GROUP = 0x00000100; - const REMOVE_FROM_GOUP = 0x00001000; - //OBSOLETE const GET_DISPLAYNAME = 0x00010000; - const COUNT_USERS = 0x00100000; - - protected $possibleActions = array( + protected $possibleActions = [ self::CREATE_GROUP => 'createGroup', self::DELETE_GROUP => 'deleteGroup', self::ADD_TO_GROUP => 'addToGroup', self::REMOVE_FROM_GOUP => 'removeFromGroup', self::COUNT_USERS => 'countUsersInGroup', - ); + self::GROUP_DETAILS => 'getGroupDetails', + ]; /** * Get all supported actions diff --git a/lib/private/Group/Database.php b/lib/private/Group/Database.php index e4144fdbe200e3b2cdf4753878b424d5e8250270..8be24fc50de978e34916d31b4f769cb2bb0feb1d 100644 --- a/lib/private/Group/Database.php +++ b/lib/private/Group/Database.php @@ -202,6 +202,11 @@ class Database extends \OC\Group\Backend { * if the user exists at all. */ public function getUserGroups( $uid ) { + //guests has empty or null $uid + if ($uid === null || $uid === '') { + return []; + } + $this->fixDI(); // No magic! diff --git a/lib/private/Group/Group.php b/lib/private/Group/Group.php index 9379d604c48c4f772f8c6a78ad1347e4b63abe8f..69dce21569496b226481d182b82f84b02ea8f7e1 100644 --- a/lib/private/Group/Group.php +++ b/lib/private/Group/Group.php @@ -31,6 +31,9 @@ namespace OC\Group; use OCP\IGroup; class Group implements IGroup { + /** @var null|string */ + protected $displayName; + /** * @var string $id */ @@ -66,18 +69,27 @@ class Group implements IGroup { * @param \OC\Group\Backend[] $backends * @param \OC\User\Manager $userManager * @param \OC\Hooks\PublicEmitter $emitter + * @param string $displayName */ - public function __construct($gid, $backends, $userManager, $emitter = null) { + public function __construct($gid, $backends, $userManager, $emitter = null, $displayName = null) { $this->gid = $gid; $this->backends = $backends; $this->userManager = $userManager; $this->emitter = $emitter; + $this->displayName = $displayName; } public function getGID() { return $this->gid; } + public function getDisplayName() { + if (is_null($this->displayName)) { + return $this->gid; + } + return $this->displayName; + } + /** * get all users in the group * diff --git a/lib/private/Group/Manager.php b/lib/private/Group/Manager.php index 31911138985bb930a11aeb146ca6a4f319307d66..944598a829688cedd82ff7ea76ebae4c570aa2ab 100644 --- a/lib/private/Group/Manager.php +++ b/lib/private/Group/Manager.php @@ -155,19 +155,29 @@ class Manager extends PublicEmitter implements IGroupManager { /** * @param string $gid + * @param string $displayName * @return \OCP\IGroup */ - protected function getGroupObject($gid) { + protected function getGroupObject($gid, $displayName = null) { $backends = array(); foreach ($this->backends as $backend) { - if ($backend->groupExists($gid)) { + if ($backend->implementsActions(\OC\Group\Backend::GROUP_DETAILS)) { + $groupData = $backend->getGroupDetails($gid); + if (is_array($groupData)) { + // take the display name from the first backend that has a non-null one + if (is_null($displayName) && isset($groupData['displayName'])) { + $displayName = $groupData['displayName']; + } + $backends[] = $backend; + } + } else if ($backend->groupExists($gid)) { $backends[] = $backend; } } if (count($backends) === 0) { return null; } - $this->cachedGroups[$gid] = new Group($gid, $backends, $this->userManager, $this); + $this->cachedGroups[$gid] = new Group($gid, $backends, $this->userManager, $this, $displayName); return $this->cachedGroups[$gid]; } diff --git a/lib/private/Http/Client/Client.php b/lib/private/Http/Client/Client.php index 8e1821113037a8a6a193d7ac21f6e3614c374acb..4697f2e038c918b54770b548c472ceff049a1240 100644 --- a/lib/private/Http/Client/Client.php +++ b/lib/private/Http/Client/Client.php @@ -77,9 +77,10 @@ class Client implements IClient { } } - $this->client->setDefaultOption('headers/User-Agent', 'ownCloud Server Crawler'); - if ($this->getProxyUri() !== '') { - $this->client->setDefaultOption('proxy', $this->getProxyUri()); + $this->client->setDefaultOption('headers/User-Agent', 'Nextcloud Server Crawler'); + $proxyUri = $this->getProxyUri(); + if ($proxyUri !== '') { + $this->client->setDefaultOption('proxy', $proxyUri); } } @@ -93,10 +94,10 @@ class Client implements IClient { $proxyUserPwd = $this->config->getSystemValue('proxyuserpwd', null); $proxyUri = ''; - if (!is_null($proxyUserPwd)) { + if ($proxyUserPwd !== null) { $proxyUri .= $proxyUserPwd . '@'; } - if (!is_null($proxyHost)) { + if ($proxyHost !== null) { $proxyUri .= $proxyHost; } diff --git a/lib/private/IntegrityCheck/Checker.php b/lib/private/IntegrityCheck/Checker.php index 102fe42a99d216859f81583f33183185dc4220c4..419f989fa0fa8e36d87d55503d066f3954c02423 100644 --- a/lib/private/IntegrityCheck/Checker.php +++ b/lib/private/IntegrityCheck/Checker.php @@ -96,12 +96,8 @@ class Checker { * @return bool */ public function isCodeCheckEnforced() { - $signedChannels = [ - 'daily', - 'testing', - 'stable', - ]; - if(!in_array($this->environmentHelper->getChannel(), $signedChannels, true)) { + $notSignedChannels = [ '', 'git']; + if (in_array($this->environmentHelper->getChannel(), $notSignedChannels, true)) { return false; } @@ -115,7 +111,7 @@ class Checker { } else { $isIntegrityCheckDisabled = false; } - if($isIntegrityCheckDisabled === true) { + if ($isIntegrityCheckDisabled === true) { return false; } @@ -271,16 +267,23 @@ class Checker { public function writeAppSignature($path, X509 $certificate, RSA $privateKey) { - if(!is_dir($path)) { - throw new \Exception('Directory does not exist.'); - } - $iterator = $this->getFolderIterator($path); - $hashes = $this->generateHashes($iterator, $path); - $signature = $this->createSignatureData($hashes, $certificate, $privateKey); - $this->fileAccessHelper->file_put_contents( - $path . '/appinfo/signature.json', + $appInfoDir = $path . '/appinfo'; + try { + $this->fileAccessHelper->assertDirectoryExists($appInfoDir); + + $iterator = $this->getFolderIterator($path); + $hashes = $this->generateHashes($iterator, $path); + $signature = $this->createSignatureData($hashes, $certificate, $privateKey); + $this->fileAccessHelper->file_put_contents( + $appInfoDir . '/signature.json', json_encode($signature, JSON_PRETTY_PRINT) - ); + ); + } catch (\Exception $e){ + if (!$this->fileAccessHelper->is_writable($appInfoDir)) { + throw new \Exception($appInfoDir . ' is not writable'); + } + throw $e; + } } /** @@ -289,17 +292,28 @@ class Checker { * @param X509 $certificate * @param RSA $rsa * @param string $path + * @throws \Exception */ public function writeCoreSignature(X509 $certificate, RSA $rsa, $path) { - $iterator = $this->getFolderIterator($path, $path); - $hashes = $this->generateHashes($iterator, $path); - $signatureData = $this->createSignatureData($hashes, $certificate, $rsa); - $this->fileAccessHelper->file_put_contents( - $path . '/core/signature.json', + $coreDir = $path . '/core'; + try { + + $this->fileAccessHelper->assertDirectoryExists($coreDir); + $iterator = $this->getFolderIterator($path, $path); + $hashes = $this->generateHashes($iterator, $path); + $signatureData = $this->createSignatureData($hashes, $certificate, $rsa); + $this->fileAccessHelper->file_put_contents( + $coreDir . '/signature.json', json_encode($signatureData, JSON_PRETTY_PRINT) - ); + ); + } catch (\Exception $e){ + if (!$this->fileAccessHelper->is_writable($coreDir)) { + throw new \Exception($coreDir . ' is not writable'); + } + throw $e; + } } /** diff --git a/lib/private/IntegrityCheck/Helpers/FileAccessHelper.php b/lib/private/IntegrityCheck/Helpers/FileAccessHelper.php index 9e2b76ce11a6219215690d784db90b32546f4bb9..a7e378c165e2dd09bdc6e7613298663dc5e66c05 100644 --- a/lib/private/IntegrityCheck/Helpers/FileAccessHelper.php +++ b/lib/private/IntegrityCheck/Helpers/FileAccessHelper.php @@ -53,10 +53,33 @@ class FileAccessHelper { * Wrapper around file_put_contents($filename, $data) * * @param string $filename - * @param $data - * @return int|false + * @param string $data + * @return int + * @throws \Exception */ public function file_put_contents($filename, $data) { - return file_put_contents($filename, $data); + $bytesWritten = @file_put_contents($filename, $data); + if ($bytesWritten === false || $bytesWritten !== strlen($data)){ + throw new \Exception('Failed to write into ' . $filename); + } + return $bytesWritten; + } + + /** + * @param string $path + * @return bool + */ + public function is_writable($path) { + return is_writable($path); + } + + /** + * @param string $path + * @throws \Exception + */ + public function assertDirectoryExists($path) { + if (!is_dir($path)) { + throw new \Exception('Directory ' . $path . ' does not exist.'); + } } } diff --git a/lib/private/Log.php b/lib/private/Log.php index ef1b70d3cb921e6d2acaac55c1dbfff37ef3804a..fddd359312736acacfa757b9cdf3f650923bf959 100644 --- a/lib/private/Log.php +++ b/lib/private/Log.php @@ -106,12 +106,8 @@ class Log implements ILogger { // FIXME: Add this for backwards compatibility, should be fixed at some point probably if($logger === null) { - // TODO: Drop backwards compatibility for config in the future $logType = $this->config->getValue('log_type', 'file'); - if($logType==='owncloud') { - $logType = 'file'; - } - $this->logger = 'OC\\Log\\'.ucfirst($logType); + $this->logger = static::getLogClass($logType); call_user_func(array($this->logger, 'init')); } else { $this->logger = $logger; @@ -327,4 +323,26 @@ class Log implements ILogger { $msg .= ': ' . json_encode($exception); $this->error($msg, $context); } + + /** + * @param string $logType + * @return string + * @internal + */ + public static function getLogClass($logType) { + switch (strtolower($logType)) { + case 'errorlog': + return \OC\Log\Errorlog::class; + case 'syslog': + return \OC\Log\Syslog::class; + case 'file': + return \OC\Log\File::class; + + // Backwards compatibility for old and fallback for unknown log types + case 'owncloud': + case 'nextcloud': + default: + return \OC\Log\File::class; + } + } } diff --git a/lib/private/Log/File.php b/lib/private/Log/File.php index 904aa1d93f1febad36bd25690247c55802e1f0ee..be8b72b3a3fcbb5a59134fb4101bc51737047e1b 100644 --- a/lib/private/Log/File.php +++ b/lib/private/Log/File.php @@ -75,8 +75,8 @@ class File { $config = \OC::$server->getSystemConfig(); // default to ISO8601 - $format = $config->getValue('logdateformat', 'c'); - $logTimeZone = $config->getValue( "logtimezone", 'UTC' ); + $format = $config->getValue('logdateformat', \DateTime::ATOM); + $logTimeZone = $config->getValue('logtimezone', 'UTC'); try { $timezone = new \DateTimeZone($logTimeZone); } catch (\Exception $e) { diff --git a/lib/private/Log/Rotate.php b/lib/private/Log/Rotate.php index 6c87c16737832c64ef344f259d32f6eb927230fb..866068433ffe09b9f7bf7c6d63c1bd1a8904357d 100644 --- a/lib/private/Log/Rotate.php +++ b/lib/private/Log/Rotate.php @@ -32,7 +32,9 @@ namespace OC\Log; */ class Rotate extends \OC\BackgroundJob\Job { private $max_log_size; - public function run($logFile) { + public function run($dummy) { + $systemConfig = \OC::$server->getSystemConfig(); + $logFile = $systemConfig->getValue('logfile', $systemConfig->getValue('datadirectory', \OC::$SERVERROOT . '/data') . '/nextcloud.log'); $this->max_log_size = \OC::$server->getConfig()->getSystemValue('log_rotate_size', false); if ($this->max_log_size) { $filesize = @filesize($logFile); diff --git a/lib/private/Mail/Mailer.php b/lib/private/Mail/Mailer.php index df8fa80f2c2cbaa79a2981826e96d96115371472..e704e8e3490549ef1b6d2b80784272ba2687df76 100644 --- a/lib/private/Mail/Mailer.php +++ b/lib/private/Mail/Mailer.php @@ -200,7 +200,7 @@ class Mailer implements IMailer { * @return \Swift_SendmailTransport */ protected function getSendMailInstance() { - switch ($this->config->getSystemValue('mail_smtpmode', 'sendmail')) { + switch ($this->config->getSystemValue('mail_smtpmode', 'php')) { case 'qmail': $binaryPath = '/var/qmail/bin/sendmail'; break; diff --git a/lib/private/Memcache/APC.php b/lib/private/Memcache/APC.php deleted file mode 100644 index 7db6d64b085f81e37faeb6865cd95ef81f0768ab..0000000000000000000000000000000000000000 --- a/lib/private/Memcache/APC.php +++ /dev/null @@ -1,136 +0,0 @@ - - * @author Clark Tomlinson - * @author Morris Jobke - * @author Otto Sabart - * @author Robin Appelman - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see - * - */ - -namespace OC\Memcache; - -use OCP\IMemcache; - -class APC extends Cache implements IMemcache { - use CASTrait { - cas as casEmulated; - } - - use CADTrait; - - public function get($key) { - $result = apc_fetch($this->getPrefix() . $key, $success); - if (!$success) { - return null; - } - return $result; - } - - public function set($key, $value, $ttl = 0) { - return apc_store($this->getPrefix() . $key, $value, $ttl); - } - - public function hasKey($key) { - return apc_exists($this->getPrefix() . $key); - } - - public function remove($key) { - return apc_delete($this->getPrefix() . $key); - } - - public function clear($prefix = '') { - $ns = $this->getPrefix() . $prefix; - $ns = preg_quote($ns, '/'); - $iter = new \APCIterator('user', '/^' . $ns . '/', APC_ITER_KEY); - return apc_delete($iter); - } - - /** - * Set a value in the cache if it's not already stored - * - * @param string $key - * @param mixed $value - * @param int $ttl Time To Live in seconds. Defaults to 60*60*24 - * @return bool - */ - public function add($key, $value, $ttl = 0) { - return apc_add($this->getPrefix() . $key, $value, $ttl); - } - - /** - * Increase a stored number - * - * @param string $key - * @param int $step - * @return int | bool - */ - public function inc($key, $step = 1) { - $this->add($key, 0); - return apc_inc($this->getPrefix() . $key, $step); - } - - /** - * Decrease a stored number - * - * @param string $key - * @param int $step - * @return int | bool - */ - public function dec($key, $step = 1) { - return apc_dec($this->getPrefix() . $key, $step); - } - - /** - * Compare and set - * - * @param string $key - * @param mixed $old - * @param mixed $new - * @return bool - */ - public function cas($key, $old, $new) { - // apc only does cas for ints - if (is_int($old) and is_int($new)) { - return apc_cas($this->getPrefix() . $key, $old, $new); - } else { - return $this->casEmulated($key, $old, $new); - } - } - - static public function isAvailable() { - if (!extension_loaded('apc')) { - return false; - } elseif (!\OC::$server->getIniWrapper()->getBool('apc.enabled')) { - return false; - } elseif (!\OC::$server->getIniWrapper()->getBool('apc.enable_cli') && \OC::$CLI) { - return false; - } else { - return true; - } - } -} - -if (!function_exists('apc_exists')) { - function apc_exists($keys) { - $result = false; - apc_fetch($keys, $result); - return $result; - } -} diff --git a/lib/private/Memcache/Factory.php b/lib/private/Memcache/Factory.php index f3841d316795b57134908a626daa9b959b755d31..8e62e020faae662e760424b38145ae39c0a29b4f 100644 --- a/lib/private/Memcache/Factory.php +++ b/lib/private/Memcache/Factory.php @@ -83,7 +83,7 @@ class Factory implements ICacheFactory { $missingCacheMessage = 'Memcache {class} not available for {use} cache'; $missingCacheHint = 'Is the matching PHP module installed and enabled?'; - if (!$localCacheClass::isAvailable()) { + if (!class_exists($localCacheClass) || !$localCacheClass::isAvailable()) { if (\OC::$CLI && !defined('PHPUNIT_RUN')) { // CLI should not hard-fail on broken memcache $this->logger->info($missingCacheMessage, [ @@ -98,7 +98,7 @@ class Factory implements ICacheFactory { ]), $missingCacheHint); } } - if (!$distributedCacheClass::isAvailable()) { + if (!class_exists($distributedCacheClass) || !$distributedCacheClass::isAvailable()) { if (\OC::$CLI && !defined('PHPUNIT_RUN')) { // CLI should not hard-fail on broken memcache $this->logger->info($missingCacheMessage, [ @@ -113,7 +113,7 @@ class Factory implements ICacheFactory { ]), $missingCacheHint); } } - if (!($lockingCacheClass && $lockingCacheClass::isAvailable())) { + if (!($lockingCacheClass && class_exists($distributedCacheClass) && $lockingCacheClass::isAvailable())) { // don't fallback since the fallback might not be suitable for storing lock $lockingCacheClass = self::NULL_CACHE; } diff --git a/lib/private/Memcache/Memcached.php b/lib/private/Memcache/Memcached.php index 12f457393744acc28accd5543b7bda6f3a2ed7a5..bf07fd0e6e717a7e7807c311fc89a5001ae8dcbe 100644 --- a/lib/private/Memcache/Memcached.php +++ b/lib/private/Memcache/Memcached.php @@ -46,16 +46,6 @@ class Memcached extends Cache implements IMemcache { parent::__construct($prefix); if (is_null(self::$cache)) { self::$cache = new \Memcached(); - $servers = \OC::$server->getSystemConfig()->getValue('memcached_servers'); - if (!$servers) { - $server = \OC::$server->getSystemConfig()->getValue('memcached_server'); - if ($server) { - $servers = array($server); - } else { - $servers = array(array('localhost', 11211)); - } - } - self::$cache->addServers($servers); $defaultOptions = [ \Memcached::OPT_CONNECT_TIMEOUT => 50, @@ -71,7 +61,7 @@ class Memcached extends Cache implements IMemcache { \Memcached::OPT_LIBKETAMA_COMPATIBLE => true, // Enable Binary Protocol - \Memcached::OPT_BINARY_PROTOCOL => true, + //\Memcached::OPT_BINARY_PROTOCOL => true, ]; // by default enable igbinary serializer if available if (\Memcached::HAVE_IGBINARY) { @@ -85,6 +75,17 @@ class Memcached extends Cache implements IMemcache { } else { throw new HintException("Expected 'memcached_options' config to be an array, got $options"); } + + $servers = \OC::$server->getSystemConfig()->getValue('memcached_servers'); + if (!$servers) { + $server = \OC::$server->getSystemConfig()->getValue('memcached_server'); + if ($server) { + $servers = [$server]; + } else { + $servers = [['localhost', 11211]]; + } + } + self::$cache->addServers($servers); } } @@ -110,7 +111,9 @@ class Memcached extends Cache implements IMemcache { } else { $result = self::$cache->set($this->getNamespace() . $key, $value); } - $this->verifyReturnCode(); + if ($result !== true) { + $this->verifyReturnCode(); + } return $result; } diff --git a/lib/private/NavigationManager.php b/lib/private/NavigationManager.php index 3e9ddfc6466b97f958b854748b2dc3773a261874..f7bc02943a38558a451b31289c852d006aa2fca6 100644 --- a/lib/private/NavigationManager.php +++ b/lib/private/NavigationManager.php @@ -1,6 +1,6 @@ * @author Joas Schilling @@ -26,13 +26,46 @@ namespace OC; +use OC\App\AppManager; +use OCP\App\IAppManager; +use OCP\IGroupManager; +use OCP\INavigationManager; +use OCP\IURLGenerator; +use OCP\IUserSession; +use OCP\L10N\IFactory; + /** * Manages the ownCloud navigation */ -class NavigationManager implements \OCP\INavigationManager { - protected $entries = array(); - protected $closureEntries = array(); + +class NavigationManager implements INavigationManager { + protected $entries = []; + protected $closureEntries = []; protected $activeEntry; + /** @var bool */ + protected $init = false; + /** @var IAppManager|AppManager */ + protected $appManager; + /** @var IURLGenerator */ + private $urlGenerator; + /** @var IFactory */ + private $l10nFac; + /** @var IUserSession */ + private $userSession; + /** @var IGroupManager */ + private $groupManager; + + public function __construct(IAppManager $appManager = null, + IURLGenerator $urlGenerator = null, + IFactory $l10nFac = null, + IUserSession $userSession = null, + IGroupManager$groupManager = null) { + $this->appManager = $appManager; + $this->urlGenerator = $urlGenerator; + $this->l10nFac = $l10nFac; + $this->userSession = $userSession; + $this->groupManager = $groupManager; + } /** * Creates a new navigation entry @@ -60,6 +93,7 @@ class NavigationManager implements \OCP\INavigationManager { * @return array an array of the added entries */ public function getAll() { + $this->init(); foreach ($this->closureEntries as $c) { $this->add($c()); } @@ -71,8 +105,9 @@ class NavigationManager implements \OCP\INavigationManager { * removes all the entries */ public function clear() { - $this->entries = array(); - $this->closureEntries = array(); + $this->entries = []; + $this->closureEntries = []; + $this->init = false; } /** @@ -93,4 +128,64 @@ class NavigationManager implements \OCP\INavigationManager { public function getActiveEntry() { return $this->activeEntry; } + + private function init() { + if ($this->init) { + return; + } + $this->init = true; + if (is_null($this->appManager)) { + return; + } + foreach ($this->appManager->getInstalledApps() as $app) { + // load plugins and collections from info.xml + $info = $this->appManager->getAppInfo($app); + if (!isset($info['navigation'])) { + continue; + } + $nav = $info['navigation']; + if (!isset($nav['name'])) { + continue; + } + if (!isset($nav['route'])) { + continue; + } + $role = isset($nav['@attributes']['role']) ? $nav['@attributes']['role'] : 'all'; + if ($role === 'admin' && !$this->isAdmin()) { + continue; + } + $l = $this->l10nFac->get($app); + $order = isset($nav['order']) ? $nav['order'] : 100; + $route = $this->urlGenerator->linkToRoute($nav['route']); + $icon = isset($nav['icon']) ? $nav['icon'] : 'app.svg'; + foreach ([$icon, "$app.svg"] as $i) { + try { + $icon = $this->urlGenerator->imagePath($app, $i); + break; + } catch (\RuntimeException $ex) { + // no icon? - ignore it then + } + } + if (is_null($icon)) { + $icon = $this->urlGenerator->imagePath('core', 'default-app-icon'); + } + + $this->add([ + 'id' => $app, + 'order' => $order, + 'href' => $route, + 'icon' => $icon, + 'name' => $l->t($nav['name']), + ]); + } + } + + private function isAdmin() { + $user = $this->userSession->getUser(); + if ($user !== null) { + return $this->groupManager->isAdmin($user->getUID()); + } + return false; + } + } diff --git a/lib/private/Preview.php b/lib/private/Preview.php deleted file mode 100644 index caa1e89baccee4247b39ed7cef77dadd10fc94d2..0000000000000000000000000000000000000000 --- a/lib/private/Preview.php +++ /dev/null @@ -1,1349 +0,0 @@ - - * @author Frank Karlitschek - * @author Georg Ehrke - * @author Joas Schilling - * @author Jörn Friedrich Dreyer - * @author Lukas Reschke - * @author Morris Jobke - * @author Olivier Paroz - * @author Robin Appelman - * @author Roeland Jago Douma - * @author Thomas Müller - * @author Tobias Kaminsky - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see - * - */ -namespace OC; - -use OC\Preview\Provider; -use OCP\Files\FileInfo; -use OCP\Files\NotFoundException; - -class Preview { - //the thumbnail folder - const THUMBNAILS_FOLDER = 'thumbnails'; - - const MODE_FILL = 'fill'; - const MODE_COVER = 'cover'; - - //config - private $maxScaleFactor; - /** @var int maximum width allowed for a preview */ - private $configMaxWidth; - /** @var int maximum height allowed for a preview */ - private $configMaxHeight; - - //fileview object - private $fileView = null; - private $userView = null; - - //vars - private $file; - private $maxX; - private $maxY; - private $scalingUp; - private $mimeType; - private $keepAspect = false; - private $mode = self::MODE_FILL; - - //used to calculate the size of the preview to generate - /** @var int $maxPreviewWidth max width a preview can have */ - private $maxPreviewWidth; - /** @var int $maxPreviewHeight max height a preview can have */ - private $maxPreviewHeight; - /** @var int $previewWidth calculated width of the preview we're looking for */ - private $previewWidth; - /** @var int $previewHeight calculated height of the preview we're looking for */ - private $previewHeight; - - //filemapper used for deleting previews - // index is path, value is fileinfo - static public $deleteFileMapper = array(); - static public $deleteChildrenMapper = array(); - - /** - * preview images object - * - * @var \OCP\IImage - */ - private $preview; - - /** - * @var \OCP\Files\FileInfo - */ - protected $info; - - /** - * check if thumbnail or bigger version of thumbnail of file is cached - * - * @param string $user userid - if no user is given, OC_User::getUser will be used - * @param string $root path of root - * @param string $file The path to the file where you want a thumbnail from - * @param int $maxX The maximum X size of the thumbnail. It can be smaller depending on the - * shape of the image - * @param int $maxY The maximum Y size of the thumbnail. It can be smaller depending on the - * shape of the image - * @param bool $scalingUp Disable/Enable upscaling of previews - * - * @throws \Exception - * @return mixed (bool / string) - * false if thumbnail does not exist - * path to thumbnail if thumbnail exists - */ - public function __construct( - $user = '', - $root = '/', - $file = '', $maxX = 1, - $maxY = 1, - $scalingUp = true - ) { - //init fileviews - if ($user === '') { - $user = \OC_User::getUser(); - } - $this->fileView = new \OC\Files\View('/' . $user . '/' . $root); - $this->userView = new \OC\Files\View('/' . $user); - - //set config - $sysConfig = \OC::$server->getConfig(); - $this->configMaxWidth = $sysConfig->getSystemValue('preview_max_x', 2048); - $this->configMaxHeight = $sysConfig->getSystemValue('preview_max_y', 2048); - $this->maxScaleFactor = $sysConfig->getSystemValue('preview_max_scale_factor', 1); - - //save parameters - $this->setFile($file); - $this->setMaxX((int)$maxX); - $this->setMaxY((int)$maxY); - $this->setScalingup($scalingUp); - - $this->preview = null; - - //check if there are preview backends - if (!\OC::$server->getPreviewManager() - ->hasProviders() - && \OC::$server->getConfig() - ->getSystemValue('enable_previews', true) - ) { - \OCP\Util::writeLog('core', 'No preview providers exist', \OCP\Util::ERROR); - throw new \Exception('No preview providers'); - } - } - - /** - * returns the path of the file you want a thumbnail from - * - * @return string - */ - public function getFile() { - return $this->file; - } - - /** - * returns the max width of the preview - * - * @return integer - */ - public function getMaxX() { - return $this->maxX; - } - - /** - * returns the max height of the preview - * - * @return integer - */ - public function getMaxY() { - return $this->maxY; - } - - /** - * returns whether or not scalingup is enabled - * - * @return bool - */ - public function getScalingUp() { - return $this->scalingUp; - } - - /** - * returns the name of the thumbnailfolder - * - * @return string - */ - public function getThumbnailsFolder() { - return self::THUMBNAILS_FOLDER; - } - - /** - * returns the max scale factor - * - * @return string - */ - public function getMaxScaleFactor() { - return $this->maxScaleFactor; - } - - /** - * returns the max width set in ownCloud's config - * - * @return integer - */ - public function getConfigMaxX() { - return $this->configMaxWidth; - } - - /** - * returns the max height set in ownCloud's config - * - * @return integer - */ - public function getConfigMaxY() { - return $this->configMaxHeight; - } - - /** - * Returns the FileInfo object associated with the file to preview - * - * @return false|Files\FileInfo|\OCP\Files\FileInfo - */ - protected function getFileInfo() { - $absPath = $this->fileView->getAbsolutePath($this->file); - $absPath = Files\Filesystem::normalizePath($absPath); - if (array_key_exists($absPath, self::$deleteFileMapper)) { - $this->info = self::$deleteFileMapper[$absPath]; - } else if (!$this->info) { - $this->info = $this->fileView->getFileInfo($this->file); - } - - return $this->info; - } - - - /** - * @return array|null - */ - private function getChildren() { - $absPath = $this->fileView->getAbsolutePath($this->file); - $absPath = Files\Filesystem::normalizePath($absPath); - - if (array_key_exists($absPath, self::$deleteChildrenMapper)) { - return self::$deleteChildrenMapper[$absPath]; - } - - return null; - } - - /** - * Sets the path of the file you want a preview of - * - * @param string $file - * @param \OCP\Files\FileInfo|null $info - * - * @return \OC\Preview - */ - public function setFile($file, $info = null) { - $this->file = $file; - $this->info = $info; - - if ($file !== '') { - $this->getFileInfo(); - if ($this->info instanceof \OCP\Files\FileInfo) { - $this->mimeType = $this->info->getMimetype(); - } - } - - return $this; - } - - /** - * Forces the use of a specific media type - * - * @param string $mimeType - */ - public function setMimetype($mimeType) { - $this->mimeType = $mimeType; - } - - /** - * Sets the max width of the preview. It's capped by the maximum allowed size set in the - * configuration - * - * @param int $maxX - * - * @throws \Exception - * @return \OC\Preview - */ - public function setMaxX($maxX = 1) { - if ($maxX <= 0) { - throw new \Exception('Cannot set width of 0 or smaller!'); - } - $configMaxX = $this->getConfigMaxX(); - $maxX = $this->limitMaxDim($maxX, $configMaxX, 'maxX'); - $this->maxX = $maxX; - - return $this; - } - - /** - * Sets the max height of the preview. It's capped by the maximum allowed size set in the - * configuration - * - * @param int $maxY - * - * @throws \Exception - * @return \OC\Preview - */ - public function setMaxY($maxY = 1) { - if ($maxY <= 0) { - throw new \Exception('Cannot set height of 0 or smaller!'); - } - $configMaxY = $this->getConfigMaxY(); - $maxY = $this->limitMaxDim($maxY, $configMaxY, 'maxY'); - $this->maxY = $maxY; - - return $this; - } - - /** - * Sets whether we're allowed to scale up when generating a preview. It's capped by the maximum - * allowed scale factor set in the configuration - * - * @param bool $scalingUp - * - * @return \OC\Preview - */ - public function setScalingup($scalingUp) { - if ($this->getMaxScaleFactor() === 1) { - $scalingUp = false; - } - $this->scalingUp = $scalingUp; - - return $this; - } - - /** - * Set whether to cover or fill the specified dimensions - * - * @param string $mode - * - * @return \OC\Preview - */ - public function setMode($mode) { - $this->mode = $mode; - - return $this; - } - - /** - * Sets whether we need to generate a preview which keeps the aspect ratio of the original file - * - * @param bool $keepAspect - * - * @return \OC\Preview - */ - public function setKeepAspect($keepAspect) { - $this->keepAspect = $keepAspect; - - return $this; - } - - /** - * Makes sure we were given a file to preview and that it exists in the filesystem - * - * @return bool - */ - public function isFileValid() { - $file = $this->getFile(); - if ($file === '') { - \OCP\Util::writeLog('core', 'No filename passed', \OCP\Util::DEBUG); - - return false; - } - - if (!$this->getFileInfo() instanceof FileInfo) { - \OCP\Util::writeLog('core', 'File:"' . $file . '" not found', \OCP\Util::DEBUG); - - return false; - } - - return true; - } - - /** - * Deletes the preview of a file with specific width and height - * - * This should never delete the max preview, use deleteAllPreviews() instead - * - * @return bool - */ - public function deletePreview() { - $fileInfo = $this->getFileInfo(); - if ($fileInfo !== null && $fileInfo !== false) { - $fileId = $fileInfo->getId(); - - $previewPath = $this->buildCachePath($fileId); - if (!strpos($previewPath, 'max')) { - return $this->userView->unlink($previewPath); - } - } - - return false; - } - - /** - * Deletes all previews of a file - */ - public function deleteAllPreviews() { - $thumbnailMount = $this->userView->getMount($this->getThumbnailsFolder()); - $propagator = $thumbnailMount->getStorage()->getPropagator(); - $propagator->beginBatch(); - - $toDelete = $this->getChildren(); - $toDelete[] = $this->getFileInfo(); - - foreach ($toDelete as $delete) { - if ($delete instanceof FileInfo) { - /** @var \OCP\Files\FileInfo $delete */ - $fileId = $delete->getId(); - - // getId() might return null, e.g. when the file is a - // .ocTransferId*.part file from chunked file upload. - if (!empty($fileId)) { - $previewPath = $this->getPreviewPath($fileId); - $this->userView->rmdir($previewPath); - } - } - } - - $propagator->commitBatch(); - } - - /** - * Checks if a preview matching the asked dimensions or a bigger version is already cached - * - * * We first retrieve the size of the max preview since this is what we be used to create - * all our preview. If it doesn't exist we return false, so that it can be generated - * * Using the dimensions of the max preview, we calculate what the size of the new - * thumbnail should be - * * And finally, we look for a suitable candidate in the cache - * - * @param int $fileId fileId of the original file we need a preview of - * - * @return string|false path to the cached preview if it exists or false - */ - public function isCached($fileId) { - if (is_null($fileId)) { - return false; - } - - /** - * Phase 1: Looking for the max preview - */ - $previewPath = $this->getPreviewPath($fileId); - // We currently can't look for a single file due to bugs related to #16478 - $allThumbnails = $this->userView->getDirectoryContent($previewPath); - list($maxPreviewWidth, $maxPreviewHeight) = $this->getMaxPreviewSize($allThumbnails); - - // Only use the cache if we have a max preview - if (!is_null($maxPreviewWidth) && !is_null($maxPreviewHeight)) { - - /** - * Phase 2: Calculating the size of the preview we need to send back - */ - $this->maxPreviewWidth = $maxPreviewWidth; - $this->maxPreviewHeight = $maxPreviewHeight; - - list($previewWidth, $previewHeight) = $this->simulatePreviewDimensions(); - if (empty($previewWidth) || empty($previewHeight)) { - return false; - } - - $this->previewWidth = $previewWidth; - $this->previewHeight = $previewHeight; - - /** - * Phase 3: We look for a preview of the exact size - */ - // This gives us a calculated path to a preview of asked dimensions - // thumbnailFolder/fileId/-(-max|-with-aspect).png - $preview = $this->buildCachePath($fileId, $previewWidth, $previewHeight); - - // This checks if we have a preview of those exact dimensions in the cache - if ($this->thumbnailSizeExists($allThumbnails, basename($preview))) { - return $preview; - } - - /** - * Phase 4: We look for a larger preview, matching the aspect ratio - */ - if (($this->getMaxX() >= $maxPreviewWidth) - && ($this->getMaxY() >= $maxPreviewHeight) - ) { - // The preview we-re looking for is the exact size or larger than the max preview, - // so return that - return $this->buildCachePath($fileId, $maxPreviewWidth, $maxPreviewHeight); - } else { - // The last resort is to look for something bigger than what we've calculated, - // but still smaller than the max preview - return $this->isCachedBigger($fileId, $allThumbnails); - } - } - - return false; - } - - /** - * Returns the dimensions of the max preview - * - * @param FileInfo[] $allThumbnails the list of all our cached thumbnails - * - * @return int[] - */ - private function getMaxPreviewSize($allThumbnails) { - $maxPreviewX = null; - $maxPreviewY = null; - - foreach ($allThumbnails as $thumbnail) { - $name = $thumbnail['name']; - if (strpos($name, 'max')) { - list($maxPreviewX, $maxPreviewY) = $this->getDimensionsFromFilename($name); - break; - } - } - - return [$maxPreviewX, $maxPreviewY]; - } - - /** - * Check if a specific thumbnail size is cached - * - * @param FileInfo[] $allThumbnails the list of all our cached thumbnails - * @param string $name - * @return bool - */ - private function thumbnailSizeExists(array $allThumbnails, $name) { - - foreach ($allThumbnails as $thumbnail) { - if ($name === $thumbnail->getName()) { - return true; - } - } - - return false; - } - - /** - * Determines the size of the preview we should be looking for in the cache - * - * @return integer[] - */ - private function simulatePreviewDimensions() { - $askedWidth = $this->getMaxX(); - $askedHeight = $this->getMaxY(); - - if ($this->keepAspect) { - list($newPreviewWidth, $newPreviewHeight) = - $this->applyAspectRatio($askedWidth, $askedHeight); - } else { - list($newPreviewWidth, $newPreviewHeight) = $this->fixSize($askedWidth, $askedHeight); - } - - return [(int)$newPreviewWidth, (int)$newPreviewHeight]; - } - - /** - * Resizes the boundaries to match the aspect ratio - * - * @param int $askedWidth - * @param int $askedHeight - * - * @param int $originalWidth - * @param int $originalHeight - * @return integer[] - */ - private function applyAspectRatio($askedWidth, $askedHeight, $originalWidth = 0, $originalHeight = 0) { - if (!$originalWidth) { - $originalWidth = $this->maxPreviewWidth; - } - if (!$originalHeight) { - $originalHeight = $this->maxPreviewHeight; - } - $originalRatio = $originalWidth / $originalHeight; - // Defines the box in which the preview has to fit - $scaleFactor = $this->scalingUp ? $this->maxScaleFactor : 1; - $askedWidth = min($askedWidth, $originalWidth * $scaleFactor); - $askedHeight = min($askedHeight, $originalHeight * $scaleFactor); - - if ($askedWidth / $originalRatio < $askedHeight) { - // width restricted - $askedHeight = round($askedWidth / $originalRatio); - } else { - $askedWidth = round($askedHeight * $originalRatio); - } - - return [(int)$askedWidth, (int)$askedHeight]; - } - - /** - * Resizes the boundaries to cover the area - * - * @param int $askedWidth - * @param int $askedHeight - * @param int $previewWidth - * @param int $previewHeight - * @return integer[] - */ - private function applyCover($askedWidth, $askedHeight, $previewWidth, $previewHeight) { - $originalRatio = $previewWidth / $previewHeight; - // Defines the box in which the preview has to fit - $scaleFactor = $this->scalingUp ? $this->maxScaleFactor : 1; - $askedWidth = min($askedWidth, $previewWidth * $scaleFactor); - $askedHeight = min($askedHeight, $previewHeight * $scaleFactor); - - if ($askedWidth / $originalRatio > $askedHeight) { - // height restricted - $askedHeight = round($askedWidth / $originalRatio); - } else { - $askedWidth = round($askedHeight * $originalRatio); - } - - return [(int)$askedWidth, (int)$askedHeight]; - } - - /** - * Makes sure an upscaled preview doesn't end up larger than the max dimensions defined in the - * config - * - * @param int $askedWidth - * @param int $askedHeight - * - * @return integer[] - */ - private function fixSize($askedWidth, $askedHeight) { - if ($this->scalingUp) { - $askedWidth = min($this->configMaxWidth, $askedWidth); - $askedHeight = min($this->configMaxHeight, $askedHeight); - } - - return [(int)$askedWidth, (int)$askedHeight]; - } - - /** - * Checks if a bigger version of a file preview is cached and if not - * return the preview of max allowed dimensions - * - * @param int $fileId fileId of the original image - * @param FileInfo[] $allThumbnails the list of all our cached thumbnails - * - * @return string path to bigger thumbnail - */ - private function isCachedBigger($fileId, $allThumbnails) { - // This is used to eliminate any thumbnail narrower than what we need - $maxX = $this->getMaxX(); - - //array for usable cached thumbnails - $possibleThumbnails = $this->getPossibleThumbnails($allThumbnails); - - foreach ($possibleThumbnails as $width => $path) { - if ($width < $maxX) { - continue; - } else { - return $path; - } - } - - // At this stage, we didn't find a preview, so we return the max preview - return $this->buildCachePath($fileId, $this->maxPreviewWidth, $this->maxPreviewHeight); - } - - /** - * Get possible bigger thumbnails of the given image with the proper aspect ratio - * - * @param FileInfo[] $allThumbnails the list of all our cached thumbnails - * - * @return string[] an array of paths to bigger thumbnails - */ - private function getPossibleThumbnails($allThumbnails) { - if ($this->keepAspect) { - $wantedAspectRatio = (float)($this->maxPreviewWidth / $this->maxPreviewHeight); - } else { - $wantedAspectRatio = (float)($this->getMaxX() / $this->getMaxY()); - } - - //array for usable cached thumbnails - $possibleThumbnails = array(); - foreach ($allThumbnails as $thumbnail) { - $name = rtrim($thumbnail['name'], '.png'); - list($x, $y, $aspectRatio) = $this->getDimensionsFromFilename($name); - if (abs($aspectRatio - $wantedAspectRatio) >= 0.000001 - || $this->unscalable($x, $y) - ) { - continue; - } - $possibleThumbnails[$x] = $thumbnail['path']; - } - - ksort($possibleThumbnails); - - return $possibleThumbnails; - } - - /** - * Looks at the preview filename from the cache and extracts the size of the preview - * - * @param string $name - * - * @return array - */ - private function getDimensionsFromFilename($name) { - $size = explode('-', $name); - $x = (int)$size[0]; - $y = (int)$size[1]; - $aspectRatio = (float)($x / $y); - - return array($x, $y, $aspectRatio); - } - - /** - * @param int $x - * @param int $y - * - * @return bool - */ - private function unscalable($x, $y) { - - $maxX = $this->getMaxX(); - $maxY = $this->getMaxY(); - $scalingUp = $this->getScalingUp(); - $maxScaleFactor = $this->getMaxScaleFactor(); - - if ($x < $maxX || $y < $maxY) { - if ($scalingUp) { - $scaleFactor = $maxX / $x; - if ($scaleFactor > $maxScaleFactor) { - return true; - } - } else { - return true; - } - } - - return false; - } - - /** - * Returns a preview of a file - * - * The cache is searched first and if nothing usable was found then a preview is - * generated by one of the providers - * - * @return \OCP\IImage - */ - public function getPreview() { - if (!is_null($this->preview) && $this->preview->valid()) { - return $this->preview; - } - - $this->preview = null; - $fileInfo = $this->getFileInfo(); - if ($fileInfo === null || $fileInfo === false || !$fileInfo->isReadable()) { - return new \OC_Image(); - } - - $fileId = $fileInfo->getId(); - $cached = $this->isCached($fileId); - if ($cached) { - $this->getCachedPreview($fileId, $cached); - } - - if (is_null($this->preview)) { - $this->generatePreview($fileId); - } - - // We still don't have a preview, so we send back an empty object - if (is_null($this->preview)) { - $this->preview = new \OC_Image(); - } - - return $this->preview; - } - - /** - * Sends the preview, including the headers to client which requested it - * - * @param null|string $mimeTypeForHeaders the media type to use when sending back the reply - * - * @throws NotFoundException - * @throws PreviewNotAvailableException - */ - public function showPreview($mimeTypeForHeaders = null) { - // Check if file is valid - if ($this->isFileValid() === false) { - throw new NotFoundException('File not found.'); - } - - if (is_null($this->preview)) { - $this->getPreview(); - } - if ($this->preview instanceof \OCP\IImage) { - if ($this->preview->valid()) { - \OCP\Response::enableCaching(3600 * 24); // 24 hours - } else { - $this->getMimeIcon(); - } - $this->preview->show($mimeTypeForHeaders); - } - } - - /** - * Retrieves the preview from the cache and resizes it if necessary - * - * @param int $fileId fileId of the original image - * @param string $cached the path to the cached preview - */ - private function getCachedPreview($fileId, $cached) { - $stream = $this->userView->fopen($cached, 'r'); - $this->preview = null; - if ($stream) { - $image = new \OC_Image(); - $image->loadFromFileHandle($stream); - - $this->preview = $image->valid() ? $image : null; - - if (!is_null($this->preview)) { - // Size of the preview we calculated - $maxX = $this->previewWidth; - $maxY = $this->previewHeight; - // Size of the preview we retrieved from the cache - $previewX = (int)$this->preview->width(); - $previewY = (int)$this->preview->height(); - - // We don't have an exact match - if ($previewX !== $maxX || $previewY !== $maxY) { - $this->resizeAndStore($fileId); - } - } - - fclose($stream); - } - } - - /** - * Resizes, crops, fixes orientation and stores in the cache - * - * @param int $fileId fileId of the original image - */ - private function resizeAndStore($fileId) { - $image = $this->preview; - if (!($image instanceof \OCP\IImage)) { - \OCP\Util::writeLog( - 'core', '$this->preview is not an instance of \OCP\IImage', \OCP\Util::DEBUG - ); - - return; - } - $previewWidth = (int)$image->width(); - $previewHeight = (int)$image->height(); - $askedWidth = $this->getMaxX(); - $askedHeight = $this->getMaxY(); - - if ($this->mode === self::MODE_COVER) { - list($askedWidth, $askedHeight) = - $this->applyCover($askedWidth, $askedHeight, $previewWidth, $previewHeight); - } - - /** - * Phase 1: If required, adjust boundaries to keep aspect ratio - */ - if ($this->keepAspect) { - list($askedWidth, $askedHeight) = - $this->applyAspectRatio($askedWidth, $askedHeight, $previewWidth, $previewHeight); - } - - /** - * Phase 2: Resizes preview to try and match requirements. - * Takes the scaling ratio into consideration - */ - list($newPreviewWidth, $newPreviewHeight) = $this->scale( - $image, $askedWidth, $askedHeight, $previewWidth, $previewHeight - ); - - // The preview has been resized and should now have the asked dimensions - if ($newPreviewWidth === $askedWidth && $newPreviewHeight === $askedHeight) { - $this->storePreview($fileId, $newPreviewWidth, $newPreviewHeight); - - return; - } - - /** - * Phase 3: We're still not there yet, so we're clipping and filling - * to match the asked dimensions - */ - // It turns out the scaled preview is now too big, so we crop the image - if ($newPreviewWidth >= $askedWidth && $newPreviewHeight >= $askedHeight) { - $this->crop($image, $askedWidth, $askedHeight, $newPreviewWidth, $newPreviewHeight); - $this->storePreview($fileId, $askedWidth, $askedHeight); - - return; - } - - // At least one dimension of the scaled preview is too small, - // so we fill the space with a transparent background - if (($newPreviewWidth < $askedWidth || $newPreviewHeight < $askedHeight)) { - $this->cropAndFill( - $image, $askedWidth, $askedHeight, $newPreviewWidth, $newPreviewHeight - ); - $this->storePreview($fileId, $askedWidth, $askedHeight); - - return; - } - - // The preview is smaller, but we can't touch it - $this->storePreview($fileId, $newPreviewWidth, $newPreviewHeight); - } - - /** - * Calculates the new dimensions of the preview - * - * The new dimensions can be larger or smaller than the ones of the preview we have to resize - * - * @param \OCP\IImage $image - * @param int $askedWidth - * @param int $askedHeight - * @param int $previewWidth - * @param int $previewHeight - * - * @return int[] - */ - private function scale($image, $askedWidth, $askedHeight, $previewWidth, $previewHeight) { - $scalingUp = $this->getScalingUp(); - $maxScaleFactor = $this->getMaxScaleFactor(); - - $factorX = $askedWidth / $previewWidth; - $factorY = $askedHeight / $previewHeight; - - if ($factorX >= $factorY) { - $factor = $factorX; - } else { - $factor = $factorY; - } - - if ($scalingUp === false) { - if ($factor > 1) { - $factor = 1; - } - } - - // We cap when upscaling - if (!is_null($maxScaleFactor)) { - if ($factor > $maxScaleFactor) { - \OCP\Util::writeLog( - 'core', 'scale factor reduced from ' . $factor . ' to ' . $maxScaleFactor, - \OCP\Util::DEBUG - ); - $factor = $maxScaleFactor; - } - } - - $newPreviewWidth = round($previewWidth * $factor); - $newPreviewHeight = round($previewHeight * $factor); - - $image->preciseResize($newPreviewWidth, $newPreviewHeight); - $this->preview = $image; - - return [$newPreviewWidth, $newPreviewHeight]; - } - - /** - * Crops a preview which is larger than the dimensions we've received - * - * @param \OCP\IImage $image - * @param int $askedWidth - * @param int $askedHeight - * @param int $previewWidth - * @param int $previewHeight - */ - private function crop($image, $askedWidth, $askedHeight, $previewWidth, $previewHeight = null) { - $cropX = floor(abs($askedWidth - $previewWidth) * 0.5); - //don't crop previews on the Y axis, this sucks if it's a document. - //$cropY = floor(abs($y - $newPreviewHeight) * 0.5); - $cropY = 0; - $image->crop($cropX, $cropY, $askedWidth, $askedHeight); - $this->preview = $image; - } - - /** - * Crops an image if it's larger than the dimensions we've received and fills the empty space - * with a transparent background - * - * @param \OCP\IImage $image - * @param int $askedWidth - * @param int $askedHeight - * @param int $previewWidth - * @param int $previewHeight - */ - private function cropAndFill($image, $askedWidth, $askedHeight, $previewWidth, $previewHeight) { - if ($previewWidth > $askedWidth) { - $cropX = floor(($previewWidth - $askedWidth) * 0.5); - $image->crop($cropX, 0, $askedWidth, $previewHeight); - $previewWidth = $askedWidth; - } - - if ($previewHeight > $askedHeight) { - $cropY = floor(($previewHeight - $askedHeight) * 0.5); - $image->crop(0, $cropY, $previewWidth, $askedHeight); - $previewHeight = $askedHeight; - } - - // Creates a transparent background - $backgroundLayer = imagecreatetruecolor($askedWidth, $askedHeight); - imagealphablending($backgroundLayer, false); - $transparency = imagecolorallocatealpha($backgroundLayer, 0, 0, 0, 127); - imagefill($backgroundLayer, 0, 0, $transparency); - imagesavealpha($backgroundLayer, true); - - $image = $image->resource(); - - $mergeX = floor(abs($askedWidth - $previewWidth) * 0.5); - $mergeY = floor(abs($askedHeight - $previewHeight) * 0.5); - - // Pastes the preview on top of the background - imagecopy( - $backgroundLayer, $image, $mergeX, $mergeY, 0, 0, $previewWidth, - $previewHeight - ); - - $image = new \OC_Image($backgroundLayer); - - $this->preview = $image; - } - - /** - * Saves a preview in the cache to speed up future calls - * - * Do not nullify the preview as it might send the whole process in a loop - * - * @param int $fileId fileId of the original image - * @param int $previewWidth - * @param int $previewHeight - */ - private function storePreview($fileId, $previewWidth, $previewHeight) { - if (empty($previewWidth) || empty($previewHeight)) { - \OCP\Util::writeLog( - 'core', 'Cannot save preview of dimension ' . $previewWidth . 'x' . $previewHeight, - \OCP\Util::DEBUG - ); - - } else { - $cachePath = $this->buildCachePath($fileId, $previewWidth, $previewHeight); - $this->userView->file_put_contents($cachePath, $this->preview->data()); - } - } - - /** - * Returns the path to a preview based on its dimensions and aspect - * - * @param int $fileId - * @param int|null $maxX - * @param int|null $maxY - * - * @return string - */ - private function buildCachePath($fileId, $maxX = null, $maxY = null) { - if (is_null($maxX)) { - $maxX = $this->getMaxX(); - } - if (is_null($maxY)) { - $maxY = $this->getMaxY(); - } - - $previewPath = $this->getPreviewPath($fileId); - $previewPath = $previewPath . strval($maxX) . '-' . strval($maxY); - $isMaxPreview = - ($maxX === $this->maxPreviewWidth && $maxY === $this->maxPreviewHeight) ? true : false; - if ($isMaxPreview) { - $previewPath .= '-max'; - } - if ($this->keepAspect && !$isMaxPreview) { - $previewPath .= '-with-aspect'; - } - if ($this->mode === self::MODE_COVER) { - $previewPath .= '-cover'; - } - $previewPath .= '.png'; - - return $previewPath; - } - - /** - * Returns the path to the folder where the previews are stored, identified by the fileId - * - * @param int $fileId - * - * @return string - */ - private function getPreviewPath($fileId) { - return $this->getThumbnailsFolder() . '/' . $fileId . '/'; - } - - /** - * Asks the provider to send a preview of the file which respects the maximum dimensions - * defined in the configuration and after saving it in the cache, it is then resized to the - * asked dimensions - * - * This is only called once in order to generate a large PNG of dimensions defined in the - * configuration file. We'll be able to quickly resize it later on. - * We never upscale the original conversion as this will be done later by the resizing - * operation - * - * @param int $fileId fileId of the original image - */ - private function generatePreview($fileId) { - $file = $this->getFile(); - $preview = null; - - $previewProviders = \OC::$server->getPreviewManager() - ->getProviders(); - foreach ($previewProviders as $supportedMimeType => $providers) { - if (!preg_match($supportedMimeType, $this->mimeType)) { - continue; - } - - foreach ($providers as $closure) { - $provider = $closure(); - if (!($provider instanceof \OCP\Preview\IProvider)) { - continue; - } - - \OCP\Util::writeLog( - 'core', 'Generating preview for "' . $file . '" with "' . get_class($provider) - . '"', \OCP\Util::DEBUG - ); - - /** @var $provider Provider */ - $preview = $provider->getThumbnail( - $file, $this->configMaxWidth, $this->configMaxHeight, $scalingUp = false, - $this->fileView - ); - - if (!($preview instanceof \OCP\IImage)) { - continue; - } - - $this->preview = $preview; - $previewPath = $this->getPreviewPath($fileId); - - if ($this->userView->is_dir($this->getThumbnailsFolder() . '/') === false) { - $this->userView->mkdir($this->getThumbnailsFolder() . '/'); - } - - if ($this->userView->is_dir($previewPath) === false) { - $this->userView->mkdir($previewPath); - } - - // This stores our large preview so that it can be used in subsequent resizing requests - $this->storeMaxPreview($previewPath); - - break 2; - } - } - - // The providers have been kind enough to give us a preview - if ($preview) { - $this->resizeAndStore($fileId); - } - } - - /** - * Defines the media icon, for the media type of the original file, as the preview - * @throws PreviewNotAvailableException - */ - private function getMimeIcon() { - $image = new \OC_Image(); - $mimeIconWebPath = \OC::$server->getMimeTypeDetector()->mimeTypeIcon($this->mimeType); - if (empty(\OC::$WEBROOT)) { - $mimeIconServerPath = \OC::$SERVERROOT . $mimeIconWebPath; - } else { - $mimeIconServerPath = str_replace(\OC::$WEBROOT, \OC::$SERVERROOT, $mimeIconWebPath); - } - // we can't load SVGs into an image - if (substr($mimeIconWebPath, -4) === '.svg') { - throw new PreviewNotAvailableException('SVG mimetype cannot be rendered'); - } - $image->loadFromFile($mimeIconServerPath); - - $this->preview = $image; - } - - /** - * Stores the max preview in the cache - * - * @param string $previewPath path to the preview - */ - private function storeMaxPreview($previewPath) { - $maxPreviewExists = false; - $preview = $this->preview; - - $allThumbnails = $this->userView->getDirectoryContent($previewPath); - // This is so that the cache doesn't need emptying when upgrading - // Can be replaced by an upgrade script... - foreach ($allThumbnails as $thumbnail) { - $name = rtrim($thumbnail['name'], '.png'); - if (strpos($name, 'max')) { - $maxPreviewExists = true; - break; - } - } - // We haven't found the max preview, so we create it - if (!$maxPreviewExists) { - $previewWidth = $preview->width(); - $previewHeight = $preview->height(); - $previewPath = $previewPath . strval($previewWidth) . '-' . strval($previewHeight); - $previewPath .= '-max.png'; - $this->userView->file_put_contents($previewPath, $preview->data()); - $this->maxPreviewWidth = $previewWidth; - $this->maxPreviewHeight = $previewHeight; - } - } - - /** - * Limits a dimension to the maximum dimension provided as argument - * - * @param int $dim - * @param int $maxDim - * @param string $dimName - * - * @return integer - */ - private function limitMaxDim($dim, $maxDim, $dimName) { - if (!is_null($maxDim)) { - if ($dim > $maxDim) { - \OCP\Util::writeLog( - 'core', $dimName . ' reduced from ' . $dim . ' to ' . $maxDim, \OCP\Util::DEBUG - ); - $dim = $maxDim; - } - } - - return $dim; - } - - /** - * @param array $args - */ - public static function post_write($args) { - self::post_delete($args, 'files/'); - } - - /** - * @param array $args - */ - public static function prepare_delete_files($args) { - self::prepare_delete($args, 'files/'); - } - - /** - * @param array $args - * @param string $prefix - */ - public static function prepare_delete(array $args, $prefix = '') { - $path = $args['path']; - if (substr($path, 0, 1) === '/') { - $path = substr($path, 1); - } - - $view = new \OC\Files\View('/' . \OC_User::getUser() . '/' . $prefix); - - $absPath = Files\Filesystem::normalizePath($view->getAbsolutePath($path)); - $fileInfo = $view->getFileInfo($path); - if ($fileInfo === false) { - return; - } - self::addPathToDeleteFileMapper($absPath, $fileInfo); - if ($view->is_dir($path)) { - $children = self::getAllChildren($view, $path); - self::$deleteChildrenMapper[$absPath] = $children; - } - } - - /** - * @param string $absolutePath - * @param \OCP\Files\FileInfo $info - */ - private static function addPathToDeleteFileMapper($absolutePath, $info) { - self::$deleteFileMapper[$absolutePath] = $info; - } - - /** - * @param \OC\Files\View $view - * @param string $path - * - * @return array - */ - private static function getAllChildren($view, $path) { - $children = $view->getDirectoryContent($path); - $childrensFiles = array(); - - $fakeRootLength = strlen($view->getRoot()); - - for ($i = 0; $i < count($children); $i++) { - $child = $children[$i]; - - $childsPath = substr($child->getPath(), $fakeRootLength); - - if ($view->is_dir($childsPath)) { - $children = array_merge( - $children, - $view->getDirectoryContent($childsPath) - ); - } else { - $childrensFiles[] = $child; - } - } - - return $childrensFiles; - } - - /** - * @param array $args - */ - public static function post_delete_files($args) { - self::post_delete($args, 'files/'); - } - - /** - * @param array $args - */ - public static function post_delete_versions($args) { - self::post_delete($args, 'files/'); - } - - /** - * @param array $args - * @param string $prefix - */ - public static function post_delete($args, $prefix = '') { - $path = Files\Filesystem::normalizePath($args['path']); - - $preview = new Preview(\OC_User::getUser(), $prefix, $path); - $preview->deleteAllPreviews(); - } - -} diff --git a/lib/private/PreviewManager.php b/lib/private/PreviewManager.php index 36b3730a720cdcb62017d649631176b27ca942ff..8c5a7ad29f1aa9f862c70b6cec0b940bd60fd58c 100644 --- a/lib/private/PreviewManager.php +++ b/lib/private/PreviewManager.php @@ -68,6 +68,9 @@ class PreviewManager implements IPreview { /** @var array */ protected $defaultProviders; + /** @var string */ + protected $userId; + /** * PreviewManager constructor. * @@ -75,15 +78,18 @@ class PreviewManager implements IPreview { * @param IRootFolder $rootFolder * @param IAppData $appData * @param EventDispatcherInterface $eventDispatcher + * @param string $userId */ public function __construct(IConfig $config, IRootFolder $rootFolder, IAppData $appData, - EventDispatcherInterface $eventDispatcher) { + EventDispatcherInterface $eventDispatcher, + $userId) { $this->config = $config; $this->rootFolder = $rootFolder; $this->appData = $appData; $this->eventDispatcher = $eventDispatcher; + $this->userId = $userId; } /** @@ -144,10 +150,22 @@ class PreviewManager implements IPreview { * @param int $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image * @param boolean $scaleUp Scale smaller images up to the thumbnail size or not. Might look ugly * @return \OCP\IImage + * @deprecated 11 Use getPreview */ public function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false) { - $preview = new \OC\Preview('', '/', $file, $maxX, $maxY, $scaleUp); - return $preview->getPreview(); + try { + $userRoot = $this->rootFolder->getUserFolder($this->userId)->getParent(); + $node = $userRoot->get($file); + if (!($file instanceof File)) { + throw new NotFoundException(); + } + + $preview = $this->getPreview($node, $maxX, $maxY); + } catch (\Exception $e) { + return new \OC_Image(); + } + + return new \OC_Image($preview->getContent()); } /** diff --git a/lib/private/Repair.php b/lib/private/Repair.php index c212ea90744afc46e58dccbceb662d382889b822..e8d466cd844c7e81bf14e9435da73f8cf1c4b0cb 100644 --- a/lib/private/Repair.php +++ b/lib/private/Repair.php @@ -31,12 +31,12 @@ namespace OC; use OC\Repair\AssetCache; -use OC\Repair\AvatarPermissions; use OC\Repair\CleanTags; use OC\Repair\Collation; use OC\Repair\DropOldJobs; use OC\Repair\MoveUpdaterStepFile; use OC\Repair\NC11\CleanPreviews; +use OC\Repair\NC11\FixMountStorages; use OC\Repair\NC11\MoveAvatars; use OC\Repair\OldGroupMembershipShares; use OC\Repair\RemoveGetETagEntries; @@ -47,7 +47,6 @@ use OC\Repair\SqliteAutoincrement; use OC\Repair\DropOldTables; use OC\Repair\FillETags; use OC\Repair\InnoDB; -use OC\Repair\RepairLegacyStorages; use OC\Repair\RepairMimeTypes; use OC\Repair\SearchLuceneTables; use OC\Repair\UpdateOutdatedOcsIds; @@ -132,7 +131,6 @@ class Repair implements IOutput{ return [ new Collation(\OC::$server->getConfig(), \OC::$server->getLogger(), \OC::$server->getDatabaseConnection(), false), new RepairMimeTypes(\OC::$server->getConfig()), - new RepairLegacyStorages(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()), new AssetCache(), new FillETags(\OC::$server->getDatabaseConnection()), new CleanTags(\OC::$server->getDatabaseConnection(), \OC::$server->getUserManager()), @@ -143,7 +141,6 @@ class Repair implements IOutput{ new RepairInvalidShares(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()), new SharePropagation(\OC::$server->getConfig()), new RemoveOldShares(\OC::$server->getDatabaseConnection()), - new AvatarPermissions(\OC::$server->getDatabaseConnection()), new RemoveRootShares(\OC::$server->getDatabaseConnection(), \OC::$server->getUserManager(), \OC::$server->getLazyRootFolder()), new RepairUnmergedShares( \OC::$server->getConfig(), @@ -161,6 +158,7 @@ class Repair implements IOutput{ \OC::$server->getUserManager(), \OC::$server->getConfig() ), + new FixMountStorages(\OC::$server->getDatabaseConnection()), ]; } diff --git a/lib/private/Repair/AvatarPermissions.php b/lib/private/Repair/AvatarPermissions.php deleted file mode 100644 index 9d75062358cdf7ef6d3564a0d3fc4bc18611f249..0000000000000000000000000000000000000000 --- a/lib/private/Repair/AvatarPermissions.php +++ /dev/null @@ -1,116 +0,0 @@ - - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see - * - */ -namespace OC\Repair; - -use Doctrine\DBAL\Platforms\OraclePlatform; -use OCP\IDBConnection; -use OCP\Migration\IOutput; -use OCP\Migration\IRepairStep; - -/** - * Class AvatarPermissions - * - * @package OC\Repair - */ -class AvatarPermissions implements IRepairStep { - /** @var IDBConnection */ - private $connection; - - /** - * AvatarPermissions constructor. - * - * @param IDBConnection $connection - */ - public function __construct(IDBConnection $connection) { - $this->connection = $connection; - } - - /** - * @return string - */ - public function getName() { - return 'Fix permissions so avatars can be stored again'; - } - - /** - * @param IOutput $output - */ - public function run(IOutput $output) { - $output->startProgress(2); - $this->fixUserRootPermissions(); - $output->advance(); - $this->fixAvatarPermissions(); - $output->finishProgress(); - } - - /** - * Make sure all user roots have permissions 23 (all but share) - */ - protected function fixUserRootPermissions() { - $qb = $this->connection->getQueryBuilder(); - $qb2 = $this->connection->getQueryBuilder(); - - $qb->select('numeric_id') - ->from('storages') - ->where($qb->expr()->like('id', $qb2->createParameter('like'))); - - if ($this->connection->getDatabasePlatform() instanceof OraclePlatform) { - // '' is null on oracle - $path = $qb2->expr()->isNull('path'); - } else { - $path = $qb2->expr()->eq('path', $qb2->createNamedParameter('')); - } - - $qb2->update('filecache') - ->set('permissions', $qb2->createNamedParameter(23)) - ->where($path) - ->andWhere($qb2->expr()->in('storage', $qb2->createFunction($qb->getSQL()))) - ->andWhere($qb2->expr()->neq('permissions', $qb2->createNamedParameter(23))) - ->setParameter('like', 'home::%'); - - - $qb2->execute(); - } - - /** - * Make sure all avatar files in the user roots have permission 27 - */ - protected function fixAvatarPermissions() { - $qb = $this->connection->getQueryBuilder(); - $qb2 = $this->connection->getQueryBuilder(); - - $qb->select('numeric_id') - ->from('storages') - ->where($qb->expr()->like('id', $qb2->createParameter('like'))); - - $qb2->update('filecache') - ->set('permissions', $qb2->createNamedParameter(27)) - ->where($qb2->expr()->like('path', $qb2->createNamedParameter('avatar.%'))) - ->andWhere($qb2->expr()->in('storage', $qb2->createFunction($qb->getSQL()))) - ->andWhere($qb2->expr()->neq('permissions', $qb2->createNamedParameter(27))) - ->setParameter('like', 'home::%'); - - $qb2->execute(); - } - -} - diff --git a/lib/private/Repair/Collation.php b/lib/private/Repair/Collation.php index 54de1a719bd2289b51bb35c93b78699a703d016e..a3535fb33a296969ef91917feb08da8eab4e3cb8 100644 --- a/lib/private/Repair/Collation.php +++ b/lib/private/Repair/Collation.php @@ -75,6 +75,18 @@ class Collation implements IRepairStep { $tables = $this->getAllNonUTF8BinTables($this->connection); foreach ($tables as $table) { + $output->info("Change row format for $table ..."); + $query = $this->connection->prepare('ALTER TABLE `' . $table . '` ROW_FORMAT = DYNAMIC;'); + try { + $query->execute(); + } catch (DriverException $e) { + // Just log this + $this->logger->logException($e); + if (!$this->ignoreFailures) { + throw $e; + } + } + $output->info("Change collation for $table ..."); $query = $this->connection->prepare('ALTER TABLE `' . $table . '` CONVERT TO CHARACTER SET ' . $characterSet . ' COLLATE ' . $characterSet . '_bin;'); try { diff --git a/lib/private/Repair/MoveUpdaterStepFile.php b/lib/private/Repair/MoveUpdaterStepFile.php index fabaff40d246d2922e09522ed27424093b2d231c..feb8a291282965ee7a485534f85b9f426c10ae17 100644 --- a/lib/private/Repair/MoveUpdaterStepFile.php +++ b/lib/private/Repair/MoveUpdaterStepFile.php @@ -44,7 +44,7 @@ class MoveUpdaterStepFile implements IRepairStep { public function run(IOutput $output) { - $dataDir = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT); + $dataDir = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data'); $instanceId = $this->config->getSystemValue('instanceid', null); if(!is_string($instanceId) || empty($instanceId)) { diff --git a/lib/private/Repair/NC11/FixMountStorages.php b/lib/private/Repair/NC11/FixMountStorages.php new file mode 100644 index 0000000000000000000000000000000000000000..d57a356dff9e5d9ef7260ed8c3ef39908c8e0923 --- /dev/null +++ b/lib/private/Repair/NC11/FixMountStorages.php @@ -0,0 +1,78 @@ + + * + * @author Joas Schilling + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ +namespace OC\Repair\NC11; + +use OCP\DB\QueryBuilder\IQueryBuilder; +use OCP\IDBConnection; +use OCP\Migration\IOutput; +use OCP\Migration\IRepairStep; + +class FixMountStorages implements IRepairStep { + + /** @var IDBConnection */ + private $db; + + /** + * @param IDBConnection $db + */ + public function __construct(IDBConnection $db) { + $this->db = $db; + } + + /** + * @return string + */ + public function getName() { + return 'Fix potential broken mount points'; + } + + public function run(IOutput $output) { + $query = $this->db->getQueryBuilder(); + $query->select('m.id', 'f.storage') + ->from('mounts', 'm') + ->leftJoin('m', 'filecache', 'f', $query->expr()->eq('m.root_id', 'f.fileid')) + ->where($query->expr()->neq('m.storage_id', 'f.storage')); + + $update = $this->db->getQueryBuilder(); + $update->update('mounts') + ->set('storage_id', $update->createParameter('storage')) + ->where($query->expr()->eq('id', $update->createParameter('mount'))); + + $result = $query->execute(); + $entriesUpdated = 0; + while ($row = $result->fetch()) { + $update->setParameter('storage', $row['storage'], IQueryBuilder::PARAM_INT) + ->setParameter('mount', $row['id'], IQueryBuilder::PARAM_INT); + $update->execute(); + $entriesUpdated++; + } + $result->closeCursor(); + + if ($entriesUpdated > 0) { + $output->info($entriesUpdated . ' mounts updated'); + return; + } + + $output->info('No mounts updated'); + } +} diff --git a/lib/private/Repair/NC11/MoveAvatarBackgroundJob.php b/lib/private/Repair/NC11/MoveAvatarsBackgroundJob.php similarity index 100% rename from lib/private/Repair/NC11/MoveAvatarBackgroundJob.php rename to lib/private/Repair/NC11/MoveAvatarsBackgroundJob.php diff --git a/lib/private/Repair/RepairInvalidShares.php b/lib/private/Repair/RepairInvalidShares.php index 6cb690057bb3a76317f6b17a9f372cd2799cffb0..04624c910dd928cdf997905c852a8528e1330471 100644 --- a/lib/private/Repair/RepairInvalidShares.php +++ b/lib/private/Repair/RepairInvalidShares.php @@ -27,6 +27,7 @@ namespace OC\Repair; use OCP\Migration\IOutput; use OCP\Migration\IRepairStep; +use Doctrine\DBAL\Platforms\OraclePlatform; /** * Repairs shares with invalid data @@ -91,6 +92,26 @@ class RepairInvalidShares implements IRepairStep { } } + /** + * Adjust file share permissions + */ + private function adjustFileSharePermissions(IOutput $out) { + $mask = \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE; + $builder = $this->connection->getQueryBuilder(); + + $permsFunc = $builder->expr()->bitwiseAnd('permissions', $mask); + $builder + ->update('share') + ->set('permissions', $permsFunc) + ->where($builder->expr()->eq('item_type', $builder->expr()->literal('file'))) + ->andWhere($builder->expr()->neq('permissions', $permsFunc)); + + $updatedEntries = $builder->execute(); + if ($updatedEntries > 0) { + $out->info('Fixed file share permissions for ' . $updatedEntries . ' shares'); + } + } + /** * Remove shares where the parent share does not exist anymore */ @@ -137,6 +158,9 @@ class RepairInvalidShares implements IRepairStep { // this situation was only possible before 9.1 $this->addShareLinkDeletePermission($out); } + if (version_compare($ocVersionFromBeforeUpdate, '12.0.0.11', '<')) { + $this->adjustFileSharePermissions($out); + } $this->removeSharesNonExistingParent($out); } diff --git a/lib/private/Repair/RepairLegacyStorages.php b/lib/private/Repair/RepairLegacyStorages.php deleted file mode 100644 index 228bdb67fe8907a295a06944a9bc868224aae331..0000000000000000000000000000000000000000 --- a/lib/private/Repair/RepairLegacyStorages.php +++ /dev/null @@ -1,257 +0,0 @@ - - * @author Joas Schilling - * @author Morris Jobke - * @author Thomas Müller - * @author Vincent Petry - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see - * - */ - -namespace OC\Repair; - -use OC\Files\Cache\Storage; -use OC\RepairException; -use OCP\Migration\IOutput; -use OCP\Migration\IRepairStep; - -class RepairLegacyStorages implements IRepairStep{ - /** - * @var \OCP\IConfig - */ - protected $config; - - /** - * @var \OCP\IDBConnection - */ - protected $connection; - - protected $findStorageInCacheStatement; - protected $renameStorageStatement; - - /** - * @param \OCP\IConfig $config - * @param \OCP\IDBConnection $connection - */ - public function __construct($config, $connection) { - $this->connection = $connection; - $this->config = $config; - - $this->findStorageInCacheStatement = $this->connection->prepare( - 'SELECT DISTINCT `storage` FROM `*PREFIX*filecache`' - . ' WHERE `storage` in (?, ?)' - ); - $this->renameStorageStatement = $this->connection->prepare( - 'UPDATE `*PREFIX*storages`' - . ' SET `id` = ?' - . ' WHERE `id` = ?' - ); - } - - public function getName() { - return 'Repair legacy storages'; - } - - /** - * Extracts the user id from a legacy storage id - * - * @param string $storageId legacy storage id in the - * format "local::/path/to/datadir/userid" - * @return string user id extracted from the storage id - */ - private function extractUserId($storageId) { - $storageId = rtrim($storageId, '/'); - $pos = strrpos($storageId, '/'); - return substr($storageId, $pos + 1); - } - - /** - * Fix the given legacy storage by renaming the old id - * to the new id. If the new id already exists, whichever - * storage that has data in the file cache will be used. - * If both have data, nothing will be done and false is - * returned. - * - * @param string $oldId old storage id - * @param int $oldNumericId old storage numeric id - * @param string $userId - * @return bool true if fixed, false otherwise - * @throws RepairException - */ - private function fixLegacyStorage($oldId, $oldNumericId, $userId = null) { - // check whether the new storage already exists - if (is_null($userId)) { - $userId = $this->extractUserId($oldId); - } - $newId = 'home::' . $userId; - - // check if target id already exists - $newNumericId = Storage::getNumericStorageId($newId); - if (!is_null($newNumericId)) { - $newNumericId = (int)$newNumericId; - // try and resolve the conflict - // check which one of "local::" or "home::" needs to be kept - $this->findStorageInCacheStatement->execute(array($oldNumericId, $newNumericId)); - $row1 = $this->findStorageInCacheStatement->fetch(); - $row2 = $this->findStorageInCacheStatement->fetch(); - $this->findStorageInCacheStatement->closeCursor(); - if ($row2 !== false) { - // two results means both storages have data, not auto-fixable - throw new RepairException( - 'Could not automatically fix legacy storage ' - . '"' . $oldId . '" => "' . $newId . '"' - . ' because they both have data.' - ); - } - if ($row1 === false || (int)$row1['storage'] === $oldNumericId) { - // old storage has data, then delete the empty new id - $toDelete = $newId; - } else if ((int)$row1['storage'] === $newNumericId) { - // new storage has data, then delete the empty old id - $toDelete = $oldId; - } else { - // unknown case, do not continue - return false; - } - - // delete storage including file cache - Storage::remove($toDelete); - - // if we deleted the old id, the new id will be used - // automatically - if ($toDelete === $oldId) { - // nothing more to do - return true; - } - } - - // rename old id to new id - $newId = Storage::adjustStorageId($newId); - $oldId = Storage::adjustStorageId($oldId); - $rowCount = $this->renameStorageStatement->execute(array($newId, $oldId)); - $this->renameStorageStatement->closeCursor(); - return ($rowCount === 1); - } - - /** - * Converts legacy home storage ids in the format - * "local::/data/dir/path/userid/" to the new format "home::userid" - */ - public function run(IOutput $out) { - // only run once - if ($this->config->getAppValue('core', 'repairlegacystoragesdone') === 'yes') { - return; - } - - $dataDir = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data/'); - $dataDir = rtrim($dataDir, '/') . '/'; - $dataDirId = 'local::' . $dataDir; - - $count = 0; - $hasWarnings = false; - - $this->connection->beginTransaction(); - - // note: not doing a direct UPDATE with the REPLACE function - // because regexp search/extract is needed and it is not guaranteed - // to work on all database types - $sql = 'SELECT `id`, `numeric_id` FROM `*PREFIX*storages`' - . ' WHERE `id` LIKE ?' - . ' ORDER BY `id`'; - $result = $this->connection->executeQuery($sql, array($this->connection->escapeLikeParameter($dataDirId) . '%')); - - while ($row = $result->fetch()) { - $currentId = $row['id']; - // one entry is the datadir itself - if ($currentId === $dataDirId) { - continue; - } - - try { - if ($this->fixLegacyStorage($currentId, (int)$row['numeric_id'])) { - $count++; - } - } - catch (RepairException $e) { - $hasWarnings = true; - $out->warning('Could not repair legacy storage ' . $currentId . ' automatically.'); - } - } - - // check for md5 ids, not in the format "prefix::" - $sql = 'SELECT COUNT(*) AS "c" FROM `*PREFIX*storages`' - . ' WHERE `id` NOT LIKE \'%::%\''; - $result = $this->connection->executeQuery($sql); - $row = $result->fetch(); - - // find at least one to make sure it's worth - // querying the user list - if ((int)$row['c'] > 0) { - $userManager = \OC::$server->getUserManager(); - - // use chunks to avoid caching too many users in memory - $limit = 30; - $offset = 0; - - do { - // query the next page of users - $results = $userManager->search('', $limit, $offset); - $storageIds = array(); - foreach ($results as $uid => $userObject) { - $storageId = $dataDirId . $uid . '/'; - if (strlen($storageId) <= 64) { - // skip short storage ids as they were handled in the previous section - continue; - } - $storageIds[$uid] = $storageId; - } - - if (count($storageIds) > 0) { - // update the storages of these users - foreach ($storageIds as $uid => $storageId) { - $numericId = Storage::getNumericStorageId($storageId); - try { - if (!is_null($numericId) && $this->fixLegacyStorage($storageId, (int)$numericId)) { - $count++; - } - } - catch (RepairException $e) { - $hasWarnings = true; - $out->warning('Could not repair legacy storage ' . $storageId . ' automatically.'); - } - } - } - $offset += $limit; - } while (count($results) >= $limit); - } - - $out->info('Updated ' . $count . ' legacy home storage ids'); - - $this->connection->commit(); - - Storage::getGlobalCache()->clearCache(); - - if ($hasWarnings) { - $out->warning('Some legacy storages could not be repaired. Please manually fix them then re-run ./occ maintenance:repair'); - } else { - // if all were done, no need to redo the repair during next upgrade - $this->config->setAppValue('core', 'repairlegacystoragesdone', 'yes'); - } - } -} diff --git a/lib/private/Security/Bruteforce/Throttler.php b/lib/private/Security/Bruteforce/Throttler.php index 031c5ffd411cd4d706858420ba77cdf076eca613..765f109fdb3b1ea7a4f6b72eb4777a52fd63641e 100644 --- a/lib/private/Security/Bruteforce/Throttler.php +++ b/lib/private/Security/Bruteforce/Throttler.php @@ -189,9 +189,10 @@ class Throttler { * Get the throttling delay (in milliseconds) * * @param string $ip + * @param string $action optionally filter by action * @return int */ - public function getDelay($ip) { + public function getDelay($ip, $action = '') { $cutoffTime = (new \DateTime()) ->sub($this->getCutoff(43200)) ->getTimestamp(); @@ -201,6 +202,11 @@ class Throttler { ->from('bruteforce_attempts') ->where($qb->expr()->gt('occurred', $qb->createNamedParameter($cutoffTime))) ->andWhere($qb->expr()->eq('subnet', $qb->createNamedParameter($this->getSubnet($ip)))); + + if ($action !== '') { + $qb->andWhere($qb->expr()->eq('action', $qb->createNamedParameter($action))); + } + $attempts = count($qb->execute()->fetchAll()); if ($attempts === 0) { @@ -225,10 +231,11 @@ class Throttler { * Will sleep for the defined amount of time * * @param string $ip + * @param string $action optionally filter by action * @return int the time spent sleeping */ - public function sleepDelay($ip) { - $delay = $this->getDelay($ip); + public function sleepDelay($ip, $action = '') { + $delay = $this->getDelay($ip, $action); usleep($delay * 1000); return $delay; } diff --git a/lib/private/Security/CSP/ContentSecurityPolicyNonceManager.php b/lib/private/Security/CSP/ContentSecurityPolicyNonceManager.php index 284700566d69d03003d9809149b2b3ee5be34822..85ae127f5f1be7b7d25e19f70f2d9aa929cc1585 100644 --- a/lib/private/Security/CSP/ContentSecurityPolicyNonceManager.php +++ b/lib/private/Security/CSP/ContentSecurityPolicyNonceManager.php @@ -69,8 +69,6 @@ class ContentSecurityPolicyNonceManager { Request::USER_AGENT_CHROME, // Firefox 45+ '/^Mozilla\/5\.0 \([^)]+\) Gecko\/[0-9.]+ Firefox\/(4[5-9]|[5-9][0-9])\.[0-9.]+$/', - // Safari 10+ - '/^Mozilla\/5\.0 \([^)]+\) AppleWebKit\/[0-9.]+ \(KHTML, like Gecko\) Version\/1[0-9.]+ Safari\/[0-9.A-Z]+$/', ]; if($this->request->isUserAgent($browserWhitelist)) { diff --git a/lib/private/Security/CertificateManager.php b/lib/private/Security/CertificateManager.php index f7bf0df58c5fff139c009d5250af302fa0ab7a25..461ef9457a7e1f69b40190dee9db2f9f58d01885 100644 --- a/lib/private/Security/CertificateManager.php +++ b/lib/private/Security/CertificateManager.php @@ -30,6 +30,7 @@ namespace OC\Security; use OC\Files\Filesystem; use OCP\ICertificateManager; use OCP\IConfig; +use OCP\ILogger; /** * Manage trusted certificates for users @@ -50,15 +51,22 @@ class CertificateManager implements ICertificateManager { */ protected $config; + /** + * @var ILogger + */ + protected $logger; + /** * @param string $uid * @param \OC\Files\View $view relative to data/ * @param IConfig $config + * @param ILogger $logger */ - public function __construct($uid, \OC\Files\View $view, IConfig $config) { + public function __construct($uid, \OC\Files\View $view, IConfig $config, ILogger $logger) { $this->uid = $uid; $this->view = $view; $this->config = $config; + $this->logger = $logger; } /** @@ -104,6 +112,13 @@ class CertificateManager implements ICertificateManager { $this->view->mkdir($path); } + $defaultCertificates = file_get_contents(\OC::$SERVERROOT . '/resources/config/ca-bundle.crt'); + if (strlen($defaultCertificates) < 1024) { // sanity check to verify that we have some content for our bundle + // log as exception so we have a stacktrace + $this->logger->logException(new \Exception('Shipped ca-bundle is empty, refusing to create certificate bundle')); + return; + } + $fhCerts = $this->view->fopen($path . '/rootcerts.crt', 'w'); // Write user certificates @@ -117,7 +132,6 @@ class CertificateManager implements ICertificateManager { } // Append the default certificates - $defaultCertificates = file_get_contents(\OC::$SERVERROOT . '/resources/config/ca-bundle.crt'); fwrite($fhCerts, $defaultCertificates); // Append the system certificate bundle @@ -203,7 +217,7 @@ class CertificateManager implements ICertificateManager { } if ($this->needsRebundling($uid)) { if (is_null($uid)) { - $manager = new CertificateManager(null, $this->view, $this->config); + $manager = new CertificateManager(null, $this->view, $this->config, $this->logger); $manager->createCertificateBundle(); } else { $this->createCertificateBundle(); diff --git a/lib/private/Server.php b/lib/private/Server.php index 2c0aac9b43cb7c00ea7c127a9afd2c001d2baf4e..3c716ae6ce6d2649b3f0c5e843eacf1a346f16cc 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -45,8 +45,8 @@ use bantu\IniGetWrapper\IniGetWrapper; use OC\App\AppStore\Fetcher\AppFetcher; use OC\App\AppStore\Fetcher\CategoryFetcher; use OC\AppFramework\Http\Request; -use OC\AppFramework\Db\Db; use OC\AppFramework\Utility\TimeFactory; +use OC\Authentication\LoginCredentials\Store; use OC\Command\AsyncBus; use OC\Diagnostics\EventLogger; use OC\Diagnostics\NullEventLogger; @@ -90,6 +90,7 @@ use OC\Security\TrustedDomainHelper; use OC\Session\CryptoWrapper; use OC\Tagging\TagMapper; use OCA\Theming\ThemingDefaults; +use OCP\Authentication\LoginCredentials\IStore; use OCP\IL10N; use OCP\IServerContainer; use OCP\RichObjectStrings\IValidator; @@ -125,7 +126,8 @@ class Server extends ServerContainer implements IServerContainer { $c->getConfig(), $c->getRootFolder(), $c->getAppDataDir('preview'), - $c->getEventDispatcher() + $c->getEventDispatcher(), + $c->getSession()->get('user_id') ); }); @@ -246,6 +248,17 @@ class Server extends ServerContainer implements IServerContainer { }); return $groupManager; }); + $this->registerService(Store::class, function(Server $c) { + $session = $c->getSession(); + if (\OC::$server->getSystemConfig()->getValue('installed', false)) { + $tokenProvider = $c->query('OC\Authentication\Token\IProvider'); + } else { + $tokenProvider = null; + } + $logger = $c->getLogger(); + return new Store($session, $logger, $tokenProvider); + }); + $this->registerAlias(IStore::class, Store::class); $this->registerService('OC\Authentication\Token\DefaultTokenMapper', function (Server $c) { $dbConnection = $c->getDatabaseConnection(); return new Authentication\Token\DefaultTokenMapper($dbConnection); @@ -313,11 +326,15 @@ class Server extends ServerContainer implements IServerContainer { }); $this->registerService(\OC\Authentication\TwoFactorAuth\Manager::class, function (Server $c) { - return new \OC\Authentication\TwoFactorAuth\Manager($c->getAppManager(), $c->getSession(), $c->getConfig()); + return new \OC\Authentication\TwoFactorAuth\Manager($c->getAppManager(), $c->getSession(), $c->getConfig(), $c->getActivityManager(), $c->getLogger()); }); - $this->registerService('NavigationManager', function ($c) { - return new \OC\NavigationManager(); + $this->registerService('NavigationManager', function (Server $c) { + return new \OC\NavigationManager($c->getAppManager(), + $c->getURLGenerator(), + $c->getL10NFactory(), + $c->getUserSession(), + $c->getGroupManager()); }); $this->registerService('AllConfig', function (Server $c) { return new \OC\AllConfig( @@ -361,7 +378,8 @@ class Server extends ServerContainer implements IServerContainer { return new CategoryFetcher( $this->getAppDataDir('appstore'), $this->getHTTPClientService(), - $this->query(TimeFactory::class) + $this->query(TimeFactory::class), + $this->getConfig() ); }); $this->registerService('UserCache', function ($c) { @@ -376,7 +394,7 @@ class Server extends ServerContainer implements IServerContainer { $version = implode(',', $v); $instanceId = \OC_Util::getInstanceId(); $path = \OC::$SERVERROOT; - $prefix = md5($instanceId . '-' . $version . '-' . $path); + $prefix = md5($instanceId . '-' . $version . '-' . $path . '-' . \OC::$WEBROOT); return new \OC\Memcache\Factory($prefix, $c->getLogger(), $config->getSystemValue('memcache.local', null), $config->getSystemValue('memcache.distributed', null), @@ -418,9 +436,8 @@ class Server extends ServerContainer implements IServerContainer { ); }); $this->registerService('Logger', function (Server $c) { - $logClass = $c->query('AllConfig')->getSystemValue('log_type', 'file'); - // TODO: Drop backwards compatibility for config in the future - $logger = 'OC\\Log\\' . ucfirst($logClass=='owncloud' ? 'file' : $logClass); + $logType = $c->query('AllConfig')->getSystemValue('log_type', 'file'); + $logger = Log::getLogClass($logType); call_user_func(array($logger, 'init')); return new Log($logger); @@ -470,9 +487,6 @@ class Server extends ServerContainer implements IServerContainer { $connection->getConfiguration()->setSQLLogger($c->getQueryLogger()); return $connection; }); - $this->registerService('Db', function (Server $c) { - return new Db($c->getDatabaseConnection()); - }); $this->registerService('HTTPHelper', function (Server $c) { $config = $c->getConfig(); return new HTTPHelper( @@ -485,7 +499,7 @@ class Server extends ServerContainer implements IServerContainer { $uid = $user ? $user : null; return new ClientService( $c->getConfig(), - new \OC\Security\CertificateManager($uid, new View(), $c->getConfig()) + new \OC\Security\CertificateManager($uid, new View(), $c->getConfig(), $c->getLogger()) ); }); $this->registerService('EventLogger', function (Server $c) { @@ -794,7 +808,9 @@ class Server extends ServerContainer implements IServerContainer { $c->getConfig(), $c->getEncryptionManager(), $c->getUserManager(), - $c->getLockingProvider() + $c->getLockingProvider(), + new \OC\Settings\Mapper($c->getDatabaseConnection()), + $c->getURLGenerator() ); return $manager; }); @@ -900,7 +916,6 @@ class Server extends ServerContainer implements IServerContainer { return $this->query('SystemTagObjectMapper'); } - /** * Returns the avatar manager, used for avatar functionality * @@ -998,7 +1013,8 @@ class Server extends ServerContainer implements IServerContainer { */ public function setSession(\OCP\ISession $session) { $this->query(SessionStorage::class)->setSession($session); - return $this->query('UserSession')->setSession($session); + $this->query('UserSession')->setSession($session); + $this->query(Store::class)->setSession($session); } /** @@ -1198,16 +1214,6 @@ class Server extends ServerContainer implements IServerContainer { return $this->query('CredentialsManager'); } - /** - * Returns an instance of the db facade - * - * @deprecated use getDatabaseConnection, will be removed in ownCloud 10 - * @return \OCP\IDb - */ - public function getDb() { - return $this->query('Db'); - } - /** * Returns an instance of the HTTP helper class * @@ -1233,7 +1239,7 @@ class Server extends ServerContainer implements IServerContainer { } $userId = $user->getUID(); } - return new CertificateManager($userId, new View(), $this->getConfig()); + return new CertificateManager($userId, new View(), $this->getConfig(), $this->getLogger()); } /** diff --git a/lib/private/Settings/Admin/Encryption.php b/lib/private/Settings/Admin/Encryption.php index 6e93407f1a39120a17fa13b0381e25adbdb380c1..63020c6bce7087b064e3a0720f5f7b102f321352 100644 --- a/lib/private/Settings/Admin/Encryption.php +++ b/lib/private/Settings/Admin/Encryption.php @@ -23,23 +23,23 @@ namespace OC\Settings\Admin; -use OC\Encryption\Manager; use OCP\AppFramework\Http\TemplateResponse; +use OCP\Encryption\IManager; use OCP\IUserManager; use OCP\Settings\ISettings; class Encryption implements ISettings { - /** @var Manager */ + /** @var IManager */ private $manager; /** @var IUserManager */ private $userManager; /** - * @param Manager $manager + * @param IManager $manager * @param IUserManager $userManager */ - public function __construct(Manager $manager, IUserManager $userManager) { + public function __construct(IManager $manager, IUserManager $userManager) { $this->manager = $manager; $this->userManager = $userManager; } diff --git a/lib/private/Settings/Manager.php b/lib/private/Settings/Manager.php index 990750848d33f7d33a784ef4deddfbbc7a093b65..7a339b94199e44a7b807f2adffcd0757c91c8d6d 100644 --- a/lib/private/Settings/Manager.php +++ b/lib/private/Settings/Manager.php @@ -29,6 +29,7 @@ use OCP\IConfig; use OCP\IDBConnection; use OCP\IL10N; use OCP\ILogger; +use OCP\IURLGenerator; use OCP\IUserManager; use OCP\Lock\ILockingProvider; use OCP\Settings\ISettings; @@ -43,6 +44,8 @@ class Manager implements IManager { private $log; /** @var IDBConnection */ private $dbc; + /** @var Mapper */ + private $mapper; /** @var IL10N */ private $l; /** @var IConfig */ @@ -53,6 +56,8 @@ class Manager implements IManager { private $userManager; /** @var ILockingProvider */ private $lockingProvider; + /** @var IURLGenerator */ + private $url; /** * @param ILogger $log @@ -62,6 +67,8 @@ class Manager implements IManager { * @param EncryptionManager $encryptionManager * @param IUserManager $userManager * @param ILockingProvider $lockingProvider + * @param Mapper $mapper + * @param IURLGenerator $url */ public function __construct( ILogger $log, @@ -70,25 +77,29 @@ class Manager implements IManager { IConfig $config, EncryptionManager $encryptionManager, IUserManager $userManager, - ILockingProvider $lockingProvider + ILockingProvider $lockingProvider, + Mapper $mapper, + IURLGenerator $url ) { $this->log = $log; $this->dbc = $dbc; + $this->mapper = $mapper; $this->l = $l; $this->config = $config; $this->encryptionManager = $encryptionManager; $this->userManager = $userManager; $this->lockingProvider = $lockingProvider; + $this->url = $url; } /** * @inheritdoc */ public function setupSettings(array $settings) { - if(isset($settings[IManager::KEY_ADMIN_SECTION])) { + if (isset($settings[IManager::KEY_ADMIN_SECTION])) { $this->setupAdminSection($settings[IManager::KEY_ADMIN_SECTION]); } - if(isset($settings[IManager::KEY_ADMIN_SETTINGS])) { + if (isset($settings[IManager::KEY_ADMIN_SETTINGS])) { $this->setupAdminSettings($settings[IManager::KEY_ADMIN_SETTINGS]); } } @@ -104,50 +115,33 @@ class Manager implements IManager { public function onAppDisabled($appId) { $appInfo = \OC_App::getAppInfo($appId); // hello static legacy - if(isset($appInfo['settings'][IManager::KEY_ADMIN_SECTION])) { - $this->remove(self::TABLE_ADMIN_SECTIONS, trim($appInfo['settings'][IManager::KEY_ADMIN_SECTION], '\\')); + if (isset($appInfo['settings'][IManager::KEY_ADMIN_SECTION])) { + $this->mapper->remove(self::TABLE_ADMIN_SECTIONS, trim($appInfo['settings'][IManager::KEY_ADMIN_SECTION], '\\')); } - if(isset($appInfo['settings'][IManager::KEY_ADMIN_SETTINGS])) { - $this->remove(self::TABLE_ADMIN_SETTINGS, trim($appInfo['settings'][IManager::KEY_ADMIN_SETTINGS], '\\')); + if (isset($appInfo['settings'][IManager::KEY_ADMIN_SETTINGS])) { + $this->mapper->remove(self::TABLE_ADMIN_SETTINGS, trim($appInfo['settings'][IManager::KEY_ADMIN_SETTINGS], '\\')); } } public function checkForOrphanedClassNames() { - $tables = [ self::TABLE_ADMIN_SECTIONS, self::TABLE_ADMIN_SETTINGS ]; + $tables = [self::TABLE_ADMIN_SECTIONS, self::TABLE_ADMIN_SETTINGS]; foreach ($tables as $table) { - $classes = $this->getClasses($table); - foreach($classes as $className) { + $classes = $this->mapper->getClasses($table); + foreach ($classes as $className) { try { \OC::$server->query($className); } catch (QueryException $e) { - $this->remove($table, $className); + $this->mapper->remove($table, $className); } } } } - /** - * returns the registerd classes in the given table - * - * @param $table - * @return string[] - */ - private function getClasses($table) { - $q = $this->dbc->getQueryBuilder(); - $resultStatement = $q->select('class') - ->from($table) - ->execute(); - $data = $resultStatement->fetchAll(); - $resultStatement->closeCursor(); - - return array_map(function($row) { return $row['class']; }, $data); - } - /** * @param string $sectionClassName */ private function setupAdminSection($sectionClassName) { - if(!class_exists($sectionClassName)) { + if (!class_exists($sectionClassName)) { $this->log->debug('Could not find admin section class ' . $sectionClassName); return; } @@ -158,14 +152,14 @@ class Manager implements IManager { return; } - if(!$section instanceof ISection) { + if (!$section instanceof ISection) { $this->log->error( 'Admin section instance must implement \OCP\ISection. Invalid class: {class}', ['class' => $sectionClassName] ); return; } - if(!$this->hasAdminSection(get_class($section))) { + if (!$this->hasAdminSection(get_class($section))) { $this->addAdminSection($section); } else { $this->updateAdminSection($section); @@ -173,7 +167,7 @@ class Manager implements IManager { } private function addAdminSection(ISection $section) { - $this->add(self::TABLE_ADMIN_SECTIONS, [ + $this->mapper->add(self::TABLE_ADMIN_SECTIONS, [ 'id' => $section->getID(), 'class' => get_class($section), 'priority' => $section->getPriority(), @@ -181,28 +175,15 @@ class Manager implements IManager { } private function addAdminSettings(ISettings $settings) { - $this->add(self::TABLE_ADMIN_SETTINGS, [ + $this->mapper->add(self::TABLE_ADMIN_SETTINGS, [ 'class' => get_class($settings), 'section' => $settings->getSection(), 'priority' => $settings->getPriority(), ]); } - /** - * @param string $table - * @param array $values - */ - private function add($table, array $values) { - $query = $this->dbc->getQueryBuilder(); - $values = array_map(function($value) use ($query) { - return $query->createNamedParameter($value); - }, $values); - $query->insert($table)->values($values); - $query->execute(); - } - private function updateAdminSettings(ISettings $settings) { - $this->update( + $this->mapper->update( self::TABLE_ADMIN_SETTINGS, 'class', get_class($settings), @@ -214,35 +195,23 @@ class Manager implements IManager { } private function updateAdminSection(ISection $section) { - $this->update( + $this->mapper->update( self::TABLE_ADMIN_SECTIONS, 'class', get_class($section), [ - 'id' => $section->getID(), + 'id' => $section->getID(), 'priority' => $section->getPriority(), ] ); } - private function update($table, $idCol, $id, $values) { - $query = $this->dbc->getQueryBuilder(); - $query->update($table); - foreach($values as $key => $value) { - $query->set($key, $query->createNamedParameter($value)); - } - $query - ->where($query->expr()->eq($idCol, $query->createParameter($idCol))) - ->setParameter($idCol, $id) - ->execute(); - } - /** * @param string $className * @return bool */ private function hasAdminSection($className) { - return $this->has(self::TABLE_ADMIN_SECTIONS, $className); + return $this->mapper->has(self::TABLE_ADMIN_SECTIONS, $className); } /** @@ -250,44 +219,11 @@ class Manager implements IManager { * @return bool */ private function hasAdminSettings($className) { - return $this->has(self::TABLE_ADMIN_SETTINGS, $className); - } - - /** - * @param string $table - * @param string $className - * @return bool - */ - private function has($table, $className) { - $query = $this->dbc->getQueryBuilder(); - $query->select('class') - ->from($table) - ->where($query->expr()->eq('class', $query->createNamedParameter($className))) - ->setMaxResults(1); - - $result = $query->execute(); - $row = $result->fetch(); - $result->closeCursor(); - - return (bool) $row; - } - - /** - * deletes an settings or admin entry from the given table - * - * @param $table - * @param $className - */ - private function remove($table, $className) { - $query = $this->dbc->getQueryBuilder(); - $query->delete($table) - ->where($query->expr()->eq('class', $query->createNamedParameter($className))); - - $query->execute(); + return $this->mapper->has(self::TABLE_ADMIN_SETTINGS, $className); } private function setupAdminSettings($settingsClassName) { - if(!class_exists($settingsClassName)) { + if (!class_exists($settingsClassName)) { $this->log->debug('Could not find admin section class ' . $settingsClassName); return; } @@ -300,14 +236,14 @@ class Manager implements IManager { return; } - if(!$settings instanceof ISettings) { + if (!$settings instanceof ISettings) { $this->log->error( 'Admin section instance must implement \OCP\Settings\ISection. Invalid class: {class}', ['class' => $settingsClassName] ); return; } - if(!$this->hasAdminSettings(get_class($settings))) { + if (!$this->hasAdminSettings(get_class($settings))) { $this->addAdminSettings($settings); } else { $this->updateAdminSettings($settings); @@ -329,24 +265,17 @@ class Manager implements IManager { public function getAdminSections() { // built-in sections $sections = [ - 0 => [new Section('server', $this->l->t('Server settings'), 0)], - 5 => [new Section('sharing', $this->l->t('Sharing'), 0)], - 45 => [new Section('encryption', $this->l->t('Encryption'), 0)], - 98 => [new Section('additional', $this->l->t('Additional settings'), 0)], - 99 => [new Section('tips-tricks', $this->l->t('Tips & tricks'), 0)], + 0 => [new Section('server', $this->l->t('Server settings'), 0, $this->url->imagePath('settings', 'admin.svg'))], + 5 => [new Section('sharing', $this->l->t('Sharing'), 0, $this->url->imagePath('core', 'actions/share.svg'))], + 45 => [new Section('encryption', $this->l->t('Encryption'), 0, $this->url->imagePath('core', 'actions/password.svg'))], + 98 => [new Section('additional', $this->l->t('Additional settings'), 0, $this->url->imagePath('core', 'actions/settings-dark.svg'))], + 99 => [new Section('tips-tricks', $this->l->t('Tips & tricks'), 0, $this->url->imagePath('settings', 'help.svg'))], ]; - $query = $this->dbc->getQueryBuilder(); - $query->selectDistinct('s.class') - ->addSelect('s.priority') - ->from(self::TABLE_ADMIN_SECTIONS, 's') - ->from(self::TABLE_ADMIN_SETTINGS, 'f') - ->where($query->expr()->eq('s.id', 'f.section')) - ; - $result = $query->execute(); + $rows = $this->mapper->getAdminSectionsFromDB(); - while($row = $result->fetch()) { - if(!isset($sections[$row['priority']])) { + foreach ($rows as $row) { + if (!isset($sections[$row['priority']])) { $sections[$row['priority']] = []; } try { @@ -355,38 +284,42 @@ class Manager implements IManager { // skip } } - $result->closeCursor(); ksort($sections); + return $sections; } + /** + * @param string $section + * @return ISection[] + */ private function getBuiltInAdminSettings($section) { $forms = []; try { - if($section === 'server') { + if ($section === 'server') { /** @var ISettings $form */ $form = new Admin\Server($this->dbc, $this->config, $this->lockingProvider, $this->l); $forms[$form->getPriority()] = [$form]; $form = new Admin\ServerDevNotice(); $forms[$form->getPriority()] = [$form]; } - if($section === 'encryption') { + if ($section === 'encryption') { /** @var ISettings $form */ $form = new Admin\Encryption($this->encryptionManager, $this->userManager); $forms[$form->getPriority()] = [$form]; } - if($section === 'sharing') { + if ($section === 'sharing') { /** @var ISettings $form */ $form = new Admin\Sharing($this->config); $forms[$form->getPriority()] = [$form]; } - if($section === 'additional') { + if ($section === 'additional') { /** @var ISettings $form */ $form = new Admin\Additional($this->config); $forms[$form->getPriority()] = [$form]; } - if($section === 'tips-tricks') { + if ($section === 'tips-tricks') { /** @var ISettings $form */ $form = new Admin\TipsTricks($this->config); $forms[$form->getPriority()] = [$form]; @@ -397,16 +330,15 @@ class Manager implements IManager { return $forms; } - private function getAdminSettingsFromDB($section, &$settings) { - $query = $this->dbc->getQueryBuilder(); - $query->select(['class', 'priority']) - ->from(self::TABLE_ADMIN_SETTINGS) - ->where($query->expr()->eq('section', $this->dbc->getQueryBuilder()->createParameter('section'))) - ->setParameter('section', $section); + /** + * @inheritdoc + */ + public function getAdminSettings($section) { + $settings = $this->getBuiltInAdminSettings($section); + $dbRows = $this->mapper->getAdminSettingsFromDB($section); - $result = $query->execute(); - while($row = $result->fetch()) { - if(!isset($settings[$row['priority']])) { + foreach ($dbRows as $row) { + if (!isset($settings[$row['priority']])) { $settings[$row['priority']] = []; } try { @@ -415,17 +347,8 @@ class Manager implements IManager { // skip } } - $result->closeCursor(); ksort($settings); - } - - /** - * @inheritdoc - */ - public function getAdminSettings($section) { - $settings = $this->getBuiltInAdminSettings($section); - $this->getAdminSettingsFromDB($section, $settings); return $settings; } } diff --git a/lib/private/Settings/Mapper.php b/lib/private/Settings/Mapper.php new file mode 100644 index 0000000000000000000000000000000000000000..2525f2c98541be24c75df8278ba43e8c3c6c7311 --- /dev/null +++ b/lib/private/Settings/Mapper.php @@ -0,0 +1,163 @@ + + * + * @author Robin Appelman + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OC\Settings; + +use OCP\IDBConnection; + +class Mapper { + const TABLE_ADMIN_SETTINGS = 'admin_settings'; + const TABLE_ADMIN_SECTIONS = 'admin_sections'; + + /** @var IDBConnection */ + private $dbc; + + /** + * @param IDBConnection $dbc + */ + public function __construct(IDBConnection $dbc) { + $this->dbc = $dbc; + } + + /** + * Get the configured admin settings from the database for the provided section + * + * @param string $section + * @return array[] [['class' => string, 'priority' => int], ...] + */ + public function getAdminSettingsFromDB($section) { + $query = $this->dbc->getQueryBuilder(); + $query->select(['class', 'priority']) + ->from(self::TABLE_ADMIN_SETTINGS) + ->where($query->expr()->eq('section', $this->dbc->getQueryBuilder()->createParameter('section'))) + ->setParameter('section', $section); + + $result = $query->execute(); + return $result->fetchAll(); + } + + /** + * Get the configured admin sections from the database + * + * @return array[] [['class' => string, 'priority' => int], ...] + */ + public function getAdminSectionsFromDB() { + $query = $this->dbc->getQueryBuilder(); + $query->selectDistinct('s.class') + ->addSelect('s.priority') + ->from(self::TABLE_ADMIN_SECTIONS, 's') + ->from(self::TABLE_ADMIN_SETTINGS, 'f') + ->where($query->expr()->eq('s.id', 'f.section')); + $result = $query->execute(); + return array_map(function ($row) { + $row['priority'] = (int)$row['priority']; + return $row; + }, $result->fetchAll()); + } + + /** + * @param string $table Mapper::TABLE_ADMIN_SECTIONS or Mapper::TABLE_ADMIN_SETTINGS + * @param array $values + */ + public function add($table, array $values) { + $query = $this->dbc->getQueryBuilder(); + $values = array_map(function ($value) use ($query) { + return $query->createNamedParameter($value); + }, $values); + $query->insert($table)->values($values); + $query->execute(); + } + + /** + * returns the registered classes in the given table + * + * @param $table Mapper::TABLE_ADMIN_SECTIONS or Mapper::TABLE_ADMIN_SETTINGS + * @return string[] + */ + public function getClasses($table) { + $q = $this->dbc->getQueryBuilder(); + $resultStatement = $q->select('class') + ->from($table) + ->execute(); + $data = $resultStatement->fetchAll(); + $resultStatement->closeCursor(); + + return array_map(function ($row) { + return $row['class']; + }, $data); + } + + /** + * Check if a class is configured in the database + * + * @param string $table Mapper::TABLE_ADMIN_SECTIONS or Mapper::TABLE_ADMIN_SETTINGS + * @param string $className + * @return bool + */ + public function has($table, $className) { + $query = $this->dbc->getQueryBuilder(); + $query->select('class') + ->from($table) + ->where($query->expr()->eq('class', $query->createNamedParameter($className))) + ->setMaxResults(1); + + $result = $query->execute(); + $row = $result->fetch(); + $result->closeCursor(); + + return (bool)$row; + } + + /** + * deletes an settings or admin entry from the given table + * + * @param $table Mapper::TABLE_ADMIN_SECTIONS or Mapper::TABLE_ADMIN_SETTINGS + * @param $className + */ + public function remove($table, $className) { + $query = $this->dbc->getQueryBuilder(); + $query->delete($table) + ->where($query->expr()->eq('class', $query->createNamedParameter($className))); + + $query->execute(); + } + + /** + * @param $table Mapper::TABLE_ADMIN_SECTIONS or Mapper::TABLE_ADMIN_SETTINGS + * @param $idCol + * @param $id + * @param $values + */ + public function update($table, $idCol, $id, $values) { + $query = $this->dbc->getQueryBuilder(); + $query->update($table); + foreach ($values as $key => $value) { + $query->set($key, $query->createNamedParameter($value)); + } + $query + ->where($query->expr()->eq($idCol, $query->createParameter($idCol))) + ->setParameter($idCol, $id) + ->execute(); + } + +} diff --git a/lib/private/Settings/Section.php b/lib/private/Settings/Section.php index b3cf242279fc24722a4fdf423a7d50f3b647d713..c89a3999c4e7ed1ad4ad79ab650e410d887a4044 100644 --- a/lib/private/Settings/Section.php +++ b/lib/private/Settings/Section.php @@ -23,25 +23,29 @@ namespace OC\Settings; -use OCP\Settings\ISection; +use OCP\Settings\IIconSection; -class Section implements ISection { +class Section implements IIconSection { /** @var string */ private $id; /** @var string */ private $name; /** @var int */ private $priority; + /** @var string */ + private $icon; /** * @param string $id * @param string $name * @param int $priority + * @param string $icon */ - public function __construct($id, $name, $priority) { + public function __construct($id, $name, $priority, $icon = '') { $this->id = $id; $this->name = $name; $this->priority = $priority; + $this->icon = $icon; } /** @@ -74,4 +78,15 @@ class Section implements ISection { public function getPriority() { return $this->priority; } + + /** + * returns the relative path to an 16*16 icon describing the section. + * e.g. '/core/img/places/files.svg' + * + * @returns string + * @since 12 + */ + public function getIcon() { + return $this->icon; + } } diff --git a/lib/private/Setup.php b/lib/private/Setup.php index 81a5343fe2103b1412128ff0419f5efbb9c18ac7..d99977676846a6eaf7ce002d9e9f3aafd23572ee 100644 --- a/lib/private/Setup.php +++ b/lib/private/Setup.php @@ -125,8 +125,8 @@ class Setup { public function getSupportedDatabases($allowAllDatabases = false) { $availableDatabases = array( 'sqlite' => array( - 'type' => 'class', - 'call' => 'SQLite3', + 'type' => 'pdo', + 'call' => 'sqlite', 'name' => 'SQLite' ), 'mysql' => array( @@ -163,9 +163,7 @@ class Setup { $type = $availableDatabases[$database]['type']; $call = $availableDatabases[$database]['call']; - if($type === 'class') { - $working = $this->class_exists($call); - } elseif ($type === 'function') { + if ($type === 'function') { $working = $this->is_callable($call); } elseif($type === 'pdo') { $working = in_array($call, $this->getAvailableDbDriversForPdo(), TRUE); diff --git a/lib/private/Setup/MySQL.php b/lib/private/Setup/MySQL.php index d1399c8821c05c05635a1a195281f718b45897d5..bafb3866b762394afa69fba86b5fdbcf9194464a 100644 --- a/lib/private/Setup/MySQL.php +++ b/lib/private/Setup/MySQL.php @@ -35,7 +35,7 @@ class MySQL extends AbstractDatabase { public function setupDatabase($username) { //check if the database user has admin right - $connection = $this->connect(); + $connection = $this->connect(['dbname' => null]); $this->createSpecificUser($username, $connection); @@ -152,7 +152,7 @@ class MySQL extends AbstractDatabase { }; } } catch (\Exception $ex) { - $this->logger->error('Specific user creation failed: {error}', [ + $this->logger->info('Can not create a new MySQL user, will continue with the provided user: {error}', [ 'app' => 'mysql.setup', 'error' => $ex->getMessage() ]); diff --git a/lib/private/Setup/PostgreSQL.php b/lib/private/Setup/PostgreSQL.php index 085e8609ab286b098ab644ac6d098a5bc540173d..c01e5bc0332bc623eae6bb30d93446a719476c42 100644 --- a/lib/private/Setup/PostgreSQL.php +++ b/lib/private/Setup/PostgreSQL.php @@ -150,14 +150,16 @@ class PostgreSQL extends AbstractDatabase { } private function createDBUser(IDBConnection $connection) { + $dbUser = $this->dbUser; try { - if ($this->userExists($connection)) { - // change the password - $query = $connection->prepare("ALTER ROLE " . addslashes($this->dbUser) . " WITH CREATEDB PASSWORD '" . addslashes($this->dbPassword) . "'"); - } else { - // create the user - $query = $connection->prepare("CREATE USER " . addslashes($this->dbUser) . " CREATEDB PASSWORD '" . addslashes($this->dbPassword) . "'"); - } + $i = 1; + while ($this->userExists($connection)) { + $i++; + $this->dbUser = $dbUser . $i; + }; + + // create the user + $query = $connection->prepare("CREATE USER " . addslashes($this->dbUser) . " CREATEDB PASSWORD '" . addslashes($this->dbPassword) . "'"); $query->execute(); } catch (DatabaseException $e) { $this->logger->error('Error while trying to create database user'); diff --git a/lib/private/Setup/Sqlite.php b/lib/private/Setup/Sqlite.php index 63b970be42e585f695686654cfaccad64b3ce0a8..4d860103b6018f33e7b5648eb77f63c04c326f49 100644 --- a/lib/private/Setup/Sqlite.php +++ b/lib/private/Setup/Sqlite.php @@ -33,7 +33,7 @@ class Sqlite extends AbstractDatabase { } public function setupDatabase($username) { - $datadir = \OC::$server->getSystemConfig()->getValue('datadirectory'); + $datadir = \OC::$server->getSystemConfig()->getValue('datadirectory', \OC::$SERVERROOT . '/data'); //delete the old sqlite database first, might cause infinte loops otherwise if(file_exists("$datadir/owncloud.db")) { diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php index 7a60295017104004d2ff8c63df09c7f49502e82b..23e8db34d7f4e1919174b47029b2d23c74f1e149 100644 --- a/lib/private/Share20/DefaultShareProvider.php +++ b/lib/private/Share20/DefaultShareProvider.php @@ -162,7 +162,6 @@ class DefaultShareProvider implements IShareProvider { $this->dbConn->beginTransaction(); $qb->execute(); $id = $this->dbConn->lastInsertId('*PREFIX*share'); - $this->dbConn->commit(); // Now fetch the inserted share and create a complete share object $qb = $this->dbConn->getQueryBuilder(); @@ -172,6 +171,7 @@ class DefaultShareProvider implements IShareProvider { $cursor = $qb->execute(); $data = $cursor->fetch(); + $this->dbConn->commit(); $cursor->closeCursor(); if ($data === false) { @@ -853,7 +853,6 @@ class DefaultShareProvider implements IShareProvider { $entryData['permissions'] = $entryData['f_permissions']; $entryData['parent'] = $entryData['f_parent'];; $share->setNodeCacheEntry(Cache::cacheEntryFromData($entryData, - $entryData['storage_string_id'], \OC::$server->getMimeTypeLoader())); } diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php index cd1d52c3bbf46a54c5942c2177993fa32542d289..acc142f62be597064a5dfe2bec6909bca779c06e 100644 --- a/lib/private/Share20/Manager.php +++ b/lib/private/Share20/Manager.php @@ -587,7 +587,6 @@ class Manager implements IManager { $share->setPassword($this->hasher->hash($share->getPassword())); } } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_EMAIL) { - $this->linkCreateChecks($share); $share->setToken( $this->secureRandom->generate( \OC\Share\Constants::TOKEN_LENGTH, @@ -1055,8 +1054,10 @@ class Manager implements IManager { public function getShareByToken($token) { $share = null; try { - $provider = $this->factory->getProviderForType(\OCP\Share::SHARE_TYPE_LINK); - $share = $provider->getShareByToken($token); + if($this->shareApiAllowLinks()) { + $provider = $this->factory->getProviderForType(\OCP\Share::SHARE_TYPE_LINK); + $share = $provider->getShareByToken($token); + } } catch (ProviderException $e) { } catch (ShareNotFound $e) { } @@ -1072,7 +1073,7 @@ class Manager implements IManager { } } - // If it is not a link share try to fetch a federated share by token + // If it is not a link share try to fetch a mail share by token if ($share === null && $this->shareProviderExists(\OCP\Share::SHARE_TYPE_EMAIL)) { try { $provider = $this->factory->getProviderForType(\OCP\Share::SHARE_TYPE_EMAIL); diff --git a/lib/private/SubAdmin.php b/lib/private/SubAdmin.php index 9a2beed09fe5c300dcfba7ab81b1a2f51d2bb317..0650c7c6c01285330f3f55a7955c6ceeb178f706 100644 --- a/lib/private/SubAdmin.php +++ b/lib/private/SubAdmin.php @@ -188,7 +188,7 @@ class SubAdmin extends PublicEmitter { * @param IGroup $group * @return bool */ - public function isSubAdminofGroup(IUser $user, IGroup $group) { + public function isSubAdminOfGroup(IUser $user, IGroup $group) { $qb = $this->dbConn->getQueryBuilder(); /* diff --git a/lib/private/SystemConfig.php b/lib/private/SystemConfig.php index 1029a6619ffd2a920f83b0bfadfb71f39d920aab..e5f1adaf00464cbc08ec8f9de164218617f13c02 100644 --- a/lib/private/SystemConfig.php +++ b/lib/private/SystemConfig.php @@ -44,7 +44,6 @@ class SystemConfig { 'passwordsalt' => true, 'secret' => true, 'updater.secret' => true, - 'ldap_agent_password' => true, 'proxyuserpwd' => true, 'log.condition' => [ 'shared_secret' => true, diff --git a/lib/private/Template/CSSResourceLocator.php b/lib/private/Template/CSSResourceLocator.php index ffeaf765ff54692f35dc2248431078ca98fe6d0a..3a474a1ecfd935873cfa892f62175fbf36666770 100644 --- a/lib/private/Template/CSSResourceLocator.php +++ b/lib/private/Template/CSSResourceLocator.php @@ -25,23 +25,46 @@ namespace OC\Template; +use OCP\ILogger; + class CSSResourceLocator extends ResourceLocator { + + /** @var SCSSCacher */ + protected $scssCacher; + + /** + * @param ILogger $logger + * @param string $theme + * @param array $core_map + * @param array $party_map + * @param SCSSCacher $scssCacher + */ + public function __construct(ILogger $logger, $theme, $core_map, $party_map, $scssCacher) { + $this->scssCacher = $scssCacher; + + parent::__construct($logger, $theme, $core_map, $party_map); + } + /** * @param string $style */ public function doFind($style) { + $app = substr($style, 0, strpos($style, '/')); if (strpos($style, '3rdparty') === 0 && $this->appendIfExist($this->thirdpartyroot, $style.'.css') + || $this->cacheAndAppendScssIfExist($this->serverroot, $style.'.scss', $app) + || $this->cacheAndAppendScssIfExist($this->serverroot, 'core/'.$style.'.scss') || $this->appendIfExist($this->serverroot, $style.'.css') || $this->appendIfExist($this->serverroot, 'core/'.$style.'.css') ) { return; } - $app = substr($style, 0, strpos($style, '/')); $style = substr($style, strpos($style, '/')+1); $app_path = \OC_App::getAppPath($app); $app_url = \OC_App::getAppWebPath($app); - $this->append($app_path, $style.'.css', $app_url); + if(!$this->cacheAndAppendScssIfExist($app_path, $style.'.scss', $app)) { + $this->append($app_path, $style.'.css', $app_url); + } } /** @@ -53,4 +76,29 @@ class CSSResourceLocator extends ResourceLocator { || $this->appendIfExist($this->serverroot, $theme_dir.$style.'.css') || $this->appendIfExist($this->serverroot, $theme_dir.'core/'.$style.'.css'); } + + /** + * cache and append the scss $file if exist at $root + * + * @param string $root path to check + * @param string $file the filename + * @return bool True if the resource was found and cached, false otherwise + */ + protected function cacheAndAppendScssIfExist($root, $file, $app = 'core') { + if (is_file($root.'/'.$file)) { + if($this->scssCacher !== null) { + if($this->scssCacher->process($root, $file, $app)) { + $this->append($root, $this->scssCacher->getCachedSCSS($app, $file), false); + return true; + } else { + $this->logger->warning('Failed to compile and/or save '.$root.'/'.$file, ['app' => 'core']); + return false; + } + } else { + $this->logger->debug('Scss is disabled for '.$root.'/'.$file.', ignoring', ['app' => 'core']); + return true; + } + } + return false; + } } diff --git a/lib/private/Template/ResourceLocator.php b/lib/private/Template/ResourceLocator.php old mode 100644 new mode 100755 index 420317d27ac8a8424bc20b97c478106c068b4aab..e22ebdcab7d7d4257577a46b61ce9789aed50921 --- a/lib/private/Template/ResourceLocator.php +++ b/lib/private/Template/ResourceLocator.php @@ -75,7 +75,7 @@ abstract class ResourceLocator { $this->doFind($resource); } catch (ResourceNotFoundException $e) { $resourceApp = substr($resource, 0, strpos($resource, '/')); - $this->logger->error('Could not find resource file "' . $e->getResourcePath() . '"', ['app' => $resourceApp]); + $this->logger->debug('Could not find resource file "' . $e->getResourcePath() . '"', ['app' => $resourceApp]); } } if (!empty($this->theme)) { @@ -84,7 +84,7 @@ abstract class ResourceLocator { $this->doFindTheme($resource); } catch (ResourceNotFoundException $e) { $resourceApp = substr($resource, 0, strpos($resource, '/')); - $this->logger->error('Could not find resource file "' . $e->getResourcePath() . '"', ['app' => $resourceApp]); + $this->logger->debug('Could not find resource file "' . $e->getResourcePath() . '"', ['app' => $resourceApp]); } } } diff --git a/lib/private/Template/SCSSCacher.php b/lib/private/Template/SCSSCacher.php new file mode 100644 index 0000000000000000000000000000000000000000..d6f5a2c6fd3fc0f5d8b3766dd4fab3c940432aaa --- /dev/null +++ b/lib/private/Template/SCSSCacher.php @@ -0,0 +1,190 @@ +. + * + */ + +namespace OC\Template; + +use Leafo\ScssPhp\Compiler; +use Leafo\ScssPhp\Exception\ParserException; +use Leafo\ScssPhp\Formatter\Crunched; +use Leafo\ScssPhp\Formatter\Expanded; +use OC\SystemConfig; +use OCP\Files\IAppData; +use OCP\Files\NotFoundException; +use OCP\Files\SimpleFS\ISimpleFolder; +use OCP\ILogger; +use OCP\IURLGenerator; + +class SCSSCacher { + + /** @var ILogger */ + protected $logger; + + /** @var IAppData */ + protected $appData; + + /** @var IURLGenerator */ + protected $urlGenerator; + + /** @var SystemConfig */ + protected $systemConfig; + + /** + * @param ILogger $logger + * @param IAppData $appData + * @param IURLGenerator $urlGenerator + * @param SystemConfig $systemConfig + */ + public function __construct(ILogger $logger, IAppData $appData, IURLGenerator $urlGenerator, SystemConfig $systemConfig) { + $this->logger = $logger; + $this->appData = $appData; + $this->urlGenerator = $urlGenerator; + $this->systemConfig = $systemConfig; + } + + /** + * Process the caching process if needed + * @param string $root Root path to the nextcloud installation + * @param string $file + * @param string $app The app name + * @return boolean + */ + public function process($root, $file, $app) { + $path = explode('/', $root . '/' . $file); + + $fileNameSCSS = array_pop($path); + $fileNameCSS = str_replace('.scss', '.css', $fileNameSCSS); + + $path = implode('/', $path); + + $webDir = explode('/', $file); + array_pop($webDir); + $webDir = implode('/', $webDir); + + try { + $folder = $this->appData->getFolder($app); + } catch(NotFoundException $e) { + // creating css appdata folder + $folder = $this->appData->newFolder($app); + } + + if($this->isCached($fileNameCSS, $fileNameSCSS, $folder, $path)) { + return true; + } else { + return $this->cache($path, $fileNameCSS, $fileNameSCSS, $folder, $webDir); + } + } + + /** + * Check if the file is cached or not + * @param string $fileNameCSS + * @param string $fileNameSCSS + * @param ISimpleFolder $folder + * @param string $path + * @return boolean + */ + private function isCached($fileNameCSS, $fileNameSCSS, ISimpleFolder $folder, $path) { + try{ + $cachedFile = $folder->getFile($fileNameCSS); + if( $cachedFile->getMTime() > filemtime($path.'/'.$fileNameSCSS) + && $cachedFile->getSize() > 0 ) { + return true; + } + } catch(NotFoundException $e) { + return false; + } + return false; + } + + /** + * Cache the file with AppData + * @param string $path + * @param string $fileNameCSS + * @param string $fileNameSCSS + * @param ISimpleFolder $folder + * @param string $webDir + * @return boolean + */ + private function cache($path, $fileNameCSS, $fileNameSCSS, ISimpleFolder $folder, $webDir) { + $scss = new Compiler(); + $scss->setImportPaths($path); + if($this->systemConfig->getValue('debug')) { + // Debug mode + $scss->setFormatter(Expanded::class); + $scss->setLineNumberStyle(Compiler::LINE_COMMENTS); + } else { + // Compression + $scss->setFormatter(Crunched::class); + } + + try { + $cachedfile = $folder->getFile($fileNameCSS); + } catch(NotFoundException $e) { + $cachedfile = $folder->newFile($fileNameCSS); + } + + // Compile + try { + $compiledScss = $scss->compile('@import "'.$fileNameSCSS.'";'); + } catch(ParserException $e) { + $this->logger->error($e, ['app' => 'core']); + return false; + } + + try { + $cachedfile->putContent($this->rebaseUrls($compiledScss, $webDir)); + $this->logger->debug($webDir.'/'.$fileNameSCSS.' compiled and successfully cached', ['app' => 'core']); + return true; + } catch(NotFoundException $e) { + return false; + } + } + + /** + * Add the correct uri prefix to make uri valid again + * @param string $css + * @param string $webDir + * @return string + */ + private function rebaseUrls($css, $webDir) { + $re = '/url\([\'"]([\.\w?=\/-]*)[\'"]\)/x'; + // OC\Route\Router:75 + if(($this->systemConfig->getValue('htaccess.IgnoreFrontController', false) === true || getenv('front_controller_active') === 'true')) { + $subst = 'url(\'../../'.$webDir.'/$1\')'; + } else { + $subst = 'url(\'../../../'.$webDir.'/$1\')'; + } + return preg_replace($re, $subst, $css); + } + + /** + * Return the cached css file uri + * @param string $appName the app name + * @param string $fileName + * @return string + */ + public function getCachedSCSS($appName, $fileName) { + $tmpfileLoc = explode('/', $fileName); + $fileName = array_pop($tmpfileLoc); + $fileName = str_replace('.scss', '.css', $fileName); + + return substr($this->urlGenerator->linkToRoute('core.Css.getCss', array('fileName' => $fileName, 'appName' => $appName)), strlen(\OC::$WEBROOT) + 1); + } +} diff --git a/lib/private/TemplateLayout.php b/lib/private/TemplateLayout.php index 8919f14216e9c4fc1ad4e751b9e5c1fe478db9ca..7ded109f76bcb57421c2f0282e76822e208459d1 100644 --- a/lib/private/TemplateLayout.php +++ b/lib/private/TemplateLayout.php @@ -35,15 +35,8 @@ */ namespace OC; -use Assetic\Asset\AssetCollection; -use Assetic\Asset\FileAsset; -use Assetic\AssetWriter; -use Assetic\Filter\CssImportFilter; -use Assetic\Filter\CssMinFilter; -use Assetic\Filter\CssRewriteFilter; -use Assetic\Filter\JSqueezeFilter; -use Assetic\Filter\SeparatorFilter; use OC\Template\JSConfigHelper; +use OC\Template\SCSSCacher; class TemplateLayout extends \OC_Template { @@ -164,11 +157,18 @@ class TemplateLayout extends \OC_Template { foreach($jsFiles as $info) { $web = $info[1]; $file = $info[2]; - $this->append( 'jsfiles', $web.'/'.$file . '?v=' . self::$versionHash); + $this->append( 'jsfiles', $web.'/'.$file . $this->getVersionHashSuffix() ); } - // Add the css files - $cssFiles = self::findStylesheetFiles(\OC_Util::$styles); + // Do not initialise scss appdata until we have a fully installed instance + // Do not load scss for update, errors, installation or login page + if(\OC::$server->getSystemConfig()->getValue('installed', false) + && !\OCP\Util::needUpgrade() + && strpos(\OC::$server->getRequest()->getRequestUri(), \OC::$server->getURLGenerator()->linkToRoute('core.login.tryLogin')) !== 0) { + $cssFiles = self::findStylesheetFiles(\OC_Util::$styles); + } else { + $cssFiles = self::findStylesheetFiles(\OC_Util::$styles, false); + } $this->assign('cssfiles', array()); $this->assign('printcssfiles', []); $this->assign('versionHash', self::$versionHash); @@ -177,26 +177,47 @@ class TemplateLayout extends \OC_Template { $file = $info[2]; if (substr($file, -strlen('print.css')) === 'print.css') { - $this->append( 'printcssfiles', $web.'/'.$file . '?v=' . self::$versionHash); + $this->append( 'printcssfiles', $web.'/'.$file . $this->getVersionHashSuffix() ); } else { - $this->append( 'cssfiles', $web.'/'.$file . '?v=' . self::$versionHash); + $this->append( 'cssfiles', $web.'/'.$file . $this->getVersionHashSuffix() ); } } } + protected function getVersionHashSuffix() { + if(\OC::$server->getConfig()->getSystemValue('debug', false)) { + // allows chrome workspace mapping in debug mode + return ""; + } + + return '?v=' . self::$versionHash; + } + /** * @param array $styles * @return array */ - static public function findStylesheetFiles($styles) { + static public function findStylesheetFiles($styles, $compileScss = true) { // Read the selected theme from the config file $theme = \OC_Util::getTheme(); + if($compileScss) { + $SCSSCacher = new SCSSCacher( + \OC::$server->getLogger(), + \OC::$server->getAppDataDir('css'), + \OC::$server->getURLGenerator(), + \OC::$server->getSystemConfig() + ); + } else { + $SCSSCacher = null; + } + $locator = new \OC\Template\CSSResourceLocator( \OC::$server->getLogger(), $theme, array( \OC::$SERVERROOT => \OC::$WEBROOT ), - array( \OC::$SERVERROOT => \OC::$WEBROOT )); + array( \OC::$SERVERROOT => \OC::$WEBROOT ), + $SCSSCacher); $locator->find($styles); return $locator->getResources(); } diff --git a/lib/private/Updater.php b/lib/private/Updater.php index e30777227ccd8461725c08cf7d8963dac50376b8..a66d49941cd88d8ac24213bec2298b9af8f8073a 100644 --- a/lib/private/Updater.php +++ b/lib/private/Updater.php @@ -82,6 +82,12 @@ class Updater extends BasicEmitter { $this->log = $log; $this->config = $config; $this->checker = $checker; + + // If at least PHP 7.0.0 is used we don't need to disable apps as we catch + // fatal errors and exceptions and disable the app just instead. + if(version_compare(phpversion(), '7.0.0', '>=')) { + $this->skip3rdPartyAppsDisable = true; + } } /** diff --git a/lib/private/User/Database.php b/lib/private/User/Database.php index 28cb33028584878f9a83656f301645333dbf1e22..a281572ad55848836dee2013ce791ec7b344274c 100644 --- a/lib/private/User/Database.php +++ b/lib/private/User/Database.php @@ -238,6 +238,12 @@ class Database extends Backend implements IUserBackend { */ private function loadUser($uid) { if (!isset($this->cache[$uid])) { + //guests $uid could be NULL or '' + if ($uid === null || $uid === '') { + $this->cache[$uid]=false; + return true; + } + $query = \OC_DB::prepare('SELECT `uid`, `displayname` FROM `*PREFIX*users` WHERE LOWER(`uid`) = LOWER(?)'); $result = $query->execute(array($uid)); diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php index 36bd45521cfdefefa49d476fb1d0e33c511ceac2..2ebe895a592c99bdc72acbd2607973c871438fa5 100644 --- a/lib/private/User/Session.php +++ b/lib/private/User/Session.php @@ -317,7 +317,7 @@ class Session implements IUserSession, Emitter { $password, IRequest $request, OC\Security\Bruteforce\Throttler $throttler) { - $currentDelay = $throttler->sleepDelay($request->getRemoteAddress()); + $currentDelay = $throttler->sleepDelay($request->getRemoteAddress(), 'login'); if ($this->manager instanceof PublicEmitter) { $this->manager->emit('\OC\User', 'preLogin', array($user, $password)); @@ -338,7 +338,7 @@ class Session implements IUserSession, Emitter { $throttler->registerAttempt('login', $request->getRemoteAddress(), ['uid' => $user]); if($currentDelay === 0) { - $throttler->sleepDelay($request->getRemoteAddress()); + $throttler->sleepDelay($request->getRemoteAddress(), 'login'); } return false; } @@ -744,6 +744,7 @@ class Session implements IUserSession, Emitter { //login $this->setUser($user); + $this->setLoginName($this->tokenProvider->getToken($sessionId)->getLoginName()); $user->updateLastLoginTimestamp(); $this->manager->emit('\OC\User', 'postRememberedLogin', [$user]); return true; @@ -768,7 +769,7 @@ class Session implements IUserSession, Emitter { try { $this->tokenProvider->invalidateToken($this->session->getId()); } catch (SessionNotAvailableException $ex) { - + } } $this->setUser(null); diff --git a/lib/private/User/User.php b/lib/private/User/User.php index 3cc6dc3b7ed62f2b1f95d8fdf0fcf5d12e84e2da..c37bb59028ee4206dbc71fd16f43764cce47733c 100644 --- a/lib/private/User/User.php +++ b/lib/private/User/User.php @@ -197,6 +197,8 @@ class User implements IUser { if ($this->emitter) { $this->emitter->emit('\OC\User', 'preDelete', array($this)); } + // get the home now because it won't return it after user deletion + $homePath = $this->getHome(); $result = $this->backend->deleteUser($this->uid); if ($result) { @@ -210,7 +212,11 @@ class User implements IUser { \OC::$server->getConfig()->deleteAllUserValues($this->uid); // Delete user files in /data/ - \OC_Helper::rmdirr($this->getHome()); + if ($homePath !== false) { + // FIXME: this operates directly on FS, should use View instead... + // also this is not testable/mockable... + \OC_Helper::rmdirr($homePath); + } // Delete the users entry in the storage table Storage::remove('home::' . $this->uid); @@ -261,7 +267,7 @@ class User implements IUser { if ($this->backend->implementsActions(Backend::GET_HOME) and $home = $this->backend->getHome($this->uid)) { $this->home = $home; } elseif ($this->config) { - $this->home = $this->config->getSystemValue('datadirectory') . '/' . $this->uid; + $this->home = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data') . '/' . $this->uid; } else { $this->home = \OC::$SERVERROOT . '/data/' . $this->uid; } diff --git a/lib/private/legacy/app.php b/lib/private/legacy/app.php index adf29601ac6d142b5ccbbd20085e82264f3d07f3..a475b895d9fdf601d551fa0562aa7676058ac569 100644 --- a/lib/private/legacy/app.php +++ b/lib/private/legacy/app.php @@ -273,9 +273,17 @@ class OC_App { $appTypes = implode(',', $appData['types']); } else { $appTypes = ''; + $appData['types'] = []; } \OC::$server->getAppConfig()->setValue($app, 'types', $appTypes); + + if (\OC::$server->getAppManager()->hasProtectedAppType($appData['types'])) { + $enabled = \OC::$server->getAppConfig()->getValue($app, 'enabled', 'yes'); + if ($enabled !== 'yes' && $enabled !== 'no') { + \OC::$server->getAppConfig()->setValue($app, 'enabled', 'yes'); + } + } } /** @@ -1296,43 +1304,21 @@ class OC_App { $data['summary'] = self::findBestL10NOption($data['summary'], $lang); } if ($lang && isset($data['description']) && is_array($data['description'])) { - $data['description'] = self::findBestL10NOption($data['description'], $lang); - } - - // just modify the description if it is available - // otherwise this will create a $data element with an empty 'description' - if (isset($data['description'])) { - if (is_string($data['description'])) { - // sometimes the description contains line breaks and they are then also - // shown in this way in the app management which isn't wanted as HTML - // manages line breaks itself - - // first of all we split on empty lines - $paragraphs = preg_split("!\n[[:space:]]*\n!mu", $data['description']); - - $result = []; - foreach ($paragraphs as $value) { - // replace multiple whitespace (tabs, space, newlines) inside a paragraph - // with a single space - also trims whitespace - $result[] = trim(preg_replace('![[:space:]]+!mu', ' ', $value)); - } - - // join the single paragraphs with a empty line in between - $data['description'] = implode("\n\n", $result); - - } else { - $data['description'] = ''; - } + $data['description'] = trim(self::findBestL10NOption($data['description'], $lang)); + } else if (isset($data['description']) && is_string($data['description'])) { + $data['description'] = trim($data['description']); + } else { + $data['description'] = ''; } return $data; } /** - * @param $config - * @param $l - * @param $info - * @throws Exception + * @param \OCP\IConfig $config + * @param \OCP\IL10N $l + * @param array $info + * @throws \Exception */ protected static function checkAppDependencies($config, $l, $info) { $dependencyAnalyzer = new DependencyAnalyzer(new Platform($config), $l); diff --git a/lib/private/legacy/files.php b/lib/private/legacy/files.php index b6c6857a1bfaae70cb9cfefc5c34b90faa2aff97..8c9adad0d4986322bad840034e7d1168a4d3da86 100644 --- a/lib/private/legacy/files.php +++ b/lib/private/legacy/files.php @@ -148,6 +148,7 @@ class OC_Files { $streamer->sendHeaders($name); $executionTime = intval(OC::$server->getIniWrapper()->getNumeric('max_execution_time')); set_time_limit(0); + ignore_user_abort(true); if ($getType === self::ZIP_FILES) { foreach ($files as $file) { $file = $dir . '/' . $file; diff --git a/lib/private/legacy/helper.php b/lib/private/legacy/helper.php index 9c4bc895fb946d7961e0b1651d7eea3007ab9f51..dfe2e09afff4ebfd5b000a5f32ed000739eac2e9 100644 --- a/lib/private/legacy/helper.php +++ b/lib/private/legacy/helper.php @@ -52,6 +52,7 @@ class OC_Helper { /** * Creates an absolute url for public use + * * @param string $service id * @param bool $add_slash * @return string the url @@ -62,13 +63,14 @@ class OC_Helper { if ($service === 'files') { $url = OC::$server->getURLGenerator()->getAbsoluteURL('/s'); } else { - $url = OC::$server->getURLGenerator()->getAbsoluteURL(OC::$server->getURLGenerator()->linkTo('', 'public.php').'?service='.$service); + $url = OC::$server->getURLGenerator()->getAbsoluteURL(OC::$server->getURLGenerator()->linkTo('', 'public.php') . '?service=' . $service); } return $url . (($add_slash && $service[strlen($service) - 1] != '/') ? '/' : ''); } /** * Make a human file size + * * @param int $bytes file size in bytes * @return string a human readable file size * @@ -104,6 +106,7 @@ class OC_Helper { /** * Make a php file size + * * @param int $bytes file size in bytes * @return string a php parseable file size * @@ -130,6 +133,7 @@ class OC_Helper { /** * Make a computer file size + * * @param string $str file size in human readable format * @return float a file size in bytes * @@ -172,6 +176,7 @@ class OC_Helper { /** * Recursive copying of folders + * * @param string $src source folder * @param string $dest target folder * @@ -194,6 +199,7 @@ class OC_Helper { /** * Recursive deletion of folders + * * @param string $dir path to the folder * @param bool $deleteSelf if set to false only the content of the folder will be deleted * @return bool @@ -393,6 +399,7 @@ class OC_Helper { /** * performs a search in a nested array + * * @param array $haystack the array to be searched * @param string $needle the search string * @param string $index optional, only search this key name @@ -425,7 +432,7 @@ class OC_Helper { * @return int number of bytes representing */ public static function maxUploadFilesize($dir, $freeSpace = null) { - if (is_null($freeSpace) || $freeSpace < 0){ + if (is_null($freeSpace) || $freeSpace < 0) { $freeSpace = self::freeSpace($dir); } return min($freeSpace, self::uploadLimit()); @@ -443,7 +450,7 @@ class OC_Helper { $freeSpace = max($freeSpace, 0); return $freeSpace; } else { - return (INF > 0)? INF: PHP_INT_MAX; // work around https://bugs.php.net/bug.php?id=69188 + return (INF > 0) ? INF : PHP_INT_MAX; // work around https://bugs.php.net/bug.php?id=69188 } } @@ -510,7 +517,7 @@ class OC_Helper { if (empty($paths)) { $paths = '/usr/local/bin /usr/bin /opt/bin /bin'; } else { - $paths = str_replace(':',' ',getenv('PATH')); + $paths = str_replace(':', ' ', getenv('PATH')); } $command = 'find ' . $paths . ' -name ' . escapeshellarg($program) . ' 2> /dev/null'; exec($command, $output, $returnCode); @@ -533,6 +540,12 @@ class OC_Helper { * @throws \OCP\Files\NotFoundException */ public static function getStorageInfo($path, $rootInfo = null) { + $memcache = \OC::$server->getMemCacheFactory()->create('storageInfo'); + $cacheKey = $rootInfo ? '__root__' . md5($path) : md5($path); + $cached = $memcache->get($cacheKey); + if (is_array($cached)) { + return $cached; + } // return storage info without adding mount points $includeExtStorage = \OC::$server->getSystemConfig()->getValue('quota_include_external_storage', false); @@ -597,10 +610,20 @@ class OC_Helper { $ownerId = $storage->getOwner($path); $ownerDisplayName = ''; $owner = \OC::$server->getUserManager()->get($ownerId); - if($owner) { + if ($owner) { $ownerDisplayName = $owner->getDisplayName(); } + $memcache->set($cacheKey, [ + 'free' => $free, + 'used' => $used, + 'quota' => $quota, + 'total' => $total, + 'relative' => $relative, + 'owner' => $ownerId, + 'ownerDisplayName' => $ownerDisplayName, + ], 5 * 60); + return [ 'free' => $free, 'used' => $used, @@ -645,6 +668,7 @@ class OC_Helper { /** * Returns whether the config file is set manually to read-only + * * @return bool */ public static function isReadOnlyConfigEnabled() { diff --git a/lib/private/legacy/user.php b/lib/private/legacy/user.php index ed0d14a1ab91b39928c2a073b7a361044c25fc6a..0a52be7565d102b612713b941fed863ac2df8cc5 100644 --- a/lib/private/legacy/user.php +++ b/lib/private/legacy/user.php @@ -125,9 +125,16 @@ class OC_User { * setup the configured backends in config.php */ public static function setupBackends() { - OC_App::loadApps(array('prelogin')); - $backends = \OC::$server->getSystemConfig()->getValue('user_backends', array()); + OC_App::loadApps(['prelogin']); + $backends = \OC::$server->getSystemConfig()->getValue('user_backends', []); + if (isset($backends['default']) && !$backends['default']) { + // clear default backends + self::clearBackends(); + } foreach ($backends as $i => $config) { + if (!is_array($config)) { + continue; + } $class = $config['class']; $arguments = $config['arguments']; if (class_exists($class)) { diff --git a/lib/private/legacy/util.php b/lib/private/legacy/util.php index 55dc5ae7c15194a24c14482f87ebd33015ef5d44..5ef1130d361b3588797e8792c13ada128ff53c3e 100644 --- a/lib/private/legacy/util.php +++ b/lib/private/legacy/util.php @@ -1001,27 +1001,6 @@ class OC_Util { } } - /** - * Check if it is allowed to remember login. - * - * @note Every app can set 'rememberlogin' to 'false' to disable the remember login feature - * - * @return bool - */ - public static function rememberLoginAllowed() { - - $apps = OC_App::getEnabledApps(); - - foreach ($apps as $app) { - $appInfo = OC_App::getAppInfo($app); - if (isset($appInfo['rememberlogin']) && $appInfo['rememberlogin'] === 'false') { - return false; - } - - } - return true; - } - /** * Check if the user is a subadmin, redirects to home if not * @@ -1381,12 +1360,12 @@ class OC_Util { } /** - * A human readable string is generated based on version, channel and build number + * A human readable string is generated based on version and build number * * @return string */ public static function getHumanVersion() { - $version = OC_Util::getVersionString() . ' (' . OC_Util::getChannel() . ')'; + $version = OC_Util::getVersionString(); $build = OC_Util::getBuild(); if (!empty($build) and OC_Util::getChannel() === 'daily') { $version .= ' Build:' . $build; diff --git a/lib/public/Activity/IManager.php b/lib/public/Activity/IManager.php index 2fe38ddb8d8e07c3f718409b6bde86faa74054f8..f5b495807c5790f35af8fb0812520a70168f1892 100644 --- a/lib/public/Activity/IManager.php +++ b/lib/public/Activity/IManager.php @@ -64,6 +64,7 @@ interface IManager { * - setSubject() * * @param IEvent $event + * @throws \BadMethodCallException if required values have not been set * @since 8.2.0 */ public function publish(IEvent $event); diff --git a/lib/public/App/IAppManager.php b/lib/public/App/IAppManager.php index 057a964ce0a66fb2aac59db913f8a30f2661f103..72c99777124a945ec15606c661d9d416d288f47d 100644 --- a/lib/public/App/IAppManager.php +++ b/lib/public/App/IAppManager.php @@ -61,6 +61,15 @@ interface IAppManager { */ public function enableApp($appId); + /** + * Whether a list of types contains a protected app type + * + * @param string[] $types + * @return bool + * @since 12.0.0 + */ + public function hasProtectedAppType($types); + /** * Enable an app only for specific groups * diff --git a/lib/public/AppFramework/Db/Mapper.php b/lib/public/AppFramework/Db/Mapper.php index aa3d9cdde37cd3210c74d63fd2b64af5ea23316a..611791a436436849d96151132a6bfecd53c7e20b 100644 --- a/lib/public/AppFramework/Db/Mapper.php +++ b/lib/public/AppFramework/Db/Mapper.php @@ -28,7 +28,6 @@ namespace OCP\AppFramework\Db; use OCP\IDBConnection; -use OCP\IDb; /** @@ -229,11 +228,7 @@ abstract class Mapper { * @since 7.0.0 */ protected function execute($sql, array $params=[], $limit=null, $offset=null){ - if ($this->db instanceof IDb) { - $query = $this->db->prepareQuery($sql, $limit, $offset); - } else { - $query = $this->db->prepare($sql, $limit, $offset); - } + $query = $this->db->prepare($sql, $limit, $offset); if ($this->isAssocArray($params)) { foreach ($params as $key => $param) { @@ -251,15 +246,6 @@ abstract class Mapper { $result = $query->execute(); - // this is only for backwards compatibility reasons and can be removed - // in owncloud 10. IDb returns a StatementWrapper from execute, PDO, - // Doctrine and IDbConnection don't so this needs to be done in order - // to stay backwards compatible for the things that rely on the - // StatementWrapper being returned - if ($result instanceof \OC_DB_StatementWrapper) { - return $result; - } - return $query; } diff --git a/lib/public/AppFramework/Http/Response.php b/lib/public/AppFramework/Http/Response.php index 8591d6abc68e3cb7b9d6345c7f026b4f9abe4dee..051e68f314491bfdeefefdbc5d76bc4df76e0e01 100644 --- a/lib/public/AppFramework/Http/Response.php +++ b/lib/public/AppFramework/Http/Response.php @@ -43,11 +43,11 @@ use OCP\AppFramework\Http; class Response { /** - * Headers - defaults to ['Cache-Control' => 'no-cache, must-revalidate'] + * Headers - defaults to ['Cache-Control' => 'no-cache, no-store, must-revalidate'] * @var array */ private $headers = array( - 'Cache-Control' => 'no-cache, must-revalidate' + 'Cache-Control' => 'no-cache, no-store, must-revalidate' ); diff --git a/lib/public/Authentication/Exceptions/CredentialsUnavailableException.php b/lib/public/Authentication/Exceptions/CredentialsUnavailableException.php new file mode 100644 index 0000000000000000000000000000000000000000..9f9e38103f7965fbb317246991ae37fa0d14344d --- /dev/null +++ b/lib/public/Authentication/Exceptions/CredentialsUnavailableException.php @@ -0,0 +1,34 @@ + + * + * @author 2016 Christoph Wurst + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OCP\Authentication\Exceptions; + +use Exception; + +/** + * @since 12 + */ +class CredentialsUnavailableException extends Exception { + +} diff --git a/lib/public/Authentication/LoginCredentials/ICredentials.php b/lib/public/Authentication/LoginCredentials/ICredentials.php new file mode 100644 index 0000000000000000000000000000000000000000..c5ef9574398dfc4369273d23e7b3a568f9984e10 --- /dev/null +++ b/lib/public/Authentication/LoginCredentials/ICredentials.php @@ -0,0 +1,58 @@ + + * + * @author 2016 Christoph Wurst + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OCP\Authentication\LoginCredentials; + +/** + * @since 12 + */ +interface ICredentials { + + /** + * Get the user UID + * + * @since 12 + * + * @return string + */ + public function getUID(); + + /** + * Get the login name the users used to login + * + * @since 12 + * + * @return string + */ + public function getLoginName(); + + /** + * Get the password + * + * @since 12 + * + * @return string + */ + public function getPassword(); +} diff --git a/lib/public/Authentication/LoginCredentials/IStore.php b/lib/public/Authentication/LoginCredentials/IStore.php new file mode 100644 index 0000000000000000000000000000000000000000..4787b16d982f21a02afaeb6c298e05cbb017d899 --- /dev/null +++ b/lib/public/Authentication/LoginCredentials/IStore.php @@ -0,0 +1,44 @@ + + * + * @author 2016 Christoph Wurst + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OCP\Authentication\LoginCredentials; + +use OCP\Authentication\Exceptions\CredentialsUnavailableException; + +/** + * @since 12 + */ +interface IStore { + + /** + * Get login credentials of the currently logged in user + * + * @since 12 + * + * @throws CredentialsUnavailableException + * @return ICredentials the login credentials of the current user + */ + public function getLoginCredentials(); + +} diff --git a/lib/public/Authentication/TwoFactorAuth/TwoFactorException.php b/lib/public/Authentication/TwoFactorAuth/TwoFactorException.php new file mode 100644 index 0000000000000000000000000000000000000000..76e728b6ab04c1f815259cb8c97bece258fdc377 --- /dev/null +++ b/lib/public/Authentication/TwoFactorAuth/TwoFactorException.php @@ -0,0 +1,38 @@ + + * @copyright Copyright (c) 2016, ownCloud GmbH. + * + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see + * + */ + +namespace OCP\Authentication\TwoFactorAuth; + +use Exception; + +/** + * Two Factor Authentication failed + * + * It defines an Exception a 2FA app can + * throw in case of an error. The 2FA Controller will catch this exception and + * display this error. + * + * @since 12 + */ +class TwoFactorException extends Exception { + +} diff --git a/lib/public/DB/QueryBuilder/IExpressionBuilder.php b/lib/public/DB/QueryBuilder/IExpressionBuilder.php index 8164c738ca53b7cb26b7d2237d71149cd7887d11..c123875b80312b324b7037fc104793c3d3715b57 100644 --- a/lib/public/DB/QueryBuilder/IExpressionBuilder.php +++ b/lib/public/DB/QueryBuilder/IExpressionBuilder.php @@ -305,6 +305,27 @@ interface IExpressionBuilder { */ public function notIn($x, $y, $type = null); + + /** + * Creates a bitwise AND comparison + * + * @param string|ILiteral $x The field or value to check + * @param int $y Bitmap that must be set + * @return IQueryFunction + * @since 12.0.0 + */ + public function bitwiseAnd($x, $y); + + /** + * Creates a bitwise OR comparison + * + * @param string|ILiteral $x The field or value to check + * @param int $y Bitmap that must be set + * @return IQueryFunction + * @since 12.0.0 + */ + public function bitwiseOr($x, $y); + /** * Quotes a given input parameter. * diff --git a/lib/public/Encryption/Keys/IStorage.php b/lib/public/Encryption/Keys/IStorage.php index e17de04316b8fe19abb1cccc416c050201575fc5..c96d1573b385110ba7654f16a31132045be4d87f 100644 --- a/lib/public/Encryption/Keys/IStorage.php +++ b/lib/public/Encryption/Keys/IStorage.php @@ -170,4 +170,14 @@ interface IStorage { */ public function copyKeys($source, $target); + /** + * backup keys of a given encryption module + * + * @param string $encryptionModuleId + * @param string $purpose + * @param string $uid + * @return bool + * @since 12.0.0 + */ + public function backupUserKeys($encryptionModuleId, $purpose, $uid); } diff --git a/lib/public/Files/Cache/IScanner.php b/lib/public/Files/Cache/IScanner.php index 60282996232488238e2d1e791f98258ac6c63b7f..8aa4dc04aa90a4a6bc0a0ddb205ede5f4a6537e1 100644 --- a/lib/public/Files/Cache/IScanner.php +++ b/lib/public/Files/Cache/IScanner.php @@ -32,6 +32,7 @@ interface IScanner { const SCAN_RECURSIVE = true; const SCAN_SHALLOW = false; + const REUSE_NONE = 0; const REUSE_ETAG = 1; const REUSE_SIZE = 2; diff --git a/lib/public/Files/Notify/IChange.php b/lib/public/Files/Notify/IChange.php new file mode 100644 index 0000000000000000000000000000000000000000..1e6aaa8abe09f0e5f49638ec20fcfdfefee4c1d3 --- /dev/null +++ b/lib/public/Files/Notify/IChange.php @@ -0,0 +1,56 @@ + + * + * @author Robin Appelman + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OCP\Files\Notify; + +/** + * Represents a detected change in the storage + * + * @since 12.0.0 + */ +interface IChange { + const ADDED = 1; + const REMOVED = 2; + const MODIFIED = 3; + const RENAMED = 4; + + /** + * Get the type of the change + * + * @return int IChange::ADDED, IChange::REMOVED, IChange::MODIFIED or IChange::RENAMED + * + * @since 12.0.0 + */ + public function getType(); + + /** + * Get the path of the file that was changed relative to the root of the storage + * + * Note, for rename changes this path is the old path for the file + * + * @return mixed + * + * @since 12.0.0 + */ + public function getPath(); +} diff --git a/lib/public/Files/Notify/INotifyHandler.php b/lib/public/Files/Notify/INotifyHandler.php new file mode 100644 index 0000000000000000000000000000000000000000..7e0e6a610d8681a8d558adb9cc845cd422c1fb9a --- /dev/null +++ b/lib/public/Files/Notify/INotifyHandler.php @@ -0,0 +1,64 @@ + + * + * @author Robin Appelman + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OCP\Files\Notify; + +/** + * Provides access to detected changes in the storage by either actively listening + * or getting the list of changes that happened in the background + * + * @since 12.0.0 + */ +interface INotifyHandler { + /** + * Start listening for update notifications + * + * The provided callback will be called for every incoming notification with the following parameters + * - IChange|IRenameChange $change + * + * Note that this call is blocking and will not exit on it's own, to stop listening for notifications return `false` from the callback + * + * @param callable $callback + * + * @since 12.0.0 + */ + public function listen(callable $callback); + + /** + * Get all changes detected since the start of the notify process or the last call to getChanges + * + * @return IChange[] + * + * @since 12.0.0 + */ + public function getChanges(); + + /** + * Stop listening for changes + * + * Note that any pending changes will be discarded + * + * @since 12.0.0 + */ + public function stop(); +} diff --git a/lib/public/Files/Notify/IRenameChange.php b/lib/public/Files/Notify/IRenameChange.php new file mode 100644 index 0000000000000000000000000000000000000000..c95499a7e7460968a52f796644aafc6481f1ac05 --- /dev/null +++ b/lib/public/Files/Notify/IRenameChange.php @@ -0,0 +1,40 @@ + + * + * @author Robin Appelman + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OCP\Files\Notify; + +/** + * Represents a detected rename change + * + * @since 12.0.0 + */ +interface IRenameChange extends IChange { + /** + * Get the new path of the renamed file relative to the storage root + * + * @return string + * + * @since 12.0.0 + */ + public function getTargetPath(); +} diff --git a/lib/public/Files/Storage/INotifyStorage.php b/lib/public/Files/Storage/INotifyStorage.php index e99124abdfdcd33da36d938adcb1aa0ae742f5a9..c6fdd44724fdf4b1afee75c8ca1611ef16949997 100644 --- a/lib/public/Files/Storage/INotifyStorage.php +++ b/lib/public/Files/Storage/INotifyStorage.php @@ -23,6 +23,8 @@ namespace OCP\Files\Storage; +use OCP\Files\Notify\INotifyHandler; + /** * Storage backend that support active notifications * @@ -48,6 +50,17 @@ interface INotifyStorage { * @param callable $callback * * @since 9.1.0 + * @deprecated 12.0.0 use INotifyStorage::notify()->listen() instead */ public function listen($path, callable $callback); + + /** + * Start the notification handler for this storage + * + * @param $path + * @return INotifyHandler + * + * @since 12.0.0 + */ + public function notify($path); } diff --git a/lib/public/Files/Storage/IStorage.php b/lib/public/Files/Storage/IStorage.php index b806dc3b7d12458e8a51db63b836b8a1ddd45cf6..27b8f1d0697f12da4905453dad1d60baaec800d6 100644 --- a/lib/public/Files/Storage/IStorage.php +++ b/lib/public/Files/Storage/IStorage.php @@ -383,7 +383,7 @@ interface IStorage { public function verifyPath($path, $fileName); /** - * @param \OCP\Files\Storage $sourceStorage + * @param \OCP\Files\Storage|\OCP\Files\Storage\IStorage $sourceStorage * @param string $sourceInternalPath * @param string $targetInternalPath * @return bool @@ -392,7 +392,7 @@ interface IStorage { public function copyFromStorage(\OCP\Files\Storage $sourceStorage, $sourceInternalPath, $targetInternalPath); /** - * @param \OCP\Files\Storage $sourceStorage + * @param \OCP\Files\Storage|\OCP\Files\Storage\IStorage $sourceStorage * @param string $sourceInternalPath * @param string $targetInternalPath * @return bool diff --git a/lib/public/GroupInterface.php b/lib/public/GroupInterface.php index 6f456f51fd788614d8dc7b7ef10b65158f83a9a8..97837e50b16e553914576a0780885be69f042a3a 100644 --- a/lib/public/GroupInterface.php +++ b/lib/public/GroupInterface.php @@ -40,6 +40,18 @@ namespace OCP; */ interface GroupInterface { + /** + * actions that user backends can define + */ + const CREATE_GROUP = 0x00000001; + const DELETE_GROUP = 0x00000010; + const ADD_TO_GROUP = 0x00000100; + const REMOVE_FROM_GOUP = 0x00001000; // oops + const REMOVE_FROM_GROUP = 0x00001000; + //OBSOLETE const GET_DISPLAYNAME = 0x00010000; + const COUNT_USERS = 0x00100000; + const GROUP_DETAILS = 0x01000000; + /** * Check if backend implements actions * @param int $actions bitwise-or'ed actions diff --git a/lib/public/IAppConfig.php b/lib/public/IAppConfig.php index 01aca47ad816fa118904ed27feb68a1ee3ee8c18..4a92a224840017b3f4efaf4cad630bac8f6bccf4 100644 --- a/lib/public/IAppConfig.php +++ b/lib/public/IAppConfig.php @@ -86,6 +86,15 @@ interface IAppConfig { */ public function getValues($app, $key); + /** + * get all values of the app or and filters out sensitive data + * + * @param string $app + * @return array + * @since 12.0.0 + */ + public function getFilteredValues($app); + /** * sets a value in the appconfig * @param string $app app diff --git a/lib/public/IDb.php b/lib/public/IDb.php deleted file mode 100644 index bb04cf540fa1ab994dfa39a1a74983e5a20b14eb..0000000000000000000000000000000000000000 --- a/lib/public/IDb.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @author Morris Jobke - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see - * - */ - -namespace OCP; - - -/** - * Small Facade for being able to inject the database connection for tests - * @since 7.0.0 - extends IDBConnection was added in 8.1.0 - */ -interface IDb extends IDBConnection { - - - /** - * Used to abstract the owncloud database access away - * @param string $sql the sql query with ? placeholder for params - * @param int $limit the maximum number of rows - * @param int $offset from which row we want to start - * @return \OC_DB_StatementWrapper prepared SQL query - * @since 7.0.0 - */ - public function prepareQuery($sql, $limit=null, $offset=null); - - - /** - * Used to get the id of the just inserted element - * @param string $tableName the name of the table where we inserted the item - * @return int the id of the inserted element - * @since 7.0.0 - */ - public function getInsertId($tableName); - - -} diff --git a/lib/public/IGroup.php b/lib/public/IGroup.php index d5fcbcc5cd99fe1ccc8a713b31e539fa94c3686c..0cc62e9a8ed9cd2deaa926ff33b871e5174aac55 100644 --- a/lib/public/IGroup.php +++ b/lib/public/IGroup.php @@ -4,6 +4,7 @@ * * @author Morris Jobke * @author Robin Appelman + * @author Vincent Petry * * @license AGPL-3.0 * @@ -36,6 +37,14 @@ interface IGroup { */ public function getGID(); + /** + * Returns the group display name + * + * @return string + * @since 9.2 + */ + public function getDisplayName(); + /** * get all users in the group * diff --git a/lib/public/IPreview.php b/lib/public/IPreview.php index a1a03fee3e1da0df72d7fbe78fbb1e784fe755bf..207539b1170f95d285d73baa57ff80b822c6116c 100644 --- a/lib/public/IPreview.php +++ b/lib/public/IPreview.php @@ -86,7 +86,7 @@ interface IPreview { * @param boolean $scaleUp Scale smaller images up to the thumbnail size or not. Might look ugly * @return \OCP\IImage * @since 6.0.0 - * @deprecated 9.2.0 Use getPreview + * @deprecated 11 Use getPreview */ public function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false); diff --git a/lib/public/IServerContainer.php b/lib/public/IServerContainer.php index 354e39bd8f981ea7bc64ef577464652126a85b4d..87628be01f71d8a67b0724b38a6158272ceeeff8 100644 --- a/lib/public/IServerContainer.php +++ b/lib/public/IServerContainer.php @@ -191,14 +191,6 @@ interface IServerContainer { */ public function getCredentialsManager(); - /** - * Returns an instance of the db facade - * @deprecated 8.1.0 use getDatabaseConnection, will be removed in ownCloud 10 - * @return \OCP\IDb - * @since 7.0.0 - */ - public function getDb(); - /** * Returns the app config manager * diff --git a/lib/public/RichObjectStrings/Definitions.php b/lib/public/RichObjectStrings/Definitions.php index fbde439c47aa4474ad59d0a17061705c17158334..f1208ae0f2cb4f96db1b68140df6315041678d63 100644 --- a/lib/public/RichObjectStrings/Definitions.php +++ b/lib/public/RichObjectStrings/Definitions.php @@ -152,6 +152,31 @@ class Definitions { ], ], ], + 'call' => [ + 'author' => 'Nextcloud', + 'app' => 'spreed', + 'since' => '11.0.2', + 'parameters' => [ + 'id' => [ + 'since' => '11.0.2', + 'required' => true, + 'description' => 'The id used to identify the call on the instance', + 'example' => '42', + ], + 'name' => [ + 'since' => '11.0.2', + 'required' => true, + 'description' => 'The display name of the call which should be used in the visual representation', + 'example' => 'Company call', + ], + 'call-type' => [ + 'since' => '11.0.2', + 'required' => true, + 'description' => 'The type of the call: one2one, group or public', + 'example' => 'one2one', + ], + ], + ], 'email' => [ 'author' => 'Nextcloud', 'app' => 'sharebymail', @@ -191,7 +216,7 @@ class Definitions { 'path' => [ 'since' => '11.0.0', 'required' => true, - 'description' => 'The full path of the file for the user', + 'description' => 'The full path of the file for the user, should not start with a slash', 'example' => 'path/to/file.txt', ], 'link' => [ diff --git a/lib/public/Settings/IIconSection.php b/lib/public/Settings/IIconSection.php new file mode 100644 index 0000000000000000000000000000000000000000..089b9b094e98c1d416d1593a6722e3d9b221c73e --- /dev/null +++ b/lib/public/Settings/IIconSection.php @@ -0,0 +1,38 @@ + + * + * @author Joas Schilling + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OCP\Settings; + +/** + * @since 12 + */ +interface IIconSection extends ISection { + /** + * returns the relative path to an 16*16 icon describing the section. + * e.g. '/core/img/places/files.svg' + * + * @returns string + * @since 12 + */ + public function getIcon(); +} diff --git a/lib/public/Settings/ISection.php b/lib/public/Settings/ISection.php index 5edf5de0ca4f5e8ab46e2d1b5c6887c40f81fc80..3c08b74bdc9e6ef1b68467895957971f7c79e449 100644 --- a/lib/public/Settings/ISection.php +++ b/lib/public/Settings/ISection.php @@ -24,6 +24,7 @@ namespace OCP\Settings; /** + * @deprecated 12 Use IIconSection instead * @since 9.1 */ interface ISection { diff --git a/ocs/v1.php b/ocs/v1.php index 5aec27ad981c3b20e13f2506a42092c3e4cfae76..79e74f20cdf44615215c32773415c0d3790d8fb4 100644 --- a/ocs/v1.php +++ b/ocs/v1.php @@ -65,8 +65,10 @@ try { } catch (MethodNotAllowedException $e) { OC_API::setContentType(); OC_Response::setStatus(405); -} catch (\OC\OCS\Exception $ex) { + exit(); +} catch (Exception $ex) { OC_API::respond($ex->getResult(), OC_API::requestedFormat()); + exit(); } /* diff --git a/resources/config/ca-bundle.crt b/resources/config/ca-bundle.crt index aee4163d27460c4c2f103d8a697b4f3a21e988b3..cce0e5835ee32ca8e724c69256b8a778c4776f8b 100644 --- a/resources/config/ca-bundle.crt +++ b/resources/config/ca-bundle.crt @@ -1,20 +1,20 @@ ## ## Bundle of CA Root Certificates ## -## Certificate data from Mozilla as of: Wed Sep 7 08:44:30 2016 +## Certificate data from Mozilla as of: Wed Nov 2 04:12:05 2016 GMT ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates ## file (certdata.txt). This file can be found in the mozilla source tree: -## http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt +## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt ## ## It contains the certificates in PEM format and therefore ## can be directly used with curl / libcurl / php_curl, or with ## an Apache+mod_ssl webserver for SSL client authentication. ## Just configure this file as the SSLCACertificateFile. ## -## Conversion done with mk-ca-bundle.pl version 1.26. -## SHA256: 01bbf1ecdd693f554ff4dcbe15880b3e6c33188a956c15ff845d313ca69cfeb8 +## Conversion done with mk-ca-bundle.pl version 1.27. +## SHA256: 17e2a90c8a5cfd6a675b3475d3d467e1ab1fe0d5397e907b08206182389caa08 ## @@ -1764,7 +1764,7 @@ AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- NetLock Arany (Class Gold) Főtanúsítvány -============================================ +======================================== -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 @@ -2280,7 +2280,7 @@ Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -----END CERTIFICATE----- Certinomis - Autorité Racine -============================= +============================ -----BEGIN CERTIFICATE----- MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg @@ -3675,7 +3675,7 @@ ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 -========================================================= +==================================================== -----BEGIN CERTIFICATE----- MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp @@ -3699,7 +3699,7 @@ B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU= -----END CERTIFICATE----- TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6 -========================================================= +==================================================== -----BEGIN CERTIFICATE----- MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls @@ -4034,3 +4034,33 @@ BgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAKBggqhkjOPQQDAwNpADBmAjEAj6jcnboM BBf6Fek9LykBl7+BFjNAk2z8+e2AcG+qj9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta 3U1fJAuwACEl74+nBCZx4nxp5V2a+EEfOzmTk51V6s2N8fvB -----END CERTIFICATE----- + +ISRG Root X1 +============ +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE +BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD +EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG +EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT +DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r +Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 +3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K +b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN +Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ +4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf +1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu +hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH +usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r +OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY +9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV +0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt +hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw +TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx +e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA +JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD +YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n +JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ +m+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- diff --git a/resources/config/mimetypemapping.dist.json b/resources/config/mimetypemapping.dist.json index a49a04e43f2d84059d9278f4e88da640b26ad912..99638b6c02dc321a42685be386da8165e05ce908 100644 --- a/resources/config/mimetypemapping.dist.json +++ b/resources/config/mimetypemapping.dist.json @@ -78,6 +78,7 @@ "key": ["application/x-iwork-keynote-sffkey"], "keynote": ["application/x-iwork-keynote-sffkey"], "kra": ["application/x-krita"], + "ldif": ["text/x-ldif"], "lwp": ["application/vnd.lotus-wordpro"], "m2t": ["video/mp2t"], "m4a": ["audio/mp4"], @@ -142,6 +143,7 @@ "rss": ["application/rss+xml"], "rtf": ["text/rtf"], "rw2": ["image/x-dcraw"], + "schema": ["text/plain"], "sgf": ["application/sgf"], "sh-lib": ["text/x-shellscript"], "sh": ["text/x-shellscript"], diff --git a/settings/Application.php b/settings/Application.php index d907cd666fb76ce41b1f0a4033aabd085c0845dd..44747c2f6817ed9903288a6d5c7dac1b0905456a 100644 --- a/settings/Application.php +++ b/settings/Application.php @@ -106,7 +106,8 @@ class Application extends App { return new CategoryFetcher( $server->getAppDataDir('appstore'), $server->getHTTPClientService(), - $server->query(TimeFactory::class) + $server->query(TimeFactory::class), + $server->getConfig() ); }); } diff --git a/settings/Controller/AdminSettingsController.php b/settings/Controller/AdminSettingsController.php index ef70caf56902fd30dbb425fcbff8268f9599ed65..4bc986e708e701ca4281f128a411c74f59bc1a03 100644 --- a/settings/Controller/AdminSettingsController.php +++ b/settings/Controller/AdminSettingsController.php @@ -28,7 +28,9 @@ use OCP\AppFramework\Controller; use OCP\AppFramework\Http\TemplateResponse; use OCP\INavigationManager; use OCP\IRequest; +use OCP\Settings\IIconSection; use OCP\Settings\IManager as ISettingsManager; +use OCP\Settings\ISection; use OCP\Template; /** @@ -133,10 +135,16 @@ class AdminSettingsController extends Controller { /** @var \OC\Settings\Section[] $prioritizedSections */ foreach($sections as $prioritizedSections) { foreach ($prioritizedSections as $section) { + $icon = ''; + if ($section instanceof IIconSection) { + $icon = $section->getIcon(); + } + $templateParameters[] = [ 'anchor' => $section->getID(), 'section-name' => $section->getName(), 'active' => $section->getID() === $currentSection, + 'icon' => $icon, ]; } } diff --git a/settings/Controller/UsersController.php b/settings/Controller/UsersController.php index 28b8d2648d99de90358fa370dd9dba02a0417ee1..43a3843249911bd33ce986294cc388ce5c49f688 100644 --- a/settings/Controller/UsersController.php +++ b/settings/Controller/UsersController.php @@ -346,13 +346,12 @@ class UsersController extends Controller { } if (empty($groups)) { - $groups = $this->groupManager->getSubAdmin()->getSubAdminsGroups($currentUser); - // New class returns IGroup[] so convert back - $gids = []; - foreach ($groups as $group) { - $gids[] = $group->getGID(); - } - $groups = $gids; + return new DataResponse( + array( + 'message' => $this->l10n->t('No valid group selected'), + ), + Http::STATUS_FORBIDDEN + ); } } @@ -380,7 +379,7 @@ class UsersController extends Controller { ); } - if($user instanceof User) { + if($user instanceof IUser) { if($groups !== null) { foreach($groups as $groupName) { $group = $this->groupManager->get($groupName); diff --git a/settings/ajax/togglegroups.php b/settings/ajax/togglegroups.php deleted file mode 100644 index b9958bef0c986ad13ed689961a034c42c527f85b..0000000000000000000000000000000000000000 --- a/settings/ajax/togglegroups.php +++ /dev/null @@ -1,92 +0,0 @@ - - * @author Christopher Schäpers - * @author Georg Ehrke - * @author Jakob Sack - * @author Lukas Reschke - * @author Robin Appelman - * @author Thomas Müller - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see - * - */ -OC_JSON::checkSubAdminUser(); -OCP\JSON::callCheck(); - -$lastConfirm = (int) \OC::$server->getSession()->get('last-password-confirm'); -if ($lastConfirm < (time() - 30 * 60 + 15)) { // allow 15 seconds delay - $l = \OC::$server->getL10N('core'); - OC_JSON::error(array( 'data' => array( 'message' => $l->t('Password confirmation is required')))); - exit(); -} - -$success = true; -$username = (string)$_POST['username']; -$group = (string)$_POST['group']; - -if($username === OC_User::getUser() && $group === "admin" && OC_User::isAdminUser($username)) { - $l = \OC::$server->getL10N('core'); - OC_JSON::error(array( 'data' => array( 'message' => $l->t('Admins can\'t remove themself from the admin group')))); - exit(); -} - -$isUserAccessible = false; -$isGroupAccessible = false; -$currentUserObject = \OC::$server->getUserSession()->getUser(); -$targetUserObject = \OC::$server->getUserManager()->get($username); -$targetGroupObject = \OC::$server->getGroupManager()->get($group); -if($targetUserObject !== null && $currentUserObject !== null && $targetGroupObject !== null) { - $isUserAccessible = \OC::$server->getGroupManager()->getSubAdmin()->isUserAccessible($currentUserObject, $targetUserObject); - $isGroupAccessible = \OC::$server->getGroupManager()->getSubAdmin()->isSubAdminofGroup($currentUserObject, $targetGroupObject); -} - -if(!OC_User::isAdminUser(OC_User::getUser()) - && (!$isUserAccessible - || !$isGroupAccessible)) { - $l = \OC::$server->getL10N('core'); - OC_JSON::error(array( 'data' => array( 'message' => $l->t('Authentication error') ))); - exit(); -} - -if(!OC_Group::groupExists($group)) { - OC_Group::createGroup($group); -} - -$l = \OC::$server->getL10N('settings'); - -$error = $l->t("Unable to add user to group %s", $group); -$action = "add"; - -// Toggle group -if( OC_Group::inGroup( $username, $group )) { - $action = "remove"; - $error = $l->t("Unable to remove user from group %s", $group); - $success = OC_Group::removeFromGroup( $username, $group ); - $usersInGroup=OC_Group::usersInGroup($group); -} -else{ - $success = OC_Group::addToGroup( $username, $group ); -} - -// Return Success story -if( $success ) { - OC_JSON::success(array("data" => array( "username" => $username, "action" => $action, "groupname" => $group ))); -} -else{ - OC_JSON::error(array("data" => array( "message" => $error ))); -} diff --git a/settings/css/settings.css b/settings/css/settings.css index 46394d3f03d8d41f02f977acdceff37093a92949..c0c79ca65efafec89c11c3d6300889a3e7c90f3a 100644 --- a/settings/css/settings.css +++ b/settings/css/settings.css @@ -7,6 +7,26 @@ input#openid, input#webdav { width:20em; } /* PERSONAL */ +/* icons for sidebar */ +.nav-icon-personal-settings { + background-image: url('../img/personal.svg?v=1'); +} +.nav-icon-sessions { + background-image: url('../img/toggle-filelist.svg?v=1'); +} +.nav-icon-apppasswords { + background-image: url('../img/password.svg?v=1'); +} +.nav-icon-clientsbox { + background-image: url('../img/change.svg?v=1'); +} +.nav-icon-federated-cloud { + background-image: url('../img/share.svg?v=1'); +} +.nav-icon-second-factor-backup-codes { + background-image: url('../img/password.svg?v=1'); +} + #avatarform { width: 160px; padding-right: 0; @@ -104,7 +124,7 @@ input#openid, input#webdav { width:20em; } } #personal-settings-container > div > form span[class^="icon-checkmark"] { position: absolute; - left: 239px; + left: 228px; top: 82px; pointer-events: none; } @@ -399,7 +419,7 @@ table.grid th, table.grid td { font-weight: normal; } td.name, td.password { padding-left:.8em; } -td.password>img,td.displayName>img, td.remove>a, td.quota>img { visibility:hidden; } +td.password>img,td.displayName>img, td.remove>a, td.quota>img { visibility:hidden; vertical-align: middle;} td.password, td.quota, td.displayName { width:12em; cursor:pointer; } td.password>span, td.quota>span, rd.displayName>span { margin-right: 1.2em; color: #C7C7C7; } span.usersLastLoginTooltip { white-space: nowrap; } @@ -492,6 +512,12 @@ input.userFilter {width: 200px;} /* APPS */ +#app-content > svg.app-filter { + float: left; + height: 0; + width: 0; +} + .appinfo { margin: 1em 40px; } #app-navigation .appwarning { background: #fcc; @@ -542,6 +568,10 @@ span.version { flex-wrap: wrap; align-content: flex-start; } +#apps-list.hidden { + display: none; +} + #apps-list .section { position: relative; flex: 0 0 auto; @@ -551,6 +581,26 @@ span.version { flex-basis: 90%; } +#apps-list .app-description p { + margin: 10px 0; +} +#apps-list .app-description ul { + list-style: disc; +} +#apps-list .app-description ol { + list-style: decimal; +} +#apps-list .app-description > ul, +#apps-list .app-description > ol { + margin-left: 19px; +} +#apps-list .app-description ol ol, +#apps-list .app-description ol ul, +#apps-list .app-description ul ol, +#apps-list .app-description ul ul { + padding-left: 15px; +} + @media (min-width: 1601px) { #apps-list .section { width: 22%; @@ -634,9 +684,6 @@ form.section { .app-description { clear: both; } -.app-description pre { - white-space: pre-line; -} #apps-list .groups-enable { margin-top: 8px; @@ -686,6 +733,17 @@ table.grid td.date{ } /* ADMIN */ + +/* Navigation icons */ +#app-navigation img { + margin-bottom: -3px; + margin-right: 6px; + width: 16px; +} +#app-navigation li span.no-icon { + padding-left: 32px; +} + #security-warning li { list-style: initial; margin: 10px 0; @@ -787,9 +845,9 @@ span.indeterminate { /* PASSWORD */ #passwordform .strengthify-wrapper { position: absolute; - left: 186px; - width: 131px; - margin-top: -7px; + left: 0; + width: 130px; + margin-top: -6px; } /* OPERA hack for strengthify*/ diff --git a/settings/img/change.svg b/settings/img/change.svg new file mode 100644 index 0000000000000000000000000000000000000000..cbc5d982b30ab101006cbdacc7916a8909937aae --- /dev/null +++ b/settings/img/change.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/settings/img/password.svg b/settings/img/password.svg new file mode 100644 index 0000000000000000000000000000000000000000..3d161917f6ec67150e599522b5f4a49f4e4df1ce --- /dev/null +++ b/settings/img/password.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/settings/img/share.svg b/settings/img/share.svg new file mode 100644 index 0000000000000000000000000000000000000000..68f2100e490e73ab50cbb4b841e47a58cd1dab83 --- /dev/null +++ b/settings/img/share.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/settings/img/toggle-filelist.svg b/settings/img/toggle-filelist.svg new file mode 100644 index 0000000000000000000000000000000000000000..47f019057ea66ee1ad3d0f75348308c102c066be --- /dev/null +++ b/settings/img/toggle-filelist.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/settings/js/apps.js b/settings/js/apps.js index de35cd53672834c49eb80bb0ca2636789c19b125..1538e71a491afc9a2b49b53a66c3972a3c24299c 100644 --- a/settings/js/apps.js +++ b/settings/js/apps.js @@ -19,6 +19,8 @@ Handlebars.registerHelper('level', function() { OC.Settings = OC.Settings || {}; OC.Settings.Apps = OC.Settings.Apps || { + markedOptions: {}, + setupGroupsSelect: function($elements) { OC.Settings.setupGroupsSelect($elements, { placeholder: t('core', 'All') @@ -186,6 +188,25 @@ OC.Settings.Apps = OC.Settings.Apps || { app.author = app.author['@value']; } + // Parse markdown in app description + app.description = DOMPurify.sanitize( + marked(app.description.trim(), OC.Settings.Apps.markedOptions), + { + SAFE_FOR_JQUERY: true, + ALLOWED_TAGS: [ + 'strong', + 'p', + 'a', + 'ul', + 'ol', + 'li', + 'em', + 'del', + 'blockquote' + ] + } + ); + var html = template(app); if (selector) { selector.html(html); @@ -271,7 +292,7 @@ OC.Settings.Apps = OC.Settings.Apps || { OC.Settings.Apps.hideErrorMessage(appId); groups = groups || []; var appItem = $('div#app-'+appId+''); - element.val(t('settings','Please wait....')); + element.val(t('settings','Enabling app …')); if(active && !groups.length) { $.post(OC.filePath('settings','ajax','disableapp.php'),{appid:appId},function(result) { if(!result || result.status !== 'success') { @@ -633,6 +654,50 @@ OC.Settings.Apps = OC.Settings.Apps || { * Initializes the apps list */ initialize: function($el) { + + var renderer = new marked.Renderer(); + renderer.link = function(href, title, text) { + try { + var prot = decodeURIComponent(unescape(href)) + .replace(/[^\w:]/g, '') + .toLowerCase(); + } catch (e) { + return ''; + } + + if (prot.indexOf('http:') !== 0 && prot.indexOf('https:') !== 0) { + return ''; + } + + var out = ''; + return out; + }; + renderer.image = function(href, title, text) { + if (text) { + return text; + } + return title; + }; + renderer.blockquote = function(quote) { + return quote; + }; + + OC.Settings.Apps.markedOptions = { + renderer: renderer, + gfm: false, + highlight: false, + tables: false, + breaks: false, + pedantic: false, + sanitize: true, + smartLists: true, + smartypants: false + }; + OC.Plugins.register('OCA.Search', OC.Settings.Apps.Search); OC.Settings.Apps.loadCategories(); OC.Util.History.addOnPopStateHandler(_.bind(this._onPopState, this)); diff --git a/settings/js/federationscopemenu.js b/settings/js/federationscopemenu.js index 0862556a2c33ff9f99ec3212e2f2ad3a1f6c50f7..872f59c5de8608052815edf9b17f0ebcb15b6822 100644 --- a/settings/js/federationscopemenu.js +++ b/settings/js/federationscopemenu.js @@ -37,7 +37,7 @@ */ var FederationScopeMenu = OC.Backbone.View.extend({ tagName: 'div', - className: 'federationScopeMenu popovermenu bubble hidden open menu', + className: 'federationScopeMenu popovermenu bubble hidden menu', field: undefined, _scopes: undefined, diff --git a/settings/js/users/groups.js b/settings/js/users/groups.js index cfe01c17530940609eedcd52463b553c102e1fdf..aac1609bce7a1c7b3263514c2ae3b03673c160f1 100644 --- a/settings/js/users/groups.js +++ b/settings/js/users/groups.js @@ -225,7 +225,9 @@ GroupList = { toggleAddGroup: function (event) { if (GroupList.isAddGroupButtonVisible()) { - event.stopPropagation(); + if (event) { + event.stopPropagation(); + } $('#newgroup-form').show(); $('#newgroup-init').hide(); $('#newgroupname').focus(); diff --git a/settings/js/users/users.js b/settings/js/users/users.js index 0e3067db7c74052d0e6580fedc821e6f452bcb1d..3cf7b5e810a183a2ed3ceb87440b1b211d0d8576 100644 --- a/settings/js/users/users.js +++ b/settings/js/users/users.js @@ -420,42 +420,63 @@ var UserList = { var $element = $(element); - var checkHandler = null; + var addUserToGroup = null, + removeUserFromGroup = null; if(user) { // Only if in a user row, and not the #newusergroups select - checkHandler = function (group) { - if (user === OC.currentUser && group === 'admin') { + var handleUserGroupMembership = function (group, add) { + if (user === OC.getCurrentUser().uid && group === 'admin') { return false; } if (!OC.isUserAdmin() && checked.length === 1 && checked[0] === group) { return false; } - $.post( - OC.filePath('settings', 'ajax', 'togglegroups.php'), - { - username: user, - group: group + + if (add && OC.isUserAdmin() && UserList.availableGroups.indexOf(group) === -1) { + GroupList.createGroup(group); + if (UserList.availableGroups.indexOf(group) === -1) { + UserList.availableGroups.push(group); + } + } + + $.ajax({ + url: OC.linkToOCS('cloud/users/' + user , 2) + 'groups', + data: { + groupid: group }, - function (response) { - if (response.status === 'success') { - GroupList.update(); - var groupName = response.data.groupname; - if (UserList.availableGroups.indexOf(groupName) === -1 && - response.data.action === 'add' - ) { - UserList.availableGroups.push(groupName); - } + type: add ? 'POST' : 'DELETE', + beforeSend: function (request) { + request.setRequestHeader('Accept', 'application/json'); + }, + success: function() { + GroupList.update(); + if (add && UserList.availableGroups.indexOf(group) === -1) { + UserList.availableGroups.push(group); + } - if (response.data.action === 'add') { - GroupList.incGroupCount(groupName); - } else { - GroupList.decGroupCount(groupName); - } + if (add) { + GroupList.incGroupCount(group); + } else { + GroupList.decGroupCount(group); } - if (response.data.message) { - OC.Notification.show(response.data.message); + }, + error: function() { + if (add) { + OC.Notification.show(t('settings', 'Unable to add user to group {group}', { + group: group + })); + } else { + OC.Notification.show(t('settings', 'Unable to remove user from group {group}', { + group: group + })); } } - ); + }); + }; + addUserToGroup = function (group) { + return handleUserGroupMembership(group, true); + }; + removeUserFromGroup = function (group) { + return handleUserGroupMembership(group, false); }; } var addGroup = function (select, group) { @@ -473,8 +494,8 @@ var UserList = { createText: label, selectedFirst: true, checked: checked, - oncheck: checkHandler, - onuncheck: checkHandler, + oncheck: addUserToGroup, + onuncheck: removeUserFromGroup, minWidth: 100 }); }, @@ -704,9 +725,9 @@ $(document).ready(function () { blurFunction = _.bind(blurFunction, $input); if(isRestoreDisabled) { $tr.addClass('row-warning'); - // add tipsy if the password change could cause data loss - no recovery enabled - $input.tipsy({gravity:'s'}); + // add tooltip if the password change could cause data loss - no recovery enabled $input.attr('title', t('settings', 'Changing the password will result in data loss, because data recovery is not available for this user')); + $input.tooltip({placement:'bottom'}); } $td.find('img').hide(); $td.children('span').replaceWith($input); diff --git a/settings/l10n/ar.js b/settings/l10n/ar.js index f9a316a51ab1efa1c16c16f4d673f914af8af283..7567276456ca5399871a6a09e1ef531d7d8fa9ae 100644 --- a/settings/l10n/ar.js +++ b/settings/l10n/ar.js @@ -15,13 +15,9 @@ OC.L10N.register( "Unable to change full name" : "لم يتم التمكن من تغيير اسمك الكامل", "Your full name has been changed." : "اسمك الكامل تم تغييره.", "Email saved" : "تم حفظ البريد الإلكتروني", - "Admins can't remove themself from the admin group" : "لا يستطيع المدير إزالة حسابه من مجموعة المديرين", - "Unable to add user to group %s" : "فشل إضافة المستخدم الى المجموعة %s", - "Unable to remove user from group %s" : "فشل إزالة المستخدم من المجموعة %s", "Couldn't update app." : "تعذر تحديث التطبيق.", "Sending..." : "جاري الارسال ...", "All" : "الكل", - "Please wait...." : "الرجاء الانتظار ...", "Error while disabling app" : "خطا عند تعطيل البرنامج", "Disable" : "إيقاف", "Enable" : "تفعيل", @@ -66,7 +62,6 @@ OC.L10N.register( "days" : "أيام", "Allow resharing" : "السماح بإعادة المشاركة ", "Documentation:" : "التوثيق", - "Uninstall App" : "أزالة تطبيق", "Valid until" : "صالح حتى", "Forum" : "منتدى", "Profile picture" : "صورة الملف الشخصي", @@ -97,7 +92,11 @@ OC.L10N.register( "set new password" : "اعداد كلمة مرور جديدة", "Default" : "افتراضي", "Language changed" : "تم تغيير اللغة", + "Admins can't remove themself from the admin group" : "لا يستطيع المدير إزالة حسابه من مجموعة المديرين", + "Unable to add user to group %s" : "فشل إضافة المستخدم الى المجموعة %s", + "Unable to remove user from group %s" : "فشل إزالة المستخدم من المجموعة %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "هل أنت متأكد انك تريد إضافة \"{domain}\" كنطاق موثوق فيه.", + "Please wait...." : "الرجاء الانتظار ...", "Everything (fatal issues, errors, warnings, info, debug)" : "كل شيء (مشاكل فادحة, اخطاء , تحذيرات , معلومات , تصحيح الاخطاء)", "Info, warnings, errors and fatal issues" : "معلومات , تحذيرات , اخطاء , مشاكل فادحة ", "Warnings, errors and fatal issues" : "تحذيرات , اخطاء , مشاكل فادحة ", @@ -109,6 +108,7 @@ OC.L10N.register( "Less" : "أقل", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "قاعدة البيانات المستخدمة هي SQLite. ننصح باستخدام قاعدة بيانات أخرى للحصول على أداء افضل.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "استخدام SQLite غير مناسب خاصتا اذا تم استخدام برنامج المزامنة على الجهاز الشخصي.", + "Uninstall App" : "أزالة تطبيق", "Group" : "مجموعة" }, "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"); diff --git a/settings/l10n/ar.json b/settings/l10n/ar.json index 913ee8bdc91039ec47c2030632e19986a21eac20..a44eebfbfa89c8b5339bb0be94529d68c71328d9 100644 --- a/settings/l10n/ar.json +++ b/settings/l10n/ar.json @@ -13,13 +13,9 @@ "Unable to change full name" : "لم يتم التمكن من تغيير اسمك الكامل", "Your full name has been changed." : "اسمك الكامل تم تغييره.", "Email saved" : "تم حفظ البريد الإلكتروني", - "Admins can't remove themself from the admin group" : "لا يستطيع المدير إزالة حسابه من مجموعة المديرين", - "Unable to add user to group %s" : "فشل إضافة المستخدم الى المجموعة %s", - "Unable to remove user from group %s" : "فشل إزالة المستخدم من المجموعة %s", "Couldn't update app." : "تعذر تحديث التطبيق.", "Sending..." : "جاري الارسال ...", "All" : "الكل", - "Please wait...." : "الرجاء الانتظار ...", "Error while disabling app" : "خطا عند تعطيل البرنامج", "Disable" : "إيقاف", "Enable" : "تفعيل", @@ -64,7 +60,6 @@ "days" : "أيام", "Allow resharing" : "السماح بإعادة المشاركة ", "Documentation:" : "التوثيق", - "Uninstall App" : "أزالة تطبيق", "Valid until" : "صالح حتى", "Forum" : "منتدى", "Profile picture" : "صورة الملف الشخصي", @@ -95,7 +90,11 @@ "set new password" : "اعداد كلمة مرور جديدة", "Default" : "افتراضي", "Language changed" : "تم تغيير اللغة", + "Admins can't remove themself from the admin group" : "لا يستطيع المدير إزالة حسابه من مجموعة المديرين", + "Unable to add user to group %s" : "فشل إضافة المستخدم الى المجموعة %s", + "Unable to remove user from group %s" : "فشل إزالة المستخدم من المجموعة %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "هل أنت متأكد انك تريد إضافة \"{domain}\" كنطاق موثوق فيه.", + "Please wait...." : "الرجاء الانتظار ...", "Everything (fatal issues, errors, warnings, info, debug)" : "كل شيء (مشاكل فادحة, اخطاء , تحذيرات , معلومات , تصحيح الاخطاء)", "Info, warnings, errors and fatal issues" : "معلومات , تحذيرات , اخطاء , مشاكل فادحة ", "Warnings, errors and fatal issues" : "تحذيرات , اخطاء , مشاكل فادحة ", @@ -107,6 +106,7 @@ "Less" : "أقل", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "قاعدة البيانات المستخدمة هي SQLite. ننصح باستخدام قاعدة بيانات أخرى للحصول على أداء افضل.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "استخدام SQLite غير مناسب خاصتا اذا تم استخدام برنامج المزامنة على الجهاز الشخصي.", + "Uninstall App" : "أزالة تطبيق", "Group" : "مجموعة" },"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" } \ No newline at end of file diff --git a/settings/l10n/ast.js b/settings/l10n/ast.js index 6a169af7467bd4a712e84a6d15a0ac0db4689e3b..5c0a54c40834fa526381b9f48d9c77e67632b2bf 100644 --- a/settings/l10n/ast.js +++ b/settings/l10n/ast.js @@ -18,14 +18,10 @@ OC.L10N.register( "Your full name has been changed." : "Camudóse'l nome completu.", "Email saved" : "Corréu-e guardáu", "Couldn't remove app." : "Nun pudo desaniciase l'aplicación.", - "Admins can't remove themself from the admin group" : "Los alministradores nun puen desaniciase a ellos mesmos del grupu d'alministrador", - "Unable to add user to group %s" : "Nun pudo amestase l'usuariu al grupu %s", - "Unable to remove user from group %s" : "Nun pudo desaniciase al usuariu del grupu %s", "Couldn't update app." : "Nun pudo anovase l'aplicación.", "Add trusted domain" : "Amestar dominiu de confianza", "Sending..." : "Unviando...", "All" : "Toos", - "Please wait...." : "Espera, por favor....", "Error while disabling app" : "Fallu mientres se desactivaba l'aplicación", "Disable" : "Desactivar", "Enable" : "Activar", @@ -99,7 +95,6 @@ OC.L10N.register( "These groups will still be able to receive shares, but not to initiate them." : "Estos grupos van poder siguir recibiendo conteníos compartíos, pero nun van poder anicialos", "Documentation:" : "Documentación:", "Enable only for specific groups" : "Habilitar namái pa grupos específicos", - "Uninstall App" : "Desinstalar aplicación", "Cheers!" : "¡Salú!", "Forum" : "Foru", "Profile picture" : "Semeya de perfil", @@ -133,7 +128,11 @@ OC.L10N.register( "set new password" : "afitar nueva contraseña", "Default" : "Predetermináu", "Language changed" : "Camudóse la llingua", + "Admins can't remove themself from the admin group" : "Los alministradores nun puen desaniciase a ellos mesmos del grupu d'alministrador", + "Unable to add user to group %s" : "Nun pudo amestase l'usuariu al grupu %s", + "Unable to remove user from group %s" : "Nun pudo desaniciase al usuariu del grupu %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "¿De xuru que quies amestar \"{domain}\" como dominiu de confianza?", + "Please wait...." : "Espera, por favor....", "Everything (fatal issues, errors, warnings, info, debug)" : "Too (Información, Avisos, Fallos, debug y problemes fatales)", "Info, warnings, errors and fatal issues" : "Información, Avisos, Fallos y problemes fatales", "Warnings, errors and fatal issues" : "Avisos, fallos y problemes fatales", @@ -143,8 +142,7 @@ OC.L10N.register( "More" : "Más", "Less" : "Menos", "Allow users to send mail notification for shared files" : "Permitir a los usuarios unviar mensaxes de notificación pa ficheros compartíos", - "Group" : "Grupu", - "External Storage" : "Almacenamientu esternu", - "Updates" : "Anovamientos" + "Uninstall App" : "Desinstalar aplicación", + "Group" : "Grupu" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/ast.json b/settings/l10n/ast.json index 3a703d0ef84e4c429681380f9a7e723540649381..847b3822dc3988f4672ff202f4b3e1e0221d149e 100644 --- a/settings/l10n/ast.json +++ b/settings/l10n/ast.json @@ -16,14 +16,10 @@ "Your full name has been changed." : "Camudóse'l nome completu.", "Email saved" : "Corréu-e guardáu", "Couldn't remove app." : "Nun pudo desaniciase l'aplicación.", - "Admins can't remove themself from the admin group" : "Los alministradores nun puen desaniciase a ellos mesmos del grupu d'alministrador", - "Unable to add user to group %s" : "Nun pudo amestase l'usuariu al grupu %s", - "Unable to remove user from group %s" : "Nun pudo desaniciase al usuariu del grupu %s", "Couldn't update app." : "Nun pudo anovase l'aplicación.", "Add trusted domain" : "Amestar dominiu de confianza", "Sending..." : "Unviando...", "All" : "Toos", - "Please wait...." : "Espera, por favor....", "Error while disabling app" : "Fallu mientres se desactivaba l'aplicación", "Disable" : "Desactivar", "Enable" : "Activar", @@ -97,7 +93,6 @@ "These groups will still be able to receive shares, but not to initiate them." : "Estos grupos van poder siguir recibiendo conteníos compartíos, pero nun van poder anicialos", "Documentation:" : "Documentación:", "Enable only for specific groups" : "Habilitar namái pa grupos específicos", - "Uninstall App" : "Desinstalar aplicación", "Cheers!" : "¡Salú!", "Forum" : "Foru", "Profile picture" : "Semeya de perfil", @@ -131,7 +126,11 @@ "set new password" : "afitar nueva contraseña", "Default" : "Predetermináu", "Language changed" : "Camudóse la llingua", + "Admins can't remove themself from the admin group" : "Los alministradores nun puen desaniciase a ellos mesmos del grupu d'alministrador", + "Unable to add user to group %s" : "Nun pudo amestase l'usuariu al grupu %s", + "Unable to remove user from group %s" : "Nun pudo desaniciase al usuariu del grupu %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "¿De xuru que quies amestar \"{domain}\" como dominiu de confianza?", + "Please wait...." : "Espera, por favor....", "Everything (fatal issues, errors, warnings, info, debug)" : "Too (Información, Avisos, Fallos, debug y problemes fatales)", "Info, warnings, errors and fatal issues" : "Información, Avisos, Fallos y problemes fatales", "Warnings, errors and fatal issues" : "Avisos, fallos y problemes fatales", @@ -141,8 +140,7 @@ "More" : "Más", "Less" : "Menos", "Allow users to send mail notification for shared files" : "Permitir a los usuarios unviar mensaxes de notificación pa ficheros compartíos", - "Group" : "Grupu", - "External Storage" : "Almacenamientu esternu", - "Updates" : "Anovamientos" + "Uninstall App" : "Desinstalar aplicación", + "Group" : "Grupu" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/az.js b/settings/l10n/az.js index 33da041addb19536908f0b2d74ce08045d87eb35..a48f28672bc808000271ab274301606dccaed400 100644 --- a/settings/l10n/az.js +++ b/settings/l10n/az.js @@ -32,16 +32,12 @@ OC.L10N.register( "Unable to change mail address" : "Mail ünvanını dəyişmək olmur", "Email saved" : "Məktub yadda saxlanıldı", "Couldn't remove app." : "Proqram təminatını silmək mümkün olmadı.", - "Admins can't remove themself from the admin group" : "İnzibatçılar özlərini inzibatçı qrupundan silə bilməz", - "Unable to add user to group %s" : "İstifadəçini %s qrupuna əlavə etmək mümkün olmadı", - "Unable to remove user from group %s" : "İstifadəçini %s qrupundan silmək mümkün olmadı", "Couldn't update app." : "Proqram təminatını yeniləmək mümkün deyil.", "Add trusted domain" : "İnamlı domainlərə əlavə et", "Sending..." : "Göndərilir...", "All" : "Hamısı", "Update to %s" : "Yenilə bunadək %s", "No apps found for your version" : "Sizin versiya üçün proqram tapılmadı", - "Please wait...." : "Xahiş olunur gözləyəsiniz.", "Error while disabling app" : "Proqram təminatını dayandırdıqda səhv baş verdi", "Disable" : "Dayandır", "Enable" : "İşə sal", @@ -134,7 +130,6 @@ OC.L10N.register( "Hide description …" : "Açıqlamanı gizlət ...", "This app cannot be installed because the following dependencies are not fulfilled:" : "Bu proqram yüklənə bilməz ona görə ki, göstərilən asılılıqlar yerinə yetirilməyib:", "Enable only for specific groups" : "Yalnız spesifik qruplara izin ver", - "Uninstall App" : "Proqram təminatını sil", "Common Name" : "Ümumi ad", "Valid until" : "Vaxtadək keçərlidir", "Issued By" : "Tərəfindən yaradılıb", @@ -186,7 +181,11 @@ OC.L10N.register( "Default" : "Susmaya görə", "log-level out of allowed range" : "jurnal-səviyyəsi izin verilən aralıqdan kənardır", "Language changed" : "Dil dəyişdirildi", + "Admins can't remove themself from the admin group" : "İnzibatçılar özlərini inzibatçı qrupundan silə bilməz", + "Unable to add user to group %s" : "İstifadəçini %s qrupuna əlavə etmək mümkün olmadı", + "Unable to remove user from group %s" : "İstifadəçini %s qrupundan silmək mümkün olmadı", "Are you really sure you want add \"{domain}\" as trusted domain?" : "\"{domain}\" adını inamlı domainlər siyahısına əlavə etməyinizdən əminsinizmi?", + "Please wait...." : "Xahiş olunur gözləyəsiniz.", "Everything (fatal issues, errors, warnings, info, debug)" : "Hər şey(ən pis hadisələr, səhvlər, xəbərdarlıqlar, məlmat, araşdırma səhvləri)", "Info, warnings, errors and fatal issues" : "Məlmat, xəbərdarlıqlar, səhvlər və ən pis hadisələr", "Warnings, errors and fatal issues" : "Xəbərdarlıqlar, səhvlər və ən pis hadisələr", @@ -201,10 +200,9 @@ OC.L10N.register( "Allow users to send mail notification for shared files to other users" : "İstifadəçilərə etdikləri paylaşımı digər istifadəçilərə mail vasitəsilə xəbərdarlıq göndərilməsinə izin verin", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLinte verilənlər bazası kimi istifadə edilir. Geniş tətbiq üçün, biz məsləhət görürük ki, arxa sonluqda fərqli verilənlər bazasından istifadə edəsiniz. ", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Xüsusilə fayl sinxronizasiyası üçün desktop client-dən istifadə edilərsə, SQLite məsləhət görülmür.", + "Uninstall App" : "Proqram təminatını sil", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it:
    %s

    " : "Ey ora,

    ancaq deyirik ki, sizin artiq %s hesabınız var.

    Sizin istifadəçi adınız: %s
    Yetkilidir: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Ey ora,\n\nancaq deyirik ki, sizin artiq %s hesabınız var.\n\nizin istifadəçi adınız: %s\nYetkilidir: %s\n\n", - "Group" : "Qrup", - "External Storage" : "Kənar depo", - "Updates" : "Yenilənmələr" + "Group" : "Qrup" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/az.json b/settings/l10n/az.json index c786765bc3ebb3ae19e072d3108d5b8691b1de2a..c1c57e15a07f8ddf4ad6537b3a9a9894f78ad9a6 100644 --- a/settings/l10n/az.json +++ b/settings/l10n/az.json @@ -30,16 +30,12 @@ "Unable to change mail address" : "Mail ünvanını dəyişmək olmur", "Email saved" : "Məktub yadda saxlanıldı", "Couldn't remove app." : "Proqram təminatını silmək mümkün olmadı.", - "Admins can't remove themself from the admin group" : "İnzibatçılar özlərini inzibatçı qrupundan silə bilməz", - "Unable to add user to group %s" : "İstifadəçini %s qrupuna əlavə etmək mümkün olmadı", - "Unable to remove user from group %s" : "İstifadəçini %s qrupundan silmək mümkün olmadı", "Couldn't update app." : "Proqram təminatını yeniləmək mümkün deyil.", "Add trusted domain" : "İnamlı domainlərə əlavə et", "Sending..." : "Göndərilir...", "All" : "Hamısı", "Update to %s" : "Yenilə bunadək %s", "No apps found for your version" : "Sizin versiya üçün proqram tapılmadı", - "Please wait...." : "Xahiş olunur gözləyəsiniz.", "Error while disabling app" : "Proqram təminatını dayandırdıqda səhv baş verdi", "Disable" : "Dayandır", "Enable" : "İşə sal", @@ -132,7 +128,6 @@ "Hide description …" : "Açıqlamanı gizlət ...", "This app cannot be installed because the following dependencies are not fulfilled:" : "Bu proqram yüklənə bilməz ona görə ki, göstərilən asılılıqlar yerinə yetirilməyib:", "Enable only for specific groups" : "Yalnız spesifik qruplara izin ver", - "Uninstall App" : "Proqram təminatını sil", "Common Name" : "Ümumi ad", "Valid until" : "Vaxtadək keçərlidir", "Issued By" : "Tərəfindən yaradılıb", @@ -184,7 +179,11 @@ "Default" : "Susmaya görə", "log-level out of allowed range" : "jurnal-səviyyəsi izin verilən aralıqdan kənardır", "Language changed" : "Dil dəyişdirildi", + "Admins can't remove themself from the admin group" : "İnzibatçılar özlərini inzibatçı qrupundan silə bilməz", + "Unable to add user to group %s" : "İstifadəçini %s qrupuna əlavə etmək mümkün olmadı", + "Unable to remove user from group %s" : "İstifadəçini %s qrupundan silmək mümkün olmadı", "Are you really sure you want add \"{domain}\" as trusted domain?" : "\"{domain}\" adını inamlı domainlər siyahısına əlavə etməyinizdən əminsinizmi?", + "Please wait...." : "Xahiş olunur gözləyəsiniz.", "Everything (fatal issues, errors, warnings, info, debug)" : "Hər şey(ən pis hadisələr, səhvlər, xəbərdarlıqlar, məlmat, araşdırma səhvləri)", "Info, warnings, errors and fatal issues" : "Məlmat, xəbərdarlıqlar, səhvlər və ən pis hadisələr", "Warnings, errors and fatal issues" : "Xəbərdarlıqlar, səhvlər və ən pis hadisələr", @@ -199,10 +198,9 @@ "Allow users to send mail notification for shared files to other users" : "İstifadəçilərə etdikləri paylaşımı digər istifadəçilərə mail vasitəsilə xəbərdarlıq göndərilməsinə izin verin", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLinte verilənlər bazası kimi istifadə edilir. Geniş tətbiq üçün, biz məsləhət görürük ki, arxa sonluqda fərqli verilənlər bazasından istifadə edəsiniz. ", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Xüsusilə fayl sinxronizasiyası üçün desktop client-dən istifadə edilərsə, SQLite məsləhət görülmür.", + "Uninstall App" : "Proqram təminatını sil", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Ey ora,

    ancaq deyirik ki, sizin artiq %s hesabınız var.

    Sizin istifadəçi adınız: %s
    Yetkilidir: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Ey ora,\n\nancaq deyirik ki, sizin artiq %s hesabınız var.\n\nizin istifadəçi adınız: %s\nYetkilidir: %s\n\n", - "Group" : "Qrup", - "External Storage" : "Kənar depo", - "Updates" : "Yenilənmələr" + "Group" : "Qrup" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/bg_BG.js b/settings/l10n/bg_BG.js index 3a97ceb0093ce07e0a38a7108ebe22fc15f1d00c..b92b3642b7a799f22734fc71ecb3495227509dc5 100644 --- a/settings/l10n/bg_BG.js +++ b/settings/l10n/bg_BG.js @@ -32,16 +32,12 @@ OC.L10N.register( "Unable to change mail address" : "Неуспешна промяна на адрес на електронна поща", "Email saved" : "Имейлът е запазен", "Couldn't remove app." : "Приложението не бе премахнато.", - "Admins can't remove themself from the admin group" : "Администраторите не могат да премахват себе си от групата \"admin\".", - "Unable to add user to group %s" : "Неуспешно добавяне на потребител към групата %s.", - "Unable to remove user from group %s" : "Неуспешно премахване на потребител от групата %s.", "Couldn't update app." : "Приложението не бе обновено.", "Add trusted domain" : "Добавяне на сигурен домейн", "Sending..." : "Изпращане...", "All" : "Всички", "Update to %s" : "Обнови до %s", "No apps found for your version" : "Няма намерени приложения за версията, която ползвате", - "Please wait...." : "Моля, изчакайте....", "Error while disabling app" : "Грешка при изключване на приложението", "Disable" : "Изключване", "Enable" : "Включване", @@ -163,7 +159,6 @@ OC.L10N.register( "Hide description …" : "Скрии описание ...", "This app cannot be installed because the following dependencies are not fulfilled:" : "Приложението не може да бъде инсталирано, защото следните зависимости не са удовлетворени:", "Enable only for specific groups" : "Включи само за определени групи", - "Uninstall App" : "Премахни приложението", "Common Name" : "Познато Име", "Valid until" : "Валиден до", "Issued By" : "Издаден от", @@ -207,6 +202,7 @@ OC.L10N.register( "Name" : "Име", "Username" : "Потребител", "Done" : "Завършен", + "Subscribe to our newsletter!" : "Абонирайте се за нашата емисия!", "Show storage location" : "Покажи мястото на хранилището", "Show last log in" : "Покажи последно вписване", "Send email to new user" : "Изпращай писмо към нов потребител", @@ -230,7 +226,11 @@ OC.L10N.register( "Default" : "Стандарт", "log-level out of allowed range" : "Ниво на проследяване \\(log-level\\) e извън допустимия обхват", "Language changed" : "Езикът е променен", + "Admins can't remove themself from the admin group" : "Администраторите не могат да премахват себе си от групата \"admin\".", + "Unable to add user to group %s" : "Неуспешно добавяне на потребител към групата %s.", + "Unable to remove user from group %s" : "Неуспешно премахване на потребител от групата %s.", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Сигурен/на ли сте, че искате \"{domain}\" да бъде добавен като сигурен домейн?", + "Please wait...." : "Моля, изчакайте....", "iPhone" : "iPhone", "Everything (fatal issues, errors, warnings, info, debug)" : "Всичко (фатални проблеми, грешки, предупреждения, информация, дебъгване)", "Info, warnings, errors and fatal issues" : "информация, предупреждения, грешки и фатални проблеми", @@ -246,16 +246,13 @@ OC.L10N.register( "Allow users to send mail notification for shared files to other users" : "Разреши на потребителите да изпращат уведомителни писма за споделени файлове към други потребители.", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite е използваната база данни. За по-големи инсталации Ви препоръчваме да изберете друг сървър за бази данни.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Използването на SQLite не се препоръчва, особено ако ползвате клиента за настолен компютър.", + "Uninstall App" : "Премахни приложението", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Здрасти,

    Само да ти кажа, че имаш %s профил

    Потребителя ти е: %s
    Достъпи го: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Здрасти,\n\nСамо да ти кажа, че имаш %s профил.\n\nПотребителя ти е: %s\nДостъпи го: %s\n", "Group" : "Група", "Default Quota" : "Стандартна квота", "Group Admin for" : "Групов Администратор за", "Storage Location" : "Дисково пространство", - "Last Login" : "Последно вписване", - "Redis" : "Redis", - "External Storage" : "Външно хранилище", - "Updates" : "Обновления", - "An error occurred: {message}" : "Възникна грешка: {message}" + "Last Login" : "Последно вписване" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/bg_BG.json b/settings/l10n/bg_BG.json index 64d76926da1871505f45428c3d1d7003ee7ea1eb..ec1e46f77195df32f5534ac9d81287027eece3dc 100644 --- a/settings/l10n/bg_BG.json +++ b/settings/l10n/bg_BG.json @@ -30,16 +30,12 @@ "Unable to change mail address" : "Неуспешна промяна на адрес на електронна поща", "Email saved" : "Имейлът е запазен", "Couldn't remove app." : "Приложението не бе премахнато.", - "Admins can't remove themself from the admin group" : "Администраторите не могат да премахват себе си от групата \"admin\".", - "Unable to add user to group %s" : "Неуспешно добавяне на потребител към групата %s.", - "Unable to remove user from group %s" : "Неуспешно премахване на потребител от групата %s.", "Couldn't update app." : "Приложението не бе обновено.", "Add trusted domain" : "Добавяне на сигурен домейн", "Sending..." : "Изпращане...", "All" : "Всички", "Update to %s" : "Обнови до %s", "No apps found for your version" : "Няма намерени приложения за версията, която ползвате", - "Please wait...." : "Моля, изчакайте....", "Error while disabling app" : "Грешка при изключване на приложението", "Disable" : "Изключване", "Enable" : "Включване", @@ -161,7 +157,6 @@ "Hide description …" : "Скрии описание ...", "This app cannot be installed because the following dependencies are not fulfilled:" : "Приложението не може да бъде инсталирано, защото следните зависимости не са удовлетворени:", "Enable only for specific groups" : "Включи само за определени групи", - "Uninstall App" : "Премахни приложението", "Common Name" : "Познато Име", "Valid until" : "Валиден до", "Issued By" : "Издаден от", @@ -205,6 +200,7 @@ "Name" : "Име", "Username" : "Потребител", "Done" : "Завършен", + "Subscribe to our newsletter!" : "Абонирайте се за нашата емисия!", "Show storage location" : "Покажи мястото на хранилището", "Show last log in" : "Покажи последно вписване", "Send email to new user" : "Изпращай писмо към нов потребител", @@ -228,7 +224,11 @@ "Default" : "Стандарт", "log-level out of allowed range" : "Ниво на проследяване \\(log-level\\) e извън допустимия обхват", "Language changed" : "Езикът е променен", + "Admins can't remove themself from the admin group" : "Администраторите не могат да премахват себе си от групата \"admin\".", + "Unable to add user to group %s" : "Неуспешно добавяне на потребител към групата %s.", + "Unable to remove user from group %s" : "Неуспешно премахване на потребител от групата %s.", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Сигурен/на ли сте, че искате \"{domain}\" да бъде добавен като сигурен домейн?", + "Please wait...." : "Моля, изчакайте....", "iPhone" : "iPhone", "Everything (fatal issues, errors, warnings, info, debug)" : "Всичко (фатални проблеми, грешки, предупреждения, информация, дебъгване)", "Info, warnings, errors and fatal issues" : "информация, предупреждения, грешки и фатални проблеми", @@ -244,16 +244,13 @@ "Allow users to send mail notification for shared files to other users" : "Разреши на потребителите да изпращат уведомителни писма за споделени файлове към други потребители.", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite е използваната база данни. За по-големи инсталации Ви препоръчваме да изберете друг сървър за бази данни.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Използването на SQLite не се препоръчва, особено ако ползвате клиента за настолен компютър.", + "Uninstall App" : "Премахни приложението", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Здрасти,

    Само да ти кажа, че имаш %s профил

    Потребителя ти е: %s
    Достъпи го: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Здрасти,\n\nСамо да ти кажа, че имаш %s профил.\n\nПотребителя ти е: %s\nДостъпи го: %s\n", "Group" : "Група", "Default Quota" : "Стандартна квота", "Group Admin for" : "Групов Администратор за", "Storage Location" : "Дисково пространство", - "Last Login" : "Последно вписване", - "Redis" : "Redis", - "External Storage" : "Външно хранилище", - "Updates" : "Обновления", - "An error occurred: {message}" : "Възникна грешка: {message}" + "Last Login" : "Последно вписване" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/bn_BD.js b/settings/l10n/bn_BD.js index 9d08bd440a79457574297a05629dad4295283e82..195745a1b8e5e12ebdea027f7f283131c17cd136 100644 --- a/settings/l10n/bn_BD.js +++ b/settings/l10n/bn_BD.js @@ -12,9 +12,6 @@ OC.L10N.register( "Your full name has been changed." : "আপনার পূর্ণ নাম পরিবর্তন করা হয়েছে।", "Email saved" : "ই-মেইল সংরক্ষন করা হয়েছে", "Couldn't remove app." : "অ্যাপ অপসারণ করা গেলনা", - "Admins can't remove themself from the admin group" : "প্রশাসকবৃন্দ তাদেরকে প্রশাসক গোষ্ঠী থেকে মুছে ফেলতে পারবেন না", - "Unable to add user to group %s" : " %s গোষ্ঠীতে ব্যবহারকারী যোগ করা সম্ভব হলো না ", - "Unable to remove user from group %s" : "%s গোষ্ঠী থেকে ব্যবহারকারীকে অপসারণ করা সম্ভব হলো না", "Couldn't update app." : "অ্যাপ নবায়ন করা গেলনা।", "All" : "সবাই", "Error while disabling app" : "অ্যাপ অকার্যকর করতে সমস্যা দেখা দিয়েছে ", @@ -72,9 +69,11 @@ OC.L10N.register( "set new password" : "নতুন কূটশব্দ নির্ধারণ করুন", "Default" : "পূর্বনির্ধারিত", "Language changed" : "ভাষা পরিবর্তন করা হয়েছে", + "Admins can't remove themself from the admin group" : "প্রশাসকবৃন্দ তাদেরকে প্রশাসক গোষ্ঠী থেকে মুছে ফেলতে পারবেন না", + "Unable to add user to group %s" : " %s গোষ্ঠীতে ব্যবহারকারী যোগ করা সম্ভব হলো না ", + "Unable to remove user from group %s" : "%s গোষ্ঠী থেকে ব্যবহারকারীকে অপসারণ করা সম্ভব হলো না", "More" : "বেশী", "Less" : "কম", - "Group" : "গোষ্ঠীসমূহ", - "External Storage" : "বাহ্যিক সংরক্ষণাগার" + "Group" : "গোষ্ঠীসমূহ" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/bn_BD.json b/settings/l10n/bn_BD.json index 4a6d100e842c2b5e2e91e336e9e847461c976333..6c6794cbe265a4571af5364ee3713c87b888d455 100644 --- a/settings/l10n/bn_BD.json +++ b/settings/l10n/bn_BD.json @@ -10,9 +10,6 @@ "Your full name has been changed." : "আপনার পূর্ণ নাম পরিবর্তন করা হয়েছে।", "Email saved" : "ই-মেইল সংরক্ষন করা হয়েছে", "Couldn't remove app." : "অ্যাপ অপসারণ করা গেলনা", - "Admins can't remove themself from the admin group" : "প্রশাসকবৃন্দ তাদেরকে প্রশাসক গোষ্ঠী থেকে মুছে ফেলতে পারবেন না", - "Unable to add user to group %s" : " %s গোষ্ঠীতে ব্যবহারকারী যোগ করা সম্ভব হলো না ", - "Unable to remove user from group %s" : "%s গোষ্ঠী থেকে ব্যবহারকারীকে অপসারণ করা সম্ভব হলো না", "Couldn't update app." : "অ্যাপ নবায়ন করা গেলনা।", "All" : "সবাই", "Error while disabling app" : "অ্যাপ অকার্যকর করতে সমস্যা দেখা দিয়েছে ", @@ -70,9 +67,11 @@ "set new password" : "নতুন কূটশব্দ নির্ধারণ করুন", "Default" : "পূর্বনির্ধারিত", "Language changed" : "ভাষা পরিবর্তন করা হয়েছে", + "Admins can't remove themself from the admin group" : "প্রশাসকবৃন্দ তাদেরকে প্রশাসক গোষ্ঠী থেকে মুছে ফেলতে পারবেন না", + "Unable to add user to group %s" : " %s গোষ্ঠীতে ব্যবহারকারী যোগ করা সম্ভব হলো না ", + "Unable to remove user from group %s" : "%s গোষ্ঠী থেকে ব্যবহারকারীকে অপসারণ করা সম্ভব হলো না", "More" : "বেশী", "Less" : "কম", - "Group" : "গোষ্ঠীসমূহ", - "External Storage" : "বাহ্যিক সংরক্ষণাগার" + "Group" : "গোষ্ঠীসমূহ" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/bs.js b/settings/l10n/bs.js index 4e0745f6c21c684381f6e8dc64425c16d36aace2..f1d6d4a48e7fd1173c17e4078f8d66bb0015f175 100644 --- a/settings/l10n/bs.js +++ b/settings/l10n/bs.js @@ -28,15 +28,11 @@ OC.L10N.register( "Unable to change mail address" : "Nemoguće je izmjeniti adresu e-pošte", "Email saved" : "E-pošta je spremljena", "Couldn't remove app." : "Nije moguće ukloniti aplikaciju.", - "Admins can't remove themself from the admin group" : "Administratori ne mogu sami sebe ukloniti iz admin grupe", - "Unable to add user to group %s" : "Dodavanje korisnika grupi %s nije moguće", - "Unable to remove user from group %s" : "Uklanjanje korisnika iz grupe %s nije moguće", "Couldn't update app." : "Ažuriranje aplikacije nije moguće.", "Add trusted domain" : "Dodaj pouzdanu domenu", "Sending..." : "Slanje...", "All" : "Sve", "Update to %s" : "Ažuriraj na %s", - "Please wait...." : "Molim pričekajte...", "Error while disabling app" : "Greška pri onemogućavanju aplikacije", "Disable" : "Onemogući", "Enable" : "Omogući", @@ -115,7 +111,6 @@ OC.L10N.register( "Documentation:" : "Dokumentacija:", "This app cannot be installed because the following dependencies are not fulfilled:" : "Ova aplikacija se ne može instalirati zbog slijedećih neispunjenih ovisnosti:", "Enable only for specific groups" : "Omogućite samo za specifične grupe", - "Uninstall App" : "Deinstaliraj aplikaciju", "Common Name" : "Opće Ime", "Valid until" : "Validno do", "Issued By" : "Izdano od", @@ -160,7 +155,11 @@ OC.L10N.register( "change email address" : "promjeni adresu e-pošte", "Default" : "Zadano", "Language changed" : "Jezik je promijenjen", + "Admins can't remove themself from the admin group" : "Administratori ne mogu sami sebe ukloniti iz admin grupe", + "Unable to add user to group %s" : "Dodavanje korisnika grupi %s nije moguće", + "Unable to remove user from group %s" : "Uklanjanje korisnika iz grupe %s nije moguće", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jeste li zaista sigurni da želite dodati \"{domain}\" kao pouzdanu domenu?", + "Please wait...." : "Molim pričekajte...", "Everything (fatal issues, errors, warnings, info, debug)" : "Sve (fatalni problemi, greške, upozorenja, info, ispravljanje pogrešaka)", "Info, warnings, errors and fatal issues" : "Informacije, upozorenja, greške i fatalni problemi", "Warnings, errors and fatal issues" : "Upozorenja, greške i fatalni problemi", @@ -171,8 +170,8 @@ OC.L10N.register( "Less" : "Manje", "Allow users to send mail notification for shared files" : "Dozvoli korisnicima slanje notifikacijske e-pošte za podijeljene datoteke", "Allow users to send mail notification for shared files to other users" : "Dozvoli korisnicima slanje notifikacijske e-pošte za podijeljene datoteke ka ostalim korisnicima", + "Uninstall App" : "Deinstaliraj aplikaciju", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hej,

    samo da javim da sad imate %s račum.

    Vaše korisničko ime: %s
    Pristupite mu: %s

    ", - "Group" : "Grupa", - "Updates" : "Ažuriranja" + "Group" : "Grupa" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/settings/l10n/bs.json b/settings/l10n/bs.json index 4329671aca7e985dede0ad1e278dd3c111769245..b45efaeea0caecb1e713dc72bda0d26994adb792 100644 --- a/settings/l10n/bs.json +++ b/settings/l10n/bs.json @@ -26,15 +26,11 @@ "Unable to change mail address" : "Nemoguće je izmjeniti adresu e-pošte", "Email saved" : "E-pošta je spremljena", "Couldn't remove app." : "Nije moguće ukloniti aplikaciju.", - "Admins can't remove themself from the admin group" : "Administratori ne mogu sami sebe ukloniti iz admin grupe", - "Unable to add user to group %s" : "Dodavanje korisnika grupi %s nije moguće", - "Unable to remove user from group %s" : "Uklanjanje korisnika iz grupe %s nije moguće", "Couldn't update app." : "Ažuriranje aplikacije nije moguće.", "Add trusted domain" : "Dodaj pouzdanu domenu", "Sending..." : "Slanje...", "All" : "Sve", "Update to %s" : "Ažuriraj na %s", - "Please wait...." : "Molim pričekajte...", "Error while disabling app" : "Greška pri onemogućavanju aplikacije", "Disable" : "Onemogući", "Enable" : "Omogući", @@ -113,7 +109,6 @@ "Documentation:" : "Dokumentacija:", "This app cannot be installed because the following dependencies are not fulfilled:" : "Ova aplikacija se ne može instalirati zbog slijedećih neispunjenih ovisnosti:", "Enable only for specific groups" : "Omogućite samo za specifične grupe", - "Uninstall App" : "Deinstaliraj aplikaciju", "Common Name" : "Opće Ime", "Valid until" : "Validno do", "Issued By" : "Izdano od", @@ -158,7 +153,11 @@ "change email address" : "promjeni adresu e-pošte", "Default" : "Zadano", "Language changed" : "Jezik je promijenjen", + "Admins can't remove themself from the admin group" : "Administratori ne mogu sami sebe ukloniti iz admin grupe", + "Unable to add user to group %s" : "Dodavanje korisnika grupi %s nije moguće", + "Unable to remove user from group %s" : "Uklanjanje korisnika iz grupe %s nije moguće", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jeste li zaista sigurni da želite dodati \"{domain}\" kao pouzdanu domenu?", + "Please wait...." : "Molim pričekajte...", "Everything (fatal issues, errors, warnings, info, debug)" : "Sve (fatalni problemi, greške, upozorenja, info, ispravljanje pogrešaka)", "Info, warnings, errors and fatal issues" : "Informacije, upozorenja, greške i fatalni problemi", "Warnings, errors and fatal issues" : "Upozorenja, greške i fatalni problemi", @@ -169,8 +168,8 @@ "Less" : "Manje", "Allow users to send mail notification for shared files" : "Dozvoli korisnicima slanje notifikacijske e-pošte za podijeljene datoteke", "Allow users to send mail notification for shared files to other users" : "Dozvoli korisnicima slanje notifikacijske e-pošte za podijeljene datoteke ka ostalim korisnicima", + "Uninstall App" : "Deinstaliraj aplikaciju", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hej,

    samo da javim da sad imate %s račum.

    Vaše korisničko ime: %s
    Pristupite mu: %s

    ", - "Group" : "Grupa", - "Updates" : "Ažuriranja" + "Group" : "Grupa" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" } \ No newline at end of file diff --git a/settings/l10n/ca.js b/settings/l10n/ca.js index 4476465edeeddc7661e73ca1771920e51bbc468a..917f5d41e4e91c58c5d2f1e3fe7b44b4fe32a228 100644 --- a/settings/l10n/ca.js +++ b/settings/l10n/ca.js @@ -34,9 +34,6 @@ OC.L10N.register( "Unable to change mail address" : "No es pot canviar l'adreça de correu electrònic", "Email saved" : "S'ha desat el correu electrònic", "Couldn't remove app." : "No s'ha pogut eliminar l'aplicació", - "Admins can't remove themself from the admin group" : "Els administradors no es poden eliminar del grup admin", - "Unable to add user to group %s" : "No es pot afegir l'usuari al grup %s", - "Unable to remove user from group %s" : "No es pot eliminar l'usuari del grup %s", "Couldn't update app." : "No s'ha pogut actualitzar l'aplicació.", "Add trusted domain" : "Afegir domini de confiança", "Migration in progress. Please wait until the migration is finished" : "Migració en progrés. Si us plau, espereu fins que finalitzi la migració", @@ -46,7 +43,6 @@ OC.L10N.register( "All" : "Tots", "Update to %s" : "Actualitzar a %s", "No apps found for your version" : "No s'han trobat aplicacions per la seva versió", - "Please wait...." : "Espereu...", "Error while disabling app" : "Error en desactivar l'aplicació", "Disable" : "Desactiva", "Enable" : "Habilita", @@ -152,7 +148,6 @@ OC.L10N.register( "Hide description …" : "Amagar descripció...", "This app cannot be installed because the following dependencies are not fulfilled:" : "Aquesta aplicació no es pot instal·lar perquè les següents dependències no es compleixen:", "Enable only for specific groups" : "Activa només per grups específics", - "Uninstall App" : "Desinstal·la l'aplicació", "Common Name" : "Nom comú", "Valid until" : "Valid fins", "Issued By" : "Emès Per", @@ -206,7 +201,11 @@ OC.L10N.register( "Default" : "Per defecte", "log-level out of allowed range" : "Nivell d'autenticació fora del rang permès", "Language changed" : "S'ha canviat l'idioma", + "Admins can't remove themself from the admin group" : "Els administradors no es poden eliminar del grup admin", + "Unable to add user to group %s" : "No es pot afegir l'usuari al grup %s", + "Unable to remove user from group %s" : "No es pot eliminar l'usuari del grup %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Esteu seguir que voleu afegir \"{domain}\" com a un domini de confiança?", + "Please wait...." : "Espereu...", "Everything (fatal issues, errors, warnings, info, debug)" : "Tot (problemes fatals, errors, avisos, informació, depuració)", "Info, warnings, errors and fatal issues" : "Informació, avisos, errors i problemes fatals", "Warnings, errors and fatal issues" : "Avisos, errors i problemes fatals", @@ -222,13 +221,9 @@ OC.L10N.register( "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "S'utilitza SQLite com a base de dades. Per a instal·lacions mes grans es recomana canviar a un altre sistema de base de dades.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "L'ús de SQLite està desaconsellat especialment quan s'usa el client d'escriptori per sincronitzar els fitxers.", "Experimental applications ahead" : "A partir d'aquest punt hi ha aplicacions experimentals", + "Uninstall App" : "Desinstal·la l'aplicació", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Què tal?,

    aquest missatge és per fer-li saber que ara té uncompte %s.

    El seu nom d'usuari: %s
    Accedeixi en: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hola, què tal?,\n\nAquest missatge és per fer-li saber que ara té un compte %s.\n\n El seu nom d'usuari: %s\nAccedeixi en: %s\n\n", - "Group" : "Grup", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Emmagatzemament extern", - "Updates" : "Actualitzacions", - "An error occurred: {message}" : "S'ha produït un error: {message}" + "Group" : "Grup" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/ca.json b/settings/l10n/ca.json index 28fffa032442a4c835057febd290cc080367bb3c..67b310b196e69812b35ad3759f9c44febcde4986 100644 --- a/settings/l10n/ca.json +++ b/settings/l10n/ca.json @@ -32,9 +32,6 @@ "Unable to change mail address" : "No es pot canviar l'adreça de correu electrònic", "Email saved" : "S'ha desat el correu electrònic", "Couldn't remove app." : "No s'ha pogut eliminar l'aplicació", - "Admins can't remove themself from the admin group" : "Els administradors no es poden eliminar del grup admin", - "Unable to add user to group %s" : "No es pot afegir l'usuari al grup %s", - "Unable to remove user from group %s" : "No es pot eliminar l'usuari del grup %s", "Couldn't update app." : "No s'ha pogut actualitzar l'aplicació.", "Add trusted domain" : "Afegir domini de confiança", "Migration in progress. Please wait until the migration is finished" : "Migració en progrés. Si us plau, espereu fins que finalitzi la migració", @@ -44,7 +41,6 @@ "All" : "Tots", "Update to %s" : "Actualitzar a %s", "No apps found for your version" : "No s'han trobat aplicacions per la seva versió", - "Please wait...." : "Espereu...", "Error while disabling app" : "Error en desactivar l'aplicació", "Disable" : "Desactiva", "Enable" : "Habilita", @@ -150,7 +146,6 @@ "Hide description …" : "Amagar descripció...", "This app cannot be installed because the following dependencies are not fulfilled:" : "Aquesta aplicació no es pot instal·lar perquè les següents dependències no es compleixen:", "Enable only for specific groups" : "Activa només per grups específics", - "Uninstall App" : "Desinstal·la l'aplicació", "Common Name" : "Nom comú", "Valid until" : "Valid fins", "Issued By" : "Emès Per", @@ -204,7 +199,11 @@ "Default" : "Per defecte", "log-level out of allowed range" : "Nivell d'autenticació fora del rang permès", "Language changed" : "S'ha canviat l'idioma", + "Admins can't remove themself from the admin group" : "Els administradors no es poden eliminar del grup admin", + "Unable to add user to group %s" : "No es pot afegir l'usuari al grup %s", + "Unable to remove user from group %s" : "No es pot eliminar l'usuari del grup %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Esteu seguir que voleu afegir \"{domain}\" com a un domini de confiança?", + "Please wait...." : "Espereu...", "Everything (fatal issues, errors, warnings, info, debug)" : "Tot (problemes fatals, errors, avisos, informació, depuració)", "Info, warnings, errors and fatal issues" : "Informació, avisos, errors i problemes fatals", "Warnings, errors and fatal issues" : "Avisos, errors i problemes fatals", @@ -220,13 +219,9 @@ "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "S'utilitza SQLite com a base de dades. Per a instal·lacions mes grans es recomana canviar a un altre sistema de base de dades.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "L'ús de SQLite està desaconsellat especialment quan s'usa el client d'escriptori per sincronitzar els fitxers.", "Experimental applications ahead" : "A partir d'aquest punt hi ha aplicacions experimentals", + "Uninstall App" : "Desinstal·la l'aplicació", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Què tal?,

    aquest missatge és per fer-li saber que ara té uncompte %s.

    El seu nom d'usuari: %s
    Accedeixi en: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hola, què tal?,\n\nAquest missatge és per fer-li saber que ara té un compte %s.\n\n El seu nom d'usuari: %s\nAccedeixi en: %s\n\n", - "Group" : "Grup", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Emmagatzemament extern", - "Updates" : "Actualitzacions", - "An error occurred: {message}" : "S'ha produït un error: {message}" + "Group" : "Grup" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/cs_CZ.js b/settings/l10n/cs_CZ.js index c3ee85073fdfcf030483e1ab7f1c8360e1fa106f..ebc36fcd11997d9dfa82aac80bf617b654dc4314 100644 --- a/settings/l10n/cs_CZ.js +++ b/settings/l10n/cs_CZ.js @@ -25,12 +25,14 @@ OC.L10N.register( "You need to set your user email before being able to send test emails." : "Pro možnost odeslání zkušebních emailů musíte nejprve nastavit svou emailovou adresu.", "Invalid request" : "Neplatný požadavek", "Invalid mail address" : "Neplatná emailová adresa", + "No valid group selected" : "Není vybrána platná skupina", "A user with that name already exists." : "Uživatel tohoto jména již existuje.", "Unable to create user." : "Nelze vytvořit uživatele.", "Your %s account was created" : "Účet %s byl vytvořen", "Unable to delete user." : "Nelze smazat uživatele.", "Settings saved" : "Nastavení uloženo", "Unable to change full name" : "Nelze změnit celé jméno", + "Unable to change email address" : "Nepodařilo se změnit e-mailovou adresu", "Your full name has been changed." : "Vaše celé jméno bylo změněno.", "Forbidden" : "Zakázáno", "Invalid user" : "Neplatný uživatel", @@ -38,9 +40,6 @@ OC.L10N.register( "Email saved" : "Email uložen", "Password confirmation is required" : "Je vyžadováno potvrzení hesla", "Couldn't remove app." : "Nepodařilo se odebrat aplikaci.", - "Admins can't remove themself from the admin group" : "Správci se nemohou odebrat sami ze skupiny správců", - "Unable to add user to group %s" : "Nelze přidat uživatele do skupiny %s", - "Unable to remove user from group %s" : "Nelze odebrat uživatele ze skupiny %s", "Couldn't update app." : "Nelze aktualizovat aplikaci.", "Are you really sure you want add {domain} as trusted domain?" : "Jste si jisti, že chcete přidat {domain} mezi důvěryhodné domény?", "Add trusted domain" : "Přidat důvěryhodnou doménu", @@ -57,7 +56,7 @@ OC.L10N.register( "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Oficiální aplikace jsou vyvíjeny komunitou. Poskytují klíčovou funkcionalitu a jsou připravené na produkční nasazení.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Schválené aplikace jsou vyvíjeny důvěryhodnými vývojáři a prošly zběžným bezpečnostním prověřením. Jsou aktivně udržovány v repozitáři s otevřeným kódem a jejich správci je považují za stabilní pro občasné až normální použití.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "U této aplikace nebyla provedena kontrola na bezpečnostní problémy. Aplikace je nová nebo nestabilní. Instalujte pouze na vlastní nebezpečí.", - "Please wait...." : "Čekejte prosím...", + "Enabling app …" : "Povolování aplikace …", "Error while disabling app" : "Chyba při zakazování aplikace", "Disable" : "Zakázat", "Enable" : "Povolit", @@ -85,6 +84,8 @@ OC.L10N.register( "Google Chrome" : "Google Chrome", "Safari" : "Safari", "Google Chrome for Android" : "Google Chrome pro Android", + "iPhone iOS" : "iPhone iOS", + "iPad iOS" : "iPad iOS", "iOS Client" : "iOS klient", "Android Client" : "Android klient", "Sync client - {os}" : "Sync klient - {os}", @@ -122,6 +123,8 @@ OC.L10N.register( "undo" : "vrátit zpět", "never" : "nikdy", "deleted {userName}" : "smazán {userName}", + "Unable to add user to group {group}" : "Nelze přidat uživatele do skupiny {group}", + "Unable to remove user from group {group}" : "Nelze odebrat uživatele ze skupiny {group}", "Add group" : "Přidat skupinu", "Invalid quota value \"{val}\"" : "Neplatná hodnota kvóty \"{val}\"", "no group" : "není ve skupině", @@ -244,14 +247,16 @@ OC.L10N.register( "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Tato aplikace nemá nastavenou žádnou maximální verzi Nextcloudu. To se v budoucnu projeví jako chyba.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Tuto aplikaci nelze nainstalovat, protože nejsou splněny následující závislosti:", "Enable only for specific groups" : "Povolit pouze pro vybrané skupiny", - "Uninstall App" : "Odinstalovat aplikaci", + "Uninstall app" : "Odinstalovat aplikaci", "SSL Root Certificates" : "Kořenové certifikáty SSL", "Common Name" : "Common Name", "Valid until" : "Platný do", "Issued By" : "Vydal", "Valid until %s" : "Platný do %s", "Import root certificate" : "Import kořenového certifikátu", + "Hey there,

    just letting you know that you now have a %s account.

    Your username: %s
    Access it: %s

    " : "Vítej,

    jen ti dáváme vědět, že nyní máš %s účet.

    Tvé uživatelské jméno: %s
    Přístup: %s

    ", "Cheers!" : "Ať slouží!", + "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Vítej,\n\njen ti dáváme vědět, že nyní máš %s účet.\n\nTvé uživatelské jméno: %s\nPřístup: %s\n\n", "Administrator documentation" : "Dokumentace administrátora", "Online documentation" : "Online dokumentace", "Forum" : "Fórum", @@ -336,7 +341,11 @@ OC.L10N.register( "Default" : "Výchozí", "log-level out of allowed range" : "úroveň logování z povoleného rozpětí", "Language changed" : "Jazyk byl změněn", + "Admins can't remove themself from the admin group" : "Správci se nemohou odebrat sami ze skupiny správců", + "Unable to add user to group %s" : "Nelze přidat uživatele do skupiny %s", + "Unable to remove user from group %s" : "Nelze odebrat uživatele ze skupiny %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jste si jisti, že chcete přidat \"{domain}\" mezi důvěryhodné domény?", + "Please wait...." : "Čekejte prosím...", "iPhone" : "iPhone", "add group" : "přidat skupinu", "Everything (fatal issues, errors, warnings, info, debug)" : "Vše (fatální problémy, chyby, varování, informační, ladící)", @@ -356,6 +365,7 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Obzvláště při používání klientské aplikace pro synchronizaci s desktopem není SQLite doporučeno.", "Experimental applications ahead" : "Experimentální aplikace v pořadí", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Experimentální aplikace nejsou prověřovány na bezpečnostní chyby, mohou být nestabilní a velmi se měnit. Jejich instalací můžete způsobit ztrátu dat nebo bezpečnostní problémy.", + "Uninstall App" : "Odinstalovat aplikaci", "Enable experimental apps" : "Povolit experimentální aplikace", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Ahoj,

    toto je oznámení o nově vytvořeném %s účtu.

    Uživatelské jméno: %s
    Přihlásit se dá zde: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Ahoj,\n\ntoto je oznámení o nově vytvořeném %s účtu.\n\nUživatelské jméno: %s\nPřihlásit se dá zde: %s\n", @@ -367,24 +377,6 @@ OC.L10N.register( "Group Admin for" : "Správce skupiny pro", "Storage Location" : "Úložiště dat", "User Backend" : "Uživatelé vedeni pomocí", - "Last Login" : "Poslední přihlášení", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Externí úložiště", - "Updates" : "Aktualizace", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Oficiální aplikace jsou vyvíjeny Nextcloud komunitou. Poskytují klíčové funkce Nextcloud a jsou připravené na produkční nasazení.", - "No apps found for \"{query}\"" : "Nebyly nalezeny žádné aplikace pro \"{query}\"", - "An error occurred: {message}" : "Nastala chyba: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Zkontrolujte prosím konfiguraci php podle instalační dokumentace ↗, hlavně při použití php-fpm.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Vaše databáze neběží s úrovní izolace transakcí \"READ COMMITED\". Toto může způsobit problémy při paralelním spouštění více akcí současně.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Server běží v prostředí Microsoft Windows. Pro optimální uživatelské pohodlí doporučujeme přejít na Linux.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Transakční uzamykání souborů je vypnuto, což může vést k problémům s \"race\" podmínkami. Pro zabránění těmto problémům povolte 'filelocking.enabled' v souboru config.php. Více informací lze nalézt v dokumentaci ↗.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Prosím překontrolujte instalační pokyny ↗ a zkontrolujte jakékoliv chyby a varování v logu.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Šifrování samotné ještě negarantuje bezpečnost systému. Přečtěte si prosím Nextcloud dokumentaci, chcete-li se dozvědět více informací o tom, jak aplikace pro šifrování funguje a jaké jsou podporované případy použití.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Pro migraci na jinou databázi použijte v příkazovém řádku nástroj: 'occ db:convert-type' nebo nahlédněte do dokumentace ↗.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Tato aplikace nemá nastavenou žádnou nejnižší podporovanou verzi Nextcloud. Toto bude hlášeno jako chyba ve verzi Nextcloud 11 a pozdější.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Tato aplikace nemá nastavenou žádnou nejvyšší podporovanou verzi Nextcloud. Toto bude hlášeno jako chyba ve verzi Nextcloud 11 a pozdější.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Chcete-li projekt podpořit\n\t\tpřipojte se k vývoji\n\t\tnebo\n\t\tpomáhejte ostatním uživatelům!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Vyvíjeno {communityopen}Nextcloud komunitou{linkclose}, {githubopen}zdrojový kód{linkclose} je licencován pod {licenseopen}AGPL{linkclose}." + "Last Login" : "Poslední přihlášení" }, "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/settings/l10n/cs_CZ.json b/settings/l10n/cs_CZ.json index 5deae26789057cf77da416f0ce3d595ddfad8626..7e73f9f69898f3ee77c3f87a3e77fc050413fa2f 100644 --- a/settings/l10n/cs_CZ.json +++ b/settings/l10n/cs_CZ.json @@ -23,12 +23,14 @@ "You need to set your user email before being able to send test emails." : "Pro možnost odeslání zkušebních emailů musíte nejprve nastavit svou emailovou adresu.", "Invalid request" : "Neplatný požadavek", "Invalid mail address" : "Neplatná emailová adresa", + "No valid group selected" : "Není vybrána platná skupina", "A user with that name already exists." : "Uživatel tohoto jména již existuje.", "Unable to create user." : "Nelze vytvořit uživatele.", "Your %s account was created" : "Účet %s byl vytvořen", "Unable to delete user." : "Nelze smazat uživatele.", "Settings saved" : "Nastavení uloženo", "Unable to change full name" : "Nelze změnit celé jméno", + "Unable to change email address" : "Nepodařilo se změnit e-mailovou adresu", "Your full name has been changed." : "Vaše celé jméno bylo změněno.", "Forbidden" : "Zakázáno", "Invalid user" : "Neplatný uživatel", @@ -36,9 +38,6 @@ "Email saved" : "Email uložen", "Password confirmation is required" : "Je vyžadováno potvrzení hesla", "Couldn't remove app." : "Nepodařilo se odebrat aplikaci.", - "Admins can't remove themself from the admin group" : "Správci se nemohou odebrat sami ze skupiny správců", - "Unable to add user to group %s" : "Nelze přidat uživatele do skupiny %s", - "Unable to remove user from group %s" : "Nelze odebrat uživatele ze skupiny %s", "Couldn't update app." : "Nelze aktualizovat aplikaci.", "Are you really sure you want add {domain} as trusted domain?" : "Jste si jisti, že chcete přidat {domain} mezi důvěryhodné domény?", "Add trusted domain" : "Přidat důvěryhodnou doménu", @@ -55,7 +54,7 @@ "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Oficiální aplikace jsou vyvíjeny komunitou. Poskytují klíčovou funkcionalitu a jsou připravené na produkční nasazení.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Schválené aplikace jsou vyvíjeny důvěryhodnými vývojáři a prošly zběžným bezpečnostním prověřením. Jsou aktivně udržovány v repozitáři s otevřeným kódem a jejich správci je považují za stabilní pro občasné až normální použití.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "U této aplikace nebyla provedena kontrola na bezpečnostní problémy. Aplikace je nová nebo nestabilní. Instalujte pouze na vlastní nebezpečí.", - "Please wait...." : "Čekejte prosím...", + "Enabling app …" : "Povolování aplikace …", "Error while disabling app" : "Chyba při zakazování aplikace", "Disable" : "Zakázat", "Enable" : "Povolit", @@ -83,6 +82,8 @@ "Google Chrome" : "Google Chrome", "Safari" : "Safari", "Google Chrome for Android" : "Google Chrome pro Android", + "iPhone iOS" : "iPhone iOS", + "iPad iOS" : "iPad iOS", "iOS Client" : "iOS klient", "Android Client" : "Android klient", "Sync client - {os}" : "Sync klient - {os}", @@ -120,6 +121,8 @@ "undo" : "vrátit zpět", "never" : "nikdy", "deleted {userName}" : "smazán {userName}", + "Unable to add user to group {group}" : "Nelze přidat uživatele do skupiny {group}", + "Unable to remove user from group {group}" : "Nelze odebrat uživatele ze skupiny {group}", "Add group" : "Přidat skupinu", "Invalid quota value \"{val}\"" : "Neplatná hodnota kvóty \"{val}\"", "no group" : "není ve skupině", @@ -242,14 +245,16 @@ "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Tato aplikace nemá nastavenou žádnou maximální verzi Nextcloudu. To se v budoucnu projeví jako chyba.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Tuto aplikaci nelze nainstalovat, protože nejsou splněny následující závislosti:", "Enable only for specific groups" : "Povolit pouze pro vybrané skupiny", - "Uninstall App" : "Odinstalovat aplikaci", + "Uninstall app" : "Odinstalovat aplikaci", "SSL Root Certificates" : "Kořenové certifikáty SSL", "Common Name" : "Common Name", "Valid until" : "Platný do", "Issued By" : "Vydal", "Valid until %s" : "Platný do %s", "Import root certificate" : "Import kořenového certifikátu", + "Hey there,

    just letting you know that you now have a %s account.

    Your username: %s
    Access it: %s

    " : "Vítej,

    jen ti dáváme vědět, že nyní máš %s účet.

    Tvé uživatelské jméno: %s
    Přístup: %s

    ", "Cheers!" : "Ať slouží!", + "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Vítej,\n\njen ti dáváme vědět, že nyní máš %s účet.\n\nTvé uživatelské jméno: %s\nPřístup: %s\n\n", "Administrator documentation" : "Dokumentace administrátora", "Online documentation" : "Online dokumentace", "Forum" : "Fórum", @@ -334,7 +339,11 @@ "Default" : "Výchozí", "log-level out of allowed range" : "úroveň logování z povoleného rozpětí", "Language changed" : "Jazyk byl změněn", + "Admins can't remove themself from the admin group" : "Správci se nemohou odebrat sami ze skupiny správců", + "Unable to add user to group %s" : "Nelze přidat uživatele do skupiny %s", + "Unable to remove user from group %s" : "Nelze odebrat uživatele ze skupiny %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jste si jisti, že chcete přidat \"{domain}\" mezi důvěryhodné domény?", + "Please wait...." : "Čekejte prosím...", "iPhone" : "iPhone", "add group" : "přidat skupinu", "Everything (fatal issues, errors, warnings, info, debug)" : "Vše (fatální problémy, chyby, varování, informační, ladící)", @@ -354,6 +363,7 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Obzvláště při používání klientské aplikace pro synchronizaci s desktopem není SQLite doporučeno.", "Experimental applications ahead" : "Experimentální aplikace v pořadí", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Experimentální aplikace nejsou prověřovány na bezpečnostní chyby, mohou být nestabilní a velmi se měnit. Jejich instalací můžete způsobit ztrátu dat nebo bezpečnostní problémy.", + "Uninstall App" : "Odinstalovat aplikaci", "Enable experimental apps" : "Povolit experimentální aplikace", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Ahoj,

    toto je oznámení o nově vytvořeném %s účtu.

    Uživatelské jméno: %s
    Přihlásit se dá zde: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Ahoj,\n\ntoto je oznámení o nově vytvořeném %s účtu.\n\nUživatelské jméno: %s\nPřihlásit se dá zde: %s\n", @@ -365,24 +375,6 @@ "Group Admin for" : "Správce skupiny pro", "Storage Location" : "Úložiště dat", "User Backend" : "Uživatelé vedeni pomocí", - "Last Login" : "Poslední přihlášení", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Externí úložiště", - "Updates" : "Aktualizace", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Oficiální aplikace jsou vyvíjeny Nextcloud komunitou. Poskytují klíčové funkce Nextcloud a jsou připravené na produkční nasazení.", - "No apps found for \"{query}\"" : "Nebyly nalezeny žádné aplikace pro \"{query}\"", - "An error occurred: {message}" : "Nastala chyba: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Zkontrolujte prosím konfiguraci php podle instalační dokumentace ↗, hlavně při použití php-fpm.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Vaše databáze neběží s úrovní izolace transakcí \"READ COMMITED\". Toto může způsobit problémy při paralelním spouštění více akcí současně.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Server běží v prostředí Microsoft Windows. Pro optimální uživatelské pohodlí doporučujeme přejít na Linux.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Transakční uzamykání souborů je vypnuto, což může vést k problémům s \"race\" podmínkami. Pro zabránění těmto problémům povolte 'filelocking.enabled' v souboru config.php. Více informací lze nalézt v dokumentaci ↗.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Prosím překontrolujte instalační pokyny ↗ a zkontrolujte jakékoliv chyby a varování v logu.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Šifrování samotné ještě negarantuje bezpečnost systému. Přečtěte si prosím Nextcloud dokumentaci, chcete-li se dozvědět více informací o tom, jak aplikace pro šifrování funguje a jaké jsou podporované případy použití.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Pro migraci na jinou databázi použijte v příkazovém řádku nástroj: 'occ db:convert-type' nebo nahlédněte do dokumentace ↗.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Tato aplikace nemá nastavenou žádnou nejnižší podporovanou verzi Nextcloud. Toto bude hlášeno jako chyba ve verzi Nextcloud 11 a pozdější.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Tato aplikace nemá nastavenou žádnou nejvyšší podporovanou verzi Nextcloud. Toto bude hlášeno jako chyba ve verzi Nextcloud 11 a pozdější.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Chcete-li projekt podpořit\n\t\tpřipojte se k vývoji\n\t\tnebo\n\t\tpomáhejte ostatním uživatelům!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Vyvíjeno {communityopen}Nextcloud komunitou{linkclose}, {githubopen}zdrojový kód{linkclose} je licencován pod {licenseopen}AGPL{linkclose}." + "Last Login" : "Poslední přihlášení" },"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" } \ No newline at end of file diff --git a/settings/l10n/da.js b/settings/l10n/da.js index 7879562cb115c77ec956cc732031e53284b3c945..474007513ced979d508931dedc524fd2945ea67e 100644 --- a/settings/l10n/da.js +++ b/settings/l10n/da.js @@ -36,9 +36,6 @@ OC.L10N.register( "Unable to change mail address" : "Kan ikke ændre mailadresse", "Email saved" : "E-mailadressen er gemt", "Couldn't remove app." : "Kunne ikke fjerne app'en.", - "Admins can't remove themself from the admin group" : "Administratorer kan ikke fjerne dem selv fra admin gruppen", - "Unable to add user to group %s" : "Brugeren kan ikke tilføjes til gruppen %s", - "Unable to remove user from group %s" : "Brugeren kan ikke fjernes fra gruppen %s", "Couldn't update app." : "Kunne ikke opdatere app'en.", "Add trusted domain" : "Tilføj et domæne som du har tillid til", "Migration in progress. Please wait until the migration is finished" : "Immigration er i gang. Vent venligst indtil overflytningen er afsluttet", @@ -50,7 +47,6 @@ OC.L10N.register( "No apps found for your version" : "Ingen apps fundet til din verion", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Godkendte programmer er udviklet af betroet udviklere som har bestået en let sikkerheds gennemgang. De er aktivt vedligeholdt i et åben kode lager og udviklerne vurdere programmet til at være stabilt for normalt brug.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Dette program er ikke kontrolleret for sikkerhedsproblemer, og er nyt eller kendt for at være ustabilt. Installer på eget ansvar.", - "Please wait...." : "Vent venligst...", "Error while disabling app" : "Kunne ikke deaktivere app", "Disable" : "Deaktiver", "Enable" : "Aktiver", @@ -168,7 +164,6 @@ OC.L10N.register( "Hide description …" : "Skjul beskrivelse", "This app cannot be installed because the following dependencies are not fulfilled:" : "Dette program kan ikke installeres, da følgende afhængigheder ikke imødekommes:", "Enable only for specific groups" : "Aktivér kun for udvalgte grupper", - "Uninstall App" : "Afinstallér app", "Common Name" : "Almindeligt navn", "Valid until" : "Gyldig indtil", "Issued By" : "Udstedt af", @@ -226,7 +221,11 @@ OC.L10N.register( "Default" : "Standard", "log-level out of allowed range" : "niveau for logregistrering går ud over tilladte interval", "Language changed" : "Sprog ændret", + "Admins can't remove themself from the admin group" : "Administratorer kan ikke fjerne dem selv fra admin gruppen", + "Unable to add user to group %s" : "Brugeren kan ikke tilføjes til gruppen %s", + "Unable to remove user from group %s" : "Brugeren kan ikke fjernes fra gruppen %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Sikker på at du vil tilføje \"{domain}\" som et domæne du har tiilid til?", + "Please wait...." : "Vent venligst...", "Everything (fatal issues, errors, warnings, info, debug)" : "Alt (alvorlige fejl, fejl, advarsler, info, debug)", "Info, warnings, errors and fatal issues" : "Info, advarsler, fejl og alvorlige fejl", "Warnings, errors and fatal issues" : "Advarsler, fejl og alvorlige fejl", @@ -243,14 +242,10 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Brug af SQLite frarådes især når skrivebordsklienten anvendes til filsynkronisering.", "Experimental applications ahead" : "Kommende eksperimentale programmer", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Eksperimentale programmer er ikke undersøgt for sikkerheds problemer. Kendt for at være ustabil og stadig under intensiv udvikling. Installering af disse programmer kan medføre datatab og/eller udgøre en sikkerhedsrisiko.", + "Uninstall App" : "Afinstallér app", "Enable experimental apps" : "Aktiver eksperimentale programmer", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hejsa,

    dette er blot en besked om, at du nu har en %s-konto.

    Dit brugernavn: %s
    Tilgå den: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hejsa,\n\ndette er blot en besked om, at du nu har en %s-konto.\n\nDit brugernavn: %s\nTilgå den: %s\n\n", - "Group" : "Gruppe", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Ekstern opbevaring", - "Updates" : "Opdateringer", - "An error occurred: {message}" : "Der opstod en fejl:{message}" + "Group" : "Gruppe" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/da.json b/settings/l10n/da.json index 112eaa65253fa3b9dd3bcb8274b4b17766a54020..70af6ed51a07ab1e965e2c02ab5e9758ed8a8489 100644 --- a/settings/l10n/da.json +++ b/settings/l10n/da.json @@ -34,9 +34,6 @@ "Unable to change mail address" : "Kan ikke ændre mailadresse", "Email saved" : "E-mailadressen er gemt", "Couldn't remove app." : "Kunne ikke fjerne app'en.", - "Admins can't remove themself from the admin group" : "Administratorer kan ikke fjerne dem selv fra admin gruppen", - "Unable to add user to group %s" : "Brugeren kan ikke tilføjes til gruppen %s", - "Unable to remove user from group %s" : "Brugeren kan ikke fjernes fra gruppen %s", "Couldn't update app." : "Kunne ikke opdatere app'en.", "Add trusted domain" : "Tilføj et domæne som du har tillid til", "Migration in progress. Please wait until the migration is finished" : "Immigration er i gang. Vent venligst indtil overflytningen er afsluttet", @@ -48,7 +45,6 @@ "No apps found for your version" : "Ingen apps fundet til din verion", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Godkendte programmer er udviklet af betroet udviklere som har bestået en let sikkerheds gennemgang. De er aktivt vedligeholdt i et åben kode lager og udviklerne vurdere programmet til at være stabilt for normalt brug.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Dette program er ikke kontrolleret for sikkerhedsproblemer, og er nyt eller kendt for at være ustabilt. Installer på eget ansvar.", - "Please wait...." : "Vent venligst...", "Error while disabling app" : "Kunne ikke deaktivere app", "Disable" : "Deaktiver", "Enable" : "Aktiver", @@ -166,7 +162,6 @@ "Hide description …" : "Skjul beskrivelse", "This app cannot be installed because the following dependencies are not fulfilled:" : "Dette program kan ikke installeres, da følgende afhængigheder ikke imødekommes:", "Enable only for specific groups" : "Aktivér kun for udvalgte grupper", - "Uninstall App" : "Afinstallér app", "Common Name" : "Almindeligt navn", "Valid until" : "Gyldig indtil", "Issued By" : "Udstedt af", @@ -224,7 +219,11 @@ "Default" : "Standard", "log-level out of allowed range" : "niveau for logregistrering går ud over tilladte interval", "Language changed" : "Sprog ændret", + "Admins can't remove themself from the admin group" : "Administratorer kan ikke fjerne dem selv fra admin gruppen", + "Unable to add user to group %s" : "Brugeren kan ikke tilføjes til gruppen %s", + "Unable to remove user from group %s" : "Brugeren kan ikke fjernes fra gruppen %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Sikker på at du vil tilføje \"{domain}\" som et domæne du har tiilid til?", + "Please wait...." : "Vent venligst...", "Everything (fatal issues, errors, warnings, info, debug)" : "Alt (alvorlige fejl, fejl, advarsler, info, debug)", "Info, warnings, errors and fatal issues" : "Info, advarsler, fejl og alvorlige fejl", "Warnings, errors and fatal issues" : "Advarsler, fejl og alvorlige fejl", @@ -241,14 +240,10 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Brug af SQLite frarådes især når skrivebordsklienten anvendes til filsynkronisering.", "Experimental applications ahead" : "Kommende eksperimentale programmer", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Eksperimentale programmer er ikke undersøgt for sikkerheds problemer. Kendt for at være ustabil og stadig under intensiv udvikling. Installering af disse programmer kan medføre datatab og/eller udgøre en sikkerhedsrisiko.", + "Uninstall App" : "Afinstallér app", "Enable experimental apps" : "Aktiver eksperimentale programmer", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hejsa,

    dette er blot en besked om, at du nu har en %s-konto.

    Dit brugernavn: %s
    Tilgå den: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hejsa,\n\ndette er blot en besked om, at du nu har en %s-konto.\n\nDit brugernavn: %s\nTilgå den: %s\n\n", - "Group" : "Gruppe", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Ekstern opbevaring", - "Updates" : "Opdateringer", - "An error occurred: {message}" : "Der opstod en fejl:{message}" + "Group" : "Gruppe" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/de.js b/settings/l10n/de.js index 2c72885908238fbf43bf555e06a44bbb75860382..fdbb8cab3b320d3be71878fb07eaf13fd7dee6c9 100644 --- a/settings/l10n/de.js +++ b/settings/l10n/de.js @@ -25,6 +25,7 @@ OC.L10N.register( "You need to set your user email before being able to send test emails." : "Zunächst muss die Benutzer-E-Mail-Adresse angegeben werden, bevor Test-E-Mails verschickt werden können.", "Invalid request" : "Fehlerhafte Anfrage", "Invalid mail address" : "Ungültige E-Mail-Adresse", + "No valid group selected" : "Keine gültige Gruppe ausgewählt", "A user with that name already exists." : "Ein Benutzer mit diesem Namen existiert bereits.", "Unable to create user." : "Benutzer konnte nicht erstellt werden.", "Your %s account was created" : "Dein %s-Konto wurde erstellt", @@ -39,13 +40,10 @@ OC.L10N.register( "Email saved" : "E-Mail-Adresse gespeichert", "Password confirmation is required" : "Passwortbestätigung ist erforderlich", "Couldn't remove app." : "Die App konnte nicht entfernt werden.", - "Admins can't remove themself from the admin group" : "Administratoren können sich nicht selbst aus der Admin-Gruppe löschen.", - "Unable to add user to group %s" : "Der Benutzer konnte nicht zur Gruppe %s hinzugefügt werden", - "Unable to remove user from group %s" : "Der Benutzer konnte nicht aus der Gruppe %s entfernt werden", "Couldn't update app." : "Die App konnte nicht aktualisiert werden.", "Are you really sure you want add {domain} as trusted domain?" : "Bist du sicher, dass du {domain} als vertrauenswürdige Domain hinzufügen möchtest?", "Add trusted domain" : "Vertrauenswürdige Domain hinzufügen", - "Migration in progress. Please wait until the migration is finished" : "Migration läuft. Bitte warte, bis die Migrationabgeschlossen ist", + "Migration in progress. Please wait until the migration is finished" : "Migration läuft. Bitte warte, bis die Migration abgeschlossen ist", "Migration started …" : "Migration begonnen…", "Not saved" : "Nicht gespeichert", "Sending..." : "Senden…", @@ -58,7 +56,7 @@ OC.L10N.register( "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Offizielle Apps werden von und innerhalb der Community entwickelt. Sie stellen die zentralen Funktionen bereit und sind für den produktiven Einsatz geeignet.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Geprüfte Apps werden von vertrauenswürdigen Entwicklern entwickelt und haben eine oberflächliche Sicherheitsprüfung durchlaufen. Sie werden innerhalb eines offenen Code-Repositorys aktiv gepflegt und ihre Betreuer erachten sie als stabil genug für für den gelegentlichen bis normalen Einsatz.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Diese App ist nicht auf Sicherheitsprobleme hin überprüft und ist neu oder bekanntermaßen instabil. Die Installation erfolgt auf eigenes Risiko.", - "Please wait...." : "Bitte warten…", + "Enabling app …" : "Aktiviere App ...", "Error while disabling app" : "Beim Deaktivieren der App ist ein Fehler aufgetreten", "Disable" : "Deaktivieren", "Enable" : "Aktivieren", @@ -88,8 +86,8 @@ OC.L10N.register( "Google Chrome for Android" : "Google Chrome für Android", "iPhone iOS" : "iPhone iOS", "iPad iOS" : "iPad iOS", - "iOS Client" : "iOS Client", - "Android Client" : "Android Client", + "iOS Client" : "iOS-Client", + "Android Client" : "Android-Client", "Sync client - {os}" : "Sync-Client - {os}", "This session" : "Diese Sitzung", "Copy" : "Kopieren", @@ -125,6 +123,8 @@ OC.L10N.register( "undo" : "rückgängig machen", "never" : "niemals", "deleted {userName}" : "{userName} gelöscht", + "Unable to add user to group {group}" : "Benutzer kann nicht zur Gruppe {group} hinzugefügt werden ", + "Unable to remove user from group {group}" : "Benutzer kann nicht aus der Gruppe {group} entfernt werden ", "Add group" : "Gruppe hinzufügen", "Invalid quota value \"{val}\"" : "Ungültiger Grenzwert \"{val}\"", "no group" : "Keine Gruppe", @@ -139,7 +139,7 @@ OC.L10N.register( "Unlimited" : "Unbegrenzt", "Personal info" : "Persönliche Informationen", "Sessions" : "Sitzungen", - "App passwords" : "App-Passwörter", + "App passwords" : "App-PINs", "Sync clients" : "Sync-Clients", "None" : "Nichts", "Login" : "Anmelden", @@ -247,7 +247,7 @@ OC.L10N.register( "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Für diese App wurde keine obere Versionsgrenze für Nextcloud gesetzt. Dies wird zukünftig als Fehler behandelt.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Die App kann nicht installiert werden, weil die folgenden Abhängigkeiten nicht erfüllt sind:", "Enable only for specific groups" : "Nur für bestimmte Gruppen aktivieren", - "Uninstall App" : "App deinstallieren", + "Uninstall app" : "App deinstallieren", "SSL Root Certificates" : "SSL Root Zertifikate", "Common Name" : "Allgemeiner Name", "Valid until" : "Gültig bis", @@ -276,7 +276,7 @@ OC.L10N.register( "Email" : "E-Mail", "Your email address" : "Deine E-Mail-Adresse", "No email address set" : "Keine E-Mail-Adresse angegeben", - "For password recovery and notifications" : "Für Passwort Wiederherstellung und Benachrichtigungen", + "For password recovery and notifications" : "Für Passwort-Wiederherstellung und Benachrichtigungen", "Phone number" : "Telefonnummer", "Your phone number" : "Deine Telefonnummer", "Address" : "Adresse", @@ -341,7 +341,11 @@ OC.L10N.register( "Default" : "Standard", "log-level out of allowed range" : "Log-Level außerhalb des erlaubten Bereichs", "Language changed" : "Sprache geändert", + "Admins can't remove themself from the admin group" : "Administratoren können sich nicht selbst aus der Admin-Gruppe löschen.", + "Unable to add user to group %s" : "Der Benutzer konnte nicht zur Gruppe %s hinzugefügt werden", + "Unable to remove user from group %s" : "Der Benutzer konnte nicht aus der Gruppe %s entfernt werden", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Bist du sicher, dass du „{domain}“ als vertrauenswürdige Domain hinzufügen möchtest?", + "Please wait...." : "Bitte warten…", "iPhone" : "iPhone", "add group" : "Gruppe hinzufügen", "Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale Probleme, Fehler, Warnungen, Infos, Debug-Meldungen)", @@ -361,6 +365,7 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Insbesondere bei der Nutzung des Desktop Clients zur Dateisynchronisierung wird vom Einsatz von SQLite abgeraten.", "Experimental applications ahead" : "Experimentelle Apps nachfolgend", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Experimentelle Apps sind nicht auf Sicherheitsprobleme hin überprüft, sind neu oder bekanntermaßen instabil und befinden sich in intensiver Entwicklung. Ihre Installation kann Datenverlust oder Sicherheitslücken hervorrufen.", + "Uninstall App" : "App deinstallieren", "Enable experimental apps" : "Experimentelle Apps aktivieren", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hallo,

    hier nur kurz die Mitteilung, dass du jetzt ein %s-Konto hast.

    Dein Benutzername: %s
    Zugriff: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hallo,\n\nhier nur kurz die Mitteilung, dass du jetzt ein %s-Konto hast.\n\nDein Benutzername: %s\nLoslegen: %s\n\n", @@ -372,24 +377,6 @@ OC.L10N.register( "Group Admin for" : "Gruppenadministrator für", "Storage Location" : "Speicherort", "User Backend" : "Benutzer-Backend", - "Last Login" : "Letzte Anmeldung", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Externer Speicher", - "Updates" : "Updates", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Offizielle Apps werden von und innerhalb der Community entwickelt. Sie stellen die zentralen Funktionen bereit und sind für den produktiven Einsatz geeignet.", - "No apps found for \"{query}\"" : "Keine Applikationen für \"{query}\" gefunden", - "An error occurred: {message}" : "Ein Fehler ist aufgetreten: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Bitte die Installationsdokumentation ↗auf Hinweise zur PHP-Konfiguration durchlesen, sowie die PHP-Konfiguration des Servers überprüfen, insbesondere dann, wenn PHP-FPM eingesetzt wird.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Deine Datenbank läuft nicht mit der \"READ COMMITED\" Transaktionsisolationsstufe. Dies kann Probleme hervorrufen, wenn mehrere Aktionen parallel ausgeführt werden.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Dein Server wird mit Microsoft Windows betrieben. Für ein optimales Nutzungserlebnis empfehlen wir dringend Linux.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Transaktionales Sperren ist deaktiviert, was zu Problemen mit Laufzeitbedingungen führen kann. 'filelocking.enabled' in der config.php aktivieren, um diese Probleme zu vermeiden. Weitere Informationen findest du in unserer Dokumentation ↗.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Bitte überprüfe noch einmal die Installationsanleitungen ↗ und kontrolliere das Log auf mögliche Fehler oder Warnungen.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Verschlüsselung alleine garantiert nicht die Systemsicherheit. Bitte lesen Sie in der Dokumentation nach, wie die Verschlüsselungs-App funktioniert und welche Anwendungsfälle unterstützt werden.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Um zu einer anderen Datenbank zu migrieren, benutze bitte die Kommandozeile: 'occ db:convert-type', oder in die Dokumentation ↗ schauen.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Für diese App wurde keine untere Versionsgrenze für Nextcloud gesetzt. Dies wird zukünftig als Fehler behandelt.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Für diese App wurde keine obere Versionsgrenze für Nextcloud gesetzt. Dies wird zukünftig als Fehler behandelt.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Wenn du das Projekt unterstützen möchtest\n⇥⇥hilf uns bei der Weiterentwicklung\n⇥⇥oder\n⇥⇥hilf anderen Nutzern!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Entwickelt von der {communityopen}Nextcloud Community{linkclose}. Der {githubopen}Quellcode{linkclose} ist unter {licenseopen}AGPL{linkclose} verfügbar." + "Last Login" : "Letzte Anmeldung" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/de.json b/settings/l10n/de.json index 349c71916f02840b5239f53444c33dd53486ee79..b451209d753234792075280a913bdf286e6d239e 100644 --- a/settings/l10n/de.json +++ b/settings/l10n/de.json @@ -23,6 +23,7 @@ "You need to set your user email before being able to send test emails." : "Zunächst muss die Benutzer-E-Mail-Adresse angegeben werden, bevor Test-E-Mails verschickt werden können.", "Invalid request" : "Fehlerhafte Anfrage", "Invalid mail address" : "Ungültige E-Mail-Adresse", + "No valid group selected" : "Keine gültige Gruppe ausgewählt", "A user with that name already exists." : "Ein Benutzer mit diesem Namen existiert bereits.", "Unable to create user." : "Benutzer konnte nicht erstellt werden.", "Your %s account was created" : "Dein %s-Konto wurde erstellt", @@ -37,13 +38,10 @@ "Email saved" : "E-Mail-Adresse gespeichert", "Password confirmation is required" : "Passwortbestätigung ist erforderlich", "Couldn't remove app." : "Die App konnte nicht entfernt werden.", - "Admins can't remove themself from the admin group" : "Administratoren können sich nicht selbst aus der Admin-Gruppe löschen.", - "Unable to add user to group %s" : "Der Benutzer konnte nicht zur Gruppe %s hinzugefügt werden", - "Unable to remove user from group %s" : "Der Benutzer konnte nicht aus der Gruppe %s entfernt werden", "Couldn't update app." : "Die App konnte nicht aktualisiert werden.", "Are you really sure you want add {domain} as trusted domain?" : "Bist du sicher, dass du {domain} als vertrauenswürdige Domain hinzufügen möchtest?", "Add trusted domain" : "Vertrauenswürdige Domain hinzufügen", - "Migration in progress. Please wait until the migration is finished" : "Migration läuft. Bitte warte, bis die Migrationabgeschlossen ist", + "Migration in progress. Please wait until the migration is finished" : "Migration läuft. Bitte warte, bis die Migration abgeschlossen ist", "Migration started …" : "Migration begonnen…", "Not saved" : "Nicht gespeichert", "Sending..." : "Senden…", @@ -56,7 +54,7 @@ "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Offizielle Apps werden von und innerhalb der Community entwickelt. Sie stellen die zentralen Funktionen bereit und sind für den produktiven Einsatz geeignet.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Geprüfte Apps werden von vertrauenswürdigen Entwicklern entwickelt und haben eine oberflächliche Sicherheitsprüfung durchlaufen. Sie werden innerhalb eines offenen Code-Repositorys aktiv gepflegt und ihre Betreuer erachten sie als stabil genug für für den gelegentlichen bis normalen Einsatz.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Diese App ist nicht auf Sicherheitsprobleme hin überprüft und ist neu oder bekanntermaßen instabil. Die Installation erfolgt auf eigenes Risiko.", - "Please wait...." : "Bitte warten…", + "Enabling app …" : "Aktiviere App ...", "Error while disabling app" : "Beim Deaktivieren der App ist ein Fehler aufgetreten", "Disable" : "Deaktivieren", "Enable" : "Aktivieren", @@ -86,8 +84,8 @@ "Google Chrome for Android" : "Google Chrome für Android", "iPhone iOS" : "iPhone iOS", "iPad iOS" : "iPad iOS", - "iOS Client" : "iOS Client", - "Android Client" : "Android Client", + "iOS Client" : "iOS-Client", + "Android Client" : "Android-Client", "Sync client - {os}" : "Sync-Client - {os}", "This session" : "Diese Sitzung", "Copy" : "Kopieren", @@ -123,6 +121,8 @@ "undo" : "rückgängig machen", "never" : "niemals", "deleted {userName}" : "{userName} gelöscht", + "Unable to add user to group {group}" : "Benutzer kann nicht zur Gruppe {group} hinzugefügt werden ", + "Unable to remove user from group {group}" : "Benutzer kann nicht aus der Gruppe {group} entfernt werden ", "Add group" : "Gruppe hinzufügen", "Invalid quota value \"{val}\"" : "Ungültiger Grenzwert \"{val}\"", "no group" : "Keine Gruppe", @@ -137,7 +137,7 @@ "Unlimited" : "Unbegrenzt", "Personal info" : "Persönliche Informationen", "Sessions" : "Sitzungen", - "App passwords" : "App-Passwörter", + "App passwords" : "App-PINs", "Sync clients" : "Sync-Clients", "None" : "Nichts", "Login" : "Anmelden", @@ -245,7 +245,7 @@ "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Für diese App wurde keine obere Versionsgrenze für Nextcloud gesetzt. Dies wird zukünftig als Fehler behandelt.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Die App kann nicht installiert werden, weil die folgenden Abhängigkeiten nicht erfüllt sind:", "Enable only for specific groups" : "Nur für bestimmte Gruppen aktivieren", - "Uninstall App" : "App deinstallieren", + "Uninstall app" : "App deinstallieren", "SSL Root Certificates" : "SSL Root Zertifikate", "Common Name" : "Allgemeiner Name", "Valid until" : "Gültig bis", @@ -274,7 +274,7 @@ "Email" : "E-Mail", "Your email address" : "Deine E-Mail-Adresse", "No email address set" : "Keine E-Mail-Adresse angegeben", - "For password recovery and notifications" : "Für Passwort Wiederherstellung und Benachrichtigungen", + "For password recovery and notifications" : "Für Passwort-Wiederherstellung und Benachrichtigungen", "Phone number" : "Telefonnummer", "Your phone number" : "Deine Telefonnummer", "Address" : "Adresse", @@ -339,7 +339,11 @@ "Default" : "Standard", "log-level out of allowed range" : "Log-Level außerhalb des erlaubten Bereichs", "Language changed" : "Sprache geändert", + "Admins can't remove themself from the admin group" : "Administratoren können sich nicht selbst aus der Admin-Gruppe löschen.", + "Unable to add user to group %s" : "Der Benutzer konnte nicht zur Gruppe %s hinzugefügt werden", + "Unable to remove user from group %s" : "Der Benutzer konnte nicht aus der Gruppe %s entfernt werden", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Bist du sicher, dass du „{domain}“ als vertrauenswürdige Domain hinzufügen möchtest?", + "Please wait...." : "Bitte warten…", "iPhone" : "iPhone", "add group" : "Gruppe hinzufügen", "Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale Probleme, Fehler, Warnungen, Infos, Debug-Meldungen)", @@ -359,6 +363,7 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Insbesondere bei der Nutzung des Desktop Clients zur Dateisynchronisierung wird vom Einsatz von SQLite abgeraten.", "Experimental applications ahead" : "Experimentelle Apps nachfolgend", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Experimentelle Apps sind nicht auf Sicherheitsprobleme hin überprüft, sind neu oder bekanntermaßen instabil und befinden sich in intensiver Entwicklung. Ihre Installation kann Datenverlust oder Sicherheitslücken hervorrufen.", + "Uninstall App" : "App deinstallieren", "Enable experimental apps" : "Experimentelle Apps aktivieren", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hallo,

    hier nur kurz die Mitteilung, dass du jetzt ein %s-Konto hast.

    Dein Benutzername: %s
    Zugriff: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hallo,\n\nhier nur kurz die Mitteilung, dass du jetzt ein %s-Konto hast.\n\nDein Benutzername: %s\nLoslegen: %s\n\n", @@ -370,24 +375,6 @@ "Group Admin for" : "Gruppenadministrator für", "Storage Location" : "Speicherort", "User Backend" : "Benutzer-Backend", - "Last Login" : "Letzte Anmeldung", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Externer Speicher", - "Updates" : "Updates", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Offizielle Apps werden von und innerhalb der Community entwickelt. Sie stellen die zentralen Funktionen bereit und sind für den produktiven Einsatz geeignet.", - "No apps found for \"{query}\"" : "Keine Applikationen für \"{query}\" gefunden", - "An error occurred: {message}" : "Ein Fehler ist aufgetreten: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Bitte die Installationsdokumentation ↗auf Hinweise zur PHP-Konfiguration durchlesen, sowie die PHP-Konfiguration des Servers überprüfen, insbesondere dann, wenn PHP-FPM eingesetzt wird.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Deine Datenbank läuft nicht mit der \"READ COMMITED\" Transaktionsisolationsstufe. Dies kann Probleme hervorrufen, wenn mehrere Aktionen parallel ausgeführt werden.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Dein Server wird mit Microsoft Windows betrieben. Für ein optimales Nutzungserlebnis empfehlen wir dringend Linux.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Transaktionales Sperren ist deaktiviert, was zu Problemen mit Laufzeitbedingungen führen kann. 'filelocking.enabled' in der config.php aktivieren, um diese Probleme zu vermeiden. Weitere Informationen findest du in unserer Dokumentation ↗.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Bitte überprüfe noch einmal die Installationsanleitungen ↗ und kontrolliere das Log auf mögliche Fehler oder Warnungen.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Verschlüsselung alleine garantiert nicht die Systemsicherheit. Bitte lesen Sie in der Dokumentation nach, wie die Verschlüsselungs-App funktioniert und welche Anwendungsfälle unterstützt werden.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Um zu einer anderen Datenbank zu migrieren, benutze bitte die Kommandozeile: 'occ db:convert-type', oder in die Dokumentation ↗ schauen.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Für diese App wurde keine untere Versionsgrenze für Nextcloud gesetzt. Dies wird zukünftig als Fehler behandelt.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Für diese App wurde keine obere Versionsgrenze für Nextcloud gesetzt. Dies wird zukünftig als Fehler behandelt.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Wenn du das Projekt unterstützen möchtest\n⇥⇥hilf uns bei der Weiterentwicklung\n⇥⇥oder\n⇥⇥hilf anderen Nutzern!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Entwickelt von der {communityopen}Nextcloud Community{linkclose}. Der {githubopen}Quellcode{linkclose} ist unter {licenseopen}AGPL{linkclose} verfügbar." + "Last Login" : "Letzte Anmeldung" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/de_DE.js b/settings/l10n/de_DE.js index 97b3efdcdb2961679576215a1067694bdcc4be9c..edb78c317c5663bb5ddeb197b77cce036b0bb9a9 100644 --- a/settings/l10n/de_DE.js +++ b/settings/l10n/de_DE.js @@ -25,6 +25,7 @@ OC.L10N.register( "You need to set your user email before being able to send test emails." : "Sie müssen Ihre Benutzer-E-Mail-Adresse einstellen, bevor Sie Test-E-Mails versenden können.", "Invalid request" : "Ungültige Anforderung", "Invalid mail address" : "Ungültige E-Mail-Adresse", + "No valid group selected" : "Keine gültige Gruppe ausgewählt", "A user with that name already exists." : "Ein Benutzer mit diesem Namen existiert bereits.", "Unable to create user." : "Benutzer konnte nicht erstellt werden.", "Your %s account was created" : "Ihr %s-Konto wurde erstellt", @@ -39,9 +40,6 @@ OC.L10N.register( "Email saved" : "E-Mail-Adresse gespeichert", "Password confirmation is required" : "Passwortbestätigung ist erforderlich", "Couldn't remove app." : "Die App konnte nicht entfernt werden.", - "Admins can't remove themself from the admin group" : "Administratoren können sich nicht selbst aus der admin-Gruppe löschen", - "Unable to add user to group %s" : "Der Benutzer konnte nicht zur Gruppe %s hinzugefügt werden", - "Unable to remove user from group %s" : "Der Benutzer konnte nicht aus der Gruppe %s entfernt werden", "Couldn't update app." : "Die App konnte nicht aktualisiert werden.", "Are you really sure you want add {domain} as trusted domain?" : "Sind Sie sich wirklich sicher, dass Sie {domain} als vertrauenswürdige Domain hinzufügen möchten?", "Add trusted domain" : "Vertrauenswürdige Domain hinzufügen", @@ -52,13 +50,13 @@ OC.L10N.register( "Official" : "Offiziell", "All" : "Alle", "Update to %s" : "Aktualisierung auf %s", - "_You have %n app update pending_::_You have %n app updates pending_" : ["Sie haben %n Aktualisierung verfügbar","Es sind %n App-Aktualisierungen für Sie verfügbar"], + "_You have %n app update pending_::_You have %n app updates pending_" : ["Es ist %n App-Aktualisierung verfügbar","Es sind %n App-Aktualisierungen verfügbar"], "No apps found for your version" : "Es wurden keine Apps für Ihre Version gefunden", "The app will be downloaded from the app store" : "Die App wird aus dem App-Store heruntergeladen", "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Offizielle Apps werden von und innerhalb der Community entwickelt. Sie stellen die zentralen Funktionen bereit und sind für den produktiven Einsatz geeignet.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Geprüfte Apps werden von vertrauenswürdigen Entwicklern entwickelt und haben eine oberflächliche Sicherheitsprüfung durchlaufen. Sie werden innerhalb eines offenen Code-Repositorys aktiv gepflegt und ihre Betreuer erachten sie als stabil genug für für den gelegentlichen bis normalen Einsatz.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Diese App ist nicht auf Sicherheitsprobleme hin überprüft und ist neu oder bekanntermaßen instabil. Die Installation erfolgt auf eigenes Risiko.", - "Please wait...." : "Bitte warten…", + "Enabling app …" : "Aktiviere App ...", "Error while disabling app" : "Beim Deaktivieren der App ist ein Fehler aufgetreten", "Disable" : "Deaktivieren", "Enable" : "Aktivieren", @@ -125,6 +123,8 @@ OC.L10N.register( "undo" : "rückgängig machen", "never" : "niemals", "deleted {userName}" : "{userName} gelöscht", + "Unable to add user to group {group}" : "Benutzer kann nicht zur Gruppe {group} hinzugefügt werden ", + "Unable to remove user from group {group}" : "Benutzer kann nicht aus der Gruppe {group} entfernt werden ", "Add group" : "Gruppe hinzufügen", "Invalid quota value \"{val}\"" : "Ungültiger Grenzwert \"{val}\"", "no group" : "Keine Gruppe", @@ -139,7 +139,7 @@ OC.L10N.register( "Unlimited" : "Unbegrenzt", "Personal info" : "Persönliche Informationen", "Sessions" : "Sitzungen", - "App passwords" : "App-Passwörter", + "App passwords" : "App-PINs", "Sync clients" : "Sync-Clients", "None" : "Keine", "Login" : "Anmelden", @@ -198,8 +198,8 @@ OC.L10N.register( "Cron" : "Cron", "Last cron job execution: %s." : "Letzte Cron-Job-Ausführung: %s.", "Last cron job execution: %s. Something seems wrong." : "Letzte Cron-Job-Ausführung: %s. Möglicherweise liegt ein Fehler vor.", - "Cron was not executed yet!" : "Cron wurde bis jetzt noch nicht ausgeführt!", - "Execute one task with each page loaded" : "Eine Aufgabe bei jedem Laden der Seite ausführen", + "Cron was not executed yet!" : "Cron wurde bislang noch nicht ausgeführt!", + "Execute one task with each page loaded" : "Eine Aufgabe bei jedem Laden einer Seite ausführen", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php ist als Webcron-Dienst registriert, der die cron.php alle 15 Minuten per HTTP aufruft.", "Use system's cron service to call the cron.php file every 15 minutes." : "Benutzen Sie den systemeigenen Cron-Dienst, um die cron.php alle 15 Minuten aufzurufen.", "The cron.php needs to be executed by the system user \"%s\"." : "Die cron.php muss durch den Systemnutzer \"%s\" ausgeführt werden.", @@ -236,18 +236,18 @@ OC.L10N.register( "by %s" : "von %s", "%s-licensed" : "%s-Lizensiert", "Documentation:" : "Dokumentation:", - "User documentation" : "Dokumentation für Benutzer", - "Admin documentation" : "Dokumentation für Administratoren", + "User documentation" : "Benutzer-Dokumentation", + "Admin documentation" : "Administratoren-Dokumentation", "Visit website" : "Webseite besuchen", "Report a bug" : "Melden Sie einen technischen Fehler", "Show description …" : "Beschreibung anzeigen…", "Hide description …" : "Beschreibung ausblenden…", - "This app has an update available." : "Es ist eine Aktualisierung für diese Anwendung verfügbar.", + "This app has an update available." : "Für diese Anwendung ist eine Aktualisierung verfügbar.", "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Für diese App wurde keine untere Versionsgrenze für Nextcloud gesetzt. Dies wird zukünftig als Fehler behandelt.", "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Für diese App wurde keine obere Versionsgrenze für Nextcloud gesetzt. Dies wird zukünftig als Fehler behandelt.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Diese App kann nicht installiert werden, weil die folgenden Abhängigkeiten nicht erfüllt sind:", "Enable only for specific groups" : "Nur für bestimmte Gruppen aktivieren", - "Uninstall App" : "App deinstallieren", + "Uninstall app" : "App deinstallieren", "SSL Root Certificates" : "SSL Root Zertifikate", "Common Name" : "Allgemeiner Name", "Valid until" : "Gültig bis", @@ -276,7 +276,7 @@ OC.L10N.register( "Email" : "E-Mail", "Your email address" : "Ihre E-Mail-Adresse", "No email address set" : "Keine E-Mail-Adresse angegeben", - "For password recovery and notifications" : "Für Passwort Wiederherstellung und Benachrichtigungen", + "For password recovery and notifications" : "Für Passwort-Wiederherstellung und Benachrichtigungen", "Phone number" : "Telefonnummer", "Your phone number" : "Ihre Telefonnummer", "Address" : "Adresse", @@ -341,7 +341,11 @@ OC.L10N.register( "Default" : "Standard", "log-level out of allowed range" : "Log-Level außerhalb des erlaubten Bereichs", "Language changed" : "Sprache geändert", + "Admins can't remove themself from the admin group" : "Administratoren können sich nicht selbst aus der admin-Gruppe löschen", + "Unable to add user to group %s" : "Der Benutzer konnte nicht zur Gruppe %s hinzugefügt werden", + "Unable to remove user from group %s" : "Der Benutzer konnte nicht aus der Gruppe %s entfernt werden", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Sind Sie sich wirklich sicher, dass Sie »{domain}« als vertrauenswürdige Domain hinzufügen möchten?", + "Please wait...." : "Bitte warten…", "iPhone" : "iPhone", "add group" : "Gruppe hinzufügen", "Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale Probleme, Fehler, Warnungen, Infos, Fehlerdiagnose)", @@ -361,6 +365,7 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Insbesondere bei der Nutzung des Desktop Clients zur Dateisynchronisierung wird vom Einsatz von SQLite abgeraten.", "Experimental applications ahead" : "Experimentelle Apps nachfolgend", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Experimentelle Apps sind nicht auf Sicherheitsprobleme hin überprüft, sind neu oder bekanntermaßen instabil und befinden sich in intensiver Entwicklung. Ihre Installation kann Datenverlust oder Sicherheitslücken hervorrufen.", + "Uninstall App" : "App deinstallieren", "Enable experimental apps" : "Experimentelle Apps aktivieren", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hallo,

    hier nur kurz die Mitteilung, dass Sie jetzt ein %s-Konto haben.

    Ihr Benutzername: %s
    Greifen Sie darauf zu: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hallo,\n\nhier nur kurz die Mitteilung, dass Sie jetzt ein %s-Konto haben.\n\nIhr Benutzername: %s\nGreifen Sie darauf zu: %s\n\n", @@ -372,24 +377,6 @@ OC.L10N.register( "Group Admin for" : "Gruppenadministrator für", "Storage Location" : "Speicherort", "User Backend" : "Benutzer-Backend", - "Last Login" : "Letzte Anmeldung", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Externer Speicher", - "Updates" : "Updates", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Offizielle Apps werden von und innerhalb der Nextcloud-Community entwickelt. Sie stellen die zentralen Funktionen bereit und sind für den produktiven Einsatz geeignet.", - "No apps found for \"{query}\"" : "Keine Applikationen für \"{query}\" gefunden", - "An error occurred: {message}" : "Ein Fehler ist aufgetreten: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Bitte schauen Sie in der Installationsdokumentation ↗auf Hinweise zur PHP-Konfiguration, sowie die PHP-Konfiguration ihres Servers, insbesondere dann, wenn Sie PHP-FPM einsetzen.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "ihre Datenbank läuft nicht mit der \"READ COMMITED\" Transaktionsisolationsstufe. Dies kann Probleme hervorrufen, wenn mehrere Aktionen parallel ausgeführt werden.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Ihr Server wird mit Microsoft Windows betrieben. Für ein optimales Nutzungserlebnis empfehlen wir dringend Linux.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Transaktionales Sperren ist deaktiviert, was zu Problemen mit Laufzeitbedingungen führen kann. Aktivieren Sie 'filelocking.enabled' in der config.php diese Probleme zu vermeiden. Weitere Informationen finden Sie in unserer Dokumentation ↗.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Bitte überprüfen Sie noch einmal die Installationsanleitungen ↗ und kontrollieren Sie das Log auf mögliche Fehler oder Warnungen.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Verschlüsselung alleine garantiert nicht die Systemsicherheit. Bitte lesen Sie in der Dokumentation nach, wie die Verschlüsselungs-App funktioniert und welche Anwendungsfälle unterstützt werden.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Um zu einer anderen Datenbank zu migrieren, benutzen Sie bitte die Kommandozeile: 'occ db:convert-type', oder in die Dokumentation ↗ schauen.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Für diese App wurde keine untere Versionsgrenze für Nextcloud gesetzt. Dies wird ab Nextcloud 11 als Fehler behandelt.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Für diese App wurde keine obere Versionsgrenze für Nextcloud gesetzt. Dies wird ab Nextcloud 11 als Fehler behandelt.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Wenn Sie das Projekt unterstützen möchten\n⇥⇥helfen Sie uns bei der Weiterentwicklung\n⇥⇥oder\n⇥⇥helfen Sie anderen Nutzern!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Entwickelt von der {communityopen}Nextcloud Community{linkclose}. Der {githubopen}Quellcode{linkclose} ist unter {licenseopen}AGPL{linkclose} verfügbar." + "Last Login" : "Letzte Anmeldung" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/de_DE.json b/settings/l10n/de_DE.json index ca67df83f5d31a329411f8aebbc8320ef87815ff..b52a89d8a412a42060f012b99a27ea2d393dda82 100644 --- a/settings/l10n/de_DE.json +++ b/settings/l10n/de_DE.json @@ -23,6 +23,7 @@ "You need to set your user email before being able to send test emails." : "Sie müssen Ihre Benutzer-E-Mail-Adresse einstellen, bevor Sie Test-E-Mails versenden können.", "Invalid request" : "Ungültige Anforderung", "Invalid mail address" : "Ungültige E-Mail-Adresse", + "No valid group selected" : "Keine gültige Gruppe ausgewählt", "A user with that name already exists." : "Ein Benutzer mit diesem Namen existiert bereits.", "Unable to create user." : "Benutzer konnte nicht erstellt werden.", "Your %s account was created" : "Ihr %s-Konto wurde erstellt", @@ -37,9 +38,6 @@ "Email saved" : "E-Mail-Adresse gespeichert", "Password confirmation is required" : "Passwortbestätigung ist erforderlich", "Couldn't remove app." : "Die App konnte nicht entfernt werden.", - "Admins can't remove themself from the admin group" : "Administratoren können sich nicht selbst aus der admin-Gruppe löschen", - "Unable to add user to group %s" : "Der Benutzer konnte nicht zur Gruppe %s hinzugefügt werden", - "Unable to remove user from group %s" : "Der Benutzer konnte nicht aus der Gruppe %s entfernt werden", "Couldn't update app." : "Die App konnte nicht aktualisiert werden.", "Are you really sure you want add {domain} as trusted domain?" : "Sind Sie sich wirklich sicher, dass Sie {domain} als vertrauenswürdige Domain hinzufügen möchten?", "Add trusted domain" : "Vertrauenswürdige Domain hinzufügen", @@ -50,13 +48,13 @@ "Official" : "Offiziell", "All" : "Alle", "Update to %s" : "Aktualisierung auf %s", - "_You have %n app update pending_::_You have %n app updates pending_" : ["Sie haben %n Aktualisierung verfügbar","Es sind %n App-Aktualisierungen für Sie verfügbar"], + "_You have %n app update pending_::_You have %n app updates pending_" : ["Es ist %n App-Aktualisierung verfügbar","Es sind %n App-Aktualisierungen verfügbar"], "No apps found for your version" : "Es wurden keine Apps für Ihre Version gefunden", "The app will be downloaded from the app store" : "Die App wird aus dem App-Store heruntergeladen", "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Offizielle Apps werden von und innerhalb der Community entwickelt. Sie stellen die zentralen Funktionen bereit und sind für den produktiven Einsatz geeignet.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Geprüfte Apps werden von vertrauenswürdigen Entwicklern entwickelt und haben eine oberflächliche Sicherheitsprüfung durchlaufen. Sie werden innerhalb eines offenen Code-Repositorys aktiv gepflegt und ihre Betreuer erachten sie als stabil genug für für den gelegentlichen bis normalen Einsatz.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Diese App ist nicht auf Sicherheitsprobleme hin überprüft und ist neu oder bekanntermaßen instabil. Die Installation erfolgt auf eigenes Risiko.", - "Please wait...." : "Bitte warten…", + "Enabling app …" : "Aktiviere App ...", "Error while disabling app" : "Beim Deaktivieren der App ist ein Fehler aufgetreten", "Disable" : "Deaktivieren", "Enable" : "Aktivieren", @@ -123,6 +121,8 @@ "undo" : "rückgängig machen", "never" : "niemals", "deleted {userName}" : "{userName} gelöscht", + "Unable to add user to group {group}" : "Benutzer kann nicht zur Gruppe {group} hinzugefügt werden ", + "Unable to remove user from group {group}" : "Benutzer kann nicht aus der Gruppe {group} entfernt werden ", "Add group" : "Gruppe hinzufügen", "Invalid quota value \"{val}\"" : "Ungültiger Grenzwert \"{val}\"", "no group" : "Keine Gruppe", @@ -137,7 +137,7 @@ "Unlimited" : "Unbegrenzt", "Personal info" : "Persönliche Informationen", "Sessions" : "Sitzungen", - "App passwords" : "App-Passwörter", + "App passwords" : "App-PINs", "Sync clients" : "Sync-Clients", "None" : "Keine", "Login" : "Anmelden", @@ -196,8 +196,8 @@ "Cron" : "Cron", "Last cron job execution: %s." : "Letzte Cron-Job-Ausführung: %s.", "Last cron job execution: %s. Something seems wrong." : "Letzte Cron-Job-Ausführung: %s. Möglicherweise liegt ein Fehler vor.", - "Cron was not executed yet!" : "Cron wurde bis jetzt noch nicht ausgeführt!", - "Execute one task with each page loaded" : "Eine Aufgabe bei jedem Laden der Seite ausführen", + "Cron was not executed yet!" : "Cron wurde bislang noch nicht ausgeführt!", + "Execute one task with each page loaded" : "Eine Aufgabe bei jedem Laden einer Seite ausführen", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php ist als Webcron-Dienst registriert, der die cron.php alle 15 Minuten per HTTP aufruft.", "Use system's cron service to call the cron.php file every 15 minutes." : "Benutzen Sie den systemeigenen Cron-Dienst, um die cron.php alle 15 Minuten aufzurufen.", "The cron.php needs to be executed by the system user \"%s\"." : "Die cron.php muss durch den Systemnutzer \"%s\" ausgeführt werden.", @@ -234,18 +234,18 @@ "by %s" : "von %s", "%s-licensed" : "%s-Lizensiert", "Documentation:" : "Dokumentation:", - "User documentation" : "Dokumentation für Benutzer", - "Admin documentation" : "Dokumentation für Administratoren", + "User documentation" : "Benutzer-Dokumentation", + "Admin documentation" : "Administratoren-Dokumentation", "Visit website" : "Webseite besuchen", "Report a bug" : "Melden Sie einen technischen Fehler", "Show description …" : "Beschreibung anzeigen…", "Hide description …" : "Beschreibung ausblenden…", - "This app has an update available." : "Es ist eine Aktualisierung für diese Anwendung verfügbar.", + "This app has an update available." : "Für diese Anwendung ist eine Aktualisierung verfügbar.", "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Für diese App wurde keine untere Versionsgrenze für Nextcloud gesetzt. Dies wird zukünftig als Fehler behandelt.", "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Für diese App wurde keine obere Versionsgrenze für Nextcloud gesetzt. Dies wird zukünftig als Fehler behandelt.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Diese App kann nicht installiert werden, weil die folgenden Abhängigkeiten nicht erfüllt sind:", "Enable only for specific groups" : "Nur für bestimmte Gruppen aktivieren", - "Uninstall App" : "App deinstallieren", + "Uninstall app" : "App deinstallieren", "SSL Root Certificates" : "SSL Root Zertifikate", "Common Name" : "Allgemeiner Name", "Valid until" : "Gültig bis", @@ -274,7 +274,7 @@ "Email" : "E-Mail", "Your email address" : "Ihre E-Mail-Adresse", "No email address set" : "Keine E-Mail-Adresse angegeben", - "For password recovery and notifications" : "Für Passwort Wiederherstellung und Benachrichtigungen", + "For password recovery and notifications" : "Für Passwort-Wiederherstellung und Benachrichtigungen", "Phone number" : "Telefonnummer", "Your phone number" : "Ihre Telefonnummer", "Address" : "Adresse", @@ -339,7 +339,11 @@ "Default" : "Standard", "log-level out of allowed range" : "Log-Level außerhalb des erlaubten Bereichs", "Language changed" : "Sprache geändert", + "Admins can't remove themself from the admin group" : "Administratoren können sich nicht selbst aus der admin-Gruppe löschen", + "Unable to add user to group %s" : "Der Benutzer konnte nicht zur Gruppe %s hinzugefügt werden", + "Unable to remove user from group %s" : "Der Benutzer konnte nicht aus der Gruppe %s entfernt werden", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Sind Sie sich wirklich sicher, dass Sie »{domain}« als vertrauenswürdige Domain hinzufügen möchten?", + "Please wait...." : "Bitte warten…", "iPhone" : "iPhone", "add group" : "Gruppe hinzufügen", "Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale Probleme, Fehler, Warnungen, Infos, Fehlerdiagnose)", @@ -359,6 +363,7 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Insbesondere bei der Nutzung des Desktop Clients zur Dateisynchronisierung wird vom Einsatz von SQLite abgeraten.", "Experimental applications ahead" : "Experimentelle Apps nachfolgend", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Experimentelle Apps sind nicht auf Sicherheitsprobleme hin überprüft, sind neu oder bekanntermaßen instabil und befinden sich in intensiver Entwicklung. Ihre Installation kann Datenverlust oder Sicherheitslücken hervorrufen.", + "Uninstall App" : "App deinstallieren", "Enable experimental apps" : "Experimentelle Apps aktivieren", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hallo,

    hier nur kurz die Mitteilung, dass Sie jetzt ein %s-Konto haben.

    Ihr Benutzername: %s
    Greifen Sie darauf zu: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hallo,\n\nhier nur kurz die Mitteilung, dass Sie jetzt ein %s-Konto haben.\n\nIhr Benutzername: %s\nGreifen Sie darauf zu: %s\n\n", @@ -370,24 +375,6 @@ "Group Admin for" : "Gruppenadministrator für", "Storage Location" : "Speicherort", "User Backend" : "Benutzer-Backend", - "Last Login" : "Letzte Anmeldung", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Externer Speicher", - "Updates" : "Updates", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Offizielle Apps werden von und innerhalb der Nextcloud-Community entwickelt. Sie stellen die zentralen Funktionen bereit und sind für den produktiven Einsatz geeignet.", - "No apps found for \"{query}\"" : "Keine Applikationen für \"{query}\" gefunden", - "An error occurred: {message}" : "Ein Fehler ist aufgetreten: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Bitte schauen Sie in der Installationsdokumentation ↗auf Hinweise zur PHP-Konfiguration, sowie die PHP-Konfiguration ihres Servers, insbesondere dann, wenn Sie PHP-FPM einsetzen.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "ihre Datenbank läuft nicht mit der \"READ COMMITED\" Transaktionsisolationsstufe. Dies kann Probleme hervorrufen, wenn mehrere Aktionen parallel ausgeführt werden.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Ihr Server wird mit Microsoft Windows betrieben. Für ein optimales Nutzungserlebnis empfehlen wir dringend Linux.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Transaktionales Sperren ist deaktiviert, was zu Problemen mit Laufzeitbedingungen führen kann. Aktivieren Sie 'filelocking.enabled' in der config.php diese Probleme zu vermeiden. Weitere Informationen finden Sie in unserer Dokumentation ↗.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Bitte überprüfen Sie noch einmal die Installationsanleitungen ↗ und kontrollieren Sie das Log auf mögliche Fehler oder Warnungen.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Verschlüsselung alleine garantiert nicht die Systemsicherheit. Bitte lesen Sie in der Dokumentation nach, wie die Verschlüsselungs-App funktioniert und welche Anwendungsfälle unterstützt werden.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Um zu einer anderen Datenbank zu migrieren, benutzen Sie bitte die Kommandozeile: 'occ db:convert-type', oder in die Dokumentation ↗ schauen.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Für diese App wurde keine untere Versionsgrenze für Nextcloud gesetzt. Dies wird ab Nextcloud 11 als Fehler behandelt.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Für diese App wurde keine obere Versionsgrenze für Nextcloud gesetzt. Dies wird ab Nextcloud 11 als Fehler behandelt.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Wenn Sie das Projekt unterstützen möchten\n⇥⇥helfen Sie uns bei der Weiterentwicklung\n⇥⇥oder\n⇥⇥helfen Sie anderen Nutzern!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Entwickelt von der {communityopen}Nextcloud Community{linkclose}. Der {githubopen}Quellcode{linkclose} ist unter {licenseopen}AGPL{linkclose} verfügbar." + "Last Login" : "Letzte Anmeldung" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/el.js b/settings/l10n/el.js index 131765857ac22cdfeaaca4ebd9c2e623f65c8390..053632812e2d327ee7b87cbaa72f36f71a477201 100644 --- a/settings/l10n/el.js +++ b/settings/l10n/el.js @@ -36,9 +36,6 @@ OC.L10N.register( "Unable to change mail address" : "Αδυναμία αλλαγής διεύθυνσης αλληλογραφίας", "Email saved" : "Το email αποθηκεύτηκε ", "Couldn't remove app." : "Αδυναμία αφαίρεσης εφαρμογής.", - "Admins can't remove themself from the admin group" : "Οι διαχειριστές δεν μπορούν να αφαιρέσουν τους εαυτούς τους από την ομάδα των διαχειριστών", - "Unable to add user to group %s" : "Αδυναμία προσθήκη χρήστη στην ομάδα %s", - "Unable to remove user from group %s" : "Αδυναμία αφαίρεσης χρήστη από την ομάδα %s", "Couldn't update app." : "Αδυναμία ενημέρωσης εφαρμογής", "Add trusted domain" : "Προσθέστε αξιόπιστη περιοχή", "Migration in progress. Please wait until the migration is finished" : "Μετάβαση σε εξέλιξη. Παρακαλούμε περιμένετε μέχρι να ολοκληρωθεί η μετάβαση", @@ -51,7 +48,6 @@ OC.L10N.register( "No apps found for your version" : "Δεν βρέθηκαν εφαρμογές για αυτή την έκδοση", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Οι εγκεκριμένες εφαρμογές αναπτύχθηκαν από αξιόπιστους προγραμματιστές και έχουν περάσει έναν συνοπτικό έλεγχο ασφαλείας. Διατηρούνται ενεργά σε ένα αποθετήριο ανοιχτού κώδικα και οι συντηρητές θεωρούν οτι είναι σταθερές για κανονική χρήση.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Η εφαρμογή αυτή δεν ελέγχεται για θέματα ασφάλειας και είναι νέα ή είναι γνωστό ότι είναι ασταθής. Η εγκατάσταση γίνεται με δική σας ευθύνη.", - "Please wait...." : "Παρακαλώ περιμένετε...", "Error while disabling app" : "Σφάλμα κατά την απενεργοποίηση εισόδου", "Disable" : "Απενεργοποίηση", "Enable" : "Ενεργοποίηση", @@ -206,7 +202,7 @@ OC.L10N.register( "This app has an update available." : "Αυτή η εφαρμογή έχει διαθέσιμη ενημέρωση.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Αυτή η εφαρμογή δεν μπορεί να εγκατασταθεί διότι δεν εκπληρώνονται οι ακόλουθες εξαρτήσεις:", "Enable only for specific groups" : "Ενεργοποίηση μόνο για καθορισμένες ομάδες", - "Uninstall App" : "Απεγκατάσταση Εφαρμογής", + "Uninstall app" : "Απεγκατάσταση εφαρμογης", "SSL Root Certificates" : "Πιστοποιητικά SSL του Root", "Common Name" : "Κοινό Όνομα", "Valid until" : "Έγκυρο έως", @@ -233,6 +229,8 @@ OC.L10N.register( "Your email address" : "Η διεύθυνση ηλ. ταχυδρομείου σας", "No email address set" : "Δεν ορίστηκε διεύθυνση email", "For password recovery and notifications" : "Η ανάκτηση του συνθηματικού και οι ειδοποιήσεις", + "Website" : "Ιστοσελίδα", + "Twitter" : "Twitter", "You are member of the following groups:" : "Είστε μέλος των ακόλουθων ομάδων:", "Password" : "Συνθηματικό", "Current password" : "Τρέχων συνθηματικό", @@ -281,7 +279,11 @@ OC.L10N.register( "Default" : "Προκαθορισμένο", "log-level out of allowed range" : "Το επίπεδο καταγραφής είναι εκτός του επιτρεπόμενου πεδίου", "Language changed" : "Η γλώσσα άλλαξε", + "Admins can't remove themself from the admin group" : "Οι διαχειριστές δεν μπορούν να αφαιρέσουν τους εαυτούς τους από την ομάδα των διαχειριστών", + "Unable to add user to group %s" : "Αδυναμία προσθήκη χρήστη στην ομάδα %s", + "Unable to remove user from group %s" : "Αδυναμία αφαίρεσης χρήστη από την ομάδα %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Είστε πραγματικά σίγουροι ότι θέλετε να προσθέσετε το \"{domain}\" σαν αξιόπιστη περιοχή;", + "Please wait...." : "Παρακαλώ περιμένετε...", "iPhone" : "iPhone", "add group" : "προσθήκη ομάδας", "Everything (fatal issues, errors, warnings, info, debug)" : "Όλα (καίρια ζητήματα, σφάλματα, προειδοποιήσεις, πληροφορίες, αποσφαλμάτωση)", @@ -300,6 +302,7 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Ειδικά όταν χρησιμοποιείτε τον πελάτη για συγχρονισμό στον υπολογιστή σας, δεν συνίσταται η χρήση της SQLite.", "Experimental applications ahead" : "Πειραματικές εφαρμογές", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Οι πειραματικές εφαρμογές δεν ελέγχονται για θέματα ασφάλειας, είναι ασταθείς και υπό συνεχή εξέλιξη. Η εγκατάσταση τους μπορεί να προκαλέσει απώλεια δεδομένων ή παραβιάσεις της ασφάλειας.", + "Uninstall App" : "Απεγκατάσταση Εφαρμογής", "Enable experimental apps" : "Ενεργοποίηση πειραματικών εφαρμογών", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Χαίρεται,

    απλά σας κάνουμε γνωστό ότι διαθέτετε έναν %s λογαριασμό.

    Το όνομά σας είναι: %s
    Έχετε πρόσβαση: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Χαίρεται, \nαπλά σας κάνουμε γνωστό ότι διαθέτετε έναν %s λογαριασμό.\nΤο όνομά σας είναι: %s\nΈχετε πρόσβαση: %s\n", @@ -310,17 +313,6 @@ OC.L10N.register( "Full Name" : "Πλήρες όνομα", "Storage Location" : "Τοποθεσία αποθηκευτικού χώρου", "User Backend" : "Σύστημα υποστήριξης χρήστη", - "Last Login" : "Τελευταία είσοδος", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Εξωτερικό Αποθηκευτικό Μέσο", - "Updates" : "Ενημερώσεις", - "No apps found for \"{query}\"" : "Δεν βρέθηκαν εφαρμογές για \"{query}\"", - "An error occurred: {message}" : "Παρουσιάστηκε σφάλμα: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Παρακαλούμε ελέγξτε την τεκμηρίωση εγκατάστασης ↗ για τις σημειώσεις ρυθμίσεων php και για τις ρυθμίσεις της php του διακομιστή, ειδικότερα όταν χρησιμοποιείτε το php-fpm.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Ο διακομιστής σας εκτελείται σε Microsoft Windows. Σας συνιστούμε το Linux για μια βέλτιστη εμπειρία χρήστη.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Παρακαλώ ελέγξτε διπλά τα εγχειρίδια εγκατάστασης ↗, και ελέγξτε για σφάλματα ή προειδοποιήσεις στο ιστορικό.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Μονάχα η κρυπτογράφηση δεν σας εγγυάται την ασφάλεια του συστήματος. Παρακαλώ δείτε στην τεκμηρίωση του Nextcloud για περισσότερες πληροφορίες σχετικά με τον τρόπο που δουλεύει η εφαρμογή κρυπτογράφησης, και τις υποστηριζόμενες περιπτώσεις.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Για να μεταφερθείτε σε άλλη βάση δεδομένων χρησιμοποιήστε το εργαλείο της γραμμής εντολών: 'occ db:convert-type', ή δείτε στην τεκμηρίωση ↗." + "Last Login" : "Τελευταία είσοδος" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/el.json b/settings/l10n/el.json index 3360d1b1c648fa9cb7b683f0637da3010470e683..bfb69683f6984bf256d29704ec00a51bd2b3ee5b 100644 --- a/settings/l10n/el.json +++ b/settings/l10n/el.json @@ -34,9 +34,6 @@ "Unable to change mail address" : "Αδυναμία αλλαγής διεύθυνσης αλληλογραφίας", "Email saved" : "Το email αποθηκεύτηκε ", "Couldn't remove app." : "Αδυναμία αφαίρεσης εφαρμογής.", - "Admins can't remove themself from the admin group" : "Οι διαχειριστές δεν μπορούν να αφαιρέσουν τους εαυτούς τους από την ομάδα των διαχειριστών", - "Unable to add user to group %s" : "Αδυναμία προσθήκη χρήστη στην ομάδα %s", - "Unable to remove user from group %s" : "Αδυναμία αφαίρεσης χρήστη από την ομάδα %s", "Couldn't update app." : "Αδυναμία ενημέρωσης εφαρμογής", "Add trusted domain" : "Προσθέστε αξιόπιστη περιοχή", "Migration in progress. Please wait until the migration is finished" : "Μετάβαση σε εξέλιξη. Παρακαλούμε περιμένετε μέχρι να ολοκληρωθεί η μετάβαση", @@ -49,7 +46,6 @@ "No apps found for your version" : "Δεν βρέθηκαν εφαρμογές για αυτή την έκδοση", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Οι εγκεκριμένες εφαρμογές αναπτύχθηκαν από αξιόπιστους προγραμματιστές και έχουν περάσει έναν συνοπτικό έλεγχο ασφαλείας. Διατηρούνται ενεργά σε ένα αποθετήριο ανοιχτού κώδικα και οι συντηρητές θεωρούν οτι είναι σταθερές για κανονική χρήση.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Η εφαρμογή αυτή δεν ελέγχεται για θέματα ασφάλειας και είναι νέα ή είναι γνωστό ότι είναι ασταθής. Η εγκατάσταση γίνεται με δική σας ευθύνη.", - "Please wait...." : "Παρακαλώ περιμένετε...", "Error while disabling app" : "Σφάλμα κατά την απενεργοποίηση εισόδου", "Disable" : "Απενεργοποίηση", "Enable" : "Ενεργοποίηση", @@ -204,7 +200,7 @@ "This app has an update available." : "Αυτή η εφαρμογή έχει διαθέσιμη ενημέρωση.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Αυτή η εφαρμογή δεν μπορεί να εγκατασταθεί διότι δεν εκπληρώνονται οι ακόλουθες εξαρτήσεις:", "Enable only for specific groups" : "Ενεργοποίηση μόνο για καθορισμένες ομάδες", - "Uninstall App" : "Απεγκατάσταση Εφαρμογής", + "Uninstall app" : "Απεγκατάσταση εφαρμογης", "SSL Root Certificates" : "Πιστοποιητικά SSL του Root", "Common Name" : "Κοινό Όνομα", "Valid until" : "Έγκυρο έως", @@ -231,6 +227,8 @@ "Your email address" : "Η διεύθυνση ηλ. ταχυδρομείου σας", "No email address set" : "Δεν ορίστηκε διεύθυνση email", "For password recovery and notifications" : "Η ανάκτηση του συνθηματικού και οι ειδοποιήσεις", + "Website" : "Ιστοσελίδα", + "Twitter" : "Twitter", "You are member of the following groups:" : "Είστε μέλος των ακόλουθων ομάδων:", "Password" : "Συνθηματικό", "Current password" : "Τρέχων συνθηματικό", @@ -279,7 +277,11 @@ "Default" : "Προκαθορισμένο", "log-level out of allowed range" : "Το επίπεδο καταγραφής είναι εκτός του επιτρεπόμενου πεδίου", "Language changed" : "Η γλώσσα άλλαξε", + "Admins can't remove themself from the admin group" : "Οι διαχειριστές δεν μπορούν να αφαιρέσουν τους εαυτούς τους από την ομάδα των διαχειριστών", + "Unable to add user to group %s" : "Αδυναμία προσθήκη χρήστη στην ομάδα %s", + "Unable to remove user from group %s" : "Αδυναμία αφαίρεσης χρήστη από την ομάδα %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Είστε πραγματικά σίγουροι ότι θέλετε να προσθέσετε το \"{domain}\" σαν αξιόπιστη περιοχή;", + "Please wait...." : "Παρακαλώ περιμένετε...", "iPhone" : "iPhone", "add group" : "προσθήκη ομάδας", "Everything (fatal issues, errors, warnings, info, debug)" : "Όλα (καίρια ζητήματα, σφάλματα, προειδοποιήσεις, πληροφορίες, αποσφαλμάτωση)", @@ -298,6 +300,7 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Ειδικά όταν χρησιμοποιείτε τον πελάτη για συγχρονισμό στον υπολογιστή σας, δεν συνίσταται η χρήση της SQLite.", "Experimental applications ahead" : "Πειραματικές εφαρμογές", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Οι πειραματικές εφαρμογές δεν ελέγχονται για θέματα ασφάλειας, είναι ασταθείς και υπό συνεχή εξέλιξη. Η εγκατάσταση τους μπορεί να προκαλέσει απώλεια δεδομένων ή παραβιάσεις της ασφάλειας.", + "Uninstall App" : "Απεγκατάσταση Εφαρμογής", "Enable experimental apps" : "Ενεργοποίηση πειραματικών εφαρμογών", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Χαίρεται,

    απλά σας κάνουμε γνωστό ότι διαθέτετε έναν %s λογαριασμό.

    Το όνομά σας είναι: %s
    Έχετε πρόσβαση: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Χαίρεται, \nαπλά σας κάνουμε γνωστό ότι διαθέτετε έναν %s λογαριασμό.\nΤο όνομά σας είναι: %s\nΈχετε πρόσβαση: %s\n", @@ -308,17 +311,6 @@ "Full Name" : "Πλήρες όνομα", "Storage Location" : "Τοποθεσία αποθηκευτικού χώρου", "User Backend" : "Σύστημα υποστήριξης χρήστη", - "Last Login" : "Τελευταία είσοδος", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Εξωτερικό Αποθηκευτικό Μέσο", - "Updates" : "Ενημερώσεις", - "No apps found for \"{query}\"" : "Δεν βρέθηκαν εφαρμογές για \"{query}\"", - "An error occurred: {message}" : "Παρουσιάστηκε σφάλμα: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Παρακαλούμε ελέγξτε την τεκμηρίωση εγκατάστασης ↗ για τις σημειώσεις ρυθμίσεων php και για τις ρυθμίσεις της php του διακομιστή, ειδικότερα όταν χρησιμοποιείτε το php-fpm.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Ο διακομιστής σας εκτελείται σε Microsoft Windows. Σας συνιστούμε το Linux για μια βέλτιστη εμπειρία χρήστη.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Παρακαλώ ελέγξτε διπλά τα εγχειρίδια εγκατάστασης ↗, και ελέγξτε για σφάλματα ή προειδοποιήσεις στο ιστορικό.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Μονάχα η κρυπτογράφηση δεν σας εγγυάται την ασφάλεια του συστήματος. Παρακαλώ δείτε στην τεκμηρίωση του Nextcloud για περισσότερες πληροφορίες σχετικά με τον τρόπο που δουλεύει η εφαρμογή κρυπτογράφησης, και τις υποστηριζόμενες περιπτώσεις.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Για να μεταφερθείτε σε άλλη βάση δεδομένων χρησιμοποιήστε το εργαλείο της γραμμής εντολών: 'occ db:convert-type', ή δείτε στην τεκμηρίωση ↗." + "Last Login" : "Τελευταία είσοδος" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/en_GB.js b/settings/l10n/en_GB.js index af8e8b307965d8bd214556858dbcb8e63cc027ad..930205ba49467869a9f261ac08bda75b928c9e81 100644 --- a/settings/l10n/en_GB.js +++ b/settings/l10n/en_GB.js @@ -36,9 +36,6 @@ OC.L10N.register( "Unable to change mail address" : "Unable to change mail address", "Email saved" : "Email saved", "Couldn't remove app." : "Couldn't remove app.", - "Admins can't remove themself from the admin group" : "Admins can't remove themselves from the admin group", - "Unable to add user to group %s" : "Unable to add user to group %s", - "Unable to remove user from group %s" : "Unable to remove user from group %s", "Couldn't update app." : "Couldn't update app.", "Add trusted domain" : "Add trusted domain", "Migration in progress. Please wait until the migration is finished" : "Migration in progress. Please wait until the migration is finished", @@ -53,7 +50,6 @@ OC.L10N.register( "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Official apps are developed by the community. They offer additional functionality and are ready for production use.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "This app is not checked for security issues and is new or known to be unstable. Install at your own risk.", - "Please wait...." : "Please wait....", "Error while disabling app" : "Error whilst disabling app", "Disable" : "Disable", "Enable" : "Enable", @@ -201,7 +197,6 @@ OC.L10N.register( "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "This app has no maximum Nextcloud version assigned. This will cause an error in the future.", "This app cannot be installed because the following dependencies are not fulfilled:" : "This app cannot be installed because the following dependencies are not fulfilled:", "Enable only for specific groups" : "Enable only for specific groups", - "Uninstall App" : "Uninstall App", "SSL Root Certificates" : "SSL Root Certificates", "Common Name" : "Common Name", "Valid until" : "Valid until", @@ -266,7 +261,11 @@ OC.L10N.register( "Default" : "Default", "log-level out of allowed range" : "log-level out of allowed range", "Language changed" : "Language changed", + "Admins can't remove themself from the admin group" : "Admins can't remove themselves from the admin group", + "Unable to add user to group %s" : "Unable to add user to group %s", + "Unable to remove user from group %s" : "Unable to remove user from group %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Are you really sure you want add \"{domain}\" as a trusted domain?", + "Please wait...." : "Please wait....", "Everything (fatal issues, errors, warnings, info, debug)" : "Everything (fatal issues, errors, warnings, info, debug)", "Info, warnings, errors and fatal issues" : "Info, warnings, errors and fatal issues", "Warnings, errors and fatal issues" : "Warnings, errors and fatal issues", @@ -284,14 +283,10 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Especially when using the desktop client for file syncing, the use of SQLite is discouraged.", "Experimental applications ahead" : "Experimental applications ahead", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches.", + "Uninstall App" : "Uninstall App", "Enable experimental apps" : "Enable experimental apps", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n", - "Group" : "Group", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "External Storage", - "Updates" : "Updates", - "An error occurred: {message}" : "An error occurred: {message}" + "Group" : "Group" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/en_GB.json b/settings/l10n/en_GB.json index 4c52e4a801054e8fe8b6989e9f22e6121a728037..0584f6a5bb1538bee831a2c20e32468ef9fa8c00 100644 --- a/settings/l10n/en_GB.json +++ b/settings/l10n/en_GB.json @@ -34,9 +34,6 @@ "Unable to change mail address" : "Unable to change mail address", "Email saved" : "Email saved", "Couldn't remove app." : "Couldn't remove app.", - "Admins can't remove themself from the admin group" : "Admins can't remove themselves from the admin group", - "Unable to add user to group %s" : "Unable to add user to group %s", - "Unable to remove user from group %s" : "Unable to remove user from group %s", "Couldn't update app." : "Couldn't update app.", "Add trusted domain" : "Add trusted domain", "Migration in progress. Please wait until the migration is finished" : "Migration in progress. Please wait until the migration is finished", @@ -51,7 +48,6 @@ "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Official apps are developed by the community. They offer additional functionality and are ready for production use.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "This app is not checked for security issues and is new or known to be unstable. Install at your own risk.", - "Please wait...." : "Please wait....", "Error while disabling app" : "Error whilst disabling app", "Disable" : "Disable", "Enable" : "Enable", @@ -199,7 +195,6 @@ "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "This app has no maximum Nextcloud version assigned. This will cause an error in the future.", "This app cannot be installed because the following dependencies are not fulfilled:" : "This app cannot be installed because the following dependencies are not fulfilled:", "Enable only for specific groups" : "Enable only for specific groups", - "Uninstall App" : "Uninstall App", "SSL Root Certificates" : "SSL Root Certificates", "Common Name" : "Common Name", "Valid until" : "Valid until", @@ -264,7 +259,11 @@ "Default" : "Default", "log-level out of allowed range" : "log-level out of allowed range", "Language changed" : "Language changed", + "Admins can't remove themself from the admin group" : "Admins can't remove themselves from the admin group", + "Unable to add user to group %s" : "Unable to add user to group %s", + "Unable to remove user from group %s" : "Unable to remove user from group %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Are you really sure you want add \"{domain}\" as a trusted domain?", + "Please wait...." : "Please wait....", "Everything (fatal issues, errors, warnings, info, debug)" : "Everything (fatal issues, errors, warnings, info, debug)", "Info, warnings, errors and fatal issues" : "Info, warnings, errors and fatal issues", "Warnings, errors and fatal issues" : "Warnings, errors and fatal issues", @@ -282,14 +281,10 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Especially when using the desktop client for file syncing, the use of SQLite is discouraged.", "Experimental applications ahead" : "Experimental applications ahead", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches.", + "Uninstall App" : "Uninstall App", "Enable experimental apps" : "Enable experimental apps", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n", - "Group" : "Group", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "External Storage", - "Updates" : "Updates", - "An error occurred: {message}" : "An error occurred: {message}" + "Group" : "Group" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/eo.js b/settings/l10n/eo.js index 8d5599ee9703dd2d8db3ef61ccf239f095bdf580..57bacd60c5019de0f89df5f222e26dc08338de3a 100644 --- a/settings/l10n/eo.js +++ b/settings/l10n/eo.js @@ -14,13 +14,9 @@ OC.L10N.register( "Unable to change full name" : "Ne eblis ŝanĝi la plenan nomon", "Your full name has been changed." : "Via plena nomo ŝanĝitas.", "Email saved" : "La retpoŝtadreso konserviĝis", - "Admins can't remove themself from the admin group" : "Administrantoj ne povas forigi sin mem el la administra grupo.", - "Unable to add user to group %s" : "Ne eblis aldoni la uzanton al la grupo %s", - "Unable to remove user from group %s" : "Ne eblis forigi la uzantan el la grupo %s", "Couldn't update app." : "Ne eblis ĝisdatigi la aplikaĵon.", "Sending..." : "Sendante...", "All" : "Ĉio", - "Please wait...." : "Bonvolu atendi...", "Error while disabling app" : "Eraris malkapabligo de aplikaĵo", "Disable" : "Malkapabligi", "Enable" : "Kapabligi", @@ -85,7 +81,6 @@ OC.L10N.register( "Show description …" : "Montri priskribon...", "Hide description …" : "Malmontri priskribon...", "Enable only for specific groups" : "Kapabligi nur por specifajn grupojn", - "Uninstall App" : "Malinstali aplikaĵon", "Common Name" : "Komuna nomo", "Valid until" : "Valida ĝis", "Valid until %s" : "Valida ĝis %s", @@ -126,6 +121,10 @@ OC.L10N.register( "change email address" : "ŝanĝi retpoŝtadreson", "Default" : "Defaŭlta", "Language changed" : "La lingvo estas ŝanĝita", + "Admins can't remove themself from the admin group" : "Administrantoj ne povas forigi sin mem el la administra grupo.", + "Unable to add user to group %s" : "Ne eblis aldoni la uzanton al la grupo %s", + "Unable to remove user from group %s" : "Ne eblis forigi la uzantan el la grupo %s", + "Please wait...." : "Bonvolu atendi...", "Everything (fatal issues, errors, warnings, info, debug)" : "Ĉio (fatalaĵoj, eraroj, avertoj, informoj, sencimigaj mesaĝoj)", "Info, warnings, errors and fatal issues" : "Informoj, avertoj, eraroj kaj fatalaĵoj", "Warnings, errors and fatal issues" : "Avertoj, eraroj kaj fatalaĵoj", @@ -137,8 +136,7 @@ OC.L10N.register( "More" : "Pli", "Less" : "Malpli", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite uziĝas kiel datumbazo. Por pli grandaj instaloj ni rekomendas ŝanĝi ĝin per malsama datumbazomotoro.", - "Group" : "Grupo", - "External Storage" : "Malena memorilo", - "Updates" : "Ĝisdatigoj" + "Uninstall App" : "Malinstali aplikaĵon", + "Group" : "Grupo" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/eo.json b/settings/l10n/eo.json index db55cf74440ad6075a6af5cb529008d1fbeb8735..adb48f15be543bfaea0e438f6790fdcd020b8183 100644 --- a/settings/l10n/eo.json +++ b/settings/l10n/eo.json @@ -12,13 +12,9 @@ "Unable to change full name" : "Ne eblis ŝanĝi la plenan nomon", "Your full name has been changed." : "Via plena nomo ŝanĝitas.", "Email saved" : "La retpoŝtadreso konserviĝis", - "Admins can't remove themself from the admin group" : "Administrantoj ne povas forigi sin mem el la administra grupo.", - "Unable to add user to group %s" : "Ne eblis aldoni la uzanton al la grupo %s", - "Unable to remove user from group %s" : "Ne eblis forigi la uzantan el la grupo %s", "Couldn't update app." : "Ne eblis ĝisdatigi la aplikaĵon.", "Sending..." : "Sendante...", "All" : "Ĉio", - "Please wait...." : "Bonvolu atendi...", "Error while disabling app" : "Eraris malkapabligo de aplikaĵo", "Disable" : "Malkapabligi", "Enable" : "Kapabligi", @@ -83,7 +79,6 @@ "Show description …" : "Montri priskribon...", "Hide description …" : "Malmontri priskribon...", "Enable only for specific groups" : "Kapabligi nur por specifajn grupojn", - "Uninstall App" : "Malinstali aplikaĵon", "Common Name" : "Komuna nomo", "Valid until" : "Valida ĝis", "Valid until %s" : "Valida ĝis %s", @@ -124,6 +119,10 @@ "change email address" : "ŝanĝi retpoŝtadreson", "Default" : "Defaŭlta", "Language changed" : "La lingvo estas ŝanĝita", + "Admins can't remove themself from the admin group" : "Administrantoj ne povas forigi sin mem el la administra grupo.", + "Unable to add user to group %s" : "Ne eblis aldoni la uzanton al la grupo %s", + "Unable to remove user from group %s" : "Ne eblis forigi la uzantan el la grupo %s", + "Please wait...." : "Bonvolu atendi...", "Everything (fatal issues, errors, warnings, info, debug)" : "Ĉio (fatalaĵoj, eraroj, avertoj, informoj, sencimigaj mesaĝoj)", "Info, warnings, errors and fatal issues" : "Informoj, avertoj, eraroj kaj fatalaĵoj", "Warnings, errors and fatal issues" : "Avertoj, eraroj kaj fatalaĵoj", @@ -135,8 +134,7 @@ "More" : "Pli", "Less" : "Malpli", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite uziĝas kiel datumbazo. Por pli grandaj instaloj ni rekomendas ŝanĝi ĝin per malsama datumbazomotoro.", - "Group" : "Grupo", - "External Storage" : "Malena memorilo", - "Updates" : "Ĝisdatigoj" + "Uninstall App" : "Malinstali aplikaĵon", + "Group" : "Grupo" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/es.js b/settings/l10n/es.js index e7ac03ebd1406a079a74db2244cc54d4452f1fcb..946576aba14fabaec9054168069d87487e9d1e93 100644 --- a/settings/l10n/es.js +++ b/settings/l10n/es.js @@ -25,6 +25,7 @@ OC.L10N.register( "You need to set your user email before being able to send test emails." : "Tiene que configurar su dirección de correo electrónico antes de poder enviar mensajes de prueba.", "Invalid request" : "Petición no válida", "Invalid mail address" : "Dirección de correo inválida", + "No valid group selected" : "No se ha seleccionado un grupo válido", "A user with that name already exists." : "Ya existe un usuario con ese nombre.", "Unable to create user." : "No se pudo crear el usuario.", "Your %s account was created" : "Se ha creado su cuenta de %s", @@ -39,9 +40,6 @@ OC.L10N.register( "Email saved" : "Correo electrónico guardado", "Password confirmation is required" : "Se requiere confirmar la contraseña", "Couldn't remove app." : "No se pudo eliminar la aplicación.", - "Admins can't remove themself from the admin group" : "Los administradores no se pueden eliminar a ellos mismos del grupo de administrador", - "Unable to add user to group %s" : "No se pudo añadir el usuario al grupo %s", - "Unable to remove user from group %s" : "No se pudo eliminar al usuario del grupo %s", "Couldn't update app." : "No se pudo actualizar la aplicación.", "Are you really sure you want add {domain} as trusted domain?" : "¿Está realmente seguro de que quiere añadir {domain} como dominio de confianza?", "Add trusted domain" : "Agregar dominio de confianza", @@ -58,7 +56,7 @@ OC.L10N.register( "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Las apps oficiales están desarrolladas por y dentro de la comunidad. Ofrecen una funcionalidad central y están preparadas para uso en producción.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Las aplicaciones aprobadas las desarrollan desarrolladores de confianza y han pasado un control de seguridad superficial. Estas se mantienen activamente en un repositorio de código abierto y sus encargados las consideran estables para un uso normal.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "No se han verificado los posibles problemas de seguridad de esta app. Es nueva o bien es conocida por ser inestable. Instálela bajo su propio riesgo.", - "Please wait...." : "Espere, por favor....", + "Enabling app …" : "Activando app ...", "Error while disabling app" : "Error mientras se desactivaba la aplicación", "Disable" : "Desactivar", "Enable" : "Activar", @@ -125,6 +123,8 @@ OC.L10N.register( "undo" : "deshacer", "never" : "nunca", "deleted {userName}" : "borrado {userName}", + "Unable to add user to group {group}" : "No se puede añadir el usuario al grupo {group}", + "Unable to remove user from group {group}" : "No se puede eliminar el usuario del grupo {group}", "Add group" : "Añadir grupo", "Invalid quota value \"{val}\"" : "Valor de cuota inválido \"{val}\"", "no group" : "sin grupo", @@ -247,7 +247,7 @@ OC.L10N.register( "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Esta app no tiene una versión máxima de Nextcloud asignada. Esto será un error en el futuro.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Esta aplicación no puede instalarse porque las siguientes dependencias no están cumplimentadas:", "Enable only for specific groups" : "Activar solamente para grupos específicos", - "Uninstall App" : "Desinstalar aplicación", + "Uninstall app" : "Desinstalar aplicación", "SSL Root Certificates" : "Raíz de certificados SSL ", "Common Name" : "Nombre común", "Valid until" : "Válido hasta", @@ -296,6 +296,7 @@ OC.L10N.register( "Desktop client" : "Cliente de escritorio", "Android app" : "Aplicación de Android", "iOS app" : "La aplicación de iOS", + "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Si deseas apoyar el proyecto, ¡{contributeopen}únete al desarrollo{linkclose} o {contributeopen}difúnde la palabra{linkclose}!", "Show First Run Wizard again" : "Mostrar nuevamente el Asistente de ejecución inicial", "Web, desktop and mobile clients currently logged in to your account." : "Clientes web, móviles y de escritorio actualmente conectados a tu cuenta.", "Device" : "Dispositivo", @@ -308,8 +309,12 @@ OC.L10N.register( "For security reasons this password will only be shown once." : "Para seguridad, esta contraseña será mostrado solamente una vez.", "Username" : "Nombre de usuario", "Done" : "Hecho", + "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Desarrollado por la {communityopen}comunidad Nextcloud{linkclose}, el {githubopen}código fuente{linkclose} está licenciado bajo la {licenseopen}AGPL{linkclose}.", "Follow us on Google Plus!" : "¡Síganos en Google+!", + "Like our facebook page!" : "¡Da a Me gusta en nuestra página de Facebook!", "Subscribe to our twitter channel!" : "Suscríbete a nuestro canal de Twitter!", + "Subscribe to our news feed!" : "¡Suscríbete a nuestro feed de noticias!", + "Subscribe to our newsletter!" : "¡Suscríbete a nuestro boletín!", "Show storage location" : "Mostrar la ubicación del almacenamiento", "Show last log in" : "Mostrar el último inicio de sesión", "Show user backend" : "Mostrar motor de usuario", @@ -336,7 +341,11 @@ OC.L10N.register( "Default" : "Predeterminado", "log-level out of allowed range" : "Nivel de autenticación fuera del rango permitido", "Language changed" : "Idioma cambiado", + "Admins can't remove themself from the admin group" : "Los administradores no se pueden eliminar a ellos mismos del grupo de administrador", + "Unable to add user to group %s" : "No se pudo añadir el usuario al grupo %s", + "Unable to remove user from group %s" : "No se pudo eliminar al usuario del grupo %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "¿Está seguro de querer agregar \"{domain}\" como un dominio de confianza?", + "Please wait...." : "Espere, por favor....", "iPhone" : "iPhone", "add group" : "añadir grupo", "Everything (fatal issues, errors, warnings, info, debug)" : "Todo (Información, Avisos, Errores, debug y problemas fatales)", @@ -356,22 +365,18 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "El uso de SQLite está desaconsejado especialmente cuando se usa el cliente de escritorio para sincronizar los ficheros.", "Experimental applications ahead" : "Aplicaciones experimentales más adelante", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Las aplicaciones experimentales no están verificadas por problemas de seguridad, recientes o conocidas por ser inestables y/o bajo un fuerte desarrollo. Instalándolas pueden causar pérdida de datos o violación de seguridades.", + "Uninstall App" : "Desinstalar aplicación", "Enable experimental apps" : "Habilitar aplicaciones experimentales", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "¿Qué tal?,

    este mensaje es para hacerle saber que ahora tiene una %s cuenta.

    Su nombre de usuario: %s
    Acceda en: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hola, ¿qué tal?,\n\nEste mensaje es para hacerle saber que ahora tiene una cuenta %s.\n\nSu nombre de usuario: %s\nAcceda en: %s\n\n", "If you want to support the project\n\t\tjoin development\n\t\t\n\t\tspread the word!" : "If you want to support the project\n\t\túnase al desarrollo\n\t\to\n\t\tdifunda la palabra.", "Add Group" : "Agregar grupo", "Group" : "Grupo", + "Default Quota" : "Cuota por defecto.", "Full Name" : "Nombre completo", "Group Admin for" : "Grupo administrador para", "Storage Location" : "Ubicación de almacenamiento", "User Backend" : "Usuario de backend", - "Last Login" : "Último inicio de sesión", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Almacenamiento externo", - "Updates" : "Actualizaciones", - "No apps found for \"{query}\"" : "No se han encontrado apps para {query}", - "An error occurred: {message}" : "Ocurrió un error: {message}" + "Last Login" : "Último inicio de sesión" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/es.json b/settings/l10n/es.json index 2ad9f67d3f114335b42bc4e83c09dabf6cd30cf5..c410fb3a2793020683aa5e69e8f897fc7e4a12b3 100644 --- a/settings/l10n/es.json +++ b/settings/l10n/es.json @@ -23,6 +23,7 @@ "You need to set your user email before being able to send test emails." : "Tiene que configurar su dirección de correo electrónico antes de poder enviar mensajes de prueba.", "Invalid request" : "Petición no válida", "Invalid mail address" : "Dirección de correo inválida", + "No valid group selected" : "No se ha seleccionado un grupo válido", "A user with that name already exists." : "Ya existe un usuario con ese nombre.", "Unable to create user." : "No se pudo crear el usuario.", "Your %s account was created" : "Se ha creado su cuenta de %s", @@ -37,9 +38,6 @@ "Email saved" : "Correo electrónico guardado", "Password confirmation is required" : "Se requiere confirmar la contraseña", "Couldn't remove app." : "No se pudo eliminar la aplicación.", - "Admins can't remove themself from the admin group" : "Los administradores no se pueden eliminar a ellos mismos del grupo de administrador", - "Unable to add user to group %s" : "No se pudo añadir el usuario al grupo %s", - "Unable to remove user from group %s" : "No se pudo eliminar al usuario del grupo %s", "Couldn't update app." : "No se pudo actualizar la aplicación.", "Are you really sure you want add {domain} as trusted domain?" : "¿Está realmente seguro de que quiere añadir {domain} como dominio de confianza?", "Add trusted domain" : "Agregar dominio de confianza", @@ -56,7 +54,7 @@ "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Las apps oficiales están desarrolladas por y dentro de la comunidad. Ofrecen una funcionalidad central y están preparadas para uso en producción.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Las aplicaciones aprobadas las desarrollan desarrolladores de confianza y han pasado un control de seguridad superficial. Estas se mantienen activamente en un repositorio de código abierto y sus encargados las consideran estables para un uso normal.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "No se han verificado los posibles problemas de seguridad de esta app. Es nueva o bien es conocida por ser inestable. Instálela bajo su propio riesgo.", - "Please wait...." : "Espere, por favor....", + "Enabling app …" : "Activando app ...", "Error while disabling app" : "Error mientras se desactivaba la aplicación", "Disable" : "Desactivar", "Enable" : "Activar", @@ -123,6 +121,8 @@ "undo" : "deshacer", "never" : "nunca", "deleted {userName}" : "borrado {userName}", + "Unable to add user to group {group}" : "No se puede añadir el usuario al grupo {group}", + "Unable to remove user from group {group}" : "No se puede eliminar el usuario del grupo {group}", "Add group" : "Añadir grupo", "Invalid quota value \"{val}\"" : "Valor de cuota inválido \"{val}\"", "no group" : "sin grupo", @@ -245,7 +245,7 @@ "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Esta app no tiene una versión máxima de Nextcloud asignada. Esto será un error en el futuro.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Esta aplicación no puede instalarse porque las siguientes dependencias no están cumplimentadas:", "Enable only for specific groups" : "Activar solamente para grupos específicos", - "Uninstall App" : "Desinstalar aplicación", + "Uninstall app" : "Desinstalar aplicación", "SSL Root Certificates" : "Raíz de certificados SSL ", "Common Name" : "Nombre común", "Valid until" : "Válido hasta", @@ -294,6 +294,7 @@ "Desktop client" : "Cliente de escritorio", "Android app" : "Aplicación de Android", "iOS app" : "La aplicación de iOS", + "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Si deseas apoyar el proyecto, ¡{contributeopen}únete al desarrollo{linkclose} o {contributeopen}difúnde la palabra{linkclose}!", "Show First Run Wizard again" : "Mostrar nuevamente el Asistente de ejecución inicial", "Web, desktop and mobile clients currently logged in to your account." : "Clientes web, móviles y de escritorio actualmente conectados a tu cuenta.", "Device" : "Dispositivo", @@ -306,8 +307,12 @@ "For security reasons this password will only be shown once." : "Para seguridad, esta contraseña será mostrado solamente una vez.", "Username" : "Nombre de usuario", "Done" : "Hecho", + "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Desarrollado por la {communityopen}comunidad Nextcloud{linkclose}, el {githubopen}código fuente{linkclose} está licenciado bajo la {licenseopen}AGPL{linkclose}.", "Follow us on Google Plus!" : "¡Síganos en Google+!", + "Like our facebook page!" : "¡Da a Me gusta en nuestra página de Facebook!", "Subscribe to our twitter channel!" : "Suscríbete a nuestro canal de Twitter!", + "Subscribe to our news feed!" : "¡Suscríbete a nuestro feed de noticias!", + "Subscribe to our newsletter!" : "¡Suscríbete a nuestro boletín!", "Show storage location" : "Mostrar la ubicación del almacenamiento", "Show last log in" : "Mostrar el último inicio de sesión", "Show user backend" : "Mostrar motor de usuario", @@ -334,7 +339,11 @@ "Default" : "Predeterminado", "log-level out of allowed range" : "Nivel de autenticación fuera del rango permitido", "Language changed" : "Idioma cambiado", + "Admins can't remove themself from the admin group" : "Los administradores no se pueden eliminar a ellos mismos del grupo de administrador", + "Unable to add user to group %s" : "No se pudo añadir el usuario al grupo %s", + "Unable to remove user from group %s" : "No se pudo eliminar al usuario del grupo %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "¿Está seguro de querer agregar \"{domain}\" como un dominio de confianza?", + "Please wait...." : "Espere, por favor....", "iPhone" : "iPhone", "add group" : "añadir grupo", "Everything (fatal issues, errors, warnings, info, debug)" : "Todo (Información, Avisos, Errores, debug y problemas fatales)", @@ -354,22 +363,18 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "El uso de SQLite está desaconsejado especialmente cuando se usa el cliente de escritorio para sincronizar los ficheros.", "Experimental applications ahead" : "Aplicaciones experimentales más adelante", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Las aplicaciones experimentales no están verificadas por problemas de seguridad, recientes o conocidas por ser inestables y/o bajo un fuerte desarrollo. Instalándolas pueden causar pérdida de datos o violación de seguridades.", + "Uninstall App" : "Desinstalar aplicación", "Enable experimental apps" : "Habilitar aplicaciones experimentales", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "¿Qué tal?,

    este mensaje es para hacerle saber que ahora tiene una %s cuenta.

    Su nombre de usuario: %s
    Acceda en: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hola, ¿qué tal?,\n\nEste mensaje es para hacerle saber que ahora tiene una cuenta %s.\n\nSu nombre de usuario: %s\nAcceda en: %s\n\n", "If you want to support the project\n\t\tjoin development\n\t\t\n\t\tspread the word!" : "If you want to support the project\n\t\túnase al desarrollo\n\t\to\n\t\tdifunda la palabra.", "Add Group" : "Agregar grupo", "Group" : "Grupo", + "Default Quota" : "Cuota por defecto.", "Full Name" : "Nombre completo", "Group Admin for" : "Grupo administrador para", "Storage Location" : "Ubicación de almacenamiento", "User Backend" : "Usuario de backend", - "Last Login" : "Último inicio de sesión", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Almacenamiento externo", - "Updates" : "Actualizaciones", - "No apps found for \"{query}\"" : "No se han encontrado apps para {query}", - "An error occurred: {message}" : "Ocurrió un error: {message}" + "Last Login" : "Último inicio de sesión" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/es_AR.js b/settings/l10n/es_AR.js index d98c87764a6ca8f2c056274b2565c52dbbf8473e..a557cec74b1933b606cf939776e05a7066595604 100644 --- a/settings/l10n/es_AR.js +++ b/settings/l10n/es_AR.js @@ -16,13 +16,9 @@ OC.L10N.register( "Unable to change full name" : "Imposible cambiar el nombre completo", "Your full name has been changed." : "Su nombre completo ha sido cambiado.", "Email saved" : "e-mail guardado", - "Admins can't remove themself from the admin group" : "Los administradores no se pueden quitar a si mismos del grupo administrador. ", - "Unable to add user to group %s" : "No fue posible agregar el usuario al grupo %s", - "Unable to remove user from group %s" : "No es posible borrar al usuario del grupo %s", "Couldn't update app." : "No se pudo actualizar la App.", "Sending..." : "Enviando...", "All" : "Todos", - "Please wait...." : "Por favor, esperá....", "Error while disabling app" : "Se ha producido un error mientras se deshabilitaba la aplicación", "Disable" : "Desactivar", "Enable" : "Activar", @@ -104,6 +100,10 @@ OC.L10N.register( "set new password" : "Configurar nueva contraseña", "Default" : "Predeterminado", "Language changed" : "Idioma cambiado", + "Admins can't remove themself from the admin group" : "Los administradores no se pueden quitar a si mismos del grupo administrador. ", + "Unable to add user to group %s" : "No fue posible agregar el usuario al grupo %s", + "Unable to remove user from group %s" : "No es posible borrar al usuario del grupo %s", + "Please wait...." : "Por favor, esperá....", "Everything (fatal issues, errors, warnings, info, debug)" : "Todo (notificaciones fatales, errores, advertencias, info, debug)", "Info, warnings, errors and fatal issues" : "Info, advertencias, errores y notificaciones fatales", "Warnings, errors and fatal issues" : "Advertencias, errores y notificaciones fatales", @@ -113,9 +113,6 @@ OC.L10N.register( "More" : "Más", "Less" : "Menos", "Allow users to send mail notification for shared files" : "Habilitar a los usuarios para enviar notificaciones por correo para archivos compartidos", - "Group" : "Grupo", - "APCu" : "APCu", - "External Storage" : "Almacenamiento externo", - "Updates" : "Actualizaciones" + "Group" : "Grupo" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/es_AR.json b/settings/l10n/es_AR.json index a6bbbdba0548e519d8659ca68213b89006b93008..2d6ed9b8c32830d83efa619989b3786730425ef1 100644 --- a/settings/l10n/es_AR.json +++ b/settings/l10n/es_AR.json @@ -14,13 +14,9 @@ "Unable to change full name" : "Imposible cambiar el nombre completo", "Your full name has been changed." : "Su nombre completo ha sido cambiado.", "Email saved" : "e-mail guardado", - "Admins can't remove themself from the admin group" : "Los administradores no se pueden quitar a si mismos del grupo administrador. ", - "Unable to add user to group %s" : "No fue posible agregar el usuario al grupo %s", - "Unable to remove user from group %s" : "No es posible borrar al usuario del grupo %s", "Couldn't update app." : "No se pudo actualizar la App.", "Sending..." : "Enviando...", "All" : "Todos", - "Please wait...." : "Por favor, esperá....", "Error while disabling app" : "Se ha producido un error mientras se deshabilitaba la aplicación", "Disable" : "Desactivar", "Enable" : "Activar", @@ -102,6 +98,10 @@ "set new password" : "Configurar nueva contraseña", "Default" : "Predeterminado", "Language changed" : "Idioma cambiado", + "Admins can't remove themself from the admin group" : "Los administradores no se pueden quitar a si mismos del grupo administrador. ", + "Unable to add user to group %s" : "No fue posible agregar el usuario al grupo %s", + "Unable to remove user from group %s" : "No es posible borrar al usuario del grupo %s", + "Please wait...." : "Por favor, esperá....", "Everything (fatal issues, errors, warnings, info, debug)" : "Todo (notificaciones fatales, errores, advertencias, info, debug)", "Info, warnings, errors and fatal issues" : "Info, advertencias, errores y notificaciones fatales", "Warnings, errors and fatal issues" : "Advertencias, errores y notificaciones fatales", @@ -111,9 +111,6 @@ "More" : "Más", "Less" : "Menos", "Allow users to send mail notification for shared files" : "Habilitar a los usuarios para enviar notificaciones por correo para archivos compartidos", - "Group" : "Grupo", - "APCu" : "APCu", - "External Storage" : "Almacenamiento externo", - "Updates" : "Actualizaciones" + "Group" : "Grupo" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/es_MX.js b/settings/l10n/es_MX.js index bd7b9dc7c9a74701a7deda69fff9e9e0c819dfd4..c07e9a94267e3bde1c08e46eb086f4f6cdf27033 100644 --- a/settings/l10n/es_MX.js +++ b/settings/l10n/es_MX.js @@ -14,12 +14,8 @@ OC.L10N.register( "Unable to change full name" : "No se puede cambiar el nombre completo", "Your full name has been changed." : "Se ha cambiado su nombre completo.", "Email saved" : "Correo electrónico guardado", - "Admins can't remove themself from the admin group" : "Los administradores no se pueden eliminar a ellos mismos del grupo de administrador", - "Unable to add user to group %s" : "No se pudo añadir el usuario al grupo %s", - "Unable to remove user from group %s" : "No se pudo eliminar al usuario del grupo %s", "Couldn't update app." : "No se pudo actualizar la aplicación.", "All" : "Todos", - "Please wait...." : "Espere, por favor....", "Error while disabling app" : "Error mientras se desactivaba la aplicación", "Disable" : "Desactivar", "Enable" : "Activar", @@ -80,6 +76,10 @@ OC.L10N.register( "set new password" : "establecer nueva contraseña", "Default" : "Predeterminado", "Language changed" : "Idioma cambiado", + "Admins can't remove themself from the admin group" : "Los administradores no se pueden eliminar a ellos mismos del grupo de administrador", + "Unable to add user to group %s" : "No se pudo añadir el usuario al grupo %s", + "Unable to remove user from group %s" : "No se pudo eliminar al usuario del grupo %s", + "Please wait...." : "Espere, por favor....", "Everything (fatal issues, errors, warnings, info, debug)" : "Todo (Información, Avisos, Errores, debug y problemas fatales)", "Info, warnings, errors and fatal issues" : "Información, Avisos, Errores y problemas fatales", "Warnings, errors and fatal issues" : "Advertencias, errores y problemas fatales", @@ -87,7 +87,6 @@ OC.L10N.register( "Fatal issues only" : "Problemas fatales solamente", "Log" : "Registro", "More" : "Más", - "Less" : "Menos", - "External Storage" : "Almacenamiento externo" + "Less" : "Menos" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/es_MX.json b/settings/l10n/es_MX.json index 79ea5692cd21d4c7e8300b119f8ae5f003be4d35..0eca2bb49aeb6f524f569db39e4cabab39f74ea2 100644 --- a/settings/l10n/es_MX.json +++ b/settings/l10n/es_MX.json @@ -12,12 +12,8 @@ "Unable to change full name" : "No se puede cambiar el nombre completo", "Your full name has been changed." : "Se ha cambiado su nombre completo.", "Email saved" : "Correo electrónico guardado", - "Admins can't remove themself from the admin group" : "Los administradores no se pueden eliminar a ellos mismos del grupo de administrador", - "Unable to add user to group %s" : "No se pudo añadir el usuario al grupo %s", - "Unable to remove user from group %s" : "No se pudo eliminar al usuario del grupo %s", "Couldn't update app." : "No se pudo actualizar la aplicación.", "All" : "Todos", - "Please wait...." : "Espere, por favor....", "Error while disabling app" : "Error mientras se desactivaba la aplicación", "Disable" : "Desactivar", "Enable" : "Activar", @@ -78,6 +74,10 @@ "set new password" : "establecer nueva contraseña", "Default" : "Predeterminado", "Language changed" : "Idioma cambiado", + "Admins can't remove themself from the admin group" : "Los administradores no se pueden eliminar a ellos mismos del grupo de administrador", + "Unable to add user to group %s" : "No se pudo añadir el usuario al grupo %s", + "Unable to remove user from group %s" : "No se pudo eliminar al usuario del grupo %s", + "Please wait...." : "Espere, por favor....", "Everything (fatal issues, errors, warnings, info, debug)" : "Todo (Información, Avisos, Errores, debug y problemas fatales)", "Info, warnings, errors and fatal issues" : "Información, Avisos, Errores y problemas fatales", "Warnings, errors and fatal issues" : "Advertencias, errores y problemas fatales", @@ -85,7 +85,6 @@ "Fatal issues only" : "Problemas fatales solamente", "Log" : "Registro", "More" : "Más", - "Less" : "Menos", - "External Storage" : "Almacenamiento externo" + "Less" : "Menos" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/et_EE.js b/settings/l10n/et_EE.js index 2c259f5626ff8c3145c4feb029c0339c40a0f011..58ebcc50cd36678e8b650d5093cef7aa5fe37576 100644 --- a/settings/l10n/et_EE.js +++ b/settings/l10n/et_EE.js @@ -30,9 +30,6 @@ OC.L10N.register( "Unable to change mail address" : "E-posti aadressi muutmine ebaõnnestus", "Email saved" : "Kiri on salvestatud", "Couldn't remove app." : "Ei suutnud rakendit eemaldada.", - "Admins can't remove themself from the admin group" : "Administraatorid ei saa ise end admin grupist eemaldada", - "Unable to add user to group %s" : "Kasutajat ei saa lisada gruppi %s", - "Unable to remove user from group %s" : "Kasutajat ei saa eemaldada grupist %s", "Couldn't update app." : "Rakenduse uuendamine ebaõnnestus.", "Add trusted domain" : "Lis ausaldusväärne domeen", "Migration in progress. Please wait until the migration is finished" : "Kolimine on käimas. Palun oota, kuni see on lõpetatud", @@ -42,7 +39,6 @@ OC.L10N.register( "All" : "Kõik", "Update to %s" : "Uuenda versioonile %s", "No apps found for your version" : "Sinu versiooni jaoks ei leitud ühtegi rakendust", - "Please wait...." : "Palun oota...", "Error while disabling app" : "Viga rakenduse keelamisel", "Disable" : "Lülita välja", "Enable" : "Lülita sisse", @@ -145,7 +141,6 @@ OC.L10N.register( "Show description …" : "Näita kirjeldist ...", "Hide description …" : "Peida kirjeldus ...", "Enable only for specific groups" : "Luba ainult kindlad grupid", - "Uninstall App" : "Eemada rakend", "SSL Root Certificates" : "SLL Juur sertifikaadid", "Common Name" : "Üldnimetus", "Valid until" : "Kehtib kuni", @@ -199,7 +194,11 @@ OC.L10N.register( "change email address" : "muuda e-posti aadressi", "Default" : "Vaikeväärtus", "Language changed" : "Keel on muudetud", + "Admins can't remove themself from the admin group" : "Administraatorid ei saa ise end admin grupist eemaldada", + "Unable to add user to group %s" : "Kasutajat ei saa lisada gruppi %s", + "Unable to remove user from group %s" : "Kasutajat ei saa eemaldada grupist %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Oled sa kindel, et soovid lisada domeeni \"{domain}\" usaldusväärseks domeeniks?", + "Please wait...." : "Palun oota...", "Everything (fatal issues, errors, warnings, info, debug)" : "Kõik (tõsised probleemid, veateated, hoiatused, info, veatuvastus)", "Info, warnings, errors and fatal issues" : "Info, hoiatused, veateted ja tõsised probleemid", "Warnings, errors and fatal issues" : "Hoiatused, veateated ja tõsised probleemid", @@ -213,11 +212,8 @@ OC.L10N.register( "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Logifail on suurem kui 100 MB. Allalaadimine võib veidi aega võtta!", "Allow users to send mail notification for shared files" : "Luba kasutajatel saata e-posti teavitusi jagatud failide kohta", "Experimental applications ahead" : "Ees on katsetusjärgus rakendused", + "Uninstall App" : "Eemada rakend", "Enable experimental apps" : "Luba katsetusjärgus rakenduste kasutamine", - "Group" : "Grupp", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Väline salvestuskoht", - "Updates" : "Uuendused" + "Group" : "Grupp" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/et_EE.json b/settings/l10n/et_EE.json index 03a4c54f9c0d3a14625b73af18eb97ab1cee5665..d8732c4e33808f58de09f3882dfea938ba36887b 100644 --- a/settings/l10n/et_EE.json +++ b/settings/l10n/et_EE.json @@ -28,9 +28,6 @@ "Unable to change mail address" : "E-posti aadressi muutmine ebaõnnestus", "Email saved" : "Kiri on salvestatud", "Couldn't remove app." : "Ei suutnud rakendit eemaldada.", - "Admins can't remove themself from the admin group" : "Administraatorid ei saa ise end admin grupist eemaldada", - "Unable to add user to group %s" : "Kasutajat ei saa lisada gruppi %s", - "Unable to remove user from group %s" : "Kasutajat ei saa eemaldada grupist %s", "Couldn't update app." : "Rakenduse uuendamine ebaõnnestus.", "Add trusted domain" : "Lis ausaldusväärne domeen", "Migration in progress. Please wait until the migration is finished" : "Kolimine on käimas. Palun oota, kuni see on lõpetatud", @@ -40,7 +37,6 @@ "All" : "Kõik", "Update to %s" : "Uuenda versioonile %s", "No apps found for your version" : "Sinu versiooni jaoks ei leitud ühtegi rakendust", - "Please wait...." : "Palun oota...", "Error while disabling app" : "Viga rakenduse keelamisel", "Disable" : "Lülita välja", "Enable" : "Lülita sisse", @@ -143,7 +139,6 @@ "Show description …" : "Näita kirjeldist ...", "Hide description …" : "Peida kirjeldus ...", "Enable only for specific groups" : "Luba ainult kindlad grupid", - "Uninstall App" : "Eemada rakend", "SSL Root Certificates" : "SLL Juur sertifikaadid", "Common Name" : "Üldnimetus", "Valid until" : "Kehtib kuni", @@ -197,7 +192,11 @@ "change email address" : "muuda e-posti aadressi", "Default" : "Vaikeväärtus", "Language changed" : "Keel on muudetud", + "Admins can't remove themself from the admin group" : "Administraatorid ei saa ise end admin grupist eemaldada", + "Unable to add user to group %s" : "Kasutajat ei saa lisada gruppi %s", + "Unable to remove user from group %s" : "Kasutajat ei saa eemaldada grupist %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Oled sa kindel, et soovid lisada domeeni \"{domain}\" usaldusväärseks domeeniks?", + "Please wait...." : "Palun oota...", "Everything (fatal issues, errors, warnings, info, debug)" : "Kõik (tõsised probleemid, veateated, hoiatused, info, veatuvastus)", "Info, warnings, errors and fatal issues" : "Info, hoiatused, veateted ja tõsised probleemid", "Warnings, errors and fatal issues" : "Hoiatused, veateated ja tõsised probleemid", @@ -211,11 +210,8 @@ "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Logifail on suurem kui 100 MB. Allalaadimine võib veidi aega võtta!", "Allow users to send mail notification for shared files" : "Luba kasutajatel saata e-posti teavitusi jagatud failide kohta", "Experimental applications ahead" : "Ees on katsetusjärgus rakendused", + "Uninstall App" : "Eemada rakend", "Enable experimental apps" : "Luba katsetusjärgus rakenduste kasutamine", - "Group" : "Grupp", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Väline salvestuskoht", - "Updates" : "Uuendused" + "Group" : "Grupp" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/eu.js b/settings/l10n/eu.js index 31e6a91a8d234df4c8411c861bbaa02a246f2c83..ac332f20a21d7de56dcaa12e8c921ebc41c79b23 100644 --- a/settings/l10n/eu.js +++ b/settings/l10n/eu.js @@ -29,15 +29,11 @@ OC.L10N.register( "Unable to change mail address" : "Ezin izan da posta helbidea aldatu", "Email saved" : "Eposta gorde da", "Couldn't remove app." : "Ezin izan da aplikazioa ezabatu..", - "Admins can't remove themself from the admin group" : "Kudeatzaileak ezin du bere burua kendu kudeatzaile taldetik", - "Unable to add user to group %s" : "Ezin izan da erabiltzailea %s taldera gehitu", - "Unable to remove user from group %s" : "Ezin izan da erabiltzailea %s taldetik ezabatu", "Couldn't update app." : "Ezin izan da aplikazioa eguneratu.", "Add trusted domain" : "Gehitu domeinu fidagarria", "Sending..." : "Bidaltzen...", "All" : "Denak", "Update to %s" : "Eguneratu %sra", - "Please wait...." : "Itxoin mesedez...", "Error while disabling app" : "Erroea izan da aplikazioa desgaitzerakoan", "Disable" : "Ez-gaitu", "Enable" : "Gaitu", @@ -118,7 +114,6 @@ OC.L10N.register( "Documentation:" : "Dokumentazioa:", "This app cannot be installed because the following dependencies are not fulfilled:" : "Aplikazioa ezin da instalatu hurrengo menpekotasunak betetzen ez direlako:", "Enable only for specific groups" : "Baimendu bakarri talde espezifikoetarako", - "Uninstall App" : "Desinstalatu aplikazioa", "Common Name" : "Izen arrunta", "Valid until" : "Data hau arte baliogarria", "Issued By" : "Honek bidalita", @@ -167,7 +162,11 @@ OC.L10N.register( "Default" : "Lehenetsia", "log-level out of allowed range" : "erregistro-maila baimendutako tartetik at", "Language changed" : "Hizkuntza aldatuta", + "Admins can't remove themself from the admin group" : "Kudeatzaileak ezin du bere burua kendu kudeatzaile taldetik", + "Unable to add user to group %s" : "Ezin izan da erabiltzailea %s taldera gehitu", + "Unable to remove user from group %s" : "Ezin izan da erabiltzailea %s taldetik ezabatu", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ziur zaude gehitu nahi duzula \"{domain}\" domeinu fidagarri gisa?", + "Please wait...." : "Itxoin mesedez...", "Everything (fatal issues, errors, warnings, info, debug)" : "Dena (arazo larriak, erroreak, abisuak, informazioa, arazketa)", "Info, warnings, errors and fatal issues" : "Informazioa, abisuak, erroreak eta arazo larriak.", "Warnings, errors and fatal issues" : "Abisuak, erroreak eta arazo larriak", @@ -179,10 +178,9 @@ OC.L10N.register( "Less" : "Gutxiago", "Allow users to send mail notification for shared files" : "Baimendu erabiltzaileak epostako jakinarazpenak bidaltzen partekatutako fitxategientzat", "Allow users to send mail notification for shared files to other users" : "Baimendu erabiltzaileak beste erabiltzaileei epostako jakinarazpenak bidaltzen partekatutako fitxategientzat", + "Uninstall App" : "Desinstalatu aplikazioa", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Kaixo,

    orain %s kontu bat duzula esateko besterik ez.

    Zure erabiltzailea: %s
    Sar zaitez: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Kaixo,\n\norain %s kontu bat duzula esateko besterik ez.\n\nZure erabiltzailea: %s\nSar zaitez: %s\n\n", - "Group" : "Taldea", - "External Storage" : "Kanpoko biltegiratzea", - "Updates" : "Eguneraketak" + "Group" : "Taldea" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/eu.json b/settings/l10n/eu.json index 7575079f23e823dd5289e570d3826cb72d9acb23..a7d45148ef3599a35c3469ed6153e1b0d8a538f6 100644 --- a/settings/l10n/eu.json +++ b/settings/l10n/eu.json @@ -27,15 +27,11 @@ "Unable to change mail address" : "Ezin izan da posta helbidea aldatu", "Email saved" : "Eposta gorde da", "Couldn't remove app." : "Ezin izan da aplikazioa ezabatu..", - "Admins can't remove themself from the admin group" : "Kudeatzaileak ezin du bere burua kendu kudeatzaile taldetik", - "Unable to add user to group %s" : "Ezin izan da erabiltzailea %s taldera gehitu", - "Unable to remove user from group %s" : "Ezin izan da erabiltzailea %s taldetik ezabatu", "Couldn't update app." : "Ezin izan da aplikazioa eguneratu.", "Add trusted domain" : "Gehitu domeinu fidagarria", "Sending..." : "Bidaltzen...", "All" : "Denak", "Update to %s" : "Eguneratu %sra", - "Please wait...." : "Itxoin mesedez...", "Error while disabling app" : "Erroea izan da aplikazioa desgaitzerakoan", "Disable" : "Ez-gaitu", "Enable" : "Gaitu", @@ -116,7 +112,6 @@ "Documentation:" : "Dokumentazioa:", "This app cannot be installed because the following dependencies are not fulfilled:" : "Aplikazioa ezin da instalatu hurrengo menpekotasunak betetzen ez direlako:", "Enable only for specific groups" : "Baimendu bakarri talde espezifikoetarako", - "Uninstall App" : "Desinstalatu aplikazioa", "Common Name" : "Izen arrunta", "Valid until" : "Data hau arte baliogarria", "Issued By" : "Honek bidalita", @@ -165,7 +160,11 @@ "Default" : "Lehenetsia", "log-level out of allowed range" : "erregistro-maila baimendutako tartetik at", "Language changed" : "Hizkuntza aldatuta", + "Admins can't remove themself from the admin group" : "Kudeatzaileak ezin du bere burua kendu kudeatzaile taldetik", + "Unable to add user to group %s" : "Ezin izan da erabiltzailea %s taldera gehitu", + "Unable to remove user from group %s" : "Ezin izan da erabiltzailea %s taldetik ezabatu", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ziur zaude gehitu nahi duzula \"{domain}\" domeinu fidagarri gisa?", + "Please wait...." : "Itxoin mesedez...", "Everything (fatal issues, errors, warnings, info, debug)" : "Dena (arazo larriak, erroreak, abisuak, informazioa, arazketa)", "Info, warnings, errors and fatal issues" : "Informazioa, abisuak, erroreak eta arazo larriak.", "Warnings, errors and fatal issues" : "Abisuak, erroreak eta arazo larriak", @@ -177,10 +176,9 @@ "Less" : "Gutxiago", "Allow users to send mail notification for shared files" : "Baimendu erabiltzaileak epostako jakinarazpenak bidaltzen partekatutako fitxategientzat", "Allow users to send mail notification for shared files to other users" : "Baimendu erabiltzaileak beste erabiltzaileei epostako jakinarazpenak bidaltzen partekatutako fitxategientzat", + "Uninstall App" : "Desinstalatu aplikazioa", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Kaixo,

    orain %s kontu bat duzula esateko besterik ez.

    Zure erabiltzailea: %s
    Sar zaitez: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Kaixo,\n\norain %s kontu bat duzula esateko besterik ez.\n\nZure erabiltzailea: %s\nSar zaitez: %s\n\n", - "Group" : "Taldea", - "External Storage" : "Kanpoko biltegiratzea", - "Updates" : "Eguneraketak" + "Group" : "Taldea" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/fa.js b/settings/l10n/fa.js index 1adb0a40646555cfdacdfc93bc2eb63ae52cbc7b..712d52864e2fe6ff9bab2260e0e237519ebb0d3a 100644 --- a/settings/l10n/fa.js +++ b/settings/l10n/fa.js @@ -28,9 +28,6 @@ OC.L10N.register( "Unable to change mail address" : "تغییر آدرس ایمیل امکان‌پذیر نیست", "Email saved" : "ایمیل ذخیره شد", "Couldn't remove app." : "امکان حذف برنامه وجود ندارد.", - "Admins can't remove themself from the admin group" : "مدیران نمی توانند خود را از گروه مدیریت حذف کنند", - "Unable to add user to group %s" : "امکان افزودن کاربر به گروه %s نیست", - "Unable to remove user from group %s" : "امکان حذف کاربر از گروه %s نیست", "Couldn't update app." : "برنامه را نمی توان به هنگام ساخت.", "Add trusted domain" : "افزودن دامنه مورد اعتماد", "Migration in progress. Please wait until the migration is finished" : "مهاجرت در حال اجراست. لطفا تا اتمام مهاجرت صبر کنید", @@ -40,7 +37,6 @@ OC.L10N.register( "All" : "همه", "Update to %s" : "بروزرسانی به %s", "No apps found for your version" : "هیچ برنامه‌ای برای نسخه‌ی شما یافت نشد", - "Please wait...." : "لطفا صبر کنید ...", "Error while disabling app" : "خطا در هنگام غیر فعال سازی برنامه", "Disable" : "غیرفعال", "Enable" : "فعال", @@ -139,7 +135,6 @@ OC.L10N.register( "Hide description …" : "عدم نمایش توضیحات...", "This app cannot be installed because the following dependencies are not fulfilled:" : "امکان نصب این برنامه وجود ندارد، این پیش‌نیازها انجام نشده‌اند:", "Enable only for specific groups" : "فعال سازی تنها برای گروه های خاص", - "Uninstall App" : "حذف برنامه", "Common Name" : "نام مشترک", "Valid until" : "متعبر تا", "Issued By" : "صدور توسط", @@ -191,6 +186,10 @@ OC.L10N.register( "change email address" : "تغییر آدرس ایمیل ", "Default" : "پیش فرض", "Language changed" : "زبان تغییر کرد", + "Admins can't remove themself from the admin group" : "مدیران نمی توانند خود را از گروه مدیریت حذف کنند", + "Unable to add user to group %s" : "امکان افزودن کاربر به گروه %s نیست", + "Unable to remove user from group %s" : "امکان حذف کاربر از گروه %s نیست", + "Please wait...." : "لطفا صبر کنید ...", "Everything (fatal issues, errors, warnings, info, debug)" : "همه موارد (مشکلات مهلک، خطاها، اخطارها، اطلاعات، خطایابی)", "Info, warnings, errors and fatal issues" : "اطلاعات، اخطارها، خطاها، مشکلات اساسی", "Warnings, errors and fatal issues" : "اخطارها، خطاها، مشکلات مهلک", @@ -201,12 +200,8 @@ OC.L10N.register( "More" : "بیش‌تر", "Less" : "کم‌تر", "Allow users to send mail notification for shared files" : "اجازه به کاربران برای ارسال ایمیل نوتیفیکیشن برای فایل‌های به اشتراک‌گذاشته شده", + "Uninstall App" : "حذف برنامه", "Enable experimental apps" : "فعال‌سازی برنامه‌های آزمایشی", - "Group" : "گروه", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "حافظه خارجی", - "Updates" : "به روز رسانی ها", - "An error occurred: {message}" : "یک خطا رخ‌داده است: {message}" + "Group" : "گروه" }, "nplurals=1; plural=0;"); diff --git a/settings/l10n/fa.json b/settings/l10n/fa.json index 812459d288373cbaf00f3e4c542e886d56ba6930..33fcfe51a9949183aace9d5eadc72cdcc2328f8d 100644 --- a/settings/l10n/fa.json +++ b/settings/l10n/fa.json @@ -26,9 +26,6 @@ "Unable to change mail address" : "تغییر آدرس ایمیل امکان‌پذیر نیست", "Email saved" : "ایمیل ذخیره شد", "Couldn't remove app." : "امکان حذف برنامه وجود ندارد.", - "Admins can't remove themself from the admin group" : "مدیران نمی توانند خود را از گروه مدیریت حذف کنند", - "Unable to add user to group %s" : "امکان افزودن کاربر به گروه %s نیست", - "Unable to remove user from group %s" : "امکان حذف کاربر از گروه %s نیست", "Couldn't update app." : "برنامه را نمی توان به هنگام ساخت.", "Add trusted domain" : "افزودن دامنه مورد اعتماد", "Migration in progress. Please wait until the migration is finished" : "مهاجرت در حال اجراست. لطفا تا اتمام مهاجرت صبر کنید", @@ -38,7 +35,6 @@ "All" : "همه", "Update to %s" : "بروزرسانی به %s", "No apps found for your version" : "هیچ برنامه‌ای برای نسخه‌ی شما یافت نشد", - "Please wait...." : "لطفا صبر کنید ...", "Error while disabling app" : "خطا در هنگام غیر فعال سازی برنامه", "Disable" : "غیرفعال", "Enable" : "فعال", @@ -137,7 +133,6 @@ "Hide description …" : "عدم نمایش توضیحات...", "This app cannot be installed because the following dependencies are not fulfilled:" : "امکان نصب این برنامه وجود ندارد، این پیش‌نیازها انجام نشده‌اند:", "Enable only for specific groups" : "فعال سازی تنها برای گروه های خاص", - "Uninstall App" : "حذف برنامه", "Common Name" : "نام مشترک", "Valid until" : "متعبر تا", "Issued By" : "صدور توسط", @@ -189,6 +184,10 @@ "change email address" : "تغییر آدرس ایمیل ", "Default" : "پیش فرض", "Language changed" : "زبان تغییر کرد", + "Admins can't remove themself from the admin group" : "مدیران نمی توانند خود را از گروه مدیریت حذف کنند", + "Unable to add user to group %s" : "امکان افزودن کاربر به گروه %s نیست", + "Unable to remove user from group %s" : "امکان حذف کاربر از گروه %s نیست", + "Please wait...." : "لطفا صبر کنید ...", "Everything (fatal issues, errors, warnings, info, debug)" : "همه موارد (مشکلات مهلک، خطاها، اخطارها، اطلاعات، خطایابی)", "Info, warnings, errors and fatal issues" : "اطلاعات، اخطارها، خطاها، مشکلات اساسی", "Warnings, errors and fatal issues" : "اخطارها، خطاها، مشکلات مهلک", @@ -199,12 +198,8 @@ "More" : "بیش‌تر", "Less" : "کم‌تر", "Allow users to send mail notification for shared files" : "اجازه به کاربران برای ارسال ایمیل نوتیفیکیشن برای فایل‌های به اشتراک‌گذاشته شده", + "Uninstall App" : "حذف برنامه", "Enable experimental apps" : "فعال‌سازی برنامه‌های آزمایشی", - "Group" : "گروه", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "حافظه خارجی", - "Updates" : "به روز رسانی ها", - "An error occurred: {message}" : "یک خطا رخ‌داده است: {message}" + "Group" : "گروه" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/settings/l10n/fi_FI.js b/settings/l10n/fi_FI.js index cecd6bb5bd44635be37e23b4a98f1ba9fb5cb7ab..dc9a7672601baa39ed75bbcd2adfa7e0bf2e8981 100644 --- a/settings/l10n/fi_FI.js +++ b/settings/l10n/fi_FI.js @@ -35,9 +35,6 @@ OC.L10N.register( "Unable to change mail address" : "Sähköpostiosoitteen vaihtaminen ei onnistunut", "Email saved" : "Sähköposti tallennettu", "Couldn't remove app." : "Sovelluksen poistaminen epäonnistui.", - "Admins can't remove themself from the admin group" : "Ylläpitäjät eivät poistaa omia tunnuksiaan ylläpitäjien ryhmästä", - "Unable to add user to group %s" : "Käyttäjän tai ryhmän %s lisääminen ei onnistu", - "Unable to remove user from group %s" : "Käyttäjän poistaminen ryhmästä %s ei onnistu", "Couldn't update app." : "Sovelluksen päivitys epäonnistui.", "Add trusted domain" : "Lisää luotettu toimialue", "Migration in progress. Please wait until the migration is finished" : "Migraatio on kesken. Odota kunnes migraatio valmistuu", @@ -51,7 +48,6 @@ OC.L10N.register( "The app will be downloaded from the app store" : "Sovellus ladataan sovelluskaupasta", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Hyväksytyt sovellukset on kehitetty luotettujen kehittäjien toimesta. Hyväksytyille sovelluksille on suoritettu pintapuolinen turvallisuustarkastus. Sovelluksia ylläpidetään avoimen koodin tietovarastoissa. Sovellusten kehittäjät mieltävät sovellukset vakaiksi ja valmiiksi tavalliseen käyttöön.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Tätä sovellusta ei ole tarkistettu tietoturvauhkien varalta. Sovellus on uusi ja mahdollisesti tiedostettu epävakaaksi. Asenna omalla vastuulla.", - "Please wait...." : "Odota hetki...", "Error while disabling app" : "Virhe poistaessa sovellusta käytöstä", "Disable" : "Poista käytöstä", "Enable" : "Käytä", @@ -183,7 +179,6 @@ OC.L10N.register( "This app has an update available." : "Tähän sovellukseen on päivitys saatavilla.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Tätä sovellusta ei voi asentaa, koska seuraavat riippuvuudet eivät täyty:", "Enable only for specific groups" : "Salli vain tietyille ryhmille", - "Uninstall App" : "Poista sovelluksen asennus", "SSL Root Certificates" : "SSL-juurivarmenteet", "Common Name" : "Yleinen nimi", "Valid until" : "Kelvollinen", @@ -247,7 +242,11 @@ OC.L10N.register( "Default" : "Oletus", "log-level out of allowed range" : "lokitaso ei sallittujen rajojen sisäpuolella", "Language changed" : "Kieli on vaihdettu", + "Admins can't remove themself from the admin group" : "Ylläpitäjät eivät poistaa omia tunnuksiaan ylläpitäjien ryhmästä", + "Unable to add user to group %s" : "Käyttäjän tai ryhmän %s lisääminen ei onnistu", + "Unable to remove user from group %s" : "Käyttäjän poistaminen ryhmästä %s ei onnistu", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Haluatko varmasti liittää kohteen \"{domain}\" luotetuksi toimialueeksi?", + "Please wait...." : "Odota hetki...", "Everything (fatal issues, errors, warnings, info, debug)" : "Kaikki (vakavat ongelmat, virheet, varoitukset, tiedot, vianjäljitys)", "Info, warnings, errors and fatal issues" : "Tiedot, varoitukset, virheet ja vakavat ongelmat", "Warnings, errors and fatal issues" : "Varoitukset, virheet ja vakavat ongelmat", @@ -265,14 +264,10 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Varsinkin työpöytäsovelluksen tiedostosynkronointia käyttäessä SQLiten käyttö ei ole suositeltavaa.", "Experimental applications ahead" : "Kokeellisia sovelluksia edessä", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Kokeellisia sovelluksia ei ole tarkistettu tietoturvauhkien varalta. Sovellukset ovat uusia, ne saattavat olla epävakaita ja ovat nopean kehityksen alaisia. Kokeellisten sovellusten asentaminen saattaa aiheuttaa tietojen katoamista tai tietoturvauhkia.", + "Uninstall App" : "Poista sovelluksen asennus", "Enable experimental apps" : "Käytä kokeiluasteella olevia sovelluksia", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hei

    Sinulla on nyt %s-tili.

    Käyttäjätunnus: %s
    Aloita käyttö: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hei\n\nSinulla on nyt %s-tili.\n\nKäyttäjätunnuksesi: %s\nAloita käyttö: %s\n\n", - "Group" : "Ryhmä", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Erillinen tallennusväline", - "Updates" : "Päivitykset", - "An error occurred: {message}" : "Tapahtui virhe: {message}" + "Group" : "Ryhmä" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/fi_FI.json b/settings/l10n/fi_FI.json index 46b8c602950b6fb7bb3bcd4f134838963ea2d794..c241717a60403f65e4428b95a7b50ae7cee96064 100644 --- a/settings/l10n/fi_FI.json +++ b/settings/l10n/fi_FI.json @@ -33,9 +33,6 @@ "Unable to change mail address" : "Sähköpostiosoitteen vaihtaminen ei onnistunut", "Email saved" : "Sähköposti tallennettu", "Couldn't remove app." : "Sovelluksen poistaminen epäonnistui.", - "Admins can't remove themself from the admin group" : "Ylläpitäjät eivät poistaa omia tunnuksiaan ylläpitäjien ryhmästä", - "Unable to add user to group %s" : "Käyttäjän tai ryhmän %s lisääminen ei onnistu", - "Unable to remove user from group %s" : "Käyttäjän poistaminen ryhmästä %s ei onnistu", "Couldn't update app." : "Sovelluksen päivitys epäonnistui.", "Add trusted domain" : "Lisää luotettu toimialue", "Migration in progress. Please wait until the migration is finished" : "Migraatio on kesken. Odota kunnes migraatio valmistuu", @@ -49,7 +46,6 @@ "The app will be downloaded from the app store" : "Sovellus ladataan sovelluskaupasta", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Hyväksytyt sovellukset on kehitetty luotettujen kehittäjien toimesta. Hyväksytyille sovelluksille on suoritettu pintapuolinen turvallisuustarkastus. Sovelluksia ylläpidetään avoimen koodin tietovarastoissa. Sovellusten kehittäjät mieltävät sovellukset vakaiksi ja valmiiksi tavalliseen käyttöön.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Tätä sovellusta ei ole tarkistettu tietoturvauhkien varalta. Sovellus on uusi ja mahdollisesti tiedostettu epävakaaksi. Asenna omalla vastuulla.", - "Please wait...." : "Odota hetki...", "Error while disabling app" : "Virhe poistaessa sovellusta käytöstä", "Disable" : "Poista käytöstä", "Enable" : "Käytä", @@ -181,7 +177,6 @@ "This app has an update available." : "Tähän sovellukseen on päivitys saatavilla.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Tätä sovellusta ei voi asentaa, koska seuraavat riippuvuudet eivät täyty:", "Enable only for specific groups" : "Salli vain tietyille ryhmille", - "Uninstall App" : "Poista sovelluksen asennus", "SSL Root Certificates" : "SSL-juurivarmenteet", "Common Name" : "Yleinen nimi", "Valid until" : "Kelvollinen", @@ -245,7 +240,11 @@ "Default" : "Oletus", "log-level out of allowed range" : "lokitaso ei sallittujen rajojen sisäpuolella", "Language changed" : "Kieli on vaihdettu", + "Admins can't remove themself from the admin group" : "Ylläpitäjät eivät poistaa omia tunnuksiaan ylläpitäjien ryhmästä", + "Unable to add user to group %s" : "Käyttäjän tai ryhmän %s lisääminen ei onnistu", + "Unable to remove user from group %s" : "Käyttäjän poistaminen ryhmästä %s ei onnistu", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Haluatko varmasti liittää kohteen \"{domain}\" luotetuksi toimialueeksi?", + "Please wait...." : "Odota hetki...", "Everything (fatal issues, errors, warnings, info, debug)" : "Kaikki (vakavat ongelmat, virheet, varoitukset, tiedot, vianjäljitys)", "Info, warnings, errors and fatal issues" : "Tiedot, varoitukset, virheet ja vakavat ongelmat", "Warnings, errors and fatal issues" : "Varoitukset, virheet ja vakavat ongelmat", @@ -263,14 +262,10 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Varsinkin työpöytäsovelluksen tiedostosynkronointia käyttäessä SQLiten käyttö ei ole suositeltavaa.", "Experimental applications ahead" : "Kokeellisia sovelluksia edessä", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Kokeellisia sovelluksia ei ole tarkistettu tietoturvauhkien varalta. Sovellukset ovat uusia, ne saattavat olla epävakaita ja ovat nopean kehityksen alaisia. Kokeellisten sovellusten asentaminen saattaa aiheuttaa tietojen katoamista tai tietoturvauhkia.", + "Uninstall App" : "Poista sovelluksen asennus", "Enable experimental apps" : "Käytä kokeiluasteella olevia sovelluksia", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hei

    Sinulla on nyt %s-tili.

    Käyttäjätunnus: %s
    Aloita käyttö: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hei\n\nSinulla on nyt %s-tili.\n\nKäyttäjätunnuksesi: %s\nAloita käyttö: %s\n\n", - "Group" : "Ryhmä", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Erillinen tallennusväline", - "Updates" : "Päivitykset", - "An error occurred: {message}" : "Tapahtui virhe: {message}" + "Group" : "Ryhmä" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js index ec4c11ff7cc4cbf5cfb1cd39025ed78ffb13fcdf..c20a4acace50027223475fdf076d1b22cf3d7cf7 100644 --- a/settings/l10n/fr.js +++ b/settings/l10n/fr.js @@ -25,12 +25,13 @@ OC.L10N.register( "You need to set your user email before being able to send test emails." : "Vous devez définir une adresse e-mail dans vos paramètres personnels avant de pouvoir envoyer des e-mails de test.", "Invalid request" : "Requête non valide", "Invalid mail address" : "Adresse e-mail non valide", + "No valid group selected" : "Aucun groupe valide sélectionné", "A user with that name already exists." : "Un utilisateur à ce nom existe déjà.", "Unable to create user." : "Impossible de créer l'utilisateur.", "Your %s account was created" : "Votre compte %s a été créé", "Unable to delete user." : "Impossible de supprimer l'utilisateur.", "Settings saved" : "Paramètres sauvegardés", - "Unable to change full name" : "Impossible de changer le nom complet", + "Unable to change full name" : "Impossible de modifier le nom complet", "Unable to change email address" : "Impossible de modifier l'adresse e-mail", "Your full name has been changed." : "Votre nom complet a été modifié.", "Forbidden" : "Interdit", @@ -39,9 +40,6 @@ OC.L10N.register( "Email saved" : "E-mail sauvegardé", "Password confirmation is required" : "Confirmation par mot de passe est requise", "Couldn't remove app." : "Impossible de supprimer l'application.", - "Admins can't remove themself from the admin group" : "Les administrateurs ne peuvent pas se retirer eux-mêmes du groupe admin", - "Unable to add user to group %s" : "Impossible d'ajouter l'utilisateur au groupe %s", - "Unable to remove user from group %s" : "Impossible de supprimer l'utilisateur du groupe %s", "Couldn't update app." : "Impossible de mettre à jour l'application", "Are you really sure you want add {domain} as trusted domain?" : "Êtes-vous vraiment sûr de vouloir ajouter {domain} comme domaine de confiance ?", "Add trusted domain" : "Ajouter un domaine de confiance", @@ -58,7 +56,7 @@ OC.L10N.register( "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Les applications officielles sont développées par et dans la communauté. Elles offrent les fonctionnalités indispensables et sont prêtes pour être utilisées en production.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Les applications approuvées sont créées par des développeurs de confiance et ont passé les tests de sécurité. Elles sont activement maintenues et leur code source est ouvert. Leurs développeurs les considèrent stables pour une utilisation normale.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Cette application est nouvelle ou instable, et sa sécurité n'a pas été vérifiée. Installez-la à vos risques et périls!", - "Please wait...." : "Veuillez patienter…", + "Enabling app …" : "Activation de l'application...", "Error while disabling app" : "Erreur lors de la désactivation de l'application", "Disable" : "Désactiver", "Enable" : "Activer", @@ -120,11 +118,13 @@ OC.L10N.register( "Groups" : "Groupes", "Unable to delete {objName}" : "Impossible de supprimer {objName}", "Error creating group: {message}" : "Erreur lors de la création du groupe : {message}", - "A valid group name must be provided" : "Vous devez spécifier un nom de groupe valide", + "A valid group name must be provided" : "Vous devez indiquer un nom de groupe valide", "deleted {groupName}" : "{groupName} supprimé", "undo" : "annuler", "never" : "jamais", "deleted {userName}" : "{userName} supprimé", + "Unable to add user to group {group}" : "Impossible d'ajouter l'utilisateur au groupe {group}", + "Unable to remove user from group {group}" : "Impossible de supprimer l'utilisateur du groupe {group}", "Add group" : "Ajouter un groupe", "Invalid quota value \"{val}\"" : "Valeur de quota invalide \"{val}\"", "no group" : "aucun groupe", @@ -203,14 +203,14 @@ OC.L10N.register( "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Utilisez un service webcron pour exécuter cron.php toutes les 15 minutes par HTTP", "Use system's cron service to call the cron.php file every 15 minutes." : "Utilisez le service cron du système pour appeler le fichier cron.php toutes les 15 minutes.", "The cron.php needs to be executed by the system user \"%s\"." : "Le cron.php doit être exécuté par l'utilisateur système \"%s\".", - "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Pour l'executer, vous devez avoir l'extension PHP posix. Regarder la {linkstart}documentation PHP{linkend} pour plus de détails.", + "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Pour l'exécuter, vous devez avoir l'extension PHP posix. Regarder la {linkstart}documentation PHP{linkend} pour plus de détails.", "Version" : "Version", "Sharing" : "Partage", "Allow apps to use the Share API" : "Autoriser les applications à utiliser l'API de partage", "Allow users to share via link" : "Autoriser les utilisateurs à partager par lien", "Allow public uploads" : "Autoriser les téléversements publics", "Enforce password protection" : "Imposer la protection par mot de passe", - "Set default expiration date" : "Spécifier une date d'expiration par défaut", + "Set default expiration date" : "Indiquer une date d'expiration par défaut", "Expire after " : "Expiration après ", "days" : "jours", "Enforce expiration date" : "Imposer la date d'expiration", @@ -220,8 +220,8 @@ OC.L10N.register( "Exclude groups from sharing" : "Empêcher certains groupes de partager", "These groups will still be able to receive shares, but not to initiate them." : "Ces groupes ne pourront plus initier de partage, mais ils pourront toujours rejoindre les partages faits par d'autres. ", "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Activer l'autocomplétion des noms d'utilisateurs dans la fenêtre de partage. Si cette option est désactivée, les noms complets doivent être indiqués.", - "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Afficher les conditions d'utilisation sur la page publique de téléversement. (Visible seulement quand la liste des fichiers est masquée.)", - "This text will be shown on the public link upload page when the file list is hidden." : "Ce texte sera visible sur la page publique de téléversement quand la liste des fichiers est masquée.", + "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Afficher les conditions d'utilisation sur la page publique de téléversement (seulement lorsque la liste des fichiers est masquée).", + "This text will be shown on the public link upload page when the file list is hidden." : "Ce texte sera affiché sur la page publique de téléversement lorsque la liste des fichiers est masquée.", "Tips & tricks" : "Trucs et astuces", "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite est actuellement utilisé comme système de gestion de base de données. Pour des installations plus volumineuses, nous vous recommandons de migrer vers un autre système de gestion de base de données.", "This is particularly recommended when using the desktop client for file synchronisation." : "C'est particulièrement recommandé lorsque l'on utilise un client bureau pour la synchronisation des fichiers.", @@ -247,7 +247,7 @@ OC.L10N.register( "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Cette application n'a pas de version maximum Nextcloud exigée. Ce sera considéré comme une erreur à l'avenir.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Cette application ne peut être installée à cause de ces dépendances non satisfaites :", "Enable only for specific groups" : "Activer uniquement pour certains groupes", - "Uninstall App" : "Désinstaller l'application", + "Uninstall app" : "Désinstaller l'application", "SSL Root Certificates" : "Certificats Racines SSL", "Common Name" : "Nom d'usage", "Valid until" : "Valide jusqu'à", @@ -299,9 +299,9 @@ OC.L10N.register( "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Si vous voulez apporter votre appui au projet {contributeopen}joignez-vous à son développement{linkclose} ou {contributeopen}passez le mot{linkclose}!", "Show First Run Wizard again" : "Revoir la fenêtre d'accueil affichée lors de votre première connexion", "Web, desktop and mobile clients currently logged in to your account." : "Clients web, desktop et mobiles actuellement connectés sur votre compte.", - "Device" : "Périphérique", + "Device" : "Appareil", "Last activity" : "Dernière activité", - "Passcodes that give an app or device permissions to access your account." : "Un mot de passe d'application est un mot de passe qui autorise une application ou un périphérique d'accéder à votre compte.", + "Passcodes that give an app or device permissions to access your account." : "Codes de sécurité autorisant une application ou un appareil à accéder à votre compte.", "Name" : "Nom", "App name" : "Nom de l'application", "Create new app password" : "Créer un nouveau mot de passe d'application", @@ -341,7 +341,11 @@ OC.L10N.register( "Default" : "Défaut", "log-level out of allowed range" : "niveau de journalisation hors borne", "Language changed" : "Langue changée", + "Admins can't remove themself from the admin group" : "Les administrateurs ne peuvent pas se retirer eux-mêmes du groupe admin", + "Unable to add user to group %s" : "Impossible d'ajouter l'utilisateur au groupe %s", + "Unable to remove user from group %s" : "Impossible de supprimer l'utilisateur du groupe %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Êtes-vous vraiment sûr de vouloir ajouter \"{domain}\" comme domaine de confiance ?", + "Please wait...." : "Veuillez patienter…", "iPhone" : "iPhone", "add group" : "ajouter groupe", "Everything (fatal issues, errors, warnings, info, debug)" : "Tout (erreurs fatales, erreurs, avertissements, informations, debogage)", @@ -361,10 +365,11 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "L'utilisation de SQLite est particulièrement déconseillée si vous utilisez le client de bureau pour synchroniser vos données.", "Experimental applications ahead" : "Attention! Applications expérimentales", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Les applications expérimentales n'ont pas fait l'objet de tests de sécurité, sont encore en développement et peuvent être instables. Les installer peut causer des pertes de données ou des failles de sécurité. ", + "Uninstall App" : "Désinstaller l'application", "Enable experimental apps" : "Activer les applications expérimentales", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Bonjour,

    Un compte %s a été créé pour vous.

    Votre nom d'utilisateur est : %s
    Visitez votre compte : %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Bonjour,

    Un compte %s a été créé pour vous.

    Votre nom d'utilisateur est : %s
    Visitez votre compte : %s

    \n", - "If you want to support the project\n\t\tjoin development\n\t\t\n\t\tspread the word!" : "Si vous voulez appuyer ce projet\nrejoindre le dévellopement\n\npartager!", + "If you want to support the project\n\t\tjoin development\n\t\t\n\t\tspread the word!" : "Si vous voulez appuyer ce projet\nrejoindre le développement\n\npartager!", "Add Group" : "Ajouter groupe", "Group" : "Groupe", "Default Quota" : "Quota par défaut", @@ -372,24 +377,6 @@ OC.L10N.register( "Group Admin for" : "Groupe admin pour", "Storage Location" : "Emplacement de stockage", "User Backend" : "Retour utilisateur", - "Last Login" : "Dernière connexion", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Stockage externe", - "Updates" : "Mises à jour", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Les applications officielles sont développées par et pour al communauté Nextcloud. Elles offrent les fonctionnalités indispensables et sont prêtes pour être utilisées en production.", - "No apps found for \"{query}\"" : "Aucune application trouvée pour \"{query}\"", - "An error occurred: {message}" : "Une erreur est survenue : {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Veuillez consulter la documentation d'installation ↗ pour savoir comment configurer php sur votre serveur, en particulier en cas d'utilisation de php-fpm.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Votre base de données ne fonctionne pas avec le niveau d'isolation de transaction \"READ COMMITED\". Ceci peut causer des problèmes quand plusieurs actions sont exécutées en parallèle.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Votre serveur fonctionne actuellement sur une plateforme Microsoft Windows. Nous vous recommandons fortement d'utiliser une plateforme Linux pour une expérience utilisateur optimale.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Le verrouillage transactionnel des fichiers est désactivé, cela peut causer des conflits en cas d'accès concurrent. Configurez 'filelocking.enabled' dans config.php pour éviter ces problèmes. Consultez la documentation ↗ pour plus d'informations.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Consultez les guides d'installation ↗, et cherchez des erreurs ou avertissements dans les logs.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Le chiffrement seul ne garantit pas la sécurité du système. Veuillez consulter la documentation pour plus d'informations sur comment les applications de chiffrement fonctionnent et les cas d'utilisations supportés.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Pour migrer vers une autre base de données utiliser la ligne de commande: 'occ db:convert-type', ou regardez la documentation", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Cette application n'a pas de version maximum Nextcloud exigée. Ce sera considéré comme une erreur dans Nextcloud 11 et supérieur.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Cette application n'a pas de version maximum Nextcloud exigée. Ce sera considéré comme une erreur dans Nextcloud 11 et supérieur.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Si vous voulez supporter le projet\nrejoindre le dévellopement\nou\naider les autres utilisateurs!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Développé par la {communityopen}communauté Nextcloud{linkclose}, le {githubopen}code source{linkclose} est sous licence {licenseopen}AGPL{linkclose}." + "Last Login" : "Dernière connexion" }, "nplurals=2; plural=(n > 1);"); diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json index 296a67524ff6daad503855bd28b13d7b5d4a30ab..16ad7a7d882ea2ae22869e6441c0891461ab52d8 100644 --- a/settings/l10n/fr.json +++ b/settings/l10n/fr.json @@ -23,12 +23,13 @@ "You need to set your user email before being able to send test emails." : "Vous devez définir une adresse e-mail dans vos paramètres personnels avant de pouvoir envoyer des e-mails de test.", "Invalid request" : "Requête non valide", "Invalid mail address" : "Adresse e-mail non valide", + "No valid group selected" : "Aucun groupe valide sélectionné", "A user with that name already exists." : "Un utilisateur à ce nom existe déjà.", "Unable to create user." : "Impossible de créer l'utilisateur.", "Your %s account was created" : "Votre compte %s a été créé", "Unable to delete user." : "Impossible de supprimer l'utilisateur.", "Settings saved" : "Paramètres sauvegardés", - "Unable to change full name" : "Impossible de changer le nom complet", + "Unable to change full name" : "Impossible de modifier le nom complet", "Unable to change email address" : "Impossible de modifier l'adresse e-mail", "Your full name has been changed." : "Votre nom complet a été modifié.", "Forbidden" : "Interdit", @@ -37,9 +38,6 @@ "Email saved" : "E-mail sauvegardé", "Password confirmation is required" : "Confirmation par mot de passe est requise", "Couldn't remove app." : "Impossible de supprimer l'application.", - "Admins can't remove themself from the admin group" : "Les administrateurs ne peuvent pas se retirer eux-mêmes du groupe admin", - "Unable to add user to group %s" : "Impossible d'ajouter l'utilisateur au groupe %s", - "Unable to remove user from group %s" : "Impossible de supprimer l'utilisateur du groupe %s", "Couldn't update app." : "Impossible de mettre à jour l'application", "Are you really sure you want add {domain} as trusted domain?" : "Êtes-vous vraiment sûr de vouloir ajouter {domain} comme domaine de confiance ?", "Add trusted domain" : "Ajouter un domaine de confiance", @@ -56,7 +54,7 @@ "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Les applications officielles sont développées par et dans la communauté. Elles offrent les fonctionnalités indispensables et sont prêtes pour être utilisées en production.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Les applications approuvées sont créées par des développeurs de confiance et ont passé les tests de sécurité. Elles sont activement maintenues et leur code source est ouvert. Leurs développeurs les considèrent stables pour une utilisation normale.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Cette application est nouvelle ou instable, et sa sécurité n'a pas été vérifiée. Installez-la à vos risques et périls!", - "Please wait...." : "Veuillez patienter…", + "Enabling app …" : "Activation de l'application...", "Error while disabling app" : "Erreur lors de la désactivation de l'application", "Disable" : "Désactiver", "Enable" : "Activer", @@ -118,11 +116,13 @@ "Groups" : "Groupes", "Unable to delete {objName}" : "Impossible de supprimer {objName}", "Error creating group: {message}" : "Erreur lors de la création du groupe : {message}", - "A valid group name must be provided" : "Vous devez spécifier un nom de groupe valide", + "A valid group name must be provided" : "Vous devez indiquer un nom de groupe valide", "deleted {groupName}" : "{groupName} supprimé", "undo" : "annuler", "never" : "jamais", "deleted {userName}" : "{userName} supprimé", + "Unable to add user to group {group}" : "Impossible d'ajouter l'utilisateur au groupe {group}", + "Unable to remove user from group {group}" : "Impossible de supprimer l'utilisateur du groupe {group}", "Add group" : "Ajouter un groupe", "Invalid quota value \"{val}\"" : "Valeur de quota invalide \"{val}\"", "no group" : "aucun groupe", @@ -201,14 +201,14 @@ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Utilisez un service webcron pour exécuter cron.php toutes les 15 minutes par HTTP", "Use system's cron service to call the cron.php file every 15 minutes." : "Utilisez le service cron du système pour appeler le fichier cron.php toutes les 15 minutes.", "The cron.php needs to be executed by the system user \"%s\"." : "Le cron.php doit être exécuté par l'utilisateur système \"%s\".", - "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Pour l'executer, vous devez avoir l'extension PHP posix. Regarder la {linkstart}documentation PHP{linkend} pour plus de détails.", + "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Pour l'exécuter, vous devez avoir l'extension PHP posix. Regarder la {linkstart}documentation PHP{linkend} pour plus de détails.", "Version" : "Version", "Sharing" : "Partage", "Allow apps to use the Share API" : "Autoriser les applications à utiliser l'API de partage", "Allow users to share via link" : "Autoriser les utilisateurs à partager par lien", "Allow public uploads" : "Autoriser les téléversements publics", "Enforce password protection" : "Imposer la protection par mot de passe", - "Set default expiration date" : "Spécifier une date d'expiration par défaut", + "Set default expiration date" : "Indiquer une date d'expiration par défaut", "Expire after " : "Expiration après ", "days" : "jours", "Enforce expiration date" : "Imposer la date d'expiration", @@ -218,8 +218,8 @@ "Exclude groups from sharing" : "Empêcher certains groupes de partager", "These groups will still be able to receive shares, but not to initiate them." : "Ces groupes ne pourront plus initier de partage, mais ils pourront toujours rejoindre les partages faits par d'autres. ", "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Activer l'autocomplétion des noms d'utilisateurs dans la fenêtre de partage. Si cette option est désactivée, les noms complets doivent être indiqués.", - "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Afficher les conditions d'utilisation sur la page publique de téléversement. (Visible seulement quand la liste des fichiers est masquée.)", - "This text will be shown on the public link upload page when the file list is hidden." : "Ce texte sera visible sur la page publique de téléversement quand la liste des fichiers est masquée.", + "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Afficher les conditions d'utilisation sur la page publique de téléversement (seulement lorsque la liste des fichiers est masquée).", + "This text will be shown on the public link upload page when the file list is hidden." : "Ce texte sera affiché sur la page publique de téléversement lorsque la liste des fichiers est masquée.", "Tips & tricks" : "Trucs et astuces", "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite est actuellement utilisé comme système de gestion de base de données. Pour des installations plus volumineuses, nous vous recommandons de migrer vers un autre système de gestion de base de données.", "This is particularly recommended when using the desktop client for file synchronisation." : "C'est particulièrement recommandé lorsque l'on utilise un client bureau pour la synchronisation des fichiers.", @@ -245,7 +245,7 @@ "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Cette application n'a pas de version maximum Nextcloud exigée. Ce sera considéré comme une erreur à l'avenir.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Cette application ne peut être installée à cause de ces dépendances non satisfaites :", "Enable only for specific groups" : "Activer uniquement pour certains groupes", - "Uninstall App" : "Désinstaller l'application", + "Uninstall app" : "Désinstaller l'application", "SSL Root Certificates" : "Certificats Racines SSL", "Common Name" : "Nom d'usage", "Valid until" : "Valide jusqu'à", @@ -297,9 +297,9 @@ "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Si vous voulez apporter votre appui au projet {contributeopen}joignez-vous à son développement{linkclose} ou {contributeopen}passez le mot{linkclose}!", "Show First Run Wizard again" : "Revoir la fenêtre d'accueil affichée lors de votre première connexion", "Web, desktop and mobile clients currently logged in to your account." : "Clients web, desktop et mobiles actuellement connectés sur votre compte.", - "Device" : "Périphérique", + "Device" : "Appareil", "Last activity" : "Dernière activité", - "Passcodes that give an app or device permissions to access your account." : "Un mot de passe d'application est un mot de passe qui autorise une application ou un périphérique d'accéder à votre compte.", + "Passcodes that give an app or device permissions to access your account." : "Codes de sécurité autorisant une application ou un appareil à accéder à votre compte.", "Name" : "Nom", "App name" : "Nom de l'application", "Create new app password" : "Créer un nouveau mot de passe d'application", @@ -339,7 +339,11 @@ "Default" : "Défaut", "log-level out of allowed range" : "niveau de journalisation hors borne", "Language changed" : "Langue changée", + "Admins can't remove themself from the admin group" : "Les administrateurs ne peuvent pas se retirer eux-mêmes du groupe admin", + "Unable to add user to group %s" : "Impossible d'ajouter l'utilisateur au groupe %s", + "Unable to remove user from group %s" : "Impossible de supprimer l'utilisateur du groupe %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Êtes-vous vraiment sûr de vouloir ajouter \"{domain}\" comme domaine de confiance ?", + "Please wait...." : "Veuillez patienter…", "iPhone" : "iPhone", "add group" : "ajouter groupe", "Everything (fatal issues, errors, warnings, info, debug)" : "Tout (erreurs fatales, erreurs, avertissements, informations, debogage)", @@ -359,10 +363,11 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "L'utilisation de SQLite est particulièrement déconseillée si vous utilisez le client de bureau pour synchroniser vos données.", "Experimental applications ahead" : "Attention! Applications expérimentales", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Les applications expérimentales n'ont pas fait l'objet de tests de sécurité, sont encore en développement et peuvent être instables. Les installer peut causer des pertes de données ou des failles de sécurité. ", + "Uninstall App" : "Désinstaller l'application", "Enable experimental apps" : "Activer les applications expérimentales", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Bonjour,

    Un compte %s a été créé pour vous.

    Votre nom d'utilisateur est : %s
    Visitez votre compte : %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Bonjour,

    Un compte %s a été créé pour vous.

    Votre nom d'utilisateur est : %s
    Visitez votre compte : %s

    \n", - "If you want to support the project\n\t\tjoin development\n\t\t\n\t\tspread the word!" : "Si vous voulez appuyer ce projet\nrejoindre le dévellopement\n\npartager!", + "If you want to support the project\n\t\tjoin development\n\t\t\n\t\tspread the word!" : "Si vous voulez appuyer ce projet\nrejoindre le développement\n\npartager!", "Add Group" : "Ajouter groupe", "Group" : "Groupe", "Default Quota" : "Quota par défaut", @@ -370,24 +375,6 @@ "Group Admin for" : "Groupe admin pour", "Storage Location" : "Emplacement de stockage", "User Backend" : "Retour utilisateur", - "Last Login" : "Dernière connexion", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Stockage externe", - "Updates" : "Mises à jour", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Les applications officielles sont développées par et pour al communauté Nextcloud. Elles offrent les fonctionnalités indispensables et sont prêtes pour être utilisées en production.", - "No apps found for \"{query}\"" : "Aucune application trouvée pour \"{query}\"", - "An error occurred: {message}" : "Une erreur est survenue : {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Veuillez consulter la documentation d'installation ↗ pour savoir comment configurer php sur votre serveur, en particulier en cas d'utilisation de php-fpm.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Votre base de données ne fonctionne pas avec le niveau d'isolation de transaction \"READ COMMITED\". Ceci peut causer des problèmes quand plusieurs actions sont exécutées en parallèle.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Votre serveur fonctionne actuellement sur une plateforme Microsoft Windows. Nous vous recommandons fortement d'utiliser une plateforme Linux pour une expérience utilisateur optimale.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Le verrouillage transactionnel des fichiers est désactivé, cela peut causer des conflits en cas d'accès concurrent. Configurez 'filelocking.enabled' dans config.php pour éviter ces problèmes. Consultez la documentation ↗ pour plus d'informations.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Consultez les guides d'installation ↗, et cherchez des erreurs ou avertissements dans les logs.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Le chiffrement seul ne garantit pas la sécurité du système. Veuillez consulter la documentation pour plus d'informations sur comment les applications de chiffrement fonctionnent et les cas d'utilisations supportés.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Pour migrer vers une autre base de données utiliser la ligne de commande: 'occ db:convert-type', ou regardez la documentation", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Cette application n'a pas de version maximum Nextcloud exigée. Ce sera considéré comme une erreur dans Nextcloud 11 et supérieur.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Cette application n'a pas de version maximum Nextcloud exigée. Ce sera considéré comme une erreur dans Nextcloud 11 et supérieur.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Si vous voulez supporter le projet\nrejoindre le dévellopement\nou\naider les autres utilisateurs!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Développé par la {communityopen}communauté Nextcloud{linkclose}, le {githubopen}code source{linkclose} est sous licence {licenseopen}AGPL{linkclose}." + "Last Login" : "Dernière connexion" },"pluralForm" :"nplurals=2; plural=(n > 1);" } \ No newline at end of file diff --git a/settings/l10n/gl.js b/settings/l10n/gl.js index d1c0d0cd7b845f8e7fd0f3180004d8c4a94d6ba7..609782e501feac8476eb86e62456173a7cac42db 100644 --- a/settings/l10n/gl.js +++ b/settings/l10n/gl.js @@ -36,9 +36,6 @@ OC.L10N.register( "Unable to change mail address" : "Non é posíbel cambiar o enderezo de correo.", "Email saved" : "Correo gardado", "Couldn't remove app." : "Non foi posíbel retirar a aplicación.", - "Admins can't remove themself from the admin group" : "Os administradores non poden eliminarse a si mesmos do grupo admin", - "Unable to add user to group %s" : "Non é posíbel engadir o usuario ao grupo %s", - "Unable to remove user from group %s" : "Non é posíbel eliminar o usuario do grupo %s", "Couldn't update app." : "Non foi posíbel actualizar a aplicación.", "Add trusted domain" : "Engadir dominio de confianza", "Migration in progress. Please wait until the migration is finished" : "A migración está en proceso. Agarde a que remate.", @@ -50,7 +47,6 @@ OC.L10N.register( "No apps found for your version" : "Non se atoparon aplicativos para esta versión", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "As aplicacións aprobadas son desenvolvidas por desenvolvedores de confianza e pasaron un control de seguridade superficial. Mantéñense activamente nun repositorio de código aberto e os seus mantedores consideran que son estábeis para uso casual normal.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "A esta aplicación non se lle fixeron comprobacións de seguridade, ademais é nova ou coñecida por ser inestábel. Instálea baixo a súa responsabilidade.", - "Please wait...." : "Agarde...", "Error while disabling app" : "Produciuse un erro ao desactivar a aplicación", "Disable" : "Desactivar", "Enable" : "Activar", @@ -163,7 +159,6 @@ OC.L10N.register( "Hide description …" : "Agochar a descrición ...", "This app cannot be installed because the following dependencies are not fulfilled:" : "Non é posíbel instalar esta aplicación por mor de non cumprirse as dependencias:", "Enable only for specific groups" : "Activar só para grupos específicos", - "Uninstall App" : "Desinstalar unha aplicación", "Common Name" : "Nome común", "Valid until" : "Válido ata", "Issued By" : "Fornecido por", @@ -218,7 +213,11 @@ OC.L10N.register( "Default" : "Predeterminado", "log-level out of allowed range" : "o nivel do rexistro está fora do intervalo admitido", "Language changed" : "O idioma cambiou", + "Admins can't remove themself from the admin group" : "Os administradores non poden eliminarse a si mesmos do grupo admin", + "Unable to add user to group %s" : "Non é posíbel engadir o usuario ao grupo %s", + "Unable to remove user from group %s" : "Non é posíbel eliminar o usuario do grupo %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Confirma que quere engadir «{domain}» como dominio de confianza?", + "Please wait...." : "Agarde...", "Everything (fatal issues, errors, warnings, info, debug)" : "Todo (incidencias críticas, erros, avisos, información, depuración)", "Info, warnings, errors and fatal issues" : "Información, avisos, erros e incidencias críticas", "Warnings, errors and fatal issues" : "Avisos, erros e incidencias críticas", @@ -235,14 +234,10 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Concretamente, se emprega o cliente de escritorio para sincronización, desaconsellámoslle o uso de SQLite", "Experimental applications ahead" : "Ante as aplicacións experimentais", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "As aplicacións experimentais, novas ou coñecidas por ser inestábeis e en forte desenvolvemento, non se lles fan comprobacións de seguridade. A súa instalación pode provocar a perda de datos o violacións de seguridade.", + "Uninstall App" : "Desinstalar unha aplicación", "Enable experimental apps" : "Activar as aplicacións experimentais", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Ola,

    Só facerlle saber que dispón da conta %s.

    O seu nome de usuario: %s
    Para acceder a ela: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Ola,\n\nSó facerlle saber que dispón da conta %s.\n\nO seu nome de usuario: %s\nPara acceder a ela: %s\n", - "Group" : "Grupo", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Almacenamento externo", - "Updates" : "Actualizacións", - "An error occurred: {message}" : "Produciuse un erro: {message}" + "Group" : "Grupo" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/gl.json b/settings/l10n/gl.json index 429abd4287b8e54013acd89337cfdde0da017b72..4d81d6bfab15cdf3d2c1ecaf24c46fd7f7244cbf 100644 --- a/settings/l10n/gl.json +++ b/settings/l10n/gl.json @@ -34,9 +34,6 @@ "Unable to change mail address" : "Non é posíbel cambiar o enderezo de correo.", "Email saved" : "Correo gardado", "Couldn't remove app." : "Non foi posíbel retirar a aplicación.", - "Admins can't remove themself from the admin group" : "Os administradores non poden eliminarse a si mesmos do grupo admin", - "Unable to add user to group %s" : "Non é posíbel engadir o usuario ao grupo %s", - "Unable to remove user from group %s" : "Non é posíbel eliminar o usuario do grupo %s", "Couldn't update app." : "Non foi posíbel actualizar a aplicación.", "Add trusted domain" : "Engadir dominio de confianza", "Migration in progress. Please wait until the migration is finished" : "A migración está en proceso. Agarde a que remate.", @@ -48,7 +45,6 @@ "No apps found for your version" : "Non se atoparon aplicativos para esta versión", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "As aplicacións aprobadas son desenvolvidas por desenvolvedores de confianza e pasaron un control de seguridade superficial. Mantéñense activamente nun repositorio de código aberto e os seus mantedores consideran que son estábeis para uso casual normal.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "A esta aplicación non se lle fixeron comprobacións de seguridade, ademais é nova ou coñecida por ser inestábel. Instálea baixo a súa responsabilidade.", - "Please wait...." : "Agarde...", "Error while disabling app" : "Produciuse un erro ao desactivar a aplicación", "Disable" : "Desactivar", "Enable" : "Activar", @@ -161,7 +157,6 @@ "Hide description …" : "Agochar a descrición ...", "This app cannot be installed because the following dependencies are not fulfilled:" : "Non é posíbel instalar esta aplicación por mor de non cumprirse as dependencias:", "Enable only for specific groups" : "Activar só para grupos específicos", - "Uninstall App" : "Desinstalar unha aplicación", "Common Name" : "Nome común", "Valid until" : "Válido ata", "Issued By" : "Fornecido por", @@ -216,7 +211,11 @@ "Default" : "Predeterminado", "log-level out of allowed range" : "o nivel do rexistro está fora do intervalo admitido", "Language changed" : "O idioma cambiou", + "Admins can't remove themself from the admin group" : "Os administradores non poden eliminarse a si mesmos do grupo admin", + "Unable to add user to group %s" : "Non é posíbel engadir o usuario ao grupo %s", + "Unable to remove user from group %s" : "Non é posíbel eliminar o usuario do grupo %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Confirma que quere engadir «{domain}» como dominio de confianza?", + "Please wait...." : "Agarde...", "Everything (fatal issues, errors, warnings, info, debug)" : "Todo (incidencias críticas, erros, avisos, información, depuración)", "Info, warnings, errors and fatal issues" : "Información, avisos, erros e incidencias críticas", "Warnings, errors and fatal issues" : "Avisos, erros e incidencias críticas", @@ -233,14 +232,10 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Concretamente, se emprega o cliente de escritorio para sincronización, desaconsellámoslle o uso de SQLite", "Experimental applications ahead" : "Ante as aplicacións experimentais", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "As aplicacións experimentais, novas ou coñecidas por ser inestábeis e en forte desenvolvemento, non se lles fan comprobacións de seguridade. A súa instalación pode provocar a perda de datos o violacións de seguridade.", + "Uninstall App" : "Desinstalar unha aplicación", "Enable experimental apps" : "Activar as aplicacións experimentais", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Ola,

    Só facerlle saber que dispón da conta %s.

    O seu nome de usuario: %s
    Para acceder a ela: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Ola,\n\nSó facerlle saber que dispón da conta %s.\n\nO seu nome de usuario: %s\nPara acceder a ela: %s\n", - "Group" : "Grupo", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Almacenamento externo", - "Updates" : "Actualizacións", - "An error occurred: {message}" : "Produciuse un erro: {message}" + "Group" : "Grupo" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/he.js b/settings/l10n/he.js index 1f3cb6ac36c4ddd5d904899ee3f78a291994f19b..8e9e253832730bfc424a2503d9861374e945e831 100644 --- a/settings/l10n/he.js +++ b/settings/l10n/he.js @@ -36,9 +36,6 @@ OC.L10N.register( "Unable to change mail address" : "לא ניתן לשנות כתובת דואר אלקטרוני", "Email saved" : "הדואר האלקטרוני נשמר", "Couldn't remove app." : "לא ניתן להסיר את היישום.", - "Admins can't remove themself from the admin group" : "מנהלים לא יכולים להסיר את עצמם מקבוצת המנהלים", - "Unable to add user to group %s" : "לא ניתן להוסיף משתמש לקבוצה %s", - "Unable to remove user from group %s" : "לא ניתן להסיר משתמש מהקבוצה %s", "Couldn't update app." : "לא ניתן לעדכן את היישום.", "Add trusted domain" : "הוספת שם מתחם מהימן", "Migration in progress. Please wait until the migration is finished" : "המרה בביצוע. יש להמתין עד סיום ההמרה", @@ -52,7 +49,6 @@ OC.L10N.register( "The app will be downloaded from the app store" : "היישום ירד מחנות היישומים", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "יישומים מאושרים מפותחים על ידי מפתחים מהימנים ועברו בדיקת הבטחה ראשונית. הם נשמרים באופן פעיל במאגר קוד פתוח והמתזקים שלהם מייעדים אותם לשימוש מזדמן ורגיל.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "יישום זה לא נבדק לבעיות אבטחה והוא חדש או ידוע כלא יציב. התקנת יישום זה הנה על אחריותך בלבד.", - "Please wait...." : "נא להמתין…", "Error while disabling app" : "אירעה שגיאה בעת נטרול היישום", "Disable" : "ניטרול", "Enable" : "הפעלה", @@ -196,7 +192,6 @@ OC.L10N.register( "This app has an update available." : "ליישום זה קיים עדכון זמין.", "This app cannot be installed because the following dependencies are not fulfilled:" : "לא ניתן להתקין את יישום זה כיוון שייחסי התלות הבאים לא התקיימו:", "Enable only for specific groups" : "אפשר רק לקבוצות מסויימות", - "Uninstall App" : "הסרת יישום", "SSL Root Certificates" : "אישורי אבטחת SSL לנתיב יסוד", "Common Name" : "שם משותף", "Valid until" : "בתוקף עד", @@ -260,7 +255,11 @@ OC.L10N.register( "Default" : "ברירת מחדל", "log-level out of allowed range" : "גודל הלוג מעבר לרמה המותרת", "Language changed" : "שפה השתנתה", + "Admins can't remove themself from the admin group" : "מנהלים לא יכולים להסיר את עצמם מקבוצת המנהלים", + "Unable to add user to group %s" : "לא ניתן להוסיף משתמש לקבוצה %s", + "Unable to remove user from group %s" : "לא ניתן להסיר משתמש מהקבוצה %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "האם באמת להוסיף \"{domain}\" כשם מתחם מהימן?", + "Please wait...." : "נא להמתין…", "Everything (fatal issues, errors, warnings, info, debug)" : "הכול (נושאים חמורים, שגיאות, אזהרות, מידע, ניפוי שגיאות)", "Info, warnings, errors and fatal issues" : "מידע, אזהרות, שגיאות ונושאים חמורים", "Warnings, errors and fatal issues" : "אזהרות, שגיאות ונושאים חמורים", @@ -278,14 +277,10 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "במיוחד כאשר משתמשים במחשב שולחני לסנכרון קבצים השימוש ב SQLite אינו מומלץ.", "Experimental applications ahead" : "ישומים ניסיוניים לפנים", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "יישומים ניסיוניים לא נבדקו לבעיות אבטחה, חדשים או ידועים כלא יציבים ותחת פיתוח כבד. התקנה שלהם עלולה להוביל לאיבוד מידע או לפרצות אבטחה.", + "Uninstall App" : "הסרת יישום", "Enable experimental apps" : "אפשר יישומים ניסיוניים", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "שלום,

    רק רצינו להודיע שעכשיו יש לך %s חשבון.

    Your שם משתמש: %s
    כניסה: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "שלום,\n\nרק רצינו להודיע שעכשיו יש לך %s חשבון.\n\nשם המשתמש שלך: %s\nכניסה: %s\n\n", - "Group" : "קבוצה", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "אחסון חיצוני", - "Updates" : "עדכונים", - "An error occurred: {message}" : "אירעה שגיאה: {message}" + "Group" : "קבוצה" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/he.json b/settings/l10n/he.json index b69e4f63d4f6af757e16f8b5fb7eccfe69e1f50f..3eace55b4b80b2134abfa28bffab84f8e2435af4 100644 --- a/settings/l10n/he.json +++ b/settings/l10n/he.json @@ -34,9 +34,6 @@ "Unable to change mail address" : "לא ניתן לשנות כתובת דואר אלקטרוני", "Email saved" : "הדואר האלקטרוני נשמר", "Couldn't remove app." : "לא ניתן להסיר את היישום.", - "Admins can't remove themself from the admin group" : "מנהלים לא יכולים להסיר את עצמם מקבוצת המנהלים", - "Unable to add user to group %s" : "לא ניתן להוסיף משתמש לקבוצה %s", - "Unable to remove user from group %s" : "לא ניתן להסיר משתמש מהקבוצה %s", "Couldn't update app." : "לא ניתן לעדכן את היישום.", "Add trusted domain" : "הוספת שם מתחם מהימן", "Migration in progress. Please wait until the migration is finished" : "המרה בביצוע. יש להמתין עד סיום ההמרה", @@ -50,7 +47,6 @@ "The app will be downloaded from the app store" : "היישום ירד מחנות היישומים", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "יישומים מאושרים מפותחים על ידי מפתחים מהימנים ועברו בדיקת הבטחה ראשונית. הם נשמרים באופן פעיל במאגר קוד פתוח והמתזקים שלהם מייעדים אותם לשימוש מזדמן ורגיל.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "יישום זה לא נבדק לבעיות אבטחה והוא חדש או ידוע כלא יציב. התקנת יישום זה הנה על אחריותך בלבד.", - "Please wait...." : "נא להמתין…", "Error while disabling app" : "אירעה שגיאה בעת נטרול היישום", "Disable" : "ניטרול", "Enable" : "הפעלה", @@ -194,7 +190,6 @@ "This app has an update available." : "ליישום זה קיים עדכון זמין.", "This app cannot be installed because the following dependencies are not fulfilled:" : "לא ניתן להתקין את יישום זה כיוון שייחסי התלות הבאים לא התקיימו:", "Enable only for specific groups" : "אפשר רק לקבוצות מסויימות", - "Uninstall App" : "הסרת יישום", "SSL Root Certificates" : "אישורי אבטחת SSL לנתיב יסוד", "Common Name" : "שם משותף", "Valid until" : "בתוקף עד", @@ -258,7 +253,11 @@ "Default" : "ברירת מחדל", "log-level out of allowed range" : "גודל הלוג מעבר לרמה המותרת", "Language changed" : "שפה השתנתה", + "Admins can't remove themself from the admin group" : "מנהלים לא יכולים להסיר את עצמם מקבוצת המנהלים", + "Unable to add user to group %s" : "לא ניתן להוסיף משתמש לקבוצה %s", + "Unable to remove user from group %s" : "לא ניתן להסיר משתמש מהקבוצה %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "האם באמת להוסיף \"{domain}\" כשם מתחם מהימן?", + "Please wait...." : "נא להמתין…", "Everything (fatal issues, errors, warnings, info, debug)" : "הכול (נושאים חמורים, שגיאות, אזהרות, מידע, ניפוי שגיאות)", "Info, warnings, errors and fatal issues" : "מידע, אזהרות, שגיאות ונושאים חמורים", "Warnings, errors and fatal issues" : "אזהרות, שגיאות ונושאים חמורים", @@ -276,14 +275,10 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "במיוחד כאשר משתמשים במחשב שולחני לסנכרון קבצים השימוש ב SQLite אינו מומלץ.", "Experimental applications ahead" : "ישומים ניסיוניים לפנים", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "יישומים ניסיוניים לא נבדקו לבעיות אבטחה, חדשים או ידועים כלא יציבים ותחת פיתוח כבד. התקנה שלהם עלולה להוביל לאיבוד מידע או לפרצות אבטחה.", + "Uninstall App" : "הסרת יישום", "Enable experimental apps" : "אפשר יישומים ניסיוניים", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "שלום,

    רק רצינו להודיע שעכשיו יש לך %s חשבון.

    Your שם משתמש: %s
    כניסה: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "שלום,\n\nרק רצינו להודיע שעכשיו יש לך %s חשבון.\n\nשם המשתמש שלך: %s\nכניסה: %s\n\n", - "Group" : "קבוצה", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "אחסון חיצוני", - "Updates" : "עדכונים", - "An error occurred: {message}" : "אירעה שגיאה: {message}" + "Group" : "קבוצה" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/hr.js b/settings/l10n/hr.js index 6fdcdf760d1910d48e05f3b617d67e3f888eb56b..267befb6645f5d46eea587388a2f8ded23f5accc 100644 --- a/settings/l10n/hr.js +++ b/settings/l10n/hr.js @@ -17,14 +17,10 @@ OC.L10N.register( "Your full name has been changed." : "Vaše puno ime je promijenjeno.", "Email saved" : "E-pošta spremljena", "Couldn't remove app." : "Nije moguće ukloniti app.", - "Admins can't remove themself from the admin group" : "Administratori ne mogu sami sebe ukloniti iz admin grupe", - "Unable to add user to group %s" : "Dodavanje korisnika grupi %s nije moguće", - "Unable to remove user from group %s" : "Uklanjanje korisnika iz grupe %s nije moguće", "Couldn't update app." : "Ažuriranje aplikacija nije moguće", "Add trusted domain" : "Dodajte pouzdanu domenu", "Sending..." : "Slanje...", "All" : "Sve", - "Please wait...." : "Molimo pričekajte...", "Error while disabling app" : "Pogreška pri onemogućavanju app", "Disable" : "Onemogućite", "Enable" : "Omogućite", @@ -98,7 +94,6 @@ OC.L10N.register( "These groups will still be able to receive shares, but not to initiate them." : "Ove će grupe još uvijek moći primati dijeljene resurse, ali ne i inicirati ih", "Documentation:" : "Dokumentacija:", "Enable only for specific groups" : "Omogućite samo za specifične grupe", - "Uninstall App" : "Deinstalirajte app", "Common Name" : "Common Name", "Valid until" : "Valid until", "Issued By" : "Issued By", @@ -135,7 +130,11 @@ OC.L10N.register( "set new password" : "postavite novu lozinku", "Default" : "Zadano", "Language changed" : "Promjena jezika", + "Admins can't remove themself from the admin group" : "Administratori ne mogu sami sebe ukloniti iz admin grupe", + "Unable to add user to group %s" : "Dodavanje korisnika grupi %s nije moguće", + "Unable to remove user from group %s" : "Uklanjanje korisnika iz grupe %s nije moguće", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jeste li doista sigurni da želite dodati \"{domain}\" kao pouzdanu domenu?", + "Please wait...." : "Molimo pričekajte...", "Everything (fatal issues, errors, warnings, info, debug)" : "Sve (kobni problemi, pogreške, upozorenja, ispravljanje pogrešaka)", "Info, warnings, errors and fatal issues" : "Informacije, upozorenja, pogreške i kobni problemi", "Warnings, errors and fatal issues" : "Upozorenja, pogreške i kobni problemi", @@ -145,8 +144,7 @@ OC.L10N.register( "More" : "Više", "Less" : "Manje", "Allow users to send mail notification for shared files" : "Dopustite korisnicima slanje notifikacijske e-pošte za podijeljene datoteke", - "Group" : "Grupa", - "External Storage" : "Vanjsko spremište", - "Updates" : "nadogradnje" + "Uninstall App" : "Deinstalirajte app", + "Group" : "Grupa" }, "nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"); diff --git a/settings/l10n/hr.json b/settings/l10n/hr.json index ecfff147b4d543e14d00b79e2fb9fa1606f4856a..22f56cf81f4972e2d6378e5babf27ec23af93d8f 100644 --- a/settings/l10n/hr.json +++ b/settings/l10n/hr.json @@ -15,14 +15,10 @@ "Your full name has been changed." : "Vaše puno ime je promijenjeno.", "Email saved" : "E-pošta spremljena", "Couldn't remove app." : "Nije moguće ukloniti app.", - "Admins can't remove themself from the admin group" : "Administratori ne mogu sami sebe ukloniti iz admin grupe", - "Unable to add user to group %s" : "Dodavanje korisnika grupi %s nije moguće", - "Unable to remove user from group %s" : "Uklanjanje korisnika iz grupe %s nije moguće", "Couldn't update app." : "Ažuriranje aplikacija nije moguće", "Add trusted domain" : "Dodajte pouzdanu domenu", "Sending..." : "Slanje...", "All" : "Sve", - "Please wait...." : "Molimo pričekajte...", "Error while disabling app" : "Pogreška pri onemogućavanju app", "Disable" : "Onemogućite", "Enable" : "Omogućite", @@ -96,7 +92,6 @@ "These groups will still be able to receive shares, but not to initiate them." : "Ove će grupe još uvijek moći primati dijeljene resurse, ali ne i inicirati ih", "Documentation:" : "Dokumentacija:", "Enable only for specific groups" : "Omogućite samo za specifične grupe", - "Uninstall App" : "Deinstalirajte app", "Common Name" : "Common Name", "Valid until" : "Valid until", "Issued By" : "Issued By", @@ -133,7 +128,11 @@ "set new password" : "postavite novu lozinku", "Default" : "Zadano", "Language changed" : "Promjena jezika", + "Admins can't remove themself from the admin group" : "Administratori ne mogu sami sebe ukloniti iz admin grupe", + "Unable to add user to group %s" : "Dodavanje korisnika grupi %s nije moguće", + "Unable to remove user from group %s" : "Uklanjanje korisnika iz grupe %s nije moguće", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jeste li doista sigurni da želite dodati \"{domain}\" kao pouzdanu domenu?", + "Please wait...." : "Molimo pričekajte...", "Everything (fatal issues, errors, warnings, info, debug)" : "Sve (kobni problemi, pogreške, upozorenja, ispravljanje pogrešaka)", "Info, warnings, errors and fatal issues" : "Informacije, upozorenja, pogreške i kobni problemi", "Warnings, errors and fatal issues" : "Upozorenja, pogreške i kobni problemi", @@ -143,8 +142,7 @@ "More" : "Više", "Less" : "Manje", "Allow users to send mail notification for shared files" : "Dopustite korisnicima slanje notifikacijske e-pošte za podijeljene datoteke", - "Group" : "Grupa", - "External Storage" : "Vanjsko spremište", - "Updates" : "nadogradnje" + "Uninstall App" : "Deinstalirajte app", + "Group" : "Grupa" },"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;" } \ No newline at end of file diff --git a/settings/l10n/hu_HU.js b/settings/l10n/hu_HU.js index 5dbce3a57d4d514dc26e487609c97be805a954ab..73883a1107d9b6fdd2a9b45189120a5ad2b554e9 100644 --- a/settings/l10n/hu_HU.js +++ b/settings/l10n/hu_HU.js @@ -39,9 +39,6 @@ OC.L10N.register( "Email saved" : "E-mail elmentve!", "Password confirmation is required" : "Jelszó megerősítés szükséges", "Couldn't remove app." : "Az alkalmazást nem sikerült eltávolítani.", - "Admins can't remove themself from the admin group" : "Adminisztrátorok nem távolíthatják el magukat az admin csoportból.", - "Unable to add user to group %s" : "A felhasználó nem adható hozzá ehhez a csoporthoz: %s", - "Unable to remove user from group %s" : "A felhasználó nem távolítható el ebből a csoportból: %s", "Couldn't update app." : "Az alkalmazás frissítése nem sikerült.", "Are you really sure you want add {domain} as trusted domain?" : "Biztos, hogy hozzá akarod adni ezt a megbízható domainekhez: {domain} ?", "Add trusted domain" : "Megbízható tartomány hozzáadása", @@ -58,7 +55,7 @@ OC.L10N.register( "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "A hivatalos alkalmazásokat a közösség fejleszti. Ezek adják a központi funkcionalitásokat és éles rendszerekben használhatóak.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "A jóváhagyott alkalmazásokat megbízható fejlesztők készítik, amik megfelelnek a felületes biztonsági ellenőrzésnek. Nyílt forráskódú tárolóban aktívan karbantartják és biztosítják a stabil használatot.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ez az alkalmazás még nincs biztonságilag ellenőrizve és vagy új, vagy ismert instabil. Telepítés csak saját felelősségre!", - "Please wait...." : "Kérlek várj...", + "Enabling app …" : "Alkalmazás engedélyezése ...", "Error while disabling app" : "Hiba az alkalmazás letiltása közben", "Disable" : "Letiltás", "Enable" : "Engedélyezés", @@ -247,7 +244,7 @@ OC.L10N.register( "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Ennek az alkalmazásnak nincs maximum szükséges Nextcloud verziója megadva. Ez hiba lesz a jövőben.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Ezt az alkalmazást nem lehet telepíteni, mert a következő függőségek hiányoznak:", "Enable only for specific groups" : "Csak bizonyos csoportok számára tegyük elérhetővé", - "Uninstall App" : "Alkalmazás eltávolítása", + "Uninstall app" : "Alkalmazás eltávolítása", "SSL Root Certificates" : "SSL Root tanusítványok", "Common Name" : "Általános Név", "Valid until" : "Érvényes", @@ -341,7 +338,11 @@ OC.L10N.register( "Default" : "Alapértelmezett", "log-level out of allowed range" : "A naplózási szint a megengedett terjedelmen kívül van.", "Language changed" : "A nyelv megváltozott", + "Admins can't remove themself from the admin group" : "Adminisztrátorok nem távolíthatják el magukat az admin csoportból.", + "Unable to add user to group %s" : "A felhasználó nem adható hozzá ehhez a csoporthoz: %s", + "Unable to remove user from group %s" : "A felhasználó nem távolítható el ebből a csoportból: %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Biztos abban, hogy hozzá akarja adni \"{domain}\"-t a megbízható tartományokhoz?", + "Please wait...." : "Kérlek várj...", "iPhone" : "iPhone", "add group" : "csoport hozzáadása", "Everything (fatal issues, errors, warnings, info, debug)" : "Minden (végzetes hibák, hibák, figyelmeztetések, információk, hibakeresési üzenetek)", @@ -361,6 +362,7 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Amikor az asztali klienset használja fálj szinkronizációra, akkor az SQLite használata nem ajánlott.", "Experimental applications ahead" : "Kísérleti alkalmazások", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "A kísérleti alkalmazások nincsenek biztonsági ellenőrizve, ismert vagy ismeretlen hibák lehetnek bennük és aktív fejlesztés alatt állnak. A telepítésük adatvesztéshez vezethet, vagy biztonsági kockázata lehet.", + "Uninstall App" : "Alkalmazás eltávolítása", "Enable experimental apps" : "Kísérleti alkalmazások engedélyezése", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Üdv!

    Értesítünk, hogy van egy %s fiókja.

    Felhasználónév: %s
    Hozzáférés: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Üdv!\n\nÉrtesítünk, hogy van egy %s fiókja.\n\nFelhasználónév: %s\nHozzáférés: %s\n\n", @@ -372,24 +374,6 @@ OC.L10N.register( "Group Admin for" : "Csoport Adminisztrátor itt", "Storage Location" : "A háttértár helye", "User Backend" : "Felhasználói háttér", - "Last Login" : "Utolsó bejelentkezés", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Külső tárolási szolgáltatások becsatolása", - "Updates" : "Frissítések", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "A hivatalos alkalmazásokat a Nextcloud közösség fejleszti. Ezek adják a Nextcloud központi funkcionalitásait és éles rendszerekben használhatóak.", - "No apps found for \"{query}\"" : "\"{query}\" keresésre nincs találat", - "An error occurred: {message}" : "Hiba történt: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Kérjük, ellenőrizd a telepítési dokumentációt ↗ a PHP konfigurációs beállításaival kapcsolatban, főleg ha PHP-FPM-et használsz.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Az adatbázisa nem tud \"READ COMMITED\" tranzakció elkülinítési szinttel. Ez problémákat okozhat ha több egyidejű esemény van végrehajtva.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "A szervered Microsoft Windowson fut. A legjobb felhasználói élményért erősen javasoljuk, hogy Linuxot használj.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Tranzakcionális fájl lezárás tiltva van, ez problémákat okozhat versenyhelyzetben. Engedélyezze a 'filelocking.enabled' beállítást a config.php -ben, hogy elkerüld ezeket a problémákat. Nézd meg a dokumentációt ↗ bővebb információért.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Kérjük, ellenőrizd a telepítési dokumentációt ↗ és a naplót, hogy tartalmaz-e bármilyen hibát vagy figyelmeztetést.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "A titkosítás önmagában nem garantálja a rendszer biztonságát. Kérlek olvassa el a Nextcloud dokumentációt, hogy további információkat szerezhess a titkosítási alkalmazás működéséről, és a támogatott lehetőségekről.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Más adatbázisról való áttéréshez használd ezt a parancssort: 'occ db:convert-type', vagy nézd meg a dokumentációt ↗.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Ennek az alkalmazásnak nincs minimum szükséges Nextcloud verziója megadva. A Nextcloud 11-et követően ez hibát fog okozni.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Ennek az alkalmazásnak nincs maximum szükséges Nextcloud verziója megadva. A Nextcloud 11-et követően ez hibát fog okozni.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Ha támogatni szeretnéd a projektet \n\t\tcsatlakozz a fejlesztéshez\n\t\tvagy\n\t\tsegítsd a többi felhasználót!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Fejlesztve a {communityopen}Nextcloud közösség{linkclose} által, a {githubopen}forráskód{linkclose} az {licenseopen}AGPL{linkclose} licensz alá tartozik." + "Last Login" : "Utolsó bejelentkezés" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/hu_HU.json b/settings/l10n/hu_HU.json index 518271f63ee9300949b34c42d932c8a6d8cac227..aad4e32d97173e52a2da63d62ef1b67d4139fdcc 100644 --- a/settings/l10n/hu_HU.json +++ b/settings/l10n/hu_HU.json @@ -37,9 +37,6 @@ "Email saved" : "E-mail elmentve!", "Password confirmation is required" : "Jelszó megerősítés szükséges", "Couldn't remove app." : "Az alkalmazást nem sikerült eltávolítani.", - "Admins can't remove themself from the admin group" : "Adminisztrátorok nem távolíthatják el magukat az admin csoportból.", - "Unable to add user to group %s" : "A felhasználó nem adható hozzá ehhez a csoporthoz: %s", - "Unable to remove user from group %s" : "A felhasználó nem távolítható el ebből a csoportból: %s", "Couldn't update app." : "Az alkalmazás frissítése nem sikerült.", "Are you really sure you want add {domain} as trusted domain?" : "Biztos, hogy hozzá akarod adni ezt a megbízható domainekhez: {domain} ?", "Add trusted domain" : "Megbízható tartomány hozzáadása", @@ -56,7 +53,7 @@ "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "A hivatalos alkalmazásokat a közösség fejleszti. Ezek adják a központi funkcionalitásokat és éles rendszerekben használhatóak.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "A jóváhagyott alkalmazásokat megbízható fejlesztők készítik, amik megfelelnek a felületes biztonsági ellenőrzésnek. Nyílt forráskódú tárolóban aktívan karbantartják és biztosítják a stabil használatot.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ez az alkalmazás még nincs biztonságilag ellenőrizve és vagy új, vagy ismert instabil. Telepítés csak saját felelősségre!", - "Please wait...." : "Kérlek várj...", + "Enabling app …" : "Alkalmazás engedélyezése ...", "Error while disabling app" : "Hiba az alkalmazás letiltása közben", "Disable" : "Letiltás", "Enable" : "Engedélyezés", @@ -245,7 +242,7 @@ "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Ennek az alkalmazásnak nincs maximum szükséges Nextcloud verziója megadva. Ez hiba lesz a jövőben.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Ezt az alkalmazást nem lehet telepíteni, mert a következő függőségek hiányoznak:", "Enable only for specific groups" : "Csak bizonyos csoportok számára tegyük elérhetővé", - "Uninstall App" : "Alkalmazás eltávolítása", + "Uninstall app" : "Alkalmazás eltávolítása", "SSL Root Certificates" : "SSL Root tanusítványok", "Common Name" : "Általános Név", "Valid until" : "Érvényes", @@ -339,7 +336,11 @@ "Default" : "Alapértelmezett", "log-level out of allowed range" : "A naplózási szint a megengedett terjedelmen kívül van.", "Language changed" : "A nyelv megváltozott", + "Admins can't remove themself from the admin group" : "Adminisztrátorok nem távolíthatják el magukat az admin csoportból.", + "Unable to add user to group %s" : "A felhasználó nem adható hozzá ehhez a csoporthoz: %s", + "Unable to remove user from group %s" : "A felhasználó nem távolítható el ebből a csoportból: %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Biztos abban, hogy hozzá akarja adni \"{domain}\"-t a megbízható tartományokhoz?", + "Please wait...." : "Kérlek várj...", "iPhone" : "iPhone", "add group" : "csoport hozzáadása", "Everything (fatal issues, errors, warnings, info, debug)" : "Minden (végzetes hibák, hibák, figyelmeztetések, információk, hibakeresési üzenetek)", @@ -359,6 +360,7 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Amikor az asztali klienset használja fálj szinkronizációra, akkor az SQLite használata nem ajánlott.", "Experimental applications ahead" : "Kísérleti alkalmazások", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "A kísérleti alkalmazások nincsenek biztonsági ellenőrizve, ismert vagy ismeretlen hibák lehetnek bennük és aktív fejlesztés alatt állnak. A telepítésük adatvesztéshez vezethet, vagy biztonsági kockázata lehet.", + "Uninstall App" : "Alkalmazás eltávolítása", "Enable experimental apps" : "Kísérleti alkalmazások engedélyezése", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Üdv!

    Értesítünk, hogy van egy %s fiókja.

    Felhasználónév: %s
    Hozzáférés: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Üdv!\n\nÉrtesítünk, hogy van egy %s fiókja.\n\nFelhasználónév: %s\nHozzáférés: %s\n\n", @@ -370,24 +372,6 @@ "Group Admin for" : "Csoport Adminisztrátor itt", "Storage Location" : "A háttértár helye", "User Backend" : "Felhasználói háttér", - "Last Login" : "Utolsó bejelentkezés", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Külső tárolási szolgáltatások becsatolása", - "Updates" : "Frissítések", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "A hivatalos alkalmazásokat a Nextcloud közösség fejleszti. Ezek adják a Nextcloud központi funkcionalitásait és éles rendszerekben használhatóak.", - "No apps found for \"{query}\"" : "\"{query}\" keresésre nincs találat", - "An error occurred: {message}" : "Hiba történt: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Kérjük, ellenőrizd a telepítési dokumentációt ↗ a PHP konfigurációs beállításaival kapcsolatban, főleg ha PHP-FPM-et használsz.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Az adatbázisa nem tud \"READ COMMITED\" tranzakció elkülinítési szinttel. Ez problémákat okozhat ha több egyidejű esemény van végrehajtva.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "A szervered Microsoft Windowson fut. A legjobb felhasználói élményért erősen javasoljuk, hogy Linuxot használj.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Tranzakcionális fájl lezárás tiltva van, ez problémákat okozhat versenyhelyzetben. Engedélyezze a 'filelocking.enabled' beállítást a config.php -ben, hogy elkerüld ezeket a problémákat. Nézd meg a dokumentációt ↗ bővebb információért.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Kérjük, ellenőrizd a telepítési dokumentációt ↗ és a naplót, hogy tartalmaz-e bármilyen hibát vagy figyelmeztetést.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "A titkosítás önmagában nem garantálja a rendszer biztonságát. Kérlek olvassa el a Nextcloud dokumentációt, hogy további információkat szerezhess a titkosítási alkalmazás működéséről, és a támogatott lehetőségekről.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Más adatbázisról való áttéréshez használd ezt a parancssort: 'occ db:convert-type', vagy nézd meg a dokumentációt ↗.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Ennek az alkalmazásnak nincs minimum szükséges Nextcloud verziója megadva. A Nextcloud 11-et követően ez hibát fog okozni.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Ennek az alkalmazásnak nincs maximum szükséges Nextcloud verziója megadva. A Nextcloud 11-et követően ez hibát fog okozni.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Ha támogatni szeretnéd a projektet \n\t\tcsatlakozz a fejlesztéshez\n\t\tvagy\n\t\tsegítsd a többi felhasználót!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Fejlesztve a {communityopen}Nextcloud közösség{linkclose} által, a {githubopen}forráskód{linkclose} az {licenseopen}AGPL{linkclose} licensz alá tartozik." + "Last Login" : "Utolsó bejelentkezés" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/hy.js b/settings/l10n/hy.js index 0f45f06c9c415b2dee0ec08acb92508216b451b4..b97727b3be23f09a31f767788b1569da507f21d2 100644 --- a/settings/l10n/hy.js +++ b/settings/l10n/hy.js @@ -24,7 +24,6 @@ OC.L10N.register( "Username" : "Օգտանուն", "Other" : "Այլ", "Language changed" : "Լեզուն փոխվեց", - "Group" : "Խումբ", - "Updates" : "Թարմացումներ" + "Group" : "Խումբ" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/hy.json b/settings/l10n/hy.json index 510df5f3d723c0ff2e1e3608f79090c07b7a0b36..7c007f317a19a2e10b95b0072643b246948b6b1d 100644 --- a/settings/l10n/hy.json +++ b/settings/l10n/hy.json @@ -22,7 +22,6 @@ "Username" : "Օգտանուն", "Other" : "Այլ", "Language changed" : "Լեզուն փոխվեց", - "Group" : "Խումբ", - "Updates" : "Թարմացումներ" + "Group" : "Խումբ" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/ia.js b/settings/l10n/ia.js new file mode 100644 index 0000000000000000000000000000000000000000..d5e36dc56dd6c0408102ef6b73751ce64b6bb2f2 --- /dev/null +++ b/settings/l10n/ia.js @@ -0,0 +1,10 @@ +OC.L10N.register( + "settings", + { + "Enabled" : "Activate", + "Wrong password" : "Contrasigno incorrecte", + "Saved" : "Salveguardate", + "Authentication error" : "Error in authentication", + "Email sent" : "Message de e-posta inviate" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/ia.json b/settings/l10n/ia.json new file mode 100644 index 0000000000000000000000000000000000000000..eb2c0321440ce7d37a5e379de062b5bbd2d054fa --- /dev/null +++ b/settings/l10n/ia.json @@ -0,0 +1,8 @@ +{ "translations": { + "Enabled" : "Activate", + "Wrong password" : "Contrasigno incorrecte", + "Saved" : "Salveguardate", + "Authentication error" : "Error in authentication", + "Email sent" : "Message de e-posta inviate" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +} \ No newline at end of file diff --git a/settings/l10n/id.js b/settings/l10n/id.js index 96f5c162a5be594e98f7d3f06a85f80002e2489c..42829f7a6793a3d49a28d9e4cccf106e149b8724 100644 --- a/settings/l10n/id.js +++ b/settings/l10n/id.js @@ -36,9 +36,6 @@ OC.L10N.register( "Unable to change mail address" : "Tidak dapat mengubah alamat email", "Email saved" : "Email disimpan", "Couldn't remove app." : "Tidak dapat menghapus aplikasi.", - "Admins can't remove themself from the admin group" : "Admin tidak dapat menghapus dirinya sendiri dari grup admin", - "Unable to add user to group %s" : "Tidak dapat menambahkan pengguna ke grup %s", - "Unable to remove user from group %s" : "Tidak dapat menghapus pengguna dari grup %s", "Couldn't update app." : "Tidak dapat memperbarui aplikasi.", "Add trusted domain" : "Tambah domain terpercaya", "Migration in progress. Please wait until the migration is finished" : "Migrasi sedang dalam proses. Mohon tunggu sampai migrasi selesai.", @@ -53,7 +50,6 @@ OC.L10N.register( "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Aplikasi resmi dikembangkan oleh dan didalam komunitas. Mereka menawarkan fungsi sentral dan siap untuk penggunaan produksi.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Aplikasi tersetujui dikembangkan oleh pengembang terpercaya dan telah lulus pemeriksaan keamanan. Mereka secara aktif dipelihara direpositori kode terbuka dan pemelihara sudah memastikan mereka stabil untuk penggunaan normal.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Apl ini belum diperiksa masalah keamanannya dan masih baru atau biasanya tidak stabil. Instal dengan resiko Anda sendiri.", - "Please wait...." : "Mohon tunggu....", "Error while disabling app" : "Terjadi kesalahan saat menonaktifkan aplikasi", "Disable" : "Nonaktifkan", "Enable" : "Aktifkan", @@ -218,7 +214,6 @@ OC.L10N.register( "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Aplikasi ini tidak mempunyai versi maksimum Nextcloud yang ditetapkan. Di masa depan nanti ini akan menjadi kesalahan.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Apl ini tidak dapat diinstal karena ketergantungan berikut belum terpenuhi:", "Enable only for specific groups" : "Aktifkan hanya untuk grup tertentu", - "Uninstall App" : "Copot aplikasi", "SSL Root Certificates" : "Sertifikat Root SSL", "Common Name" : "Nama umum", "Valid until" : "Berlaku sampai", @@ -294,7 +289,11 @@ OC.L10N.register( "Default" : "Default", "log-level out of allowed range" : "level-log melebihi batas yang diizinkan", "Language changed" : "Bahasa telah diubah", + "Admins can't remove themself from the admin group" : "Admin tidak dapat menghapus dirinya sendiri dari grup admin", + "Unable to add user to group %s" : "Tidak dapat menambahkan pengguna ke grup %s", + "Unable to remove user from group %s" : "Tidak dapat menghapus pengguna dari grup %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Apakah Anda yakin ingin menambahkan \"{domain}\" sebagai domain terpercaya?", + "Please wait...." : "Mohon tunggu....", "iPhone" : "iPhone", "add group" : "tambah grup", "Everything (fatal issues, errors, warnings, info, debug)" : "Semuanya (Masalah fatal, kesalahan, peringatan, info, debug)", @@ -314,6 +313,7 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Terutama saat menggunakan klien desktop untuk sinkronisasi berkas, penggunaan SQLite tidak disarankan.", "Experimental applications ahead" : "Aplikasi percobaan terdepan", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Aplikasi percobaan belum diperiksa untuk masalah keamanan, baru atau dikenal tidak stabil dan dalam proses pengembangan. Menginstalnya dapat menyebabkan kehilangan data atau penerobosan keamanan.", + "Uninstall App" : "Copot aplikasi", "Enable experimental apps" : "Aktifkan aplikasi percobaan", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hai,

    sekedar memberi tahu bahwa Andaa sekarang memiliki akun %s.

    Nama Pengguna Anda: %s
    Akses di: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hai,\n\nsekedar memberi tahu bahwa Andaa sekarang memiliki akun %s.\n\nNama Pengguna Anda: %s\nAkses di: %s\n", @@ -324,24 +324,6 @@ OC.L10N.register( "Group Admin for" : "Grup Admin untuk", "Storage Location" : "Lokasi Penyimpanan", "User Backend" : "Backend Pengguna", - "Last Login" : "Log Masuk Terakhir", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Penyimpanan Eksternal", - "Updates" : "Pembaruan", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Aplikasi resmi dikembangkan oleh dan didalam komunitas Nextcloud. Mereka menawarkan fungsi sentral untuk Nextcloud dan siap untuk penggunaan produksi.", - "No apps found for \"{query}\"" : "Tidak ditemukan aplikasi untuk \"{query}\"", - "An error occurred: {message}" : "Sebuah kesalahan yang muncul: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Mohon cek dokumentasi instalasi↗ untuk catatan konfigurasi php dan konfigurasi PHP server Anda, khususnya saat menggunakan php-fpm.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Database Anda tidak dijalankan dengan isolasi transaksi level \"READ COMMITED\". Ini dapat menyebabkan masalah saat banyak tindakan dilakukan secara paralel.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Server Anda dijalankan di Microsoft Windows. Kami sangat menyarankan Linux untuk mendapatkan pengalaman pengguna yang optimal.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Penguncian berkas transaksional nonaktif, ini dapat menyebabkan masalah dengan kondisi tertentu. Aktifkan 'filelocking.enabled' dalam config.php untuk menghindari masalah ini. Lihat dokumentasi ↗ untuk informasi lebih lanjut.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Mohon cek petunjuk instalasi ↗, dan cek masalah atau peringatan di log.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Enkripsi saja tidak dapat menjamin keamanan sistem. Silakan lihat dokumentasi Nextcloud untuk informasi lebih lanjut dalam bagaimana aplikasi enkripsi bekerja, dan kasus pendukung.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Untuk migrasi ke database lain, gunakan alat command line: 'occ db:convert-type', atau lihat dokumentasi ↗.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Aplikasi ini tidak mempunyai versi minimum Nextcloud yang ditetapkan. Ini akan menjadi kesalahan dalam Nextcloud 11 atau versi yang lebih tinggi.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Aplikasi ini tidak mempunyai versi maksimum Nextcloud yang ditetapkan. Ini akan menjadi kesalahan dalam Nextcloud 11 atau versi yang lebih tinggi.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Apabila Anda ingin mendukung proyek ini\n\t\tikuti pengembangannya\n\t\tatau\n\t\tbantu pengguna lainnya!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Dikembangkan oleh {commmunityopen}komunitas Nextcloud{linkclose}, {githubopen}sumber kode{linkclose} dilisensikan dibawah {licenseopen}AGPL{linkclose}." + "Last Login" : "Log Masuk Terakhir" }, "nplurals=1; plural=0;"); diff --git a/settings/l10n/id.json b/settings/l10n/id.json index bca26730533b7d299054e9ddcb20ae331158ffad..4b9ed65bd57fd396bfdc213cfd3e383bf3b054d9 100644 --- a/settings/l10n/id.json +++ b/settings/l10n/id.json @@ -34,9 +34,6 @@ "Unable to change mail address" : "Tidak dapat mengubah alamat email", "Email saved" : "Email disimpan", "Couldn't remove app." : "Tidak dapat menghapus aplikasi.", - "Admins can't remove themself from the admin group" : "Admin tidak dapat menghapus dirinya sendiri dari grup admin", - "Unable to add user to group %s" : "Tidak dapat menambahkan pengguna ke grup %s", - "Unable to remove user from group %s" : "Tidak dapat menghapus pengguna dari grup %s", "Couldn't update app." : "Tidak dapat memperbarui aplikasi.", "Add trusted domain" : "Tambah domain terpercaya", "Migration in progress. Please wait until the migration is finished" : "Migrasi sedang dalam proses. Mohon tunggu sampai migrasi selesai.", @@ -51,7 +48,6 @@ "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Aplikasi resmi dikembangkan oleh dan didalam komunitas. Mereka menawarkan fungsi sentral dan siap untuk penggunaan produksi.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Aplikasi tersetujui dikembangkan oleh pengembang terpercaya dan telah lulus pemeriksaan keamanan. Mereka secara aktif dipelihara direpositori kode terbuka dan pemelihara sudah memastikan mereka stabil untuk penggunaan normal.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Apl ini belum diperiksa masalah keamanannya dan masih baru atau biasanya tidak stabil. Instal dengan resiko Anda sendiri.", - "Please wait...." : "Mohon tunggu....", "Error while disabling app" : "Terjadi kesalahan saat menonaktifkan aplikasi", "Disable" : "Nonaktifkan", "Enable" : "Aktifkan", @@ -216,7 +212,6 @@ "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Aplikasi ini tidak mempunyai versi maksimum Nextcloud yang ditetapkan. Di masa depan nanti ini akan menjadi kesalahan.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Apl ini tidak dapat diinstal karena ketergantungan berikut belum terpenuhi:", "Enable only for specific groups" : "Aktifkan hanya untuk grup tertentu", - "Uninstall App" : "Copot aplikasi", "SSL Root Certificates" : "Sertifikat Root SSL", "Common Name" : "Nama umum", "Valid until" : "Berlaku sampai", @@ -292,7 +287,11 @@ "Default" : "Default", "log-level out of allowed range" : "level-log melebihi batas yang diizinkan", "Language changed" : "Bahasa telah diubah", + "Admins can't remove themself from the admin group" : "Admin tidak dapat menghapus dirinya sendiri dari grup admin", + "Unable to add user to group %s" : "Tidak dapat menambahkan pengguna ke grup %s", + "Unable to remove user from group %s" : "Tidak dapat menghapus pengguna dari grup %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Apakah Anda yakin ingin menambahkan \"{domain}\" sebagai domain terpercaya?", + "Please wait...." : "Mohon tunggu....", "iPhone" : "iPhone", "add group" : "tambah grup", "Everything (fatal issues, errors, warnings, info, debug)" : "Semuanya (Masalah fatal, kesalahan, peringatan, info, debug)", @@ -312,6 +311,7 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Terutama saat menggunakan klien desktop untuk sinkronisasi berkas, penggunaan SQLite tidak disarankan.", "Experimental applications ahead" : "Aplikasi percobaan terdepan", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Aplikasi percobaan belum diperiksa untuk masalah keamanan, baru atau dikenal tidak stabil dan dalam proses pengembangan. Menginstalnya dapat menyebabkan kehilangan data atau penerobosan keamanan.", + "Uninstall App" : "Copot aplikasi", "Enable experimental apps" : "Aktifkan aplikasi percobaan", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hai,

    sekedar memberi tahu bahwa Andaa sekarang memiliki akun %s.

    Nama Pengguna Anda: %s
    Akses di: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hai,\n\nsekedar memberi tahu bahwa Andaa sekarang memiliki akun %s.\n\nNama Pengguna Anda: %s\nAkses di: %s\n", @@ -322,24 +322,6 @@ "Group Admin for" : "Grup Admin untuk", "Storage Location" : "Lokasi Penyimpanan", "User Backend" : "Backend Pengguna", - "Last Login" : "Log Masuk Terakhir", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Penyimpanan Eksternal", - "Updates" : "Pembaruan", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Aplikasi resmi dikembangkan oleh dan didalam komunitas Nextcloud. Mereka menawarkan fungsi sentral untuk Nextcloud dan siap untuk penggunaan produksi.", - "No apps found for \"{query}\"" : "Tidak ditemukan aplikasi untuk \"{query}\"", - "An error occurred: {message}" : "Sebuah kesalahan yang muncul: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Mohon cek dokumentasi instalasi↗ untuk catatan konfigurasi php dan konfigurasi PHP server Anda, khususnya saat menggunakan php-fpm.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Database Anda tidak dijalankan dengan isolasi transaksi level \"READ COMMITED\". Ini dapat menyebabkan masalah saat banyak tindakan dilakukan secara paralel.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Server Anda dijalankan di Microsoft Windows. Kami sangat menyarankan Linux untuk mendapatkan pengalaman pengguna yang optimal.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Penguncian berkas transaksional nonaktif, ini dapat menyebabkan masalah dengan kondisi tertentu. Aktifkan 'filelocking.enabled' dalam config.php untuk menghindari masalah ini. Lihat dokumentasi ↗ untuk informasi lebih lanjut.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Mohon cek petunjuk instalasi ↗, dan cek masalah atau peringatan di log.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Enkripsi saja tidak dapat menjamin keamanan sistem. Silakan lihat dokumentasi Nextcloud untuk informasi lebih lanjut dalam bagaimana aplikasi enkripsi bekerja, dan kasus pendukung.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Untuk migrasi ke database lain, gunakan alat command line: 'occ db:convert-type', atau lihat dokumentasi ↗.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Aplikasi ini tidak mempunyai versi minimum Nextcloud yang ditetapkan. Ini akan menjadi kesalahan dalam Nextcloud 11 atau versi yang lebih tinggi.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Aplikasi ini tidak mempunyai versi maksimum Nextcloud yang ditetapkan. Ini akan menjadi kesalahan dalam Nextcloud 11 atau versi yang lebih tinggi.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Apabila Anda ingin mendukung proyek ini\n\t\tikuti pengembangannya\n\t\tatau\n\t\tbantu pengguna lainnya!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Dikembangkan oleh {commmunityopen}komunitas Nextcloud{linkclose}, {githubopen}sumber kode{linkclose} dilisensikan dibawah {licenseopen}AGPL{linkclose}." + "Last Login" : "Log Masuk Terakhir" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/settings/l10n/is.js b/settings/l10n/is.js index 356ca42c2dd572ae122761b903c28970f7608b59..dd3906735893c9d7ace8372d2ca2d14f0ce3ba32 100644 --- a/settings/l10n/is.js +++ b/settings/l10n/is.js @@ -36,9 +36,6 @@ OC.L10N.register( "Unable to change mail address" : "Get ekki breytt tölvupóstfangi", "Email saved" : "Tölvupóstfang vistað", "Couldn't remove app." : "Gat ekki fjarlægt forrit.", - "Admins can't remove themself from the admin group" : "Stjórnendur geta ekki fjarlægt sjálfa sig úr stjórnendahóp", - "Unable to add user to group %s" : "Ekki tókst að bæta notanda við hópinn %s", - "Unable to remove user from group %s" : "Ekki tókst að fjarlægja notanda úr hópnum %s", "Couldn't update app." : "Gat ekki uppfært forrit.", "Add trusted domain" : "Bæta við treystu léni", "Migration in progress. Please wait until the migration is finished" : "Yfirfærsla er í gangi. Dokaðu við þar til henni er lokið", @@ -54,7 +51,6 @@ OC.L10N.register( "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Opinber forrit eru þróuð af og innan samfélagsins. Þau bjóða upp á ýmsa kjarnaeiginleika og eru tilbúin til notkunar í raunvinnslu.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Samþykkt forrit eru þróuð af treystum forriturum og hafa gengist undir lauslegar öryggisprófanir. Þau eru í virku viðhaldi í opnum hugbúnaðarsöfnum og umsjónarmenn þeirra dæma þau nógu stöðug til notkunar í allri venjulegri vinnslu.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Þetta forrit hefur ekki verið öryggisprófað, er nýtt erða þekkt fyrir ótöðugleika við vissar aðstæður. Uppsetning er á þína ábyrgð.", - "Please wait...." : "Andartak....", "Error while disabling app" : "Villa við að afvirkja forrit", "Disable" : "Gera óvirkt", "Enable" : "Virkja", @@ -217,7 +213,6 @@ OC.L10N.register( "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Þetta vorrit er ekki með tiltekna neina hámarksútgáfu Nextcloud. Þetta mun gefa villu í framtíðinni.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Ekki var hægt að setja upp forritið þar sem eftirfarandi kerfiskröfur eru ekki uppfylltar:", "Enable only for specific groups" : "Einungis fyrir sérstaka hópa", - "Uninstall App" : "Fjarlægja/Henda út forriti", "SSL Root Certificates" : "SSL-rótarskilríki", "Common Name" : "Almennt heiti", "Valid until" : "Gildir til", @@ -298,7 +293,11 @@ OC.L10N.register( "Default" : "Sjálfgefið", "log-level out of allowed range" : "annálsstig utan leyfðra marka", "Language changed" : "Tungumáli breytt", + "Admins can't remove themself from the admin group" : "Stjórnendur geta ekki fjarlægt sjálfa sig úr stjórnendahóp", + "Unable to add user to group %s" : "Ekki tókst að bæta notanda við hópinn %s", + "Unable to remove user from group %s" : "Ekki tókst að fjarlægja notanda úr hópnum %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ertu viss um að þú viljir bæta \"{domain}\" við sem treystu léni?", + "Please wait...." : "Andartak....", "iPhone" : "iPhone", "add group" : "bæta við hópi", "Everything (fatal issues, errors, warnings, info, debug)" : "Allt (aflúsun, upplýsingar, viðvaranir, villur og alvarlegar aðvaranir)", @@ -318,6 +317,7 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Sérstaklega þegar tölvu forrit er notað til samræmingar þá er ekki mælt með notkunn SQLite.", "Experimental applications ahead" : "Forrit á tilraunastigi fyrst", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Tilraunaforrit eru ekki yfirfarin með tilliti til öryggisvandamála, þau eru þekkt fyrir að vera óstöðug og þróast hratt. Uppsetning þeirra getur valdið gagnatapi og öryggisbrestum.", + "Uninstall App" : "Fjarlægja/Henda út forriti", "Enable experimental apps" : "Virkja forrit á tilraunastigi", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hæ þú,

    bara að láta þig vita að þú átt núna %s aðgang.

    Notandanafnið þitt: %s
    Tengstu honum: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hæ þú,\n\nbara að láta þig vita að þú átt núna %s aðgang.\n\nNotandanafnið þitt: %s\nTengstu honum: %s\n\n", @@ -329,23 +329,6 @@ OC.L10N.register( "Group Admin for" : "Hópstjóri fyrir", "Storage Location" : "Staðsetning gagnageymslu", "User Backend" : "Bakendi notanda", - "Last Login" : "Síðasta innskráning", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Ytri gagnageymsla", - "Updates" : "Uppfærslur", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Opinber forrit eru þróuð af og innan Nextcloud samfélagsins. Þau virka með kjarnaeiginleikum Nextcloud og eru tilbúin til notkunar í raunvinnslu.", - "No apps found for \"{query}\"" : "Engin forrit fundust fyrir \"{query}\"", - "An error occurred: {message}" : "Villa kom upp: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Endilega skoðaðu hjálparskjöl uppsetningarinnar ↗ varðandi athugasemdir vegna uppsetningar PHP og sjálfa uppsetningu PHP-þjónsins, Sérstaklega ef þú notar php-fpm.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Gagnagrunnurinn keyrir ekki með \"READ COMMITED\" færsluaðgreiningarstiginu. Þetta getur valdið vandamálum þegar margar aðgerðir eru keyrðar í einu.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Þjónninn þinn er keyrandi á Microsoft Windows. Við mælum sterklega með Linux til að njóta sem best allra eiginleika fyrir notendurna.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Yfirfarðu vandlega uppsetningarleiðbeiningarnar ↗, og athugaðu hvort nokkrar villumeldingar eða aðvaranir séu í annálnum.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Dulritun ein og sér tryggir ekki öryggi kerfisins. Endilega skoðaðu hjálparskjölin um hvernig dulritunarforritið virkar, og dæmi um hvaða uppsetningar eru studdar.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Til að yfirfæra í annan gagnagrunn skaltu nota skipanalínutólið: 'occ db:convert-type', eða lesa hjálparskjölin ↗.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Þetta vorrit er ekki með tiltekna neina lágmarksútgáfu Nextcloud. Þetta mun gefa villu í Nextcloud 11 og nýrri.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Þetta vorrit er ekki með tiltekna neina hámarksútgáfu Nextcloud. Þetta mun gefa villu í Nextcloud 11 og nýrri.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Ef þú vilt styðja við verkefnið\n\t\ttaktu þátt í þróuninni\n\t\teða\n\t\thjálpaðu öðrum notendum!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Þróað af {communityopen}Nextcloud samfélaginu{linkclose}, {githubopen}grunnkóðinn{linkclose} er gefinn út með {licenseopen}AGPL{linkclose} notkunarleyfinu." + "Last Login" : "Síðasta innskráning" }, "nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"); diff --git a/settings/l10n/is.json b/settings/l10n/is.json index b4df1b0e76f6af19be09f2cd1d55bfd8d2922079..f5bf0bee0b9ab00a91b5f7aa082dc07c5ea68832 100644 --- a/settings/l10n/is.json +++ b/settings/l10n/is.json @@ -34,9 +34,6 @@ "Unable to change mail address" : "Get ekki breytt tölvupóstfangi", "Email saved" : "Tölvupóstfang vistað", "Couldn't remove app." : "Gat ekki fjarlægt forrit.", - "Admins can't remove themself from the admin group" : "Stjórnendur geta ekki fjarlægt sjálfa sig úr stjórnendahóp", - "Unable to add user to group %s" : "Ekki tókst að bæta notanda við hópinn %s", - "Unable to remove user from group %s" : "Ekki tókst að fjarlægja notanda úr hópnum %s", "Couldn't update app." : "Gat ekki uppfært forrit.", "Add trusted domain" : "Bæta við treystu léni", "Migration in progress. Please wait until the migration is finished" : "Yfirfærsla er í gangi. Dokaðu við þar til henni er lokið", @@ -52,7 +49,6 @@ "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Opinber forrit eru þróuð af og innan samfélagsins. Þau bjóða upp á ýmsa kjarnaeiginleika og eru tilbúin til notkunar í raunvinnslu.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Samþykkt forrit eru þróuð af treystum forriturum og hafa gengist undir lauslegar öryggisprófanir. Þau eru í virku viðhaldi í opnum hugbúnaðarsöfnum og umsjónarmenn þeirra dæma þau nógu stöðug til notkunar í allri venjulegri vinnslu.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Þetta forrit hefur ekki verið öryggisprófað, er nýtt erða þekkt fyrir ótöðugleika við vissar aðstæður. Uppsetning er á þína ábyrgð.", - "Please wait...." : "Andartak....", "Error while disabling app" : "Villa við að afvirkja forrit", "Disable" : "Gera óvirkt", "Enable" : "Virkja", @@ -215,7 +211,6 @@ "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Þetta vorrit er ekki með tiltekna neina hámarksútgáfu Nextcloud. Þetta mun gefa villu í framtíðinni.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Ekki var hægt að setja upp forritið þar sem eftirfarandi kerfiskröfur eru ekki uppfylltar:", "Enable only for specific groups" : "Einungis fyrir sérstaka hópa", - "Uninstall App" : "Fjarlægja/Henda út forriti", "SSL Root Certificates" : "SSL-rótarskilríki", "Common Name" : "Almennt heiti", "Valid until" : "Gildir til", @@ -296,7 +291,11 @@ "Default" : "Sjálfgefið", "log-level out of allowed range" : "annálsstig utan leyfðra marka", "Language changed" : "Tungumáli breytt", + "Admins can't remove themself from the admin group" : "Stjórnendur geta ekki fjarlægt sjálfa sig úr stjórnendahóp", + "Unable to add user to group %s" : "Ekki tókst að bæta notanda við hópinn %s", + "Unable to remove user from group %s" : "Ekki tókst að fjarlægja notanda úr hópnum %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ertu viss um að þú viljir bæta \"{domain}\" við sem treystu léni?", + "Please wait...." : "Andartak....", "iPhone" : "iPhone", "add group" : "bæta við hópi", "Everything (fatal issues, errors, warnings, info, debug)" : "Allt (aflúsun, upplýsingar, viðvaranir, villur og alvarlegar aðvaranir)", @@ -316,6 +315,7 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Sérstaklega þegar tölvu forrit er notað til samræmingar þá er ekki mælt með notkunn SQLite.", "Experimental applications ahead" : "Forrit á tilraunastigi fyrst", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Tilraunaforrit eru ekki yfirfarin með tilliti til öryggisvandamála, þau eru þekkt fyrir að vera óstöðug og þróast hratt. Uppsetning þeirra getur valdið gagnatapi og öryggisbrestum.", + "Uninstall App" : "Fjarlægja/Henda út forriti", "Enable experimental apps" : "Virkja forrit á tilraunastigi", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hæ þú,

    bara að láta þig vita að þú átt núna %s aðgang.

    Notandanafnið þitt: %s
    Tengstu honum: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hæ þú,\n\nbara að láta þig vita að þú átt núna %s aðgang.\n\nNotandanafnið þitt: %s\nTengstu honum: %s\n\n", @@ -327,23 +327,6 @@ "Group Admin for" : "Hópstjóri fyrir", "Storage Location" : "Staðsetning gagnageymslu", "User Backend" : "Bakendi notanda", - "Last Login" : "Síðasta innskráning", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Ytri gagnageymsla", - "Updates" : "Uppfærslur", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Opinber forrit eru þróuð af og innan Nextcloud samfélagsins. Þau virka með kjarnaeiginleikum Nextcloud og eru tilbúin til notkunar í raunvinnslu.", - "No apps found for \"{query}\"" : "Engin forrit fundust fyrir \"{query}\"", - "An error occurred: {message}" : "Villa kom upp: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Endilega skoðaðu hjálparskjöl uppsetningarinnar ↗ varðandi athugasemdir vegna uppsetningar PHP og sjálfa uppsetningu PHP-þjónsins, Sérstaklega ef þú notar php-fpm.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Gagnagrunnurinn keyrir ekki með \"READ COMMITED\" færsluaðgreiningarstiginu. Þetta getur valdið vandamálum þegar margar aðgerðir eru keyrðar í einu.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Þjónninn þinn er keyrandi á Microsoft Windows. Við mælum sterklega með Linux til að njóta sem best allra eiginleika fyrir notendurna.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Yfirfarðu vandlega uppsetningarleiðbeiningarnar ↗, og athugaðu hvort nokkrar villumeldingar eða aðvaranir séu í annálnum.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Dulritun ein og sér tryggir ekki öryggi kerfisins. Endilega skoðaðu hjálparskjölin um hvernig dulritunarforritið virkar, og dæmi um hvaða uppsetningar eru studdar.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Til að yfirfæra í annan gagnagrunn skaltu nota skipanalínutólið: 'occ db:convert-type', eða lesa hjálparskjölin ↗.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Þetta vorrit er ekki með tiltekna neina lágmarksútgáfu Nextcloud. Þetta mun gefa villu í Nextcloud 11 og nýrri.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Þetta vorrit er ekki með tiltekna neina hámarksútgáfu Nextcloud. Þetta mun gefa villu í Nextcloud 11 og nýrri.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Ef þú vilt styðja við verkefnið\n\t\ttaktu þátt í þróuninni\n\t\teða\n\t\thjálpaðu öðrum notendum!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Þróað af {communityopen}Nextcloud samfélaginu{linkclose}, {githubopen}grunnkóðinn{linkclose} er gefinn út með {licenseopen}AGPL{linkclose} notkunarleyfinu." + "Last Login" : "Síðasta innskráning" },"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);" } \ No newline at end of file diff --git a/settings/l10n/it.js b/settings/l10n/it.js index d81471d7a5faf977aecc4c08dafeee277f60bed8..727e98fa77414a00c3c126985ea67c15671ffb55 100644 --- a/settings/l10n/it.js +++ b/settings/l10n/it.js @@ -25,6 +25,7 @@ OC.L10N.register( "You need to set your user email before being able to send test emails." : "Devi impostare l'indirizzo del tuo utente prima di poter provare l'invio delle email.", "Invalid request" : "Richiesta non valida", "Invalid mail address" : "Indirizzo email non valido", + "No valid group selected" : "Nessun gruppo valido selezionato", "A user with that name already exists." : "Un utente con quel nome esiste già.", "Unable to create user." : "Impossibile creare l'utente.", "Your %s account was created" : "Il tuo account %s è stato creato", @@ -39,9 +40,6 @@ OC.L10N.register( "Email saved" : "Email salvata", "Password confirmation is required" : "La conferma della password è richiesta", "Couldn't remove app." : "Impossibile rimuovere l'applicazione.", - "Admins can't remove themself from the admin group" : "Gli amministratori non possono rimuovere se stessi dal gruppo di amministrazione", - "Unable to add user to group %s" : "Impossibile aggiungere l'utente al gruppo %s", - "Unable to remove user from group %s" : "Impossibile rimuovere l'utente dal gruppo %s", "Couldn't update app." : "Impossibile aggiornate l'applicazione.", "Are you really sure you want add {domain} as trusted domain?" : "Sei davvero sicuro di voler aggiungere {domain} come dominio attendibile?", "Add trusted domain" : "Aggiungi dominio attendibile", @@ -58,7 +56,7 @@ OC.L10N.register( "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Le applicazioni ufficiali sono sviluppate dalla comunità. Esse offrono nuove funzionalità e sono pronte per l'uso in produzione.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Le applicazioni approvate sono sviluppate da sviluppatori affidabili e hanno passato un rapido controllo di sicurezza. Sono attivamente mantenute in un deposito aperto del codice e i loro responsabili le ritengono pronte sia per un utilizzo casuale che per un utilizzo continuativo.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Questa applicazione non è stata sottoposta a controlli di sicurezza, è nuova o notoriamente instabile. Installala a tuo rischio.", - "Please wait...." : "Attendere...", + "Enabling app …" : "Abilitazione applicazione...", "Error while disabling app" : "Errore durante la disattivazione", "Disable" : "Disabilita", "Enable" : "Abilita", @@ -125,6 +123,8 @@ OC.L10N.register( "undo" : "annulla", "never" : "mai", "deleted {userName}" : "{userName} eliminato", + "Unable to add user to group {group}" : "Impossibile aggiungere l'utente al gruppo {group}", + "Unable to remove user from group {group}" : "Impossibile rimuovere l'utente dal gruppo {group}", "Add group" : "Aggiungi gruppo", "Invalid quota value \"{val}\"" : "Valore di quota \"{val}\" non valido", "no group" : "nessun gruppo", @@ -247,7 +247,7 @@ OC.L10N.register( "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Questa applicazione non contiene l'informazione della versione massima di Nextcloud richiesta. In futuro ciò sarà considerato un errore.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Questa applicazione non può essere installata perché le seguenti dipendenze non sono soddisfatte:", "Enable only for specific groups" : "Abilita solo per gruppi specifici", - "Uninstall App" : "Disinstalla applicazione", + "Uninstall app" : "Disinstalla applicazione", "SSL Root Certificates" : "Certificati radice SSL", "Common Name" : "Nome comune", "Valid until" : "Valido fino al", @@ -341,7 +341,11 @@ OC.L10N.register( "Default" : "Predefinito", "log-level out of allowed range" : "livello di log fuori dall'intervallo consentito", "Language changed" : "Lingua modificata", + "Admins can't remove themself from the admin group" : "Gli amministratori non possono rimuovere se stessi dal gruppo di amministrazione", + "Unable to add user to group %s" : "Impossibile aggiungere l'utente al gruppo %s", + "Unable to remove user from group %s" : "Impossibile rimuovere l'utente dal gruppo %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Sei sicuro di voler aggiungere \"{domain}\" come dominio attendibile?", + "Please wait...." : "Attendere...", "iPhone" : "iPhone", "add group" : "aggiungi gruppo", "Everything (fatal issues, errors, warnings, info, debug)" : "Tutto (problemi gravi, errori, avvisi, informazioni, debug)", @@ -361,6 +365,7 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "In particolar modo, quando si utilizza il client desktop per la sincronizzazione dei file, l'uso di SQLite è sconsigliato.", "Experimental applications ahead" : "Prima le applicazioni sperimentali", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Le applicazioni sperimentali non sono sottoposte a controlli di sicurezza, sono nuove o notoriamente instabili e sotto sviluppo intensivo. La loro installazione può causare perdite di dati o problemi di sicurezza.", + "Uninstall App" : "Disinstalla applicazione", "Enable experimental apps" : "Abilita le applicazioni sperimentali", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Ciao,

    volevo informarti che ora hai un account %s.

    Il tuo nome utente: %s
    Accedi: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Ciao,\n\nvolevo informarti che ora hai un account %s.\n\nIl tuo nome utente: %s\nAccedi: %s\n\n", @@ -372,24 +377,6 @@ OC.L10N.register( "Group Admin for" : "Gruppo di amministrazione per", "Storage Location" : "Posizione di archiviazione", "User Backend" : "Motore utente", - "Last Login" : "Ultimo accesso", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Archiviazione esterna", - "Updates" : "Aggiornamenti", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Le applicazioni ufficiali sono sviluppate dalla comunità di Nextcloud. Esse offrono le funzionalità principali di Nextcloud e sono pronte per l'uso in produzione.", - "No apps found for \"{query}\"" : "Nessuna applicazione trovata per \"{query}\"", - "An error occurred: {message}" : "Si è verificato un errore: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Controlla la documentazione di installazione↗ per le note di configurazione di php e la configurazione del tuo server, in particolare quando utilizzi php-fpm.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Il tuo database non è in esecuzione con il livello di isolamento delle transazioni \"READ COMMITTED\". Ciò può causare problemi quando diverse azioni sono eseguite in parallelo.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Il tuo server è in esecuzione su Microsoft Windows. Consigliamo vivamente Linux per un'esperienza utente ottimale.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Il blocco del file transazionale è disabilitato, ciò potrebbe comportare problemi di race condition. Abilita 'filelocking.enabled' nel config-php per evitare questi problemi. Vedi la documentazione ↗ per ulteriori informazioni.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Leggi attentamente le guide d'installazione ↗, e controlla gli errori o gli avvisi nel log.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "La sola cifratura non garantisce la sicurezza del sistema. Leggi la documentazione di Nextcloud per ulteriori informazioni sul funzionamento dell'applicazione di cifratura e sui casi d'uso supportati.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Per migrare a un altro database, usa lo strumento da riga di comando: 'occ db:convert-type', o leggi la documentazione ↗.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Questa applicazione non contiene l'informazione della versione minima di Nextcloud richiesta. In Nextcloud 11 e successive, ciò sarà considerato un errore.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Questa applicazione non contiene l'informazione della versione massima di Nextcloud richiesta. In Nextcloud 11 e successive, ciò sarà considerato un errore.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Se desideri supportare il progetto\n\t\tcontribuisci allo sviluppo\n\t\to\n\t\taiuta gli altri utenti!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Sviluppato dalla {communityopen}comunità di Nextcloud{linkclose}, il {githubopen}codice sorgente{linkclose} è rilasciato nei termini della licenza {licenseopen}AGPL{linkclose}." + "Last Login" : "Ultimo accesso" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/it.json b/settings/l10n/it.json index 44437586f9d6182a8cf4e390f353da72a5e6d521..01b584d12d02be3ab3062bcc5600c02b53dcc94f 100644 --- a/settings/l10n/it.json +++ b/settings/l10n/it.json @@ -23,6 +23,7 @@ "You need to set your user email before being able to send test emails." : "Devi impostare l'indirizzo del tuo utente prima di poter provare l'invio delle email.", "Invalid request" : "Richiesta non valida", "Invalid mail address" : "Indirizzo email non valido", + "No valid group selected" : "Nessun gruppo valido selezionato", "A user with that name already exists." : "Un utente con quel nome esiste già.", "Unable to create user." : "Impossibile creare l'utente.", "Your %s account was created" : "Il tuo account %s è stato creato", @@ -37,9 +38,6 @@ "Email saved" : "Email salvata", "Password confirmation is required" : "La conferma della password è richiesta", "Couldn't remove app." : "Impossibile rimuovere l'applicazione.", - "Admins can't remove themself from the admin group" : "Gli amministratori non possono rimuovere se stessi dal gruppo di amministrazione", - "Unable to add user to group %s" : "Impossibile aggiungere l'utente al gruppo %s", - "Unable to remove user from group %s" : "Impossibile rimuovere l'utente dal gruppo %s", "Couldn't update app." : "Impossibile aggiornate l'applicazione.", "Are you really sure you want add {domain} as trusted domain?" : "Sei davvero sicuro di voler aggiungere {domain} come dominio attendibile?", "Add trusted domain" : "Aggiungi dominio attendibile", @@ -56,7 +54,7 @@ "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Le applicazioni ufficiali sono sviluppate dalla comunità. Esse offrono nuove funzionalità e sono pronte per l'uso in produzione.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Le applicazioni approvate sono sviluppate da sviluppatori affidabili e hanno passato un rapido controllo di sicurezza. Sono attivamente mantenute in un deposito aperto del codice e i loro responsabili le ritengono pronte sia per un utilizzo casuale che per un utilizzo continuativo.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Questa applicazione non è stata sottoposta a controlli di sicurezza, è nuova o notoriamente instabile. Installala a tuo rischio.", - "Please wait...." : "Attendere...", + "Enabling app …" : "Abilitazione applicazione...", "Error while disabling app" : "Errore durante la disattivazione", "Disable" : "Disabilita", "Enable" : "Abilita", @@ -123,6 +121,8 @@ "undo" : "annulla", "never" : "mai", "deleted {userName}" : "{userName} eliminato", + "Unable to add user to group {group}" : "Impossibile aggiungere l'utente al gruppo {group}", + "Unable to remove user from group {group}" : "Impossibile rimuovere l'utente dal gruppo {group}", "Add group" : "Aggiungi gruppo", "Invalid quota value \"{val}\"" : "Valore di quota \"{val}\" non valido", "no group" : "nessun gruppo", @@ -245,7 +245,7 @@ "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Questa applicazione non contiene l'informazione della versione massima di Nextcloud richiesta. In futuro ciò sarà considerato un errore.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Questa applicazione non può essere installata perché le seguenti dipendenze non sono soddisfatte:", "Enable only for specific groups" : "Abilita solo per gruppi specifici", - "Uninstall App" : "Disinstalla applicazione", + "Uninstall app" : "Disinstalla applicazione", "SSL Root Certificates" : "Certificati radice SSL", "Common Name" : "Nome comune", "Valid until" : "Valido fino al", @@ -339,7 +339,11 @@ "Default" : "Predefinito", "log-level out of allowed range" : "livello di log fuori dall'intervallo consentito", "Language changed" : "Lingua modificata", + "Admins can't remove themself from the admin group" : "Gli amministratori non possono rimuovere se stessi dal gruppo di amministrazione", + "Unable to add user to group %s" : "Impossibile aggiungere l'utente al gruppo %s", + "Unable to remove user from group %s" : "Impossibile rimuovere l'utente dal gruppo %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Sei sicuro di voler aggiungere \"{domain}\" come dominio attendibile?", + "Please wait...." : "Attendere...", "iPhone" : "iPhone", "add group" : "aggiungi gruppo", "Everything (fatal issues, errors, warnings, info, debug)" : "Tutto (problemi gravi, errori, avvisi, informazioni, debug)", @@ -359,6 +363,7 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "In particolar modo, quando si utilizza il client desktop per la sincronizzazione dei file, l'uso di SQLite è sconsigliato.", "Experimental applications ahead" : "Prima le applicazioni sperimentali", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Le applicazioni sperimentali non sono sottoposte a controlli di sicurezza, sono nuove o notoriamente instabili e sotto sviluppo intensivo. La loro installazione può causare perdite di dati o problemi di sicurezza.", + "Uninstall App" : "Disinstalla applicazione", "Enable experimental apps" : "Abilita le applicazioni sperimentali", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Ciao,

    volevo informarti che ora hai un account %s.

    Il tuo nome utente: %s
    Accedi: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Ciao,\n\nvolevo informarti che ora hai un account %s.\n\nIl tuo nome utente: %s\nAccedi: %s\n\n", @@ -370,24 +375,6 @@ "Group Admin for" : "Gruppo di amministrazione per", "Storage Location" : "Posizione di archiviazione", "User Backend" : "Motore utente", - "Last Login" : "Ultimo accesso", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Archiviazione esterna", - "Updates" : "Aggiornamenti", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Le applicazioni ufficiali sono sviluppate dalla comunità di Nextcloud. Esse offrono le funzionalità principali di Nextcloud e sono pronte per l'uso in produzione.", - "No apps found for \"{query}\"" : "Nessuna applicazione trovata per \"{query}\"", - "An error occurred: {message}" : "Si è verificato un errore: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Controlla la documentazione di installazione↗ per le note di configurazione di php e la configurazione del tuo server, in particolare quando utilizzi php-fpm.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Il tuo database non è in esecuzione con il livello di isolamento delle transazioni \"READ COMMITTED\". Ciò può causare problemi quando diverse azioni sono eseguite in parallelo.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Il tuo server è in esecuzione su Microsoft Windows. Consigliamo vivamente Linux per un'esperienza utente ottimale.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Il blocco del file transazionale è disabilitato, ciò potrebbe comportare problemi di race condition. Abilita 'filelocking.enabled' nel config-php per evitare questi problemi. Vedi la documentazione ↗ per ulteriori informazioni.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Leggi attentamente le guide d'installazione ↗, e controlla gli errori o gli avvisi nel log.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "La sola cifratura non garantisce la sicurezza del sistema. Leggi la documentazione di Nextcloud per ulteriori informazioni sul funzionamento dell'applicazione di cifratura e sui casi d'uso supportati.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Per migrare a un altro database, usa lo strumento da riga di comando: 'occ db:convert-type', o leggi la documentazione ↗.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Questa applicazione non contiene l'informazione della versione minima di Nextcloud richiesta. In Nextcloud 11 e successive, ciò sarà considerato un errore.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Questa applicazione non contiene l'informazione della versione massima di Nextcloud richiesta. In Nextcloud 11 e successive, ciò sarà considerato un errore.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Se desideri supportare il progetto\n\t\tcontribuisci allo sviluppo\n\t\to\n\t\taiuta gli altri utenti!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Sviluppato dalla {communityopen}comunità di Nextcloud{linkclose}, il {githubopen}codice sorgente{linkclose} è rilasciato nei termini della licenza {licenseopen}AGPL{linkclose}." + "Last Login" : "Ultimo accesso" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/ja.js b/settings/l10n/ja.js index 3c3dfb7b7bfbd58aa151f027df947bc8b915118f..3eac52bbfd5bdd9ad5b477edfa531863cffc5c3a 100644 --- a/settings/l10n/ja.js +++ b/settings/l10n/ja.js @@ -39,9 +39,6 @@ OC.L10N.register( "Email saved" : "メールアドレスを保存しました", "Password confirmation is required" : "パスワードの確認が必要です", "Couldn't remove app." : "アプリが削除できませんでした。", - "Admins can't remove themself from the admin group" : "管理者は自身を管理者グループから削除できません。", - "Unable to add user to group %s" : "ユーザーをグループ %s に追加できません", - "Unable to remove user from group %s" : "ユーザーをグループ %s から削除できません", "Couldn't update app." : "アプリをアップデートできませんでした。", "Are you really sure you want add {domain} as trusted domain?" : "{domain} を信頼できるドメインとして追加してもよろしいですか?", "Add trusted domain" : "信頼するドメイン名に追加", @@ -58,7 +55,7 @@ OC.L10N.register( "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "公式アプリは ownCloud コミュニティにより開発されています。公式アプリは ownCloud の中心的な機能を提供し、製品として可能です。", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "承認されたアプリは信頼された開発者により開発され、大まかなセキュリティチェックに合格しています。アプリは積極的にオープンソースコードレポジトリでメンテナンスされ、メンテナは通常の用途では安定していると考えます。", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "このアプリはセキュリティチェックされていません、新規アプリか安定性が確認されていないアプリです。自己責任でインストールしてください。", - "Please wait...." : "しばらくお待ちください...", + "Enabling app …" : "アプリを有効 ...", "Error while disabling app" : "アプリ無効化中にエラーが発生", "Disable" : "無効にする", "Enable" : "有効にする", @@ -125,6 +122,8 @@ OC.L10N.register( "undo" : "元に戻す", "never" : "なし", "deleted {userName}" : "{userName} を削除しました", + "Unable to add user to group {group}" : "ユーザーを {group} グループに追加できません", + "Unable to remove user from group {group}" : "ユーザーを {group} グループから削除できません", "Add group" : "グループを追加する", "Invalid quota value \"{val}\"" : "クオータ値 \"{val}\" は不正な値です。", "no group" : "グループなし", @@ -247,14 +246,16 @@ OC.L10N.register( "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "このアプリは Nextcloud バージョンの上限が指定されていません.将来、エラーが発生する可能性があります.", "This app cannot be installed because the following dependencies are not fulfilled:" : "次の依存関係が満たされないためこのアプリをインストールできません:", "Enable only for specific groups" : "特定のグループのみ有効に", - "Uninstall App" : "アプリをアンインストール", + "Uninstall app" : "アプリをアンインストール", "SSL Root Certificates" : "SSLルート証明書", "Common Name" : "コモンネーム", "Valid until" : "有効期限", "Issued By" : "発行元", "Valid until %s" : "%s まで有効", "Import root certificate" : "ルート証明書をインポート", + "Hey there,

    just letting you know that you now have a %s account.

    Your username: %s
    Access it: %s

    " : "こんにちは、

    あなたのアカウント %s が利用できるようになりました。

    ユーザー名: %s
    接続URL: %s

    ", "Cheers!" : "それでは!", + "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "こんにちは、\n\nあなたのアカウント %s が利用できるようになりました。\n\nユーザー名: %s\n接続URL: %s\n\n", "Administrator documentation" : "管理者ドキュメント", "Online documentation" : "オンラインドキュメント", "Forum" : "フォーラム", @@ -339,7 +340,11 @@ OC.L10N.register( "Default" : "デフォルト", "log-level out of allowed range" : "ログレベルが許可された範囲を超えています", "Language changed" : "言語が変更されました", + "Admins can't remove themself from the admin group" : "管理者は自身を管理者グループから削除できません。", + "Unable to add user to group %s" : "ユーザーをグループ %s に追加できません", + "Unable to remove user from group %s" : "ユーザーをグループ %s から削除できません", "Are you really sure you want add \"{domain}\" as trusted domain?" : "\"{domain}\" を信頼するドメインに追加してもよろしいでしょうか?", + "Please wait...." : "しばらくお待ちください...", "iPhone" : "iPhone", "add group" : "グループを追加する", "Everything (fatal issues, errors, warnings, info, debug)" : "すべて (致命的な問題、エラー、警告、情報、デバッグ)", @@ -359,6 +364,7 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "特にデスクトップクライアントをファイル同期に使用する場合,SQLiteは非推奨です.", "Experimental applications ahead" : "実験的なアプリケーションを試す", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "実験的なアプリは、脆弱性についてチェックされていませんし、不安定であったり、激しく開発中です。それらをインストールすると、データの損失やセキュリティ侵害を引き起こす可能性があります。", + "Uninstall App" : "アプリをアンインストール", "Enable experimental apps" : "実験的なアプリを有効にする", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "こんにちは、

    あなたのアカウント %s が利用可能になったことをお知らせします。

    ユーザー名: %s
    以下のURLからアクセス: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "こんにちは、\n\nあなたのアカウント %s が利用可能になったことをお知らせします。\n\nユーザー名: %s\n接続URL: %s\n\n", @@ -370,24 +376,6 @@ OC.L10N.register( "Group Admin for" : "グループの管理者", "Storage Location" : "ストレージの場所", "User Backend" : "ユーザーバックエンド", - "Last Login" : "最終ログイン", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "外部ストレージ", - "Updates" : "アップデート", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "公式アプリはNextcloudコミュニティによって開発されています。コミュニティでは、Nextcloudの中心的な機能を提供し、プロダクションでの使用に備えています。", - "No apps found for \"{query}\"" : "{query} のアプリは見つかりませんでした", - "An error occurred: {message}" : "エラーが発生しました: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "php-fpmを使用している場合は特に、お使いのサーバのPHP設定とPHP設定の注意点については、インストールマニュアル↗を確認してください。", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "あなたのデータベースは \"READ COMMITED\" トランザクション分離レベルで動作していません。このことにより複数のアクションが平行して実行される場合に問題が起こる可能性があります。", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "サーバーはMicrosoft Windows上で動作しています。最適なユーザーエクスペリエンスのためにLinuxを強くお勧めします。", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "ファイルの書き込み時のロックが無効になっていると、競合時に問題が発生する可能性があります。 config.phpで 'filelocking.enabled'を有効にして、これらの問題を回避してください。詳細については、ドキュメントを参照してください。", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "インストールガイドを再確認し、ログのエラーや警告を確認してください>。", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "暗号化だけではシステムのセキュリティを保証するものではありません。暗号化アプリケーションの仕組みとサポートされているユースケースについては、Nextcloudのドキュメントを参照してください。", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "他のデータベースに移行する場合はコマンドラインツール: 'occ db:convert-type' を使うか、ドキュメント ↗を参照してください。", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "このアプリは、最小NextCloudのバージョンが割り当てられていません。これは、Nextcloud 11以降ではエラーになります。", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "このアプリは、割り当てられた最大NextCloudバージョンがありません。これは、Nextcloud 11以降ではエラーになります。", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "このプロジェクトを応援するには、\n\t\t開発に参加\n\t\tまたは、\n\t\t他の人を助ける!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "{communityopen}Nextcloud community{linkclose} による開発されています。{githubopen}source code{linkclose} は、 {licenseopen}AGPL{linkclose} ライセンスで提供されています。" + "Last Login" : "最終ログイン" }, "nplurals=1; plural=0;"); diff --git a/settings/l10n/ja.json b/settings/l10n/ja.json index 5aac59fb1731726e81fc6efdd418b3eddd5f702d..2aad81aeaf6a0e49236d997121f023828dbf5c7f 100644 --- a/settings/l10n/ja.json +++ b/settings/l10n/ja.json @@ -37,9 +37,6 @@ "Email saved" : "メールアドレスを保存しました", "Password confirmation is required" : "パスワードの確認が必要です", "Couldn't remove app." : "アプリが削除できませんでした。", - "Admins can't remove themself from the admin group" : "管理者は自身を管理者グループから削除できません。", - "Unable to add user to group %s" : "ユーザーをグループ %s に追加できません", - "Unable to remove user from group %s" : "ユーザーをグループ %s から削除できません", "Couldn't update app." : "アプリをアップデートできませんでした。", "Are you really sure you want add {domain} as trusted domain?" : "{domain} を信頼できるドメインとして追加してもよろしいですか?", "Add trusted domain" : "信頼するドメイン名に追加", @@ -56,7 +53,7 @@ "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "公式アプリは ownCloud コミュニティにより開発されています。公式アプリは ownCloud の中心的な機能を提供し、製品として可能です。", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "承認されたアプリは信頼された開発者により開発され、大まかなセキュリティチェックに合格しています。アプリは積極的にオープンソースコードレポジトリでメンテナンスされ、メンテナは通常の用途では安定していると考えます。", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "このアプリはセキュリティチェックされていません、新規アプリか安定性が確認されていないアプリです。自己責任でインストールしてください。", - "Please wait...." : "しばらくお待ちください...", + "Enabling app …" : "アプリを有効 ...", "Error while disabling app" : "アプリ無効化中にエラーが発生", "Disable" : "無効にする", "Enable" : "有効にする", @@ -123,6 +120,8 @@ "undo" : "元に戻す", "never" : "なし", "deleted {userName}" : "{userName} を削除しました", + "Unable to add user to group {group}" : "ユーザーを {group} グループに追加できません", + "Unable to remove user from group {group}" : "ユーザーを {group} グループから削除できません", "Add group" : "グループを追加する", "Invalid quota value \"{val}\"" : "クオータ値 \"{val}\" は不正な値です。", "no group" : "グループなし", @@ -245,14 +244,16 @@ "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "このアプリは Nextcloud バージョンの上限が指定されていません.将来、エラーが発生する可能性があります.", "This app cannot be installed because the following dependencies are not fulfilled:" : "次の依存関係が満たされないためこのアプリをインストールできません:", "Enable only for specific groups" : "特定のグループのみ有効に", - "Uninstall App" : "アプリをアンインストール", + "Uninstall app" : "アプリをアンインストール", "SSL Root Certificates" : "SSLルート証明書", "Common Name" : "コモンネーム", "Valid until" : "有効期限", "Issued By" : "発行元", "Valid until %s" : "%s まで有効", "Import root certificate" : "ルート証明書をインポート", + "Hey there,

    just letting you know that you now have a %s account.

    Your username: %s
    Access it: %s

    " : "こんにちは、

    あなたのアカウント %s が利用できるようになりました。

    ユーザー名: %s
    接続URL: %s

    ", "Cheers!" : "それでは!", + "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "こんにちは、\n\nあなたのアカウント %s が利用できるようになりました。\n\nユーザー名: %s\n接続URL: %s\n\n", "Administrator documentation" : "管理者ドキュメント", "Online documentation" : "オンラインドキュメント", "Forum" : "フォーラム", @@ -337,7 +338,11 @@ "Default" : "デフォルト", "log-level out of allowed range" : "ログレベルが許可された範囲を超えています", "Language changed" : "言語が変更されました", + "Admins can't remove themself from the admin group" : "管理者は自身を管理者グループから削除できません。", + "Unable to add user to group %s" : "ユーザーをグループ %s に追加できません", + "Unable to remove user from group %s" : "ユーザーをグループ %s から削除できません", "Are you really sure you want add \"{domain}\" as trusted domain?" : "\"{domain}\" を信頼するドメインに追加してもよろしいでしょうか?", + "Please wait...." : "しばらくお待ちください...", "iPhone" : "iPhone", "add group" : "グループを追加する", "Everything (fatal issues, errors, warnings, info, debug)" : "すべて (致命的な問題、エラー、警告、情報、デバッグ)", @@ -357,6 +362,7 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "特にデスクトップクライアントをファイル同期に使用する場合,SQLiteは非推奨です.", "Experimental applications ahead" : "実験的なアプリケーションを試す", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "実験的なアプリは、脆弱性についてチェックされていませんし、不安定であったり、激しく開発中です。それらをインストールすると、データの損失やセキュリティ侵害を引き起こす可能性があります。", + "Uninstall App" : "アプリをアンインストール", "Enable experimental apps" : "実験的なアプリを有効にする", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "こんにちは、

    あなたのアカウント %s が利用可能になったことをお知らせします。

    ユーザー名: %s
    以下のURLからアクセス: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "こんにちは、\n\nあなたのアカウント %s が利用可能になったことをお知らせします。\n\nユーザー名: %s\n接続URL: %s\n\n", @@ -368,24 +374,6 @@ "Group Admin for" : "グループの管理者", "Storage Location" : "ストレージの場所", "User Backend" : "ユーザーバックエンド", - "Last Login" : "最終ログイン", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "外部ストレージ", - "Updates" : "アップデート", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "公式アプリはNextcloudコミュニティによって開発されています。コミュニティでは、Nextcloudの中心的な機能を提供し、プロダクションでの使用に備えています。", - "No apps found for \"{query}\"" : "{query} のアプリは見つかりませんでした", - "An error occurred: {message}" : "エラーが発生しました: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "php-fpmを使用している場合は特に、お使いのサーバのPHP設定とPHP設定の注意点については、インストールマニュアル↗を確認してください。", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "あなたのデータベースは \"READ COMMITED\" トランザクション分離レベルで動作していません。このことにより複数のアクションが平行して実行される場合に問題が起こる可能性があります。", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "サーバーはMicrosoft Windows上で動作しています。最適なユーザーエクスペリエンスのためにLinuxを強くお勧めします。", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "ファイルの書き込み時のロックが無効になっていると、競合時に問題が発生する可能性があります。 config.phpで 'filelocking.enabled'を有効にして、これらの問題を回避してください。詳細については、ドキュメントを参照してください。", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "インストールガイドを再確認し、ログのエラーや警告を確認してください>。", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "暗号化だけではシステムのセキュリティを保証するものではありません。暗号化アプリケーションの仕組みとサポートされているユースケースについては、Nextcloudのドキュメントを参照してください。", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "他のデータベースに移行する場合はコマンドラインツール: 'occ db:convert-type' を使うか、ドキュメント ↗を参照してください。", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "このアプリは、最小NextCloudのバージョンが割り当てられていません。これは、Nextcloud 11以降ではエラーになります。", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "このアプリは、割り当てられた最大NextCloudバージョンがありません。これは、Nextcloud 11以降ではエラーになります。", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "このプロジェクトを応援するには、\n\t\t開発に参加\n\t\tまたは、\n\t\t他の人を助ける!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "{communityopen}Nextcloud community{linkclose} による開発されています。{githubopen}source code{linkclose} は、 {licenseopen}AGPL{linkclose} ライセンスで提供されています。" + "Last Login" : "最終ログイン" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/settings/l10n/ka_GE.js b/settings/l10n/ka_GE.js index f1add7c6928b5862a6d1dfb012cc2dce984348ac..131f1beb0f32f10bad7da911f752682b6b27c2aa 100644 --- a/settings/l10n/ka_GE.js +++ b/settings/l10n/ka_GE.js @@ -5,12 +5,8 @@ OC.L10N.register( "Email sent" : "იმეილი გაიგზავნა", "Invalid request" : "არასწორი მოთხოვნა", "Email saved" : "იმეილი შენახულია", - "Admins can't remove themself from the admin group" : "ადმინისტრატორებს არ შეუძლიათ საკუთარი თავის წაშლა ადმინ ჯგუფიდან", - "Unable to add user to group %s" : "მომხმარებლის დამატება ვერ მოხეხდა ჯგუფში %s", - "Unable to remove user from group %s" : "მომხმარებლის წაშლა ვერ მოხეხდა ჯგუფიდან %s", "Couldn't update app." : "ვერ მოხერხდა აპლიკაციის განახლება.", "All" : "ყველა", - "Please wait...." : "დაიცადეთ....", "Disable" : "გამორთვა", "Enable" : "ჩართვა", "Updating...." : "მიმდინარეობს განახლება....", @@ -57,9 +53,12 @@ OC.L10N.register( "set new password" : "დააყენეთ ახალი პაროლი", "Default" : "საწყისი პარამეტრები", "Language changed" : "ენა შეცვლილია", + "Admins can't remove themself from the admin group" : "ადმინისტრატორებს არ შეუძლიათ საკუთარი თავის წაშლა ადმინ ჯგუფიდან", + "Unable to add user to group %s" : "მომხმარებლის დამატება ვერ მოხეხდა ჯგუფში %s", + "Unable to remove user from group %s" : "მომხმარებლის წაშლა ვერ მოხეხდა ჯგუფიდან %s", + "Please wait...." : "დაიცადეთ....", "Log" : "ლოგი", "More" : "უფრო მეტი", - "Less" : "უფრო ნაკლები", - "External Storage" : "ექსტერნალ საცავი" + "Less" : "უფრო ნაკლები" }, "nplurals=1; plural=0;"); diff --git a/settings/l10n/ka_GE.json b/settings/l10n/ka_GE.json index 219160111e055b8948744402f246be49ba2f420c..d2953e86a98fcd4b5950954bb30efb97e73676c9 100644 --- a/settings/l10n/ka_GE.json +++ b/settings/l10n/ka_GE.json @@ -3,12 +3,8 @@ "Email sent" : "იმეილი გაიგზავნა", "Invalid request" : "არასწორი მოთხოვნა", "Email saved" : "იმეილი შენახულია", - "Admins can't remove themself from the admin group" : "ადმინისტრატორებს არ შეუძლიათ საკუთარი თავის წაშლა ადმინ ჯგუფიდან", - "Unable to add user to group %s" : "მომხმარებლის დამატება ვერ მოხეხდა ჯგუფში %s", - "Unable to remove user from group %s" : "მომხმარებლის წაშლა ვერ მოხეხდა ჯგუფიდან %s", "Couldn't update app." : "ვერ მოხერხდა აპლიკაციის განახლება.", "All" : "ყველა", - "Please wait...." : "დაიცადეთ....", "Disable" : "გამორთვა", "Enable" : "ჩართვა", "Updating...." : "მიმდინარეობს განახლება....", @@ -55,9 +51,12 @@ "set new password" : "დააყენეთ ახალი პაროლი", "Default" : "საწყისი პარამეტრები", "Language changed" : "ენა შეცვლილია", + "Admins can't remove themself from the admin group" : "ადმინისტრატორებს არ შეუძლიათ საკუთარი თავის წაშლა ადმინ ჯგუფიდან", + "Unable to add user to group %s" : "მომხმარებლის დამატება ვერ მოხეხდა ჯგუფში %s", + "Unable to remove user from group %s" : "მომხმარებლის წაშლა ვერ მოხეხდა ჯგუფიდან %s", + "Please wait...." : "დაიცადეთ....", "Log" : "ლოგი", "More" : "უფრო მეტი", - "Less" : "უფრო ნაკლები", - "External Storage" : "ექსტერნალ საცავი" + "Less" : "უფრო ნაკლები" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/settings/l10n/km.js b/settings/l10n/km.js index 45b9fbe09453d5b4abff1d28049a9d8e7a216818..5c604f03c49aaffcc79d23a0b16d6195db6728d0 100644 --- a/settings/l10n/km.js +++ b/settings/l10n/km.js @@ -10,13 +10,9 @@ OC.L10N.register( "You need to set your user email before being able to send test emails." : "អ្នក​ត្រូវ​តែ​កំណត់​អ៊ីមែល​របស់​អ្នក​មុន​នឹង​អាច​ផ្ញើ​អ៊ីមែល​សាកល្បង​បាន។", "Invalid request" : "សំណើ​មិន​ត្រឹម​ត្រូវ", "Email saved" : "បាន​រក្សា​ទុក​អ៊ីមែល", - "Admins can't remove themself from the admin group" : "អ្នក​គ្រប់​គ្រង​មិន​អាច​លុប​ខ្លួន​ឯង​ចេញ​ពី​ក្រុម​អ្នក​គ្រប់​គ្រង​ឡើយ", - "Unable to add user to group %s" : "មិន​អាច​បន្ថែម​អ្នក​ប្រើ​ទៅ​ក្រុម %s", - "Unable to remove user from group %s" : "មិន​អាច​ដក​អ្នក​ប្រើ​ចេញ​ពី​ក្រុម​ %s", "Couldn't update app." : "មិន​អាច​ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី។", "Sending..." : "កំពុង​ផ្ញើ...", "All" : "ទាំងអស់", - "Please wait...." : "សូម​រង់​ចាំ....", "Error while disabling app" : "មាន​កំហុស​ពេល​កំពុង​បិទកម្មវិធី", "Disable" : "បិទ", "Enable" : "បើក", @@ -74,9 +70,12 @@ OC.L10N.register( "set new password" : "កំណត់​ពាក្យ​សម្ងាត់​ថ្មី", "Default" : "លំនាំ​ដើម", "Language changed" : "បាន​ប្ដូរ​ភាសា", + "Admins can't remove themself from the admin group" : "អ្នក​គ្រប់​គ្រង​មិន​អាច​លុប​ខ្លួន​ឯង​ចេញ​ពី​ក្រុម​អ្នក​គ្រប់​គ្រង​ឡើយ", + "Unable to add user to group %s" : "មិន​អាច​បន្ថែម​អ្នក​ប្រើ​ទៅ​ក្រុម %s", + "Unable to remove user from group %s" : "មិន​អាច​ដក​អ្នក​ប្រើ​ចេញ​ពី​ក្រុម​ %s", + "Please wait...." : "សូម​រង់​ចាំ....", "Log" : "Log", "More" : "ច្រើន​ទៀត", - "Less" : "តិច", - "External Storage" : "ឃ្លាំងផ្ទុក​ខាងក្រៅ" + "Less" : "តិច" }, "nplurals=1; plural=0;"); diff --git a/settings/l10n/km.json b/settings/l10n/km.json index ae778387a74b0f87364510cc3579f11b5796e743..00f212fc43636a4a7a30c82fc153bdaacde76e97 100644 --- a/settings/l10n/km.json +++ b/settings/l10n/km.json @@ -8,13 +8,9 @@ "You need to set your user email before being able to send test emails." : "អ្នក​ត្រូវ​តែ​កំណត់​អ៊ីមែល​របស់​អ្នក​មុន​នឹង​អាច​ផ្ញើ​អ៊ីមែល​សាកល្បង​បាន។", "Invalid request" : "សំណើ​មិន​ត្រឹម​ត្រូវ", "Email saved" : "បាន​រក្សា​ទុក​អ៊ីមែល", - "Admins can't remove themself from the admin group" : "អ្នក​គ្រប់​គ្រង​មិន​អាច​លុប​ខ្លួន​ឯង​ចេញ​ពី​ក្រុម​អ្នក​គ្រប់​គ្រង​ឡើយ", - "Unable to add user to group %s" : "មិន​អាច​បន្ថែម​អ្នក​ប្រើ​ទៅ​ក្រុម %s", - "Unable to remove user from group %s" : "មិន​អាច​ដក​អ្នក​ប្រើ​ចេញ​ពី​ក្រុម​ %s", "Couldn't update app." : "មិន​អាច​ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី។", "Sending..." : "កំពុង​ផ្ញើ...", "All" : "ទាំងអស់", - "Please wait...." : "សូម​រង់​ចាំ....", "Error while disabling app" : "មាន​កំហុស​ពេល​កំពុង​បិទកម្មវិធី", "Disable" : "បិទ", "Enable" : "បើក", @@ -72,9 +68,12 @@ "set new password" : "កំណត់​ពាក្យ​សម្ងាត់​ថ្មី", "Default" : "លំនាំ​ដើម", "Language changed" : "បាន​ប្ដូរ​ភាសា", + "Admins can't remove themself from the admin group" : "អ្នក​គ្រប់​គ្រង​មិន​អាច​លុប​ខ្លួន​ឯង​ចេញ​ពី​ក្រុម​អ្នក​គ្រប់​គ្រង​ឡើយ", + "Unable to add user to group %s" : "មិន​អាច​បន្ថែម​អ្នក​ប្រើ​ទៅ​ក្រុម %s", + "Unable to remove user from group %s" : "មិន​អាច​ដក​អ្នក​ប្រើ​ចេញ​ពី​ក្រុម​ %s", + "Please wait...." : "សូម​រង់​ចាំ....", "Log" : "Log", "More" : "ច្រើន​ទៀត", - "Less" : "តិច", - "External Storage" : "ឃ្លាំងផ្ទុក​ខាងក្រៅ" + "Less" : "តិច" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/settings/l10n/kn.js b/settings/l10n/kn.js index 987c79e5674d6ab142560a7a39aa153ba2d86d6c..441cc3e1ee6fd3d43c80a1de082b8e84c7ffa3cc 100644 --- a/settings/l10n/kn.js +++ b/settings/l10n/kn.js @@ -26,13 +26,9 @@ OC.L10N.register( "Unable to change mail address" : "ಇ-ಅಂಚೆ ವಿಳಾಸ ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", "Email saved" : "ಇ-ಅಂಚೆಯನ್ನು ಉಳಿಸಿದೆ", "Couldn't remove app." : "ಅಳಿಸುವಾಗ ಏನೊ ಲೋಪವಾಗಿದೆ", - "Admins can't remove themself from the admin group" : "ನಿರ್ವಾಹಕರು ನಿರ್ವಹಣೆ ಗುಂಪಿನಿಂದ ತಮ್ಮನ್ನೇ ತಾವು ತೆಗೆದುಹಾಕಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಿಲ್ಲ", - "Unable to add user to group %s" : "%s ಗುಂಪಿಗೆ ಹೂಸ ಬಳಕೆದಾರನನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", - "Unable to remove user from group %s" : "%s ಗುಂಪು ಬಳಕೆದಾರ ತೆಗೆದುಹಾಕಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ", "Couldn't update app." : " ಕಾಯಕ್ರಮವನ್ನು ನವೀಕರಿಸಲ ಸಾದ್ಯವಾಗುತ್ತಿಲ್ಲ.", "Sending..." : "ಕಳುಹಿಸಲಾಗುತ್ತಿದೆ ...", "All" : "ಎಲ್ಲಾ", - "Please wait...." : "ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ ....", "Error while disabling app" : "ಕಾರ್ಯಕ್ರಮವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುವಾಗ ಏನೊ ಲೋಪವಾಗಿದೆ", "Disable" : "ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ", "Enable" : "ಸಕ್ರಿಯಗೊಳಿಸು", @@ -84,7 +80,6 @@ OC.L10N.register( "Enforce expiration date" : "ಮುಕ್ತಾಯ ದಿನಾಂಕವನ್ನು ಬಲವ೦ತವಾಗಿ ಜಾರಿಗೆ ಮಾಡಿ", "Documentation:" : "ದಾಖಲೆ:", "Enable only for specific groups" : "ಕೇವಲ ನಿರ್ದಿಷ್ಟ ಗುಂಪುಗಳಿಗೆ ಸಕ್ರಿಯಗೊಳಿಸಿ", - "Uninstall App" : "ಅಳಿಸಿ", "Cheers!" : "ಆನಂದಿಸಿ !", "Forum" : "ವೇದಿಕೆ", "Cancel" : "ರದ್ದು", @@ -109,6 +104,10 @@ OC.L10N.register( "change email address" : "ಇ-ಅಂಚೆ ವಿಳಾಸ ಬದಲಾಯಿಸಿ", "Default" : "ಆರಂಭದ ಪ್ರತಿ", "Language changed" : "ಭಾಷೆಯನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ", + "Admins can't remove themself from the admin group" : "ನಿರ್ವಾಹಕರು ನಿರ್ವಹಣೆ ಗುಂಪಿನಿಂದ ತಮ್ಮನ್ನೇ ತಾವು ತೆಗೆದುಹಾಕಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಿಲ್ಲ", + "Unable to add user to group %s" : "%s ಗುಂಪಿಗೆ ಹೂಸ ಬಳಕೆದಾರನನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", + "Unable to remove user from group %s" : "%s ಗುಂಪು ಬಳಕೆದಾರ ತೆಗೆದುಹಾಕಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ", + "Please wait...." : "ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ ....", "Everything (fatal issues, errors, warnings, info, debug)" : "ಎಲ್ಲ ರೀತಿಗಳು (ವಿನಾಶಕ ಸಮಸ್ಯೆಗಳು, ದೋಷಗಳು, ಎಚ್ಚರಿಕೆಗಳನ್ನು, ಮಾಹಿತಿ, ಇತರೆ )", "Info, warnings, errors and fatal issues" : "ಮಾಹಿತಿ, ಎಚ್ಚರಿಕೆ, ದೋಷಗಳು ಮತ್ತು ಮಾರಕ ಸಮಸ್ಯೆಗಳು", "Warnings, errors and fatal issues" : "ಎಚ್ಚರಿಕೆ, ದೋಷಗಳು ಮತ್ತು ಮಾರಕ ಸಮಸ್ಯೆಗಳು", @@ -117,6 +116,7 @@ OC.L10N.register( "Log" : "ಹಿನ್ನೆಲೆಯ ದಾಖಲೆ", "More" : "ಇನ್ನಷ್ಟು", "Less" : "ಕಡಿಮೆ", + "Uninstall App" : "ಅಳಿಸಿ", "Group" : "ಗುಂಪು" }, "nplurals=1; plural=0;"); diff --git a/settings/l10n/kn.json b/settings/l10n/kn.json index 76adf1ff84097357fa5b20e755428ac5317589a5..76d068bfb5a0140c34d65cfa22047d91d55a8300 100644 --- a/settings/l10n/kn.json +++ b/settings/l10n/kn.json @@ -24,13 +24,9 @@ "Unable to change mail address" : "ಇ-ಅಂಚೆ ವಿಳಾಸ ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", "Email saved" : "ಇ-ಅಂಚೆಯನ್ನು ಉಳಿಸಿದೆ", "Couldn't remove app." : "ಅಳಿಸುವಾಗ ಏನೊ ಲೋಪವಾಗಿದೆ", - "Admins can't remove themself from the admin group" : "ನಿರ್ವಾಹಕರು ನಿರ್ವಹಣೆ ಗುಂಪಿನಿಂದ ತಮ್ಮನ್ನೇ ತಾವು ತೆಗೆದುಹಾಕಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಿಲ್ಲ", - "Unable to add user to group %s" : "%s ಗುಂಪಿಗೆ ಹೂಸ ಬಳಕೆದಾರನನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", - "Unable to remove user from group %s" : "%s ಗುಂಪು ಬಳಕೆದಾರ ತೆಗೆದುಹಾಕಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ", "Couldn't update app." : " ಕಾಯಕ್ರಮವನ್ನು ನವೀಕರಿಸಲ ಸಾದ್ಯವಾಗುತ್ತಿಲ್ಲ.", "Sending..." : "ಕಳುಹಿಸಲಾಗುತ್ತಿದೆ ...", "All" : "ಎಲ್ಲಾ", - "Please wait...." : "ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ ....", "Error while disabling app" : "ಕಾರ್ಯಕ್ರಮವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುವಾಗ ಏನೊ ಲೋಪವಾಗಿದೆ", "Disable" : "ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ", "Enable" : "ಸಕ್ರಿಯಗೊಳಿಸು", @@ -82,7 +78,6 @@ "Enforce expiration date" : "ಮುಕ್ತಾಯ ದಿನಾಂಕವನ್ನು ಬಲವ೦ತವಾಗಿ ಜಾರಿಗೆ ಮಾಡಿ", "Documentation:" : "ದಾಖಲೆ:", "Enable only for specific groups" : "ಕೇವಲ ನಿರ್ದಿಷ್ಟ ಗುಂಪುಗಳಿಗೆ ಸಕ್ರಿಯಗೊಳಿಸಿ", - "Uninstall App" : "ಅಳಿಸಿ", "Cheers!" : "ಆನಂದಿಸಿ !", "Forum" : "ವೇದಿಕೆ", "Cancel" : "ರದ್ದು", @@ -107,6 +102,10 @@ "change email address" : "ಇ-ಅಂಚೆ ವಿಳಾಸ ಬದಲಾಯಿಸಿ", "Default" : "ಆರಂಭದ ಪ್ರತಿ", "Language changed" : "ಭಾಷೆಯನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ", + "Admins can't remove themself from the admin group" : "ನಿರ್ವಾಹಕರು ನಿರ್ವಹಣೆ ಗುಂಪಿನಿಂದ ತಮ್ಮನ್ನೇ ತಾವು ತೆಗೆದುಹಾಕಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಿಲ್ಲ", + "Unable to add user to group %s" : "%s ಗುಂಪಿಗೆ ಹೂಸ ಬಳಕೆದಾರನನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", + "Unable to remove user from group %s" : "%s ಗುಂಪು ಬಳಕೆದಾರ ತೆಗೆದುಹಾಕಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ", + "Please wait...." : "ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ ....", "Everything (fatal issues, errors, warnings, info, debug)" : "ಎಲ್ಲ ರೀತಿಗಳು (ವಿನಾಶಕ ಸಮಸ್ಯೆಗಳು, ದೋಷಗಳು, ಎಚ್ಚರಿಕೆಗಳನ್ನು, ಮಾಹಿತಿ, ಇತರೆ )", "Info, warnings, errors and fatal issues" : "ಮಾಹಿತಿ, ಎಚ್ಚರಿಕೆ, ದೋಷಗಳು ಮತ್ತು ಮಾರಕ ಸಮಸ್ಯೆಗಳು", "Warnings, errors and fatal issues" : "ಎಚ್ಚರಿಕೆ, ದೋಷಗಳು ಮತ್ತು ಮಾರಕ ಸಮಸ್ಯೆಗಳು", @@ -115,6 +114,7 @@ "Log" : "ಹಿನ್ನೆಲೆಯ ದಾಖಲೆ", "More" : "ಇನ್ನಷ್ಟು", "Less" : "ಕಡಿಮೆ", + "Uninstall App" : "ಅಳಿಸಿ", "Group" : "ಗುಂಪು" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/settings/l10n/ko.js b/settings/l10n/ko.js index 2eb47bab7a8f213ebfa73351a0e0f4958479e144..adaff000a694739bd7add202e81fbd25cc486cd0 100644 --- a/settings/l10n/ko.js +++ b/settings/l10n/ko.js @@ -29,17 +29,18 @@ OC.L10N.register( "Unable to create user." : "사용자를 만들 수 없습니다.", "Your %s account was created" : "%s 계정을 등록했습니다", "Unable to delete user." : "사용자를 삭제할 수 없습니다.", + "Settings saved" : "설정 저장됨", "Unable to change full name" : "전체 이름을 변경할 수 없음", + "Unable to change email address" : "이메일 주소를 변경할 수 없음", "Your full name has been changed." : "전체 이름이 변경되었습니다.", "Forbidden" : "거부됨", "Invalid user" : "잘못된 사용자", "Unable to change mail address" : "이메일 주소를 변경할 수 없음", "Email saved" : "이메일 저장됨", + "Password confirmation is required" : "암호 확인이 필요합니다", "Couldn't remove app." : "앱을 삭제할 수 없습니다.", - "Admins can't remove themself from the admin group" : "관리자 자신을 관리자 그룹에서 삭제할 수 없음", - "Unable to add user to group %s" : "그룹 %s에 사용자를 추가할 수 없음", - "Unable to remove user from group %s" : "그룹 %s에서 사용자를 삭제할 수 없음", "Couldn't update app." : "앱을 업데이트할 수 없습니다.", + "Are you really sure you want add {domain} as trusted domain?" : "신뢰할 수 있는 도메인 목록에 {domain}을(를) 추가하시겠습니까?", "Add trusted domain" : "신뢰할 수 있는 도메인 추가", "Migration in progress. Please wait until the migration is finished" : "이전 작업 중입니다. 작업이 완료될 때까지 기다려 주십시오", "Migration started …" : "이전 시작됨...", @@ -51,9 +52,9 @@ OC.L10N.register( "_You have %n app update pending_::_You have %n app updates pending_" : ["앱 %n개 업데이트 대기 중"], "No apps found for your version" : "설치된 버전에 대한 앱 없음", "The app will be downloaded from the app store" : "이 앱은 앱 스토어에서 다운로드 할 것", + "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "커뮤니티가 개발한 공식 앱입니다. 이 앱은 Nextcloud의 핵심 기능이며 프로덕션 환경에서 사용할 수 있습니다.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "승인된 앱은 신뢰할 수 있는 개발자가 개발하며 보안 검사를 통과했습니다. 열린 코드 저장소에서 관리되며 일반적인 환경에서 사용할 수 있는 수준으로 관리됩니다.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "이 앱의 보안 문제가 점검되지 않았고, 출시된 지 얼마 지나지 않았거나 아직 불안정합니다. 본인 책임 하에 설치하십시오.", - "Please wait...." : "기다려 주십시오....", "Error while disabling app" : "앱을 비활성화하는 중 오류 발생", "Disable" : "사용 안함", "Enable" : "사용함", @@ -71,24 +72,40 @@ OC.L10N.register( "App update" : "앱 업데이트", "Approved" : "승인됨", "Experimental" : "실험적", + "No apps found for {query}" : "{query}에 대한 앱을 찾을 수 없습니다", + "Allow filesystem access" : "파일시스템 접근 허용", "Disconnect" : "연결 해제", + "Revoke" : "취소", "Internet Explorer" : "인터넷 익스플로러", "Edge" : "엣지", "Firefox" : "파이어 폭스", "Google Chrome" : "구글 크롬", "Safari" : "사파리", "Google Chrome for Android" : "안드로이드 용 구글 크롬", + "iPhone iOS" : "iPhone iOS", + "iPad iOS" : "iPad iOS", "iOS Client" : "아이폰 OS 클라이언트", "Android Client" : "안드로이드 클라이언트", "Sync client - {os}" : "동기화 클라이언트 - {os}", "This session" : "이 세션", + "Copy" : "복사", "Copied!" : "복사됨!", "Not supported!" : "지원하지 않음!", "Press ⌘-C to copy." : "⌘-C 복사", "Press Ctrl-C to copy." : "Ctrl-C 복사", + "Error while loading browser sessions and device tokens" : "웹 브라우저 세션과 장치 토큰을 불러오는 중 오류가 발생했습니다", + "Error while creating device token" : "장치 토큰을 만드는 중 오류가 발생했습니다", + "Error while deleting the token" : "토큰을 삭제하는 중 오류가 발생했습니다", "An error occurred. Please upload an ASCII-encoded PEM certificate." : "오류가 발생했습니다. ASCII로 인코딩된 PEM 인증서를 업로드하십시오.", "Valid until {date}" : "{date}까지 유효함", "Delete" : "삭제", + "Local" : "로컬", + "Private" : "개인", + "Only visible to local users" : "로컬 사용자만 보임", + "Only visible to you" : "나만 보임", + "Contacts" : "연락처", + "Visible to local users and to trusted servers" : "로컬 사용자와 신뢰된 서버에게 보이기", + "Public" : "공개", "Select a profile picture" : "프로필 사진 선택", "Very weak password" : "매우 약한 암호", "Weak password" : "약한 암호", @@ -108,6 +125,7 @@ OC.L10N.register( "no group" : "그룹 없음", "Password successfully changed" : "암호가 성공적으로 변경되었습니다", "Changing the password will result in data loss, because data recovery is not available for this user" : "이 사용자에 대해 데이터 복구를 사용할 수 없기 때문에, 암호를 변경하면 데이터를 잃게 됩니다.", + "Could not change the users email" : "사용자 이메일을 변경할 수 없습니다", "A valid username must be provided" : "올바른 사용자 이름을 입력해야 함", "Error creating user: {message}" : "사용자 생성 오류: {message}", "A valid password must be provided" : "올바른 암호를 입력해야 함", @@ -122,6 +140,8 @@ OC.L10N.register( "Login" : "로그인", "Plain" : "일반", "NT LAN Manager" : "NT LAN 관리자", + "SSL/TLS" : "SSL/TLS", + "STARTTLS" : "STARTTLS", "Email server" : "이메일 서버", "Open documentation" : "문서 열기", "This is used for sending out notifications." : "알림을 보낼 때 사용됩니다.", @@ -143,6 +163,7 @@ OC.L10N.register( "Enable server-side encryption" : "서버 측 암호화 사용", "Please read carefully before activating server-side encryption: " : "서버 측 암호화를 활성화하기 전에 읽어 보십시오:", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "암호화를 사용하면, 사용하기 시작한 시간 이후에 서버에 업로드된 모든 파일이 암호화됩니다. 나중에 암호화를 사용하지 않으려면 사용하고 있는 암호화 모듈에서 비활성화를 지원해야 하고 모든 사전 조건(예: 복구 키 설정)을 만족해야 합니다.", + "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "암호화만으로 시스템의 보안을 보장할 수 없습니다. 암호화 응용 프로그램 작동 방식 및 지원되는 사용 사례에 대한 자세한 내용은 설명서를 참조하십시오.", "Be aware that encryption always increases the file size." : "암호화된 파일의 크기는 항상 커집니다.", "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "데이터를 주기적으로 백업하는 것을 추천하며, 암호화를 사용하고 있다면 데이터와 더불어 암호화 키도 백업하십시오.", "This is the final warning: Do you really want to enable encryption?" : "마지막 경고입니다. 암호화를 활성화하시겠습니까?", @@ -154,16 +175,20 @@ OC.L10N.register( "Start migration" : "이전 시작", "Security & setup warnings" : "보안 및 설치 경고", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "php가 시스템 환경 변수를 올바르게 조회할 수 있도록 설정되지 않았습니다. getenv(\"PATH\")의 값이 비어 있습니다.", + "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "서버 PHP 설정(특히 php-fpm 사용시)에 관한 내용은 설치 가이드 ↗를 참고하십시오.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "읽기 전용 설정이 활성화되었습니다. 이 상태에서는 웹 인터페이스를 통하여 일부 설정을 변경할 수 없습니다. 또한 매 업데이트마다 파일을 쓸 수 있는 상태로 변경해야 합니다.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP에서 인라인 doc 블록을 삭제하도록 설정되어 있습니다. 일부 코어 앱에 접근할 수 없을 수도 있습니다.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Zend OPcache, eAccelerator 같은 캐시/가속기 문제일 수도 있습니다.", + "Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "데이터베이스가 \"READ COMMITTED\" 트랜잭션 격리 수준에서 실행되고 있지 않습니다. 여러 작업이 동시에 실행될 때 문제가 발생할 수 있습니다.", + "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s 버전보다 낮은 %2$s 버전이 설치되어있습니다. 안정성과 성능을 위해 %1$s 버전으로 업데이트하시기를 권장합니다.", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP 모듈 'fileinfo'가 존재하지 않습니다. MIME 형식 감지 결과를 향상시키기 위하여 이 모듈을 활성화하는 것을 추천합니다.", + "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "트랜잭션 파일 잠금이 비활성화되어있어 동시 접근시 문제가 발생할 수 있습니다. config.php에서 'filelocking.enabled'를 활성화하여 이 문제를 해결할 수 있습니다. 자세한 내용은 사용 설명서 ↗를 참고하십시오.", "System locale can not be set to a one which supports UTF-8." : "UTF-8을 지원하는 시스템 로케일을 사용할 수 없습니다.", "This means that there might be problems with certain characters in file names." : "파일 이름의 일부 문자에 문제가 생길 수도 있습니다.", "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "다음 중 하나 이상의 로케일을 지원하기 위하여 필요한 패키지를 시스템에 설치하는 것을 추천합니다: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "도메인의 루트 디렉터리 아래에 설치되어 있지 않고 시스템 cron을 사용한다면 URL 생성에 문제가 발생할 수도 있습니다. 이 문제를 해결하려면 설치본의 웹 루트 경로에 있는 config.php 파일의 \"overwrite.cli.url\" 옵션을 변경하십시오(제안: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "CLI로 cronjob을 실행할 수 없었습니다. 다음 기술적 오류가 발생했습니다:", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "설치 가이드를 ↗ 확인하고 로그에 오류 또는 경고를 확인하시기 바랍니다.", + "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "설치 가이드 ↗를 확인하고 로그에 오류 또는 경고를 확인하시기 바랍니다.", "All checks passed." : "모든 검사를 통과했습니다.", "Cron" : "Cron", "Last cron job execution: %s." : "마지막 cron 작업 실행: %s.", @@ -172,6 +197,8 @@ OC.L10N.register( "Execute one task with each page loaded" : "개별 페이지를 불러올 때마다 실행", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php는 webcron 서비스에 등록되어 HTTP로 15분마다 cron.php에 접근합니다.", "Use system's cron service to call the cron.php file every 15 minutes." : "시스템의 cron 서비스를 통하여 15분마다 cron.php 파일을 실행합니다.", + "The cron.php needs to be executed by the system user \"%s\"." : "cron.php는 시스템 사용자 \"%s\"가 실행해야합니다.", + "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "실행하려면 PHP POSIX 확장이 필요합니다. 자세한 내용은 {linkstart}PHP 사용 설명서{linkend}를 참고하십시오.", "Version" : "버전", "Sharing" : "공유", "Allow apps to use the Share API" : "앱에서 공유 API를 사용할 수 있도록 허용", @@ -191,6 +218,9 @@ OC.L10N.register( "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "공개 링크 업로드 페이지에 고지 사항 텍스트를 표시합니다. (파일리스트가 숨겨져있는 경우에만 표시)", "This text will be shown on the public link upload page when the file list is hidden." : "파일 목록이 숨겨져 있으면 이 텍스트는 공개 링크 업로드 페이지에 표시됩니다.", "Tips & tricks" : "팁과 추가 정보", + "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "현재 백엔드 데이터베이스로 SQLite를 사용하고 있습니다. 대규모의 파일을 관리하려고 한다면 다른 데이터베이스 백엔드로 전환할 것을 권장합니다.", + "This is particularly recommended when using the desktop client for file synchronisation." : "특히 파일 동기화를 위해 데스크톱 클라이언트를 사용할 예정인 경우 권장됩니다.", + "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "다른 데이터베이스로 마이그레이션하려면 'occ db:convert-type' 명령행 도구를 사용하거나 사용 설명서 ↗를 참고하시기 바랍니다.", "How to do backups" : "백업 방법", "Advanced monitoring" : "고급 모니터링", "Performance tuning" : "성능 튜닝", @@ -207,19 +237,23 @@ OC.L10N.register( "Show description …" : "설명 보기...", "Hide description …" : "설명 숨기기...", "This app has an update available." : "이 앱을 업데이트할 수 있습니다.", + "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "이 앱은 Nextcloud 최소 버전을 지정하지 않았습니다. Nextcloud 11 이후에는 오류로 처리됩니다.", + "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "이 앱은 Nextcloud 최대 버전을 지정하지 않았습니다. Nextcloud 11 이후에는 오류로 처리됩니다.", "This app cannot be installed because the following dependencies are not fulfilled:" : "다음 의존성을 만족할 수 없기 때문에 이 앱을 설치할 수 없습니다:", "Enable only for specific groups" : "특정 그룹에만 허용", - "Uninstall App" : "앱 제거", "SSL Root Certificates" : "SSL 루트 인증서", "Common Name" : "공통 이름", "Valid until" : "만료 기간:", "Issued By" : "발급자:", "Valid until %s" : "%s까지 유효함", "Import root certificate" : "루트 인증서 가져오기", + "Hey there,

    just letting you know that you now have a %s account.

    Your username: %s
    Access it: %s

    " : "안녕하세요.

    %s 계정을 사용할 수 있음을 알려 드립니다.

    사용자 이름: %s
    접근 링크: %s

    ", "Cheers!" : "감사합니다!", + "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "안녕하세요.\n\n%s 계정을 사용할 수 있음을 알려 드립니다.\n\n사용자 이름: %s\n접근 링크: %s\n\n", "Administrator documentation" : "관리자 문서", "Online documentation" : "온라인 문서", "Forum" : "포럼", + "Getting help" : "도움 얻기", "Commercial support" : "상용 지원", "You are using %s of %s" : "현재 %s / %s을(를) 사용중입니다.", "Profile picture" : "프로필 사진", @@ -236,6 +270,14 @@ OC.L10N.register( "Your email address" : "이메일 주소", "No email address set" : "이메일 주소가 설정되지 않음", "For password recovery and notifications" : "암호 복구와 알림에 사용", + "Phone number" : "휴대폰 번호", + "Your phone number" : "내 휴대폰 번호", + "Address" : "주소", + "Your postal address" : "내 우편 번호", + "Website" : "웹 사이트", + "Your website" : "내 웹 사이트", + "Twitter" : "트위터", + "Your Twitter handle" : "내 트위터", "You are member of the following groups:" : "다음 그룹의 구성원입니다:", "Password" : "암호", "Current password" : "현재 암호", @@ -247,9 +289,12 @@ OC.L10N.register( "Desktop client" : "데스크톱 클라이언트", "Android app" : "Android 앱", "iOS app" : "iOS 앱", + "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "이 프로젝트를 지원하려면 {contributeopen}개발에 참여{linkclose}하거나 {contributeopen}주변에 알려주세요{linkclose}!", "Show First Run Wizard again" : "첫 실행 마법사 다시 보이기", + "Web, desktop and mobile clients currently logged in to your account." : "사용자 계정으로 로그인된 웹, 데스크톱, 모바일 클라이언트 목록입니다.", "Device" : "장치", "Last activity" : "최근 활동", + "Passcodes that give an app or device permissions to access your account." : "앱 암호는 앱이나 장치가 사용자 계정에 접근할 수 있도록 해줍니다.", "Name" : "이름", "App name" : "앱 이름", "Create new app password" : "새로운 앱 암호 만들기", @@ -257,6 +302,12 @@ OC.L10N.register( "For security reasons this password will only be shown once." : "보안상의 이유로 이 암호는 한 번만 표시됩니다.", "Username" : "사용자 이름", "Done" : "완료", + "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "{communityopen}Nextcloud 커뮤니티{linkclose}에서 개발, {githubopen}소스 코드{linkclose}는 {licenseopen}AGPL{linkclose} 라이선스를 따릅니다.", + "Follow us on Google Plus!" : "Google Plus를 팔로우하세요!", + "Like our facebook page!" : "Facebook 페이지에서 좋아요를 눌러주세요!", + "Subscribe to our twitter channel!" : "Twitter 채널을 구독하세요!", + "Subscribe to our news feed!" : "뉴스 피드를 구독하세요!", + "Subscribe to our newsletter!" : "뉴스 레터를 구독하세요!", "Show storage location" : "저장소 위치 보이기", "Show last log in" : "마지막 로그인 시간 보이기", "Show user backend" : "사용자 백엔드 보이기", @@ -266,6 +317,7 @@ OC.L10N.register( "Create" : "만들기", "Admin Recovery Password" : "관리자 복구 암호", "Enter the recovery password in order to recover the users files during password change" : "암호 변경 시 변경된 사용자 파일을 복구하려면 복구 암호를 입력하십시오", + "Group name" : "그룹 이름", "Everyone" : "모두", "Admins" : "관리자", "Default quota" : "기본 할당량", @@ -282,7 +334,11 @@ OC.L10N.register( "Default" : "기본값", "log-level out of allowed range" : "로그 단계가 허용 범위를 벗어남", "Language changed" : "언어가 변경됨", + "Admins can't remove themself from the admin group" : "관리자 자신을 관리자 그룹에서 삭제할 수 없음", + "Unable to add user to group %s" : "그룹 %s에 사용자를 추가할 수 없음", + "Unable to remove user from group %s" : "그룹 %s에서 사용자를 삭제할 수 없음", "Are you really sure you want add \"{domain}\" as trusted domain?" : "신뢰할 수 있는 도메인 목록에 \"{domain}\"을(를) 추가하시겠습니까?", + "Please wait...." : "기다려 주십시오....", "iPhone" : "아이폰", "add group" : "그룹 추가", "Everything (fatal issues, errors, warnings, info, debug)" : "모두 (치명적 문제, 오류, 경고, 정보, 디버그)", @@ -302,9 +358,11 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "특히 파일 동기화를 위해 데스크톱 클라이언트를 사용할 예정이면, SQLite를 사용하지 않는 것이 좋습니다.", "Experimental applications ahead" : "실험적인 앱 사용 예정", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "실험적인 앱은 보안 문제 검사를 통과하지 않았으며, 아직 새롭거나, 불안정하거나, 개발 중일 수도 있습니다. 이러한 앱을 설치하면 데이터 손실 및 보안 문제가 발생할 수도 있습니다.", + "Uninstall App" : "앱 제거", "Enable experimental apps" : "실험적인 앱 사용", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "안녕하세요.

    %s 계정을 사용할 수 있음을 알려 드립니다.

    사용자 이름: %s
    접근 링크: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "안녕하세요.\n\n%s 계정을 사용할 수 있음을 알려 드립니다.\n\n사용자 이름: %s\n접근 링크: %s\n\n", + "If you want to support the project\n\t\tjoin development\n\t\t\n\t\tspread the word!" : "이 프로젝트를 지원하려면 개발에 참여하거나 주변에 알려주세요!", "Add Group" : "그룹 추가", "Group" : "그룹", "Default Quota" : "기본 할당량", @@ -312,11 +370,6 @@ OC.L10N.register( "Group Admin for" : "다음 그룹의 관리자:", "Storage Location" : "저장소 위치", "User Backend" : "사용자 백엔드", - "Last Login" : "마지막 로그인", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "외부 저장소", - "Updates" : "업데이트", - "An error occurred: {message}" : "오류 발생: {message}" + "Last Login" : "마지막 로그인" }, "nplurals=1; plural=0;"); diff --git a/settings/l10n/ko.json b/settings/l10n/ko.json index dbbb165e86b36c205567b6101472ecbdfb5e3d98..08934a74bd5953cd5703db6a0a6202400cff8ef7 100644 --- a/settings/l10n/ko.json +++ b/settings/l10n/ko.json @@ -27,17 +27,18 @@ "Unable to create user." : "사용자를 만들 수 없습니다.", "Your %s account was created" : "%s 계정을 등록했습니다", "Unable to delete user." : "사용자를 삭제할 수 없습니다.", + "Settings saved" : "설정 저장됨", "Unable to change full name" : "전체 이름을 변경할 수 없음", + "Unable to change email address" : "이메일 주소를 변경할 수 없음", "Your full name has been changed." : "전체 이름이 변경되었습니다.", "Forbidden" : "거부됨", "Invalid user" : "잘못된 사용자", "Unable to change mail address" : "이메일 주소를 변경할 수 없음", "Email saved" : "이메일 저장됨", + "Password confirmation is required" : "암호 확인이 필요합니다", "Couldn't remove app." : "앱을 삭제할 수 없습니다.", - "Admins can't remove themself from the admin group" : "관리자 자신을 관리자 그룹에서 삭제할 수 없음", - "Unable to add user to group %s" : "그룹 %s에 사용자를 추가할 수 없음", - "Unable to remove user from group %s" : "그룹 %s에서 사용자를 삭제할 수 없음", "Couldn't update app." : "앱을 업데이트할 수 없습니다.", + "Are you really sure you want add {domain} as trusted domain?" : "신뢰할 수 있는 도메인 목록에 {domain}을(를) 추가하시겠습니까?", "Add trusted domain" : "신뢰할 수 있는 도메인 추가", "Migration in progress. Please wait until the migration is finished" : "이전 작업 중입니다. 작업이 완료될 때까지 기다려 주십시오", "Migration started …" : "이전 시작됨...", @@ -49,9 +50,9 @@ "_You have %n app update pending_::_You have %n app updates pending_" : ["앱 %n개 업데이트 대기 중"], "No apps found for your version" : "설치된 버전에 대한 앱 없음", "The app will be downloaded from the app store" : "이 앱은 앱 스토어에서 다운로드 할 것", + "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "커뮤니티가 개발한 공식 앱입니다. 이 앱은 Nextcloud의 핵심 기능이며 프로덕션 환경에서 사용할 수 있습니다.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "승인된 앱은 신뢰할 수 있는 개발자가 개발하며 보안 검사를 통과했습니다. 열린 코드 저장소에서 관리되며 일반적인 환경에서 사용할 수 있는 수준으로 관리됩니다.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "이 앱의 보안 문제가 점검되지 않았고, 출시된 지 얼마 지나지 않았거나 아직 불안정합니다. 본인 책임 하에 설치하십시오.", - "Please wait...." : "기다려 주십시오....", "Error while disabling app" : "앱을 비활성화하는 중 오류 발생", "Disable" : "사용 안함", "Enable" : "사용함", @@ -69,24 +70,40 @@ "App update" : "앱 업데이트", "Approved" : "승인됨", "Experimental" : "실험적", + "No apps found for {query}" : "{query}에 대한 앱을 찾을 수 없습니다", + "Allow filesystem access" : "파일시스템 접근 허용", "Disconnect" : "연결 해제", + "Revoke" : "취소", "Internet Explorer" : "인터넷 익스플로러", "Edge" : "엣지", "Firefox" : "파이어 폭스", "Google Chrome" : "구글 크롬", "Safari" : "사파리", "Google Chrome for Android" : "안드로이드 용 구글 크롬", + "iPhone iOS" : "iPhone iOS", + "iPad iOS" : "iPad iOS", "iOS Client" : "아이폰 OS 클라이언트", "Android Client" : "안드로이드 클라이언트", "Sync client - {os}" : "동기화 클라이언트 - {os}", "This session" : "이 세션", + "Copy" : "복사", "Copied!" : "복사됨!", "Not supported!" : "지원하지 않음!", "Press ⌘-C to copy." : "⌘-C 복사", "Press Ctrl-C to copy." : "Ctrl-C 복사", + "Error while loading browser sessions and device tokens" : "웹 브라우저 세션과 장치 토큰을 불러오는 중 오류가 발생했습니다", + "Error while creating device token" : "장치 토큰을 만드는 중 오류가 발생했습니다", + "Error while deleting the token" : "토큰을 삭제하는 중 오류가 발생했습니다", "An error occurred. Please upload an ASCII-encoded PEM certificate." : "오류가 발생했습니다. ASCII로 인코딩된 PEM 인증서를 업로드하십시오.", "Valid until {date}" : "{date}까지 유효함", "Delete" : "삭제", + "Local" : "로컬", + "Private" : "개인", + "Only visible to local users" : "로컬 사용자만 보임", + "Only visible to you" : "나만 보임", + "Contacts" : "연락처", + "Visible to local users and to trusted servers" : "로컬 사용자와 신뢰된 서버에게 보이기", + "Public" : "공개", "Select a profile picture" : "프로필 사진 선택", "Very weak password" : "매우 약한 암호", "Weak password" : "약한 암호", @@ -106,6 +123,7 @@ "no group" : "그룹 없음", "Password successfully changed" : "암호가 성공적으로 변경되었습니다", "Changing the password will result in data loss, because data recovery is not available for this user" : "이 사용자에 대해 데이터 복구를 사용할 수 없기 때문에, 암호를 변경하면 데이터를 잃게 됩니다.", + "Could not change the users email" : "사용자 이메일을 변경할 수 없습니다", "A valid username must be provided" : "올바른 사용자 이름을 입력해야 함", "Error creating user: {message}" : "사용자 생성 오류: {message}", "A valid password must be provided" : "올바른 암호를 입력해야 함", @@ -120,6 +138,8 @@ "Login" : "로그인", "Plain" : "일반", "NT LAN Manager" : "NT LAN 관리자", + "SSL/TLS" : "SSL/TLS", + "STARTTLS" : "STARTTLS", "Email server" : "이메일 서버", "Open documentation" : "문서 열기", "This is used for sending out notifications." : "알림을 보낼 때 사용됩니다.", @@ -141,6 +161,7 @@ "Enable server-side encryption" : "서버 측 암호화 사용", "Please read carefully before activating server-side encryption: " : "서버 측 암호화를 활성화하기 전에 읽어 보십시오:", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "암호화를 사용하면, 사용하기 시작한 시간 이후에 서버에 업로드된 모든 파일이 암호화됩니다. 나중에 암호화를 사용하지 않으려면 사용하고 있는 암호화 모듈에서 비활성화를 지원해야 하고 모든 사전 조건(예: 복구 키 설정)을 만족해야 합니다.", + "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "암호화만으로 시스템의 보안을 보장할 수 없습니다. 암호화 응용 프로그램 작동 방식 및 지원되는 사용 사례에 대한 자세한 내용은 설명서를 참조하십시오.", "Be aware that encryption always increases the file size." : "암호화된 파일의 크기는 항상 커집니다.", "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "데이터를 주기적으로 백업하는 것을 추천하며, 암호화를 사용하고 있다면 데이터와 더불어 암호화 키도 백업하십시오.", "This is the final warning: Do you really want to enable encryption?" : "마지막 경고입니다. 암호화를 활성화하시겠습니까?", @@ -152,16 +173,20 @@ "Start migration" : "이전 시작", "Security & setup warnings" : "보안 및 설치 경고", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "php가 시스템 환경 변수를 올바르게 조회할 수 있도록 설정되지 않았습니다. getenv(\"PATH\")의 값이 비어 있습니다.", + "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "서버 PHP 설정(특히 php-fpm 사용시)에 관한 내용은 설치 가이드 ↗를 참고하십시오.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "읽기 전용 설정이 활성화되었습니다. 이 상태에서는 웹 인터페이스를 통하여 일부 설정을 변경할 수 없습니다. 또한 매 업데이트마다 파일을 쓸 수 있는 상태로 변경해야 합니다.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP에서 인라인 doc 블록을 삭제하도록 설정되어 있습니다. 일부 코어 앱에 접근할 수 없을 수도 있습니다.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Zend OPcache, eAccelerator 같은 캐시/가속기 문제일 수도 있습니다.", + "Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "데이터베이스가 \"READ COMMITTED\" 트랜잭션 격리 수준에서 실행되고 있지 않습니다. 여러 작업이 동시에 실행될 때 문제가 발생할 수 있습니다.", + "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s 버전보다 낮은 %2$s 버전이 설치되어있습니다. 안정성과 성능을 위해 %1$s 버전으로 업데이트하시기를 권장합니다.", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP 모듈 'fileinfo'가 존재하지 않습니다. MIME 형식 감지 결과를 향상시키기 위하여 이 모듈을 활성화하는 것을 추천합니다.", + "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "트랜잭션 파일 잠금이 비활성화되어있어 동시 접근시 문제가 발생할 수 있습니다. config.php에서 'filelocking.enabled'를 활성화하여 이 문제를 해결할 수 있습니다. 자세한 내용은 사용 설명서 ↗를 참고하십시오.", "System locale can not be set to a one which supports UTF-8." : "UTF-8을 지원하는 시스템 로케일을 사용할 수 없습니다.", "This means that there might be problems with certain characters in file names." : "파일 이름의 일부 문자에 문제가 생길 수도 있습니다.", "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "다음 중 하나 이상의 로케일을 지원하기 위하여 필요한 패키지를 시스템에 설치하는 것을 추천합니다: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "도메인의 루트 디렉터리 아래에 설치되어 있지 않고 시스템 cron을 사용한다면 URL 생성에 문제가 발생할 수도 있습니다. 이 문제를 해결하려면 설치본의 웹 루트 경로에 있는 config.php 파일의 \"overwrite.cli.url\" 옵션을 변경하십시오(제안: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "CLI로 cronjob을 실행할 수 없었습니다. 다음 기술적 오류가 발생했습니다:", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "설치 가이드를 ↗ 확인하고 로그에 오류 또는 경고를 확인하시기 바랍니다.", + "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "설치 가이드 ↗를 확인하고 로그에 오류 또는 경고를 확인하시기 바랍니다.", "All checks passed." : "모든 검사를 통과했습니다.", "Cron" : "Cron", "Last cron job execution: %s." : "마지막 cron 작업 실행: %s.", @@ -170,6 +195,8 @@ "Execute one task with each page loaded" : "개별 페이지를 불러올 때마다 실행", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php는 webcron 서비스에 등록되어 HTTP로 15분마다 cron.php에 접근합니다.", "Use system's cron service to call the cron.php file every 15 minutes." : "시스템의 cron 서비스를 통하여 15분마다 cron.php 파일을 실행합니다.", + "The cron.php needs to be executed by the system user \"%s\"." : "cron.php는 시스템 사용자 \"%s\"가 실행해야합니다.", + "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "실행하려면 PHP POSIX 확장이 필요합니다. 자세한 내용은 {linkstart}PHP 사용 설명서{linkend}를 참고하십시오.", "Version" : "버전", "Sharing" : "공유", "Allow apps to use the Share API" : "앱에서 공유 API를 사용할 수 있도록 허용", @@ -189,6 +216,9 @@ "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "공개 링크 업로드 페이지에 고지 사항 텍스트를 표시합니다. (파일리스트가 숨겨져있는 경우에만 표시)", "This text will be shown on the public link upload page when the file list is hidden." : "파일 목록이 숨겨져 있으면 이 텍스트는 공개 링크 업로드 페이지에 표시됩니다.", "Tips & tricks" : "팁과 추가 정보", + "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "현재 백엔드 데이터베이스로 SQLite를 사용하고 있습니다. 대규모의 파일을 관리하려고 한다면 다른 데이터베이스 백엔드로 전환할 것을 권장합니다.", + "This is particularly recommended when using the desktop client for file synchronisation." : "특히 파일 동기화를 위해 데스크톱 클라이언트를 사용할 예정인 경우 권장됩니다.", + "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "다른 데이터베이스로 마이그레이션하려면 'occ db:convert-type' 명령행 도구를 사용하거나 사용 설명서 ↗를 참고하시기 바랍니다.", "How to do backups" : "백업 방법", "Advanced monitoring" : "고급 모니터링", "Performance tuning" : "성능 튜닝", @@ -205,19 +235,23 @@ "Show description …" : "설명 보기...", "Hide description …" : "설명 숨기기...", "This app has an update available." : "이 앱을 업데이트할 수 있습니다.", + "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "이 앱은 Nextcloud 최소 버전을 지정하지 않았습니다. Nextcloud 11 이후에는 오류로 처리됩니다.", + "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "이 앱은 Nextcloud 최대 버전을 지정하지 않았습니다. Nextcloud 11 이후에는 오류로 처리됩니다.", "This app cannot be installed because the following dependencies are not fulfilled:" : "다음 의존성을 만족할 수 없기 때문에 이 앱을 설치할 수 없습니다:", "Enable only for specific groups" : "특정 그룹에만 허용", - "Uninstall App" : "앱 제거", "SSL Root Certificates" : "SSL 루트 인증서", "Common Name" : "공통 이름", "Valid until" : "만료 기간:", "Issued By" : "발급자:", "Valid until %s" : "%s까지 유효함", "Import root certificate" : "루트 인증서 가져오기", + "Hey there,

    just letting you know that you now have a %s account.

    Your username: %s
    Access it: %s

    " : "안녕하세요.

    %s 계정을 사용할 수 있음을 알려 드립니다.

    사용자 이름: %s
    접근 링크: %s

    ", "Cheers!" : "감사합니다!", + "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "안녕하세요.\n\n%s 계정을 사용할 수 있음을 알려 드립니다.\n\n사용자 이름: %s\n접근 링크: %s\n\n", "Administrator documentation" : "관리자 문서", "Online documentation" : "온라인 문서", "Forum" : "포럼", + "Getting help" : "도움 얻기", "Commercial support" : "상용 지원", "You are using %s of %s" : "현재 %s / %s을(를) 사용중입니다.", "Profile picture" : "프로필 사진", @@ -234,6 +268,14 @@ "Your email address" : "이메일 주소", "No email address set" : "이메일 주소가 설정되지 않음", "For password recovery and notifications" : "암호 복구와 알림에 사용", + "Phone number" : "휴대폰 번호", + "Your phone number" : "내 휴대폰 번호", + "Address" : "주소", + "Your postal address" : "내 우편 번호", + "Website" : "웹 사이트", + "Your website" : "내 웹 사이트", + "Twitter" : "트위터", + "Your Twitter handle" : "내 트위터", "You are member of the following groups:" : "다음 그룹의 구성원입니다:", "Password" : "암호", "Current password" : "현재 암호", @@ -245,9 +287,12 @@ "Desktop client" : "데스크톱 클라이언트", "Android app" : "Android 앱", "iOS app" : "iOS 앱", + "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "이 프로젝트를 지원하려면 {contributeopen}개발에 참여{linkclose}하거나 {contributeopen}주변에 알려주세요{linkclose}!", "Show First Run Wizard again" : "첫 실행 마법사 다시 보이기", + "Web, desktop and mobile clients currently logged in to your account." : "사용자 계정으로 로그인된 웹, 데스크톱, 모바일 클라이언트 목록입니다.", "Device" : "장치", "Last activity" : "최근 활동", + "Passcodes that give an app or device permissions to access your account." : "앱 암호는 앱이나 장치가 사용자 계정에 접근할 수 있도록 해줍니다.", "Name" : "이름", "App name" : "앱 이름", "Create new app password" : "새로운 앱 암호 만들기", @@ -255,6 +300,12 @@ "For security reasons this password will only be shown once." : "보안상의 이유로 이 암호는 한 번만 표시됩니다.", "Username" : "사용자 이름", "Done" : "완료", + "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "{communityopen}Nextcloud 커뮤니티{linkclose}에서 개발, {githubopen}소스 코드{linkclose}는 {licenseopen}AGPL{linkclose} 라이선스를 따릅니다.", + "Follow us on Google Plus!" : "Google Plus를 팔로우하세요!", + "Like our facebook page!" : "Facebook 페이지에서 좋아요를 눌러주세요!", + "Subscribe to our twitter channel!" : "Twitter 채널을 구독하세요!", + "Subscribe to our news feed!" : "뉴스 피드를 구독하세요!", + "Subscribe to our newsletter!" : "뉴스 레터를 구독하세요!", "Show storage location" : "저장소 위치 보이기", "Show last log in" : "마지막 로그인 시간 보이기", "Show user backend" : "사용자 백엔드 보이기", @@ -264,6 +315,7 @@ "Create" : "만들기", "Admin Recovery Password" : "관리자 복구 암호", "Enter the recovery password in order to recover the users files during password change" : "암호 변경 시 변경된 사용자 파일을 복구하려면 복구 암호를 입력하십시오", + "Group name" : "그룹 이름", "Everyone" : "모두", "Admins" : "관리자", "Default quota" : "기본 할당량", @@ -280,7 +332,11 @@ "Default" : "기본값", "log-level out of allowed range" : "로그 단계가 허용 범위를 벗어남", "Language changed" : "언어가 변경됨", + "Admins can't remove themself from the admin group" : "관리자 자신을 관리자 그룹에서 삭제할 수 없음", + "Unable to add user to group %s" : "그룹 %s에 사용자를 추가할 수 없음", + "Unable to remove user from group %s" : "그룹 %s에서 사용자를 삭제할 수 없음", "Are you really sure you want add \"{domain}\" as trusted domain?" : "신뢰할 수 있는 도메인 목록에 \"{domain}\"을(를) 추가하시겠습니까?", + "Please wait...." : "기다려 주십시오....", "iPhone" : "아이폰", "add group" : "그룹 추가", "Everything (fatal issues, errors, warnings, info, debug)" : "모두 (치명적 문제, 오류, 경고, 정보, 디버그)", @@ -300,9 +356,11 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "특히 파일 동기화를 위해 데스크톱 클라이언트를 사용할 예정이면, SQLite를 사용하지 않는 것이 좋습니다.", "Experimental applications ahead" : "실험적인 앱 사용 예정", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "실험적인 앱은 보안 문제 검사를 통과하지 않았으며, 아직 새롭거나, 불안정하거나, 개발 중일 수도 있습니다. 이러한 앱을 설치하면 데이터 손실 및 보안 문제가 발생할 수도 있습니다.", + "Uninstall App" : "앱 제거", "Enable experimental apps" : "실험적인 앱 사용", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "안녕하세요.

    %s 계정을 사용할 수 있음을 알려 드립니다.

    사용자 이름: %s
    접근 링크: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "안녕하세요.\n\n%s 계정을 사용할 수 있음을 알려 드립니다.\n\n사용자 이름: %s\n접근 링크: %s\n\n", + "If you want to support the project\n\t\tjoin development\n\t\t\n\t\tspread the word!" : "이 프로젝트를 지원하려면 개발에 참여하거나 주변에 알려주세요!", "Add Group" : "그룹 추가", "Group" : "그룹", "Default Quota" : "기본 할당량", @@ -310,11 +368,6 @@ "Group Admin for" : "다음 그룹의 관리자:", "Storage Location" : "저장소 위치", "User Backend" : "사용자 백엔드", - "Last Login" : "마지막 로그인", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "외부 저장소", - "Updates" : "업데이트", - "An error occurred: {message}" : "오류 발생: {message}" + "Last Login" : "마지막 로그인" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/settings/l10n/lb.js b/settings/l10n/lb.js index 5f5bbb6cbc2fb3ba41ce43259b7fc4962055bf29..9a1d28e770fa20f0af6cee5d421493e00199e7a5 100644 --- a/settings/l10n/lb.js +++ b/settings/l10n/lb.js @@ -8,8 +8,6 @@ OC.L10N.register( "Email sent" : "Email geschéckt", "Invalid request" : "Ongülteg Requête", "Email saved" : "E-mail gespäichert", - "Admins can't remove themself from the admin group" : "Admins kennen sech selwer net aus enger Admin Group läschen.", - "Unable to add user to group %s" : "Onmeiglech User an Grupp ze sätzen %s", "All" : "All", "Disable" : "Ofschalten", "Enable" : "Aschalten", @@ -49,12 +47,11 @@ OC.L10N.register( "Other" : "Aner", "Quota" : "Quota", "Language changed" : "Sprooch huet geännert", + "Admins can't remove themself from the admin group" : "Admins kennen sech selwer net aus enger Admin Group läschen.", + "Unable to add user to group %s" : "Onmeiglech User an Grupp ze sätzen %s", "Log" : "Log", "More" : "Méi", "Less" : "Manner", - "Group" : "Grupp", - "APCu" : "APCu", - "Redis" : "Redis", - "Updates" : "Updates" + "Group" : "Grupp" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/lb.json b/settings/l10n/lb.json index 5a0cae2af06832f3149083fdddd2834b95b6f5ba..cd241c5539aaece2fd1bbbd0d7ec2bb520db4341 100644 --- a/settings/l10n/lb.json +++ b/settings/l10n/lb.json @@ -6,8 +6,6 @@ "Email sent" : "Email geschéckt", "Invalid request" : "Ongülteg Requête", "Email saved" : "E-mail gespäichert", - "Admins can't remove themself from the admin group" : "Admins kennen sech selwer net aus enger Admin Group läschen.", - "Unable to add user to group %s" : "Onmeiglech User an Grupp ze sätzen %s", "All" : "All", "Disable" : "Ofschalten", "Enable" : "Aschalten", @@ -47,12 +45,11 @@ "Other" : "Aner", "Quota" : "Quota", "Language changed" : "Sprooch huet geännert", + "Admins can't remove themself from the admin group" : "Admins kennen sech selwer net aus enger Admin Group läschen.", + "Unable to add user to group %s" : "Onmeiglech User an Grupp ze sätzen %s", "Log" : "Log", "More" : "Méi", "Less" : "Manner", - "Group" : "Grupp", - "APCu" : "APCu", - "Redis" : "Redis", - "Updates" : "Updates" + "Group" : "Grupp" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/lt_LT.js b/settings/l10n/lt_LT.js index 349e6a32051bf535532a11d6ff78c58d8ec421f5..6d564652550f8a823671368fadd227d12b3a6fc3 100644 --- a/settings/l10n/lt_LT.js +++ b/settings/l10n/lt_LT.js @@ -29,16 +29,14 @@ OC.L10N.register( "Email saved" : "El. paštas įrašytas", "Password confirmation is required" : "Reikalingas slaptažodžio patvirtinimas", "Couldn't remove app." : "Nepavyko pašalinti programėlės.", - "Admins can't remove themself from the admin group" : "Administratoriai negali pašalinti savęs iš administratorių grupės", - "Unable to add user to group %s" : "Nepavyko pridėti naudotojo į grupę %s", - "Unable to remove user from group %s" : "Nepavyko pašalinti naudotojo iš grupės %s", "Couldn't update app." : "Nepavyko atnaujinti programėlės.", - "Not saved" : "Neišsaugota", + "Add trusted domain" : "Pridėti patikimą domeną", + "Not saved" : "Neįrašyta", "Sending..." : "Siunčiama...", "Official" : "Oficiali", "All" : "Viskas", "Update to %s" : "Atnaujinti į %s", - "Please wait...." : "Prašome palaukti...", + "Enabling app …" : "Programėlė įjungiama", "Error while disabling app" : "Klaida, išjungiant programėlę", "Disable" : "Išjungti", "Enable" : "Įjungti", @@ -46,8 +44,11 @@ OC.L10N.register( "Updating...." : "Atnaujinama...", "Error while updating app" : "Įvyko klaida atnaujinant programą", "Updated" : "Atnaujinta", + "Uninstalling ...." : "Išdiegiama...", + "Uninstall" : "Išdiegti", "Approved" : "Patvirtinta", "Experimental" : "Eksperimentinė", + "Disconnect" : "Atjungti", "Internet Explorer" : "Internet Explorer", "Edge" : "Edge", "Firefox" : "Firefox", @@ -67,6 +68,7 @@ OC.L10N.register( "Only visible to local users" : "Matoma tik vietiniams naudotojams", "Only visible to you" : "Matoma tik jums", "Visible to local users and to trusted servers" : "Matoma tik vietiniams naudotojams ir patikimiems serveriams", + "Public" : "Viešai", "Select a profile picture" : "Pasirinkite profilio paveikslą", "Very weak password" : "Labai silpnas slaptažodis", "Weak password" : "Silpnas slaptažodis", @@ -76,6 +78,7 @@ OC.L10N.register( "Groups" : "Grupės", "undo" : "anuliuoti", "never" : "niekada", + "Add group" : "Pridėti grupę", "Password successfully changed" : "Slaptažodis sėkmingai pakeistas", "Changing the password will result in data loss, because data recovery is not available for this user" : "Slaptažodžio pakeitimas sąlygos duomenų praradimą, kadangi šiam naudotojui nėra prieinamas duomenų atkūrimas", "A valid username must be provided" : "Privalo būti pateiktas tinkamas naudotojo vardas", @@ -160,18 +163,16 @@ OC.L10N.register( "set new password" : "nustatyti naują slaptažodį", "Default" : "Numatytasis", "Language changed" : "Kalba pakeista", + "Admins can't remove themself from the admin group" : "Administratoriai negali pašalinti savęs iš administratorių grupės", + "Unable to add user to group %s" : "Nepavyko pridėti naudotojo į grupę %s", + "Unable to remove user from group %s" : "Nepavyko pašalinti naudotojo iš grupės %s", + "Please wait...." : "Prašome palaukti...", "iPhone" : "iPhone", "Fatal issues only" : "Tik lemtingosios klaidos", "Log" : "Žurnalas", "More" : "Daugiau", "Less" : "Mažiau", "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Žurnalo failo dydis yra daugiau nei 100 MB. Jo atsiuntimas gali šiek tiek užtrukti!", - "Group" : "Grupė", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Išorinės saugyklos", - "Updates" : "Atnaujinimai", - "An error occurred: {message}" : "Įvyko klaida: {message}", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Jeigu norite palaikyti projektą, tuomet\n\t\tprisijunkite prie kūrimo\n\t\tarba\n\t\tpadėkite kitiems naudotojams!" + "Group" : "Grupė" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/settings/l10n/lt_LT.json b/settings/l10n/lt_LT.json index 98b3fc749b497b277278767642af33ef3bc2299b..85d13b491707bedc94fdd35c5975cc891d0a17cc 100644 --- a/settings/l10n/lt_LT.json +++ b/settings/l10n/lt_LT.json @@ -27,16 +27,14 @@ "Email saved" : "El. paštas įrašytas", "Password confirmation is required" : "Reikalingas slaptažodžio patvirtinimas", "Couldn't remove app." : "Nepavyko pašalinti programėlės.", - "Admins can't remove themself from the admin group" : "Administratoriai negali pašalinti savęs iš administratorių grupės", - "Unable to add user to group %s" : "Nepavyko pridėti naudotojo į grupę %s", - "Unable to remove user from group %s" : "Nepavyko pašalinti naudotojo iš grupės %s", "Couldn't update app." : "Nepavyko atnaujinti programėlės.", - "Not saved" : "Neišsaugota", + "Add trusted domain" : "Pridėti patikimą domeną", + "Not saved" : "Neįrašyta", "Sending..." : "Siunčiama...", "Official" : "Oficiali", "All" : "Viskas", "Update to %s" : "Atnaujinti į %s", - "Please wait...." : "Prašome palaukti...", + "Enabling app …" : "Programėlė įjungiama", "Error while disabling app" : "Klaida, išjungiant programėlę", "Disable" : "Išjungti", "Enable" : "Įjungti", @@ -44,8 +42,11 @@ "Updating...." : "Atnaujinama...", "Error while updating app" : "Įvyko klaida atnaujinant programą", "Updated" : "Atnaujinta", + "Uninstalling ...." : "Išdiegiama...", + "Uninstall" : "Išdiegti", "Approved" : "Patvirtinta", "Experimental" : "Eksperimentinė", + "Disconnect" : "Atjungti", "Internet Explorer" : "Internet Explorer", "Edge" : "Edge", "Firefox" : "Firefox", @@ -65,6 +66,7 @@ "Only visible to local users" : "Matoma tik vietiniams naudotojams", "Only visible to you" : "Matoma tik jums", "Visible to local users and to trusted servers" : "Matoma tik vietiniams naudotojams ir patikimiems serveriams", + "Public" : "Viešai", "Select a profile picture" : "Pasirinkite profilio paveikslą", "Very weak password" : "Labai silpnas slaptažodis", "Weak password" : "Silpnas slaptažodis", @@ -74,6 +76,7 @@ "Groups" : "Grupės", "undo" : "anuliuoti", "never" : "niekada", + "Add group" : "Pridėti grupę", "Password successfully changed" : "Slaptažodis sėkmingai pakeistas", "Changing the password will result in data loss, because data recovery is not available for this user" : "Slaptažodžio pakeitimas sąlygos duomenų praradimą, kadangi šiam naudotojui nėra prieinamas duomenų atkūrimas", "A valid username must be provided" : "Privalo būti pateiktas tinkamas naudotojo vardas", @@ -158,18 +161,16 @@ "set new password" : "nustatyti naują slaptažodį", "Default" : "Numatytasis", "Language changed" : "Kalba pakeista", + "Admins can't remove themself from the admin group" : "Administratoriai negali pašalinti savęs iš administratorių grupės", + "Unable to add user to group %s" : "Nepavyko pridėti naudotojo į grupę %s", + "Unable to remove user from group %s" : "Nepavyko pašalinti naudotojo iš grupės %s", + "Please wait...." : "Prašome palaukti...", "iPhone" : "iPhone", "Fatal issues only" : "Tik lemtingosios klaidos", "Log" : "Žurnalas", "More" : "Daugiau", "Less" : "Mažiau", "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Žurnalo failo dydis yra daugiau nei 100 MB. Jo atsiuntimas gali šiek tiek užtrukti!", - "Group" : "Grupė", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Išorinės saugyklos", - "Updates" : "Atnaujinimai", - "An error occurred: {message}" : "Įvyko klaida: {message}", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Jeigu norite palaikyti projektą, tuomet\n\t\tprisijunkite prie kūrimo\n\t\tarba\n\t\tpadėkite kitiems naudotojams!" + "Group" : "Grupė" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);" } \ No newline at end of file diff --git a/settings/l10n/lv.js b/settings/l10n/lv.js index e45d4c215778bf187f8a88aabbf0dcaca07561a2..382c9cc1818e42941b3c07376a1ff4bd431e9967 100644 --- a/settings/l10n/lv.js +++ b/settings/l10n/lv.js @@ -1,7 +1,7 @@ OC.L10N.register( "settings", { - "Enabled" : "Pievienots", + "Enabled" : "Iespējots", "Not enabled" : "Nav pievienots", "Wrong password" : "Nepareiza parole", "Saved" : "Saglabāts", @@ -10,47 +10,88 @@ OC.L10N.register( "Authentication error" : "Autentifikācijas kļūda", "Please provide an admin recovery password, otherwise all user data will be lost" : "Lūdzu ievadiet administratora atjaunošanas paroli, citādi visi lietotāja dati tiks zaudēti", "Wrong admin recovery password. Please check the password and try again." : "Nepareiza administratora atjaunošanas parole. Lūdzu pārbaudiet paroli un mēģiniet vēlreiz.", + "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Aizmugursistēmas neatbalsta paroles maiņu, bet lietotāja šifrēšanas atslēga ir veiksmīgi atjaunināta.", + "installing and updating apps via the app store or Federated Cloud Sharing" : "programmu instalēšana un atjaunināšana, izmantojot programmu veikalu vai Federatīvajām Cloud koplietošanu", "Federated Cloud Sharing" : "Federatīva mākoņkoplietošana", + "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL izmanto novecojušu %s versiju (%s). Lūdzu, atjauniniet operētājsistēmu vai funkcijām, piem., %s nedarbosies pareizi.", + "A problem occurred, please check your log files (Error: %s)" : "Radusies problēma, lūdzu, pārbaudiet žurnāla failus (Kļūda: %s)", + "Migration Completed" : "Migrācija ir pabeigta", "Group already exists." : "Grupa jau eksistē.", "Unable to add group." : "Nevar pievienot grupu.", "Unable to delete group." : "Nevar izdzēst grupu.", "test email settings" : "testēt e-pasta iestatījumus", + "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Radās kļūda, nosūtot e-pastu. Lūdzu, pārskatiet savus iestatījumus. (Kļūda: %s)", "Email sent" : "Vēstule nosūtīta", "You need to set your user email before being able to send test emails." : "Nepieciešams norādīt sava lietotāja e-pasta adresi, lai nosūtīta testa e-pastus.", "Invalid request" : "Nederīgs vaicājums", "Invalid mail address" : "Nepareiza e-pasta adrese", + "No valid group selected" : "Atlasītā grupa nav derīga", "A user with that name already exists." : "Jau pastāv lietotājs ar šo vārdu.", "Unable to create user." : "Nevar izveidot lietotāju.", "Your %s account was created" : "Konts %s ir izveidots", "Unable to delete user." : "Nevar izdzēst lietotāju.", + "Settings saved" : "Iestatījumi saglabāti", "Unable to change full name" : "Nav iespējams nomainīt jūsu pilno vārdu", + "Unable to change email address" : "Nevar mainīt e-pasta adresi", "Your full name has been changed." : "Jūsu pilnais vārds tika mainīts.", "Forbidden" : "Pieeja liegta", "Invalid user" : "Nepareizs lietotājs", "Unable to change mail address" : "Nevar nomainīt e-pasta adresi", "Email saved" : "E-pasts tika saglabāts", - "Couldn't remove app." : "Nebija iespējams atslēgt lietoni.", - "Admins can't remove themself from the admin group" : "Administratori nevar izņemt paši sevi no administratoru grupas", - "Unable to add user to group %s" : "Nevar pievienot lietotāju grupai %s", - "Unable to remove user from group %s" : "Nevar izņemt lietotāju no grupas %s", - "Couldn't update app." : "Nevarēja atjaunināt lietotni.", + "Password confirmation is required" : "Nepieciešams paroles apstiprinājums", + "Couldn't remove app." : "Nebija iespējams atslēgt programmu.", + "Couldn't update app." : "Nevarēja atjaunināt programmu.", + "Are you really sure you want add {domain} as trusted domain?" : "Tu tiešām esi pārliecināta, ka vēlies pievienot {domain} kā uzticamu domēnu?", "Add trusted domain" : "Pievienot uzticamu domēnu", + "Migration in progress. Please wait until the migration is finished" : "Notiek migrācija. Lūdzu, pagaidiet, līdz migrēšana ir pabeigta", + "Migration started …" : "Uzsākta migrācija...", + "Not saved" : "Nav saglabāts", "Sending..." : "Sūta...", "All" : "Visi", - "No apps found for your version" : "Neatrada aplikāciju jūsu versijai", - "Please wait...." : "Lūdzu, uzgaidiet....", - "Error while disabling app" : "Kļūda, atvienojot lietotni", + "Update to %s" : "Atjaunināts uz %s", + "No apps found for your version" : "Neatrada programmu jūsu versijai", + "Error while disabling app" : "Kļūda, atvienojot programmu", "Disable" : "Deaktivēt", "Enable" : "Aktivēt", - "Error while enabling app" : "Kļūda, pievienojot lietotni", + "Error while enabling app" : "Kļūda, pievienojot programmu", "Updating...." : "Atjaunina....", - "Error while updating app" : "Kļūda, atjauninot lietotni", + "Error while updating app" : "Kļūda, atjauninot programmu", "Updated" : "Atjaunināta", "Uninstalling ...." : "Atinstalē ....", - "Error while uninstalling app" : "Kļūda, atinstalējot lietotni", + "Error while uninstalling app" : "Kļūda, atinstalējot programmu", "Uninstall" : "Atinstalēt", + "App update" : "Programmu atjaunināšana", + "Approved" : "Apstiprināts", + "Experimental" : "Eksperimentāls", + "Disconnect" : "Atvienot", + "Revoke" : "Atsaukt", + "Internet Explorer" : "Internet Explorer", + "Edge" : "Edge", + "Firefox" : "Firefox", + "Google Chrome" : "Google Chrome", + "Safari" : "Safari", + "Google Chrome for Android" : "Google Chrome for Android", + "iPhone iOS" : "iPhone iOS", + "iPad iOS" : "iPad iOS", + "iOS Client" : "iOS Klients", + "Android Client" : "Android Klients", + "Sync client - {os}" : "Sync klients - {os}", + "This session" : "Šajā sesijā", + "Copy" : "Kopēt", + "Copied!" : "Nokopēts!", + "Not supported!" : "Nav atbalstīts!", + "Press ⌘-C to copy." : "Spied ⌘-C lai kopētu.", + "Press Ctrl-C to copy." : "Spied Ctrl-C lai kopētu.", "Valid until {date}" : "Valīds līdz {date}", "Delete" : "Dzēst", + "Local" : "Lokāls", + "Private" : "Privāts", + "Only visible to local users" : "Redzami tikai lokālajiem lietotājiem", + "Only visible to you" : "Redzams tikai jums", + "Contacts" : "Kontakti", + "Visible to local users and to trusted servers" : "Redzama uz vietējiem lietotājiem un uzticamiem serveriem", + "Public" : "Publisks", + "Will be synced to a global and public address book" : "Tiks sinhronizēts ar globālu un publisku adrešu grāmatu", "Select a profile picture" : "Izvēlieties profila attēlu", "Very weak password" : "Ļoti vāja parole", "Weak password" : "Vāja parole", @@ -59,58 +100,131 @@ OC.L10N.register( "Strong password" : "Lieliska parole", "Groups" : "Grupas", "Unable to delete {objName}" : "Nevar izdzēst {objName}", + "Error creating group: {message}" : "Kļūda, veidojot grupu: {message}", "A valid group name must be provided" : "Jānorāda derīgs grupas nosaukums", "deleted {groupName}" : "grupa {groupName} dzēsta", "undo" : "atsaukt", "never" : "nekad", "deleted {userName}" : "lietotājs {userName} dzēsts", + "Unable to add user to group {group}" : "Nevar pievienot lietotāju grupai {group}", + "Unable to remove user from group {group}" : "Nevar noņemt lietotāju no grupas {group}", + "Add group" : "Pievienot grupu", + "Invalid quota value \"{val}\"" : "Nederīga kvotas vērtība \"{val}\"", + "no group" : "neviena grupa", + "Password successfully changed" : "Parole veiksmīgi nomainīta", + "Could not change the users email" : "Nevarēja mainīt lietotāja e-pasta adrese", "A valid username must be provided" : "Jānorāda derīgs lietotājvārds", + "Error creating user: {message}" : "Kļūda, veidojot lietotāju: {message}", "A valid password must be provided" : "Jānorāda derīga parole", "A valid email must be provided" : "Jānorāda derīga e-pasta adrese", "__language_name__" : "Latviešu", "Unlimited" : "Neierobežota", + "Personal info" : "Personiskā informācija", + "Sessions" : "Sesijas", + "App passwords" : "Programmu paroles", "Sync clients" : "Sinhronizācijas lietotnes", "None" : "Nav", "Login" : "Ierakstīties", "Plain" : "vienkāršs teksts", "NT LAN Manager" : "NT LAN Pārvaldnieks", + "SSL/TLS" : "SSL/TLS", + "STARTTLS" : "STARTTLS", + "Email server" : "E-pasta serveris", "Open documentation" : "Atvērt dokumentāciju", + "This is used for sending out notifications." : "Tas tiek izmantots, izsūtot paziņojumus.", + "Send mode" : "Sūtīšanas metode", "Encryption" : "Šifrēšana", "From address" : "No adreses", + "mail" : "e-pasts", + "Authentication method" : "Autentifikācijas metode", + "Authentication required" : "Nepieciešama autentifikācija", "Server address" : "Servera adrese", "Port" : "Ports", "Credentials" : "Akreditācijas dati", "SMTP Username" : "SMTP lietotājvārds", "SMTP Password" : "SMTP parole", + "Store credentials" : "Saglabāt akreditācijas datus", "Test email settings" : "Izmēģināt e-pasta iestatījumus", "Send email" : "Sūtīt e-pastu", + "Please read carefully before activating server-side encryption: " : "Lūdzu, izlasiet uzmanīgi pirms aktivējiet servera šifrēšanu:", + "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "Šifrēšana vien negarantē sistēmas drošību. Skatiet dokumentāciju, lai iegūtu papildinformāciju par šifrēšanas programmu izmantošana, kā arī citu darbību gadījumos.", + "Be aware that encryption always increases the file size." : "Jāapzinās, ka šifrēšanas vienmēr palielina faila lielumu.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Vienmēr ir ieteicams regulāri veidot dublējumkopijas datu šifrēšanas gadījumam, pārliecinieties, lai dublētu, šifrēšanas atslēgas ir kopā ar jūsu datiem.", + "This is the final warning: Do you really want to enable encryption?" : "Šis ir pēdējais brīdinājums: vai tiešām vēlaties iespējot šifrēšanu?", "Enable encryption" : "Ieslēgt šifrēšanu", + "No encryption module loaded, please enable an encryption module in the app menu." : "Nav ielādēts šifrēšanas moduļis, lūdzu, aktivizējiet šifrēšanas moduli programmu izvēlnē.", + "Select default encryption module:" : "Atlasiet noklusēto šifrēšanas moduli:", + "Start migration" : "Sākt migrāciju", + "Security & setup warnings" : "Drošības un iestatījumu brīdinājumi", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Trūkst PHP modulis “fileinfo”. Mēs iesakām to aktivēt, lai pēc iespējas labāk noteiktu mime tipus.", + "All checks passed." : "Visas pārbaudes veiksmīgas.", "Cron" : "Cron", "Execute one task with each page loaded" : "Izpildīt vienu uzdevumu ar katru ielādēto lapu", "Version" : "Versija", "Sharing" : "Dalīšanās", - "Allow apps to use the Share API" : "Ļaut lietotnēm izmantot koplietošanas API", + "Allow apps to use the Share API" : "Ļaut programmām izmantot koplietošanas API", "Allow users to share via link" : "Ļaut lietotājiem koplietot caur saitēm", "Allow public uploads" : "Atļaut publisko augšupielādi", + "Enforce password protection" : "Ieviest paroles aizsardzību", + "Set default expiration date" : "Iestatīt noklusējuma beigu datumu", "Expire after " : "Nederīga pēc", "days" : "dienas", + "Enforce expiration date" : "Uzspiest beigu termiņu", "Allow resharing" : "Atļaut atkārtotu koplietošanu", + "Allow sharing with groups" : "Atļaut koplietošanu ar grupu", + "Restrict users to only share with users in their groups" : "Ierobežot lietotājiem koplietot tikai ar lietotājiem savās grupās", + "Exclude groups from sharing" : "Izslēgt grupu no koplietošanas", + "This is particularly recommended when using the desktop client for file synchronisation." : "Tas ir īpaši ieteicams, ja, izmantojot darbvirsmas klientu, lai veiktu failu sinhronizāciju.", + "How to do backups" : "Kā veikt dublēšanu", + "Advanced monitoring" : "Papildu uzraudzība", + "Performance tuning" : "Veiktspējas uzstādīšana", + "Improving the config.php" : "Uzlabot config.php", + "Theming" : "Dizains", + "Hardening and security guidance" : "Aizsardzības un drošības norādījumi", + "Developer documentation" : "Izstrādātāja dokumentācija", + "%s-licensed" : "%s-licencēts", "Documentation:" : "Dokumentācija:", "User documentation" : "Lietotāja dokumentācija", "Admin documentation" : "Administratora dokumentācija", + "Visit website" : "Apmeklējiet vietni", + "Report a bug" : "Ziņot par kļūdu", "Show description …" : "Rādīt aprakstu …", "Hide description …" : "Slēpt aprakstu …", + "This app has an update available." : "Šai programmai ir pieejams jauninājums", + "Enable only for specific groups" : "Iespējot tikai konkrētām grupām", + "Uninstall app" : "Atinstalēt programmu", + "SSL Root Certificates" : "SSL Root Sertifikāti", + "Valid until" : "Derīgs līdz", + "Issued By" : "Izsniedza", + "Valid until %s" : "Derīgs līdz %s", + "Import root certificate" : "Importēt root sertifikātu", + "Cheers!" : "Priekā!", + "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hei,\n\nvienkārši Jūsu zināšanai, ka Jums tagad ir %s konts.\n\nJūsu lietotājvārds: %s\nPiekļuve: %s\n\n", + "Administrator documentation" : "Administratora dokumentācija", "Online documentation" : "Tiešsaistes dokumentācija", "Forum" : "Forums", + "Getting help" : "Saņemt palīdzību", "You are using %s of %s" : "Jūs izmantojiet %s no %s", "Profile picture" : "Profila attēls", "Upload new" : "Ielādēt jaunu", + "Select from Files" : "Izvēlēties no faila", "Remove image" : "Novākt attēlu", + "png or jpg, max. 20 MB" : "png vai jpg, max. 20 MB", "Cancel" : "Atcelt", + "Choose as profile picture" : "Izvēlēties kā profila attēlu", "Full name" : "Pilns vārds", + "No display name set" : "Nav norādīts ekrāna vārds", "Email" : "E-pasts", "Your email address" : "Jūsu e-pasta adrese", + "No email address set" : "Nav norādīts e-pasts", + "For password recovery and notifications" : "Paroles atjaunošanai un paziņojumiem", + "Phone number" : "Tālruņa numurs", + "Your phone number" : "Jūsu tālruņa numurs", + "Address" : "Adrese", + "Your postal address" : "Jūsu pasta adrese", + "Website" : "Mājaslapa", + "Your website" : "Jūsu mājaslapa", + "Twitter" : "Twitter", "You are member of the following groups:" : "Jūs esat šādu grupu biedrs:", "Password" : "Parole", "Current password" : "Pašreizējā parole", @@ -118,37 +232,75 @@ OC.L10N.register( "Change password" : "Mainīt paroli", "Language" : "Valoda", "Help translate" : "Palīdzi tulkot", - "Get the apps to sync your files" : "Saņem lietotnes, lai sinhronizētu savas datnes", + "Get the apps to sync your files" : "Saņem programmu, lai sinhronizētu savas datnes", "Desktop client" : "Darbvirsmas klients", - "Android app" : "Android lietotne", - "iOS app" : "iOS lietotne", + "Android app" : "Android programma", + "iOS app" : "iOS programma", "Show First Run Wizard again" : "Vēlreiz rādīt pirmās palaišanas vedni", + "Device" : "Ierīce", + "Last activity" : "Pēdējā aktivitāte", "Name" : "Nosaukums", + "App name" : "Programmas nosaukums", + "Create new app password" : "Izveidot jaunu programmas paroli", + "Use the credentials below to configure your app or device." : "Izmantot akreditācijas datus, lai konfigurētu savu programmu vai ierīci.", + "For security reasons this password will only be shown once." : "Drošības apsvērumu dēļ šī parole, tiks parādīta tikai vienreiz.", "Username" : "Lietotājvārds", "Done" : "Pabeigts", + "Follow us on Google Plus!" : "Seko mums Google Plus!", + "Subscribe to our newsletter!" : "Abonēt mūsu jaunumus!", + "Show storage location" : "Rādīt krātuves atrašanās vietu", + "Show last log in" : "Rādīt pēdējo autorizāciju", "Send email to new user" : "Sūtīt e-pastu jaunajam lietotājam", "Show email address" : "Rādīt e-pasta adreses", "E-Mail" : "E-pasts", "Create" : "Izveidot", "Admin Recovery Password" : "Administratora atgūšanas parole", "Enter the recovery password in order to recover the users files during password change" : "Ievadiet atgūšanas paroli, lai varētu atgūt lietotāja failus paroles maiņas laikā.", + "Group name" : "Grupas nosaukums", + "Everyone" : "Visi", + "Admins" : "Admins", + "Default quota" : "Apjoms pēc noklusējuma", + "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Lūdzu, ievadiet krātuves kvotu (piem: \"512 MB\" vai \"12 GB\")", "Other" : "Cits", + "Group admin for" : "Admin grupa", "Quota" : "Apjoms", + "Storage location" : "Krātuves atrašanās vieta", + "Last login" : "Pēdējā pieteikšanās", + "change full name" : "mainīt vārdu", "set new password" : "iestatīt jaunu paroli", + "change email address" : "mainīt e-pasta adresi", "Default" : "Noklusējuma", + "log-level out of allowed range" : "žurnāla-līmenis ārpus atļautā diapazona", "Language changed" : "Valoda tika nomainīta", + "Admins can't remove themself from the admin group" : "Administratori nevar izņemt paši sevi no administratoru grupas", + "Unable to add user to group %s" : "Nevar pievienot lietotāju grupai %s", + "Unable to remove user from group %s" : "Nevar izņemt lietotāju no grupas %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Vai esat pārliecināts, ka vēlaties pievienot \"{domain}\" kā uzticamu domēnu?", + "Please wait...." : "Lūdzu, uzgaidiet....", + "iPhone" : "iPhone", + "add group" : "pievienot grupu", "Everything (fatal issues, errors, warnings, info, debug)" : "Viss (letālas problēmas, kļūdas, brīdinājumi, informatīvas ziņas, atkļūdošanas paziņojumi)", "Info, warnings, errors and fatal issues" : "Informatīvas ziņas, brīdinājumi, kļūdas un letālas problēmas", "Warnings, errors and fatal issues" : "Brīdinājumi, kļūdas un letālas problēmas", "Errors and fatal issues" : "Kļūdas un letālas problēmas", "Fatal issues only" : "Tikai letālas problēmas", "Log" : "Žurnāls", + "What to log" : "Ko pierakstīt", + "Download logfile" : "Lejupielādēt žurnālfailu", "More" : "Vairāk", "Less" : "Mazāk", + "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Šis žurnālfails ir lielāks par 100 MB. Lejupielāde var aizņemt kādu laiku.", + "Allow users to send mail notification for shared files" : "Atļaut lietotājiem nosūtīt e-pasta paziņojumu par koplietojamiem failiem", + "Allow users to send mail notification for shared files to other users" : "Atļaut lietotājiem nosūtīt e-pasta paziņojumu par koplietojamiem failiem citiem lietotājiem", + "Uninstall App" : "Atinstalēt programmu", + "Enable experimental apps" : "Atļaut eksperimentālās programmas", + "If you want to support the project\n\t\tjoin development\n\t\t\n\t\tspread the word!" : "Ja vēlaties atbalstīt projektu\n\t\tpievienoties attīstībai\n\t\t\n\t\tizplatīt vārdu!", + "Add Group" : "Pievienot grupu", "Group" : "Grupa", - "External Storage" : "Ārējā krātuve", - "Updates" : "Atjauninājumi", - "An error occurred: {message}" : "Notika kļūda: {message}" + "Default Quota" : "Apjoms pēc noklusējuma", + "Full Name" : "Pilns vārds", + "Group Admin for" : "Admin grupa", + "Storage Location" : "Krātuves atrašanās vieta", + "Last Login" : "Pēdējā pieteikšanās" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"); diff --git a/settings/l10n/lv.json b/settings/l10n/lv.json index 73fb1390eb76aa724e1e96db947e9e1cd9ed5f23..36e1576c80005ad6bfbf681caf0236744c3e9e11 100644 --- a/settings/l10n/lv.json +++ b/settings/l10n/lv.json @@ -1,5 +1,5 @@ { "translations": { - "Enabled" : "Pievienots", + "Enabled" : "Iespējots", "Not enabled" : "Nav pievienots", "Wrong password" : "Nepareiza parole", "Saved" : "Saglabāts", @@ -8,47 +8,88 @@ "Authentication error" : "Autentifikācijas kļūda", "Please provide an admin recovery password, otherwise all user data will be lost" : "Lūdzu ievadiet administratora atjaunošanas paroli, citādi visi lietotāja dati tiks zaudēti", "Wrong admin recovery password. Please check the password and try again." : "Nepareiza administratora atjaunošanas parole. Lūdzu pārbaudiet paroli un mēģiniet vēlreiz.", + "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Aizmugursistēmas neatbalsta paroles maiņu, bet lietotāja šifrēšanas atslēga ir veiksmīgi atjaunināta.", + "installing and updating apps via the app store or Federated Cloud Sharing" : "programmu instalēšana un atjaunināšana, izmantojot programmu veikalu vai Federatīvajām Cloud koplietošanu", "Federated Cloud Sharing" : "Federatīva mākoņkoplietošana", + "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL izmanto novecojušu %s versiju (%s). Lūdzu, atjauniniet operētājsistēmu vai funkcijām, piem., %s nedarbosies pareizi.", + "A problem occurred, please check your log files (Error: %s)" : "Radusies problēma, lūdzu, pārbaudiet žurnāla failus (Kļūda: %s)", + "Migration Completed" : "Migrācija ir pabeigta", "Group already exists." : "Grupa jau eksistē.", "Unable to add group." : "Nevar pievienot grupu.", "Unable to delete group." : "Nevar izdzēst grupu.", "test email settings" : "testēt e-pasta iestatījumus", + "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Radās kļūda, nosūtot e-pastu. Lūdzu, pārskatiet savus iestatījumus. (Kļūda: %s)", "Email sent" : "Vēstule nosūtīta", "You need to set your user email before being able to send test emails." : "Nepieciešams norādīt sava lietotāja e-pasta adresi, lai nosūtīta testa e-pastus.", "Invalid request" : "Nederīgs vaicājums", "Invalid mail address" : "Nepareiza e-pasta adrese", + "No valid group selected" : "Atlasītā grupa nav derīga", "A user with that name already exists." : "Jau pastāv lietotājs ar šo vārdu.", "Unable to create user." : "Nevar izveidot lietotāju.", "Your %s account was created" : "Konts %s ir izveidots", "Unable to delete user." : "Nevar izdzēst lietotāju.", + "Settings saved" : "Iestatījumi saglabāti", "Unable to change full name" : "Nav iespējams nomainīt jūsu pilno vārdu", + "Unable to change email address" : "Nevar mainīt e-pasta adresi", "Your full name has been changed." : "Jūsu pilnais vārds tika mainīts.", "Forbidden" : "Pieeja liegta", "Invalid user" : "Nepareizs lietotājs", "Unable to change mail address" : "Nevar nomainīt e-pasta adresi", "Email saved" : "E-pasts tika saglabāts", - "Couldn't remove app." : "Nebija iespējams atslēgt lietoni.", - "Admins can't remove themself from the admin group" : "Administratori nevar izņemt paši sevi no administratoru grupas", - "Unable to add user to group %s" : "Nevar pievienot lietotāju grupai %s", - "Unable to remove user from group %s" : "Nevar izņemt lietotāju no grupas %s", - "Couldn't update app." : "Nevarēja atjaunināt lietotni.", + "Password confirmation is required" : "Nepieciešams paroles apstiprinājums", + "Couldn't remove app." : "Nebija iespējams atslēgt programmu.", + "Couldn't update app." : "Nevarēja atjaunināt programmu.", + "Are you really sure you want add {domain} as trusted domain?" : "Tu tiešām esi pārliecināta, ka vēlies pievienot {domain} kā uzticamu domēnu?", "Add trusted domain" : "Pievienot uzticamu domēnu", + "Migration in progress. Please wait until the migration is finished" : "Notiek migrācija. Lūdzu, pagaidiet, līdz migrēšana ir pabeigta", + "Migration started …" : "Uzsākta migrācija...", + "Not saved" : "Nav saglabāts", "Sending..." : "Sūta...", "All" : "Visi", - "No apps found for your version" : "Neatrada aplikāciju jūsu versijai", - "Please wait...." : "Lūdzu, uzgaidiet....", - "Error while disabling app" : "Kļūda, atvienojot lietotni", + "Update to %s" : "Atjaunināts uz %s", + "No apps found for your version" : "Neatrada programmu jūsu versijai", + "Error while disabling app" : "Kļūda, atvienojot programmu", "Disable" : "Deaktivēt", "Enable" : "Aktivēt", - "Error while enabling app" : "Kļūda, pievienojot lietotni", + "Error while enabling app" : "Kļūda, pievienojot programmu", "Updating...." : "Atjaunina....", - "Error while updating app" : "Kļūda, atjauninot lietotni", + "Error while updating app" : "Kļūda, atjauninot programmu", "Updated" : "Atjaunināta", "Uninstalling ...." : "Atinstalē ....", - "Error while uninstalling app" : "Kļūda, atinstalējot lietotni", + "Error while uninstalling app" : "Kļūda, atinstalējot programmu", "Uninstall" : "Atinstalēt", + "App update" : "Programmu atjaunināšana", + "Approved" : "Apstiprināts", + "Experimental" : "Eksperimentāls", + "Disconnect" : "Atvienot", + "Revoke" : "Atsaukt", + "Internet Explorer" : "Internet Explorer", + "Edge" : "Edge", + "Firefox" : "Firefox", + "Google Chrome" : "Google Chrome", + "Safari" : "Safari", + "Google Chrome for Android" : "Google Chrome for Android", + "iPhone iOS" : "iPhone iOS", + "iPad iOS" : "iPad iOS", + "iOS Client" : "iOS Klients", + "Android Client" : "Android Klients", + "Sync client - {os}" : "Sync klients - {os}", + "This session" : "Šajā sesijā", + "Copy" : "Kopēt", + "Copied!" : "Nokopēts!", + "Not supported!" : "Nav atbalstīts!", + "Press ⌘-C to copy." : "Spied ⌘-C lai kopētu.", + "Press Ctrl-C to copy." : "Spied Ctrl-C lai kopētu.", "Valid until {date}" : "Valīds līdz {date}", "Delete" : "Dzēst", + "Local" : "Lokāls", + "Private" : "Privāts", + "Only visible to local users" : "Redzami tikai lokālajiem lietotājiem", + "Only visible to you" : "Redzams tikai jums", + "Contacts" : "Kontakti", + "Visible to local users and to trusted servers" : "Redzama uz vietējiem lietotājiem un uzticamiem serveriem", + "Public" : "Publisks", + "Will be synced to a global and public address book" : "Tiks sinhronizēts ar globālu un publisku adrešu grāmatu", "Select a profile picture" : "Izvēlieties profila attēlu", "Very weak password" : "Ļoti vāja parole", "Weak password" : "Vāja parole", @@ -57,58 +98,131 @@ "Strong password" : "Lieliska parole", "Groups" : "Grupas", "Unable to delete {objName}" : "Nevar izdzēst {objName}", + "Error creating group: {message}" : "Kļūda, veidojot grupu: {message}", "A valid group name must be provided" : "Jānorāda derīgs grupas nosaukums", "deleted {groupName}" : "grupa {groupName} dzēsta", "undo" : "atsaukt", "never" : "nekad", "deleted {userName}" : "lietotājs {userName} dzēsts", + "Unable to add user to group {group}" : "Nevar pievienot lietotāju grupai {group}", + "Unable to remove user from group {group}" : "Nevar noņemt lietotāju no grupas {group}", + "Add group" : "Pievienot grupu", + "Invalid quota value \"{val}\"" : "Nederīga kvotas vērtība \"{val}\"", + "no group" : "neviena grupa", + "Password successfully changed" : "Parole veiksmīgi nomainīta", + "Could not change the users email" : "Nevarēja mainīt lietotāja e-pasta adrese", "A valid username must be provided" : "Jānorāda derīgs lietotājvārds", + "Error creating user: {message}" : "Kļūda, veidojot lietotāju: {message}", "A valid password must be provided" : "Jānorāda derīga parole", "A valid email must be provided" : "Jānorāda derīga e-pasta adrese", "__language_name__" : "Latviešu", "Unlimited" : "Neierobežota", + "Personal info" : "Personiskā informācija", + "Sessions" : "Sesijas", + "App passwords" : "Programmu paroles", "Sync clients" : "Sinhronizācijas lietotnes", "None" : "Nav", "Login" : "Ierakstīties", "Plain" : "vienkāršs teksts", "NT LAN Manager" : "NT LAN Pārvaldnieks", + "SSL/TLS" : "SSL/TLS", + "STARTTLS" : "STARTTLS", + "Email server" : "E-pasta serveris", "Open documentation" : "Atvērt dokumentāciju", + "This is used for sending out notifications." : "Tas tiek izmantots, izsūtot paziņojumus.", + "Send mode" : "Sūtīšanas metode", "Encryption" : "Šifrēšana", "From address" : "No adreses", + "mail" : "e-pasts", + "Authentication method" : "Autentifikācijas metode", + "Authentication required" : "Nepieciešama autentifikācija", "Server address" : "Servera adrese", "Port" : "Ports", "Credentials" : "Akreditācijas dati", "SMTP Username" : "SMTP lietotājvārds", "SMTP Password" : "SMTP parole", + "Store credentials" : "Saglabāt akreditācijas datus", "Test email settings" : "Izmēģināt e-pasta iestatījumus", "Send email" : "Sūtīt e-pastu", + "Please read carefully before activating server-side encryption: " : "Lūdzu, izlasiet uzmanīgi pirms aktivējiet servera šifrēšanu:", + "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "Šifrēšana vien negarantē sistēmas drošību. Skatiet dokumentāciju, lai iegūtu papildinformāciju par šifrēšanas programmu izmantošana, kā arī citu darbību gadījumos.", + "Be aware that encryption always increases the file size." : "Jāapzinās, ka šifrēšanas vienmēr palielina faila lielumu.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Vienmēr ir ieteicams regulāri veidot dublējumkopijas datu šifrēšanas gadījumam, pārliecinieties, lai dublētu, šifrēšanas atslēgas ir kopā ar jūsu datiem.", + "This is the final warning: Do you really want to enable encryption?" : "Šis ir pēdējais brīdinājums: vai tiešām vēlaties iespējot šifrēšanu?", "Enable encryption" : "Ieslēgt šifrēšanu", + "No encryption module loaded, please enable an encryption module in the app menu." : "Nav ielādēts šifrēšanas moduļis, lūdzu, aktivizējiet šifrēšanas moduli programmu izvēlnē.", + "Select default encryption module:" : "Atlasiet noklusēto šifrēšanas moduli:", + "Start migration" : "Sākt migrāciju", + "Security & setup warnings" : "Drošības un iestatījumu brīdinājumi", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Trūkst PHP modulis “fileinfo”. Mēs iesakām to aktivēt, lai pēc iespējas labāk noteiktu mime tipus.", + "All checks passed." : "Visas pārbaudes veiksmīgas.", "Cron" : "Cron", "Execute one task with each page loaded" : "Izpildīt vienu uzdevumu ar katru ielādēto lapu", "Version" : "Versija", "Sharing" : "Dalīšanās", - "Allow apps to use the Share API" : "Ļaut lietotnēm izmantot koplietošanas API", + "Allow apps to use the Share API" : "Ļaut programmām izmantot koplietošanas API", "Allow users to share via link" : "Ļaut lietotājiem koplietot caur saitēm", "Allow public uploads" : "Atļaut publisko augšupielādi", + "Enforce password protection" : "Ieviest paroles aizsardzību", + "Set default expiration date" : "Iestatīt noklusējuma beigu datumu", "Expire after " : "Nederīga pēc", "days" : "dienas", + "Enforce expiration date" : "Uzspiest beigu termiņu", "Allow resharing" : "Atļaut atkārtotu koplietošanu", + "Allow sharing with groups" : "Atļaut koplietošanu ar grupu", + "Restrict users to only share with users in their groups" : "Ierobežot lietotājiem koplietot tikai ar lietotājiem savās grupās", + "Exclude groups from sharing" : "Izslēgt grupu no koplietošanas", + "This is particularly recommended when using the desktop client for file synchronisation." : "Tas ir īpaši ieteicams, ja, izmantojot darbvirsmas klientu, lai veiktu failu sinhronizāciju.", + "How to do backups" : "Kā veikt dublēšanu", + "Advanced monitoring" : "Papildu uzraudzība", + "Performance tuning" : "Veiktspējas uzstādīšana", + "Improving the config.php" : "Uzlabot config.php", + "Theming" : "Dizains", + "Hardening and security guidance" : "Aizsardzības un drošības norādījumi", + "Developer documentation" : "Izstrādātāja dokumentācija", + "%s-licensed" : "%s-licencēts", "Documentation:" : "Dokumentācija:", "User documentation" : "Lietotāja dokumentācija", "Admin documentation" : "Administratora dokumentācija", + "Visit website" : "Apmeklējiet vietni", + "Report a bug" : "Ziņot par kļūdu", "Show description …" : "Rādīt aprakstu …", "Hide description …" : "Slēpt aprakstu …", + "This app has an update available." : "Šai programmai ir pieejams jauninājums", + "Enable only for specific groups" : "Iespējot tikai konkrētām grupām", + "Uninstall app" : "Atinstalēt programmu", + "SSL Root Certificates" : "SSL Root Sertifikāti", + "Valid until" : "Derīgs līdz", + "Issued By" : "Izsniedza", + "Valid until %s" : "Derīgs līdz %s", + "Import root certificate" : "Importēt root sertifikātu", + "Cheers!" : "Priekā!", + "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hei,\n\nvienkārši Jūsu zināšanai, ka Jums tagad ir %s konts.\n\nJūsu lietotājvārds: %s\nPiekļuve: %s\n\n", + "Administrator documentation" : "Administratora dokumentācija", "Online documentation" : "Tiešsaistes dokumentācija", "Forum" : "Forums", + "Getting help" : "Saņemt palīdzību", "You are using %s of %s" : "Jūs izmantojiet %s no %s", "Profile picture" : "Profila attēls", "Upload new" : "Ielādēt jaunu", + "Select from Files" : "Izvēlēties no faila", "Remove image" : "Novākt attēlu", + "png or jpg, max. 20 MB" : "png vai jpg, max. 20 MB", "Cancel" : "Atcelt", + "Choose as profile picture" : "Izvēlēties kā profila attēlu", "Full name" : "Pilns vārds", + "No display name set" : "Nav norādīts ekrāna vārds", "Email" : "E-pasts", "Your email address" : "Jūsu e-pasta adrese", + "No email address set" : "Nav norādīts e-pasts", + "For password recovery and notifications" : "Paroles atjaunošanai un paziņojumiem", + "Phone number" : "Tālruņa numurs", + "Your phone number" : "Jūsu tālruņa numurs", + "Address" : "Adrese", + "Your postal address" : "Jūsu pasta adrese", + "Website" : "Mājaslapa", + "Your website" : "Jūsu mājaslapa", + "Twitter" : "Twitter", "You are member of the following groups:" : "Jūs esat šādu grupu biedrs:", "Password" : "Parole", "Current password" : "Pašreizējā parole", @@ -116,37 +230,75 @@ "Change password" : "Mainīt paroli", "Language" : "Valoda", "Help translate" : "Palīdzi tulkot", - "Get the apps to sync your files" : "Saņem lietotnes, lai sinhronizētu savas datnes", + "Get the apps to sync your files" : "Saņem programmu, lai sinhronizētu savas datnes", "Desktop client" : "Darbvirsmas klients", - "Android app" : "Android lietotne", - "iOS app" : "iOS lietotne", + "Android app" : "Android programma", + "iOS app" : "iOS programma", "Show First Run Wizard again" : "Vēlreiz rādīt pirmās palaišanas vedni", + "Device" : "Ierīce", + "Last activity" : "Pēdējā aktivitāte", "Name" : "Nosaukums", + "App name" : "Programmas nosaukums", + "Create new app password" : "Izveidot jaunu programmas paroli", + "Use the credentials below to configure your app or device." : "Izmantot akreditācijas datus, lai konfigurētu savu programmu vai ierīci.", + "For security reasons this password will only be shown once." : "Drošības apsvērumu dēļ šī parole, tiks parādīta tikai vienreiz.", "Username" : "Lietotājvārds", "Done" : "Pabeigts", + "Follow us on Google Plus!" : "Seko mums Google Plus!", + "Subscribe to our newsletter!" : "Abonēt mūsu jaunumus!", + "Show storage location" : "Rādīt krātuves atrašanās vietu", + "Show last log in" : "Rādīt pēdējo autorizāciju", "Send email to new user" : "Sūtīt e-pastu jaunajam lietotājam", "Show email address" : "Rādīt e-pasta adreses", "E-Mail" : "E-pasts", "Create" : "Izveidot", "Admin Recovery Password" : "Administratora atgūšanas parole", "Enter the recovery password in order to recover the users files during password change" : "Ievadiet atgūšanas paroli, lai varētu atgūt lietotāja failus paroles maiņas laikā.", + "Group name" : "Grupas nosaukums", + "Everyone" : "Visi", + "Admins" : "Admins", + "Default quota" : "Apjoms pēc noklusējuma", + "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Lūdzu, ievadiet krātuves kvotu (piem: \"512 MB\" vai \"12 GB\")", "Other" : "Cits", + "Group admin for" : "Admin grupa", "Quota" : "Apjoms", + "Storage location" : "Krātuves atrašanās vieta", + "Last login" : "Pēdējā pieteikšanās", + "change full name" : "mainīt vārdu", "set new password" : "iestatīt jaunu paroli", + "change email address" : "mainīt e-pasta adresi", "Default" : "Noklusējuma", + "log-level out of allowed range" : "žurnāla-līmenis ārpus atļautā diapazona", "Language changed" : "Valoda tika nomainīta", + "Admins can't remove themself from the admin group" : "Administratori nevar izņemt paši sevi no administratoru grupas", + "Unable to add user to group %s" : "Nevar pievienot lietotāju grupai %s", + "Unable to remove user from group %s" : "Nevar izņemt lietotāju no grupas %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Vai esat pārliecināts, ka vēlaties pievienot \"{domain}\" kā uzticamu domēnu?", + "Please wait...." : "Lūdzu, uzgaidiet....", + "iPhone" : "iPhone", + "add group" : "pievienot grupu", "Everything (fatal issues, errors, warnings, info, debug)" : "Viss (letālas problēmas, kļūdas, brīdinājumi, informatīvas ziņas, atkļūdošanas paziņojumi)", "Info, warnings, errors and fatal issues" : "Informatīvas ziņas, brīdinājumi, kļūdas un letālas problēmas", "Warnings, errors and fatal issues" : "Brīdinājumi, kļūdas un letālas problēmas", "Errors and fatal issues" : "Kļūdas un letālas problēmas", "Fatal issues only" : "Tikai letālas problēmas", "Log" : "Žurnāls", + "What to log" : "Ko pierakstīt", + "Download logfile" : "Lejupielādēt žurnālfailu", "More" : "Vairāk", "Less" : "Mazāk", + "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Šis žurnālfails ir lielāks par 100 MB. Lejupielāde var aizņemt kādu laiku.", + "Allow users to send mail notification for shared files" : "Atļaut lietotājiem nosūtīt e-pasta paziņojumu par koplietojamiem failiem", + "Allow users to send mail notification for shared files to other users" : "Atļaut lietotājiem nosūtīt e-pasta paziņojumu par koplietojamiem failiem citiem lietotājiem", + "Uninstall App" : "Atinstalēt programmu", + "Enable experimental apps" : "Atļaut eksperimentālās programmas", + "If you want to support the project\n\t\tjoin development\n\t\t\n\t\tspread the word!" : "Ja vēlaties atbalstīt projektu\n\t\tpievienoties attīstībai\n\t\t\n\t\tizplatīt vārdu!", + "Add Group" : "Pievienot grupu", "Group" : "Grupa", - "External Storage" : "Ārējā krātuve", - "Updates" : "Atjauninājumi", - "An error occurred: {message}" : "Notika kļūda: {message}" + "Default Quota" : "Apjoms pēc noklusējuma", + "Full Name" : "Pilns vārds", + "Group Admin for" : "Admin grupa", + "Storage Location" : "Krātuves atrašanās vieta", + "Last Login" : "Pēdējā pieteikšanās" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);" } \ No newline at end of file diff --git a/settings/l10n/mk.js b/settings/l10n/mk.js index 769ad1df48b26a2856c3bee74da0906f1995dc0f..b4ddc9551026d62bd513efa9c4ee7d4e6dc6022a 100644 --- a/settings/l10n/mk.js +++ b/settings/l10n/mk.js @@ -33,9 +33,6 @@ OC.L10N.register( "Unable to change mail address" : "Не можам да ја променам електронската адреса/пошта", "Email saved" : "Електронската пошта е снимена", "Couldn't remove app." : "Не можам да ја отстранам апликацијата.", - "Admins can't remove themself from the admin group" : "Администраторите неможе да се избришат себеси од админ групата", - "Unable to add user to group %s" : "Неможе да додадам корисник во група %s", - "Unable to remove user from group %s" : "Неможе да избришам корисник од група %s", "Couldn't update app." : "Не можам да ја надградам апликацијата.", "Add trusted domain" : "Додади доверлив домејн", "Migration started …" : "Миграцијата е започнаа ...", @@ -44,7 +41,6 @@ OC.L10N.register( "All" : "Сите", "Update to %s" : "Надгради на %s", "No apps found for your version" : "За вашата верзија не се пронајдени апликации", - "Please wait...." : "Ве молам почекајте ...", "Error while disabling app" : "Грешка при исклучувањето на апликацијата", "Disable" : "Оневозможи", "Enable" : "Овозможи", @@ -164,6 +160,10 @@ OC.L10N.register( "Default" : "Предефиниран", "log-level out of allowed range" : "нивото на логирање е надвор од дозволениот опсег", "Language changed" : "Јазикот е сменет", + "Admins can't remove themself from the admin group" : "Администраторите неможе да се избришат себеси од админ групата", + "Unable to add user to group %s" : "Неможе да додадам корисник во група %s", + "Unable to remove user from group %s" : "Неможе да избришам корисник од група %s", + "Please wait...." : "Ве молам почекајте ...", "Info, warnings, errors and fatal issues" : "Информации, предупредувања, грешки и фатални работи", "Warnings, errors and fatal issues" : "Предупредувања, грешки и фатални работи", "Errors and fatal issues" : "Грешки и фатални работи", @@ -173,9 +173,6 @@ OC.L10N.register( "Download logfile" : "Преземи ја датотеката со логови", "More" : "Повеќе", "Less" : "Помалку", - "Group" : "Група", - "External Storage" : "Надворешно складиште", - "Updates" : "Ажурирања", - "An error occurred: {message}" : "Се случи грешка: {message}" + "Group" : "Група" }, "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"); diff --git a/settings/l10n/mk.json b/settings/l10n/mk.json index 76c4994e0ee1b8a9b3bc3fc587c2af08838dc910..cbb05bbd3800c7982786e84f866fa7f68deda26b 100644 --- a/settings/l10n/mk.json +++ b/settings/l10n/mk.json @@ -31,9 +31,6 @@ "Unable to change mail address" : "Не можам да ја променам електронската адреса/пошта", "Email saved" : "Електронската пошта е снимена", "Couldn't remove app." : "Не можам да ја отстранам апликацијата.", - "Admins can't remove themself from the admin group" : "Администраторите неможе да се избришат себеси од админ групата", - "Unable to add user to group %s" : "Неможе да додадам корисник во група %s", - "Unable to remove user from group %s" : "Неможе да избришам корисник од група %s", "Couldn't update app." : "Не можам да ја надградам апликацијата.", "Add trusted domain" : "Додади доверлив домејн", "Migration started …" : "Миграцијата е започнаа ...", @@ -42,7 +39,6 @@ "All" : "Сите", "Update to %s" : "Надгради на %s", "No apps found for your version" : "За вашата верзија не се пронајдени апликации", - "Please wait...." : "Ве молам почекајте ...", "Error while disabling app" : "Грешка при исклучувањето на апликацијата", "Disable" : "Оневозможи", "Enable" : "Овозможи", @@ -162,6 +158,10 @@ "Default" : "Предефиниран", "log-level out of allowed range" : "нивото на логирање е надвор од дозволениот опсег", "Language changed" : "Јазикот е сменет", + "Admins can't remove themself from the admin group" : "Администраторите неможе да се избришат себеси од админ групата", + "Unable to add user to group %s" : "Неможе да додадам корисник во група %s", + "Unable to remove user from group %s" : "Неможе да избришам корисник од група %s", + "Please wait...." : "Ве молам почекајте ...", "Info, warnings, errors and fatal issues" : "Информации, предупредувања, грешки и фатални работи", "Warnings, errors and fatal issues" : "Предупредувања, грешки и фатални работи", "Errors and fatal issues" : "Грешки и фатални работи", @@ -171,9 +171,6 @@ "Download logfile" : "Преземи ја датотеката со логови", "More" : "Повеќе", "Less" : "Помалку", - "Group" : "Група", - "External Storage" : "Надворешно складиште", - "Updates" : "Ажурирања", - "An error occurred: {message}" : "Се случи грешка: {message}" + "Group" : "Група" },"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" } \ No newline at end of file diff --git a/settings/l10n/nb_NO.js b/settings/l10n/nb_NO.js index 27af749b5dcc2c528fa91977d4749f0520dbdde4..32cc38f7759704e48b64be6c3b2e2a418f4d4f18 100644 --- a/settings/l10n/nb_NO.js +++ b/settings/l10n/nb_NO.js @@ -36,9 +36,6 @@ OC.L10N.register( "Unable to change mail address" : "Kan ikke endre epost-adresse", "Email saved" : "Epost lagret", "Couldn't remove app." : "Klarte ikke å fjerne app.", - "Admins can't remove themself from the admin group" : "Admin kan ikke flytte seg selv fra admingruppen", - "Unable to add user to group %s" : "Kan ikke legge bruker til gruppen %s", - "Unable to remove user from group %s" : "Kan ikke slette bruker fra gruppen %s", "Couldn't update app." : "Kunne ikke oppdatere app.", "Add trusted domain" : "Legg til et klarert domene", "Migration in progress. Please wait until the migration is finished" : "Migrering utføres. Vent til migreringen er ferdig.", @@ -54,7 +51,6 @@ OC.L10N.register( "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Offisielle apper er utviklet av og innenfor miljøet, de byr på sentral funksjonalitet og er klare for bruk i produksjon.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Godkjente apper er utviklet av tiltrodde utviklere og har gjennomgått en rask sikkerhetssjekk. De vedlikeholdes aktivt i et åpent kode-depot og utviklerne anser dem for å være stabile for tidvis eller normal bruk.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Denne appen er ikke sjekket for sikkerhetsproblemer og er ny eller ansett for å være ustabil. Installer på egen risiko.", - "Please wait...." : "Vennligst vent...", "Error while disabling app" : "Deaktivering av app feilet", "Disable" : "Deaktiver ", "Enable" : "Aktiver", @@ -84,6 +80,7 @@ OC.L10N.register( "Android Client" : "Android klient", "Sync client - {os}" : "Synkroniseringsklient - {os}", "This session" : "Denne økten", + "Copy" : "Kopier", "Copied!" : "Kopiert!", "Not supported!" : "Ikke støttet!", "Press ⌘-C to copy." : "Trykk ⌘-C for å kopiere", @@ -94,6 +91,7 @@ OC.L10N.register( "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Det oppstod en feil. Vennligst last opp et ASCII-kodet PEM-sertifikat.", "Valid until {date}" : "Gyldig til {date}", "Delete" : "Slett", + "Private" : "Privat", "Select a profile picture" : "Velg et profilbilde", "Very weak password" : "Veldig svakt passord", "Weak password" : "Svakt passord", @@ -226,7 +224,6 @@ OC.L10N.register( "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Denne appen har ingen høyeste versjon av Nextcloud definert. Dette vil være en feil i fremtiden.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Denne appen kan ikke installeres fordi følgende avhengigheter ikke er tilfredsstilt:", "Enable only for specific groups" : "Aktiver kun for visse grupper", - "Uninstall App" : "Avinstaller app", "SSL Root Certificates" : "SSL rotsertifikater", "Common Name" : "Vanlig navn", "Valid until" : "Gyldig til", @@ -309,7 +306,11 @@ OC.L10N.register( "Default" : "Standard", "log-level out of allowed range" : "Loggnivå utenfor tillatt område", "Language changed" : "Språk endret", + "Admins can't remove themself from the admin group" : "Admin kan ikke flytte seg selv fra admingruppen", + "Unable to add user to group %s" : "Kan ikke legge bruker til gruppen %s", + "Unable to remove user from group %s" : "Kan ikke slette bruker fra gruppen %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ønsker du virkelig å legge til \"{domain}\" som klarert domene?", + "Please wait...." : "Vennligst vent...", "iPhone" : "iPhone", "add group" : "legg til gruppe", "Everything (fatal issues, errors, warnings, info, debug)" : "Alt (fatale problemer, feil, advarsler, info, debug)", @@ -329,6 +330,7 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "SQLite er spesielt frarådet om man bruker desktopklienten til filsynkronisering", "Experimental applications ahead" : "Eksperimentelle applikasjoner forut", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Eksperimentelle apper er ikke sjekket for sikkerhetsproblemer. De er nye eller de anses som ustabile og under stadig utvikling. Å installere slike apper kan forårsake tap av data eller brudd på sikkerheten.", + "Uninstall App" : "Avinstaller app", "Enable experimental apps" : "Aktiver eksperimentelle apper", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hei,

    vil bare informere om at du nå har en %s-konto.

    Brukernavnet ditt: %s
    Gå dit: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hei,\n\nVil bare informere om at du nå har en %s-konto.\n\nBrukernavnet ditt: %s\nGå dit: %s\n\n", @@ -340,24 +342,6 @@ OC.L10N.register( "Group Admin for" : "Gruppeadministrator for", "Storage Location" : "Lagringsplassering", "User Backend" : "Bruker-tjener", - "Last Login" : "Siste innlogging", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Ekstern lagring", - "Updates" : "Oppdateringer", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Offisielle apper er utviklet av og innenfor miljøet, de byr på sentral funksjonalitet og er klare for bruk i produksjon.", - "No apps found for \"{query}\"" : "Ingen apper funnet for \"{query}\"", - "An error occurred: {message}" : "Det oppstod en feil: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Vennligst sjekk installasjonsdokumentasjonen ↗ etter php konfigurasjonsnotater og konfigurering av php på tjeneren din, særlig om du bruker php-fpm.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Din database kjører ikke med \"READ COMMITED\" transaksjonsisolering. Dette kan lage problemer når flere handlinger kjøres i paralell.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Serveren din kjører på Microsoft Windows. Vi anbefaler sterkt Linux for en optimal brukeropplevelse.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Transaksjonsbasert fil-låsing er deaktivert. Dette kan føre til konflikt. Aktiver \"filelocking.enabled\" i config.php for å unngå disse problemene. Se dokumentasjonen ↗ for mer informasjon.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Vennligst dobbeltsjekk installasjonsveiledningen ↗, og se etter feil og advarsler i loggen.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Krypteringen alene gir ikke noen garanti for systemets sikkerhet. Vennligst se i Nextcloud dokumentasjonen for mer informasjon om hvordan krypteringsappen virker, og de fungerende brukeeksemplene.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "For å migrere til en annen database, bruk kommandolinjeverktøyet: 'occ db:convert-type', eller les i dokumentasjonen ↗.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Denne appen har ingen laveste versjon av Nextcloud definert. Dette vil være en feil i Nextcloud 11 og senere.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Denne appen har ingen maksimum versjon av Nextcloud definert. Dette vil være en feil i Nextcloud 11 og senere.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Hvis du vil støtte prosjektet \n\t\tdelta i utviklingen\n\t\tor\n\t\thjelp andre brukere!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Utviklet av {communityopen}Nextcloud mijøet{linkclose}, {githubopen}kildekoden{linkclose} er lisensiert under {licenseopen}AGPL{linkclose}." + "Last Login" : "Siste innlogging" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/nb_NO.json b/settings/l10n/nb_NO.json index 09552049cdba94a82b1c4f4072649034b93ebb5c..dc153fc66f6e2939d9c4bd55880a057961961d63 100644 --- a/settings/l10n/nb_NO.json +++ b/settings/l10n/nb_NO.json @@ -34,9 +34,6 @@ "Unable to change mail address" : "Kan ikke endre epost-adresse", "Email saved" : "Epost lagret", "Couldn't remove app." : "Klarte ikke å fjerne app.", - "Admins can't remove themself from the admin group" : "Admin kan ikke flytte seg selv fra admingruppen", - "Unable to add user to group %s" : "Kan ikke legge bruker til gruppen %s", - "Unable to remove user from group %s" : "Kan ikke slette bruker fra gruppen %s", "Couldn't update app." : "Kunne ikke oppdatere app.", "Add trusted domain" : "Legg til et klarert domene", "Migration in progress. Please wait until the migration is finished" : "Migrering utføres. Vent til migreringen er ferdig.", @@ -52,7 +49,6 @@ "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Offisielle apper er utviklet av og innenfor miljøet, de byr på sentral funksjonalitet og er klare for bruk i produksjon.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Godkjente apper er utviklet av tiltrodde utviklere og har gjennomgått en rask sikkerhetssjekk. De vedlikeholdes aktivt i et åpent kode-depot og utviklerne anser dem for å være stabile for tidvis eller normal bruk.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Denne appen er ikke sjekket for sikkerhetsproblemer og er ny eller ansett for å være ustabil. Installer på egen risiko.", - "Please wait...." : "Vennligst vent...", "Error while disabling app" : "Deaktivering av app feilet", "Disable" : "Deaktiver ", "Enable" : "Aktiver", @@ -82,6 +78,7 @@ "Android Client" : "Android klient", "Sync client - {os}" : "Synkroniseringsklient - {os}", "This session" : "Denne økten", + "Copy" : "Kopier", "Copied!" : "Kopiert!", "Not supported!" : "Ikke støttet!", "Press ⌘-C to copy." : "Trykk ⌘-C for å kopiere", @@ -92,6 +89,7 @@ "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Det oppstod en feil. Vennligst last opp et ASCII-kodet PEM-sertifikat.", "Valid until {date}" : "Gyldig til {date}", "Delete" : "Slett", + "Private" : "Privat", "Select a profile picture" : "Velg et profilbilde", "Very weak password" : "Veldig svakt passord", "Weak password" : "Svakt passord", @@ -224,7 +222,6 @@ "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Denne appen har ingen høyeste versjon av Nextcloud definert. Dette vil være en feil i fremtiden.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Denne appen kan ikke installeres fordi følgende avhengigheter ikke er tilfredsstilt:", "Enable only for specific groups" : "Aktiver kun for visse grupper", - "Uninstall App" : "Avinstaller app", "SSL Root Certificates" : "SSL rotsertifikater", "Common Name" : "Vanlig navn", "Valid until" : "Gyldig til", @@ -307,7 +304,11 @@ "Default" : "Standard", "log-level out of allowed range" : "Loggnivå utenfor tillatt område", "Language changed" : "Språk endret", + "Admins can't remove themself from the admin group" : "Admin kan ikke flytte seg selv fra admingruppen", + "Unable to add user to group %s" : "Kan ikke legge bruker til gruppen %s", + "Unable to remove user from group %s" : "Kan ikke slette bruker fra gruppen %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ønsker du virkelig å legge til \"{domain}\" som klarert domene?", + "Please wait...." : "Vennligst vent...", "iPhone" : "iPhone", "add group" : "legg til gruppe", "Everything (fatal issues, errors, warnings, info, debug)" : "Alt (fatale problemer, feil, advarsler, info, debug)", @@ -327,6 +328,7 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "SQLite er spesielt frarådet om man bruker desktopklienten til filsynkronisering", "Experimental applications ahead" : "Eksperimentelle applikasjoner forut", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Eksperimentelle apper er ikke sjekket for sikkerhetsproblemer. De er nye eller de anses som ustabile og under stadig utvikling. Å installere slike apper kan forårsake tap av data eller brudd på sikkerheten.", + "Uninstall App" : "Avinstaller app", "Enable experimental apps" : "Aktiver eksperimentelle apper", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hei,

    vil bare informere om at du nå har en %s-konto.

    Brukernavnet ditt: %s
    Gå dit: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hei,\n\nVil bare informere om at du nå har en %s-konto.\n\nBrukernavnet ditt: %s\nGå dit: %s\n\n", @@ -338,24 +340,6 @@ "Group Admin for" : "Gruppeadministrator for", "Storage Location" : "Lagringsplassering", "User Backend" : "Bruker-tjener", - "Last Login" : "Siste innlogging", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Ekstern lagring", - "Updates" : "Oppdateringer", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Offisielle apper er utviklet av og innenfor miljøet, de byr på sentral funksjonalitet og er klare for bruk i produksjon.", - "No apps found for \"{query}\"" : "Ingen apper funnet for \"{query}\"", - "An error occurred: {message}" : "Det oppstod en feil: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Vennligst sjekk installasjonsdokumentasjonen ↗ etter php konfigurasjonsnotater og konfigurering av php på tjeneren din, særlig om du bruker php-fpm.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Din database kjører ikke med \"READ COMMITED\" transaksjonsisolering. Dette kan lage problemer når flere handlinger kjøres i paralell.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Serveren din kjører på Microsoft Windows. Vi anbefaler sterkt Linux for en optimal brukeropplevelse.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Transaksjonsbasert fil-låsing er deaktivert. Dette kan føre til konflikt. Aktiver \"filelocking.enabled\" i config.php for å unngå disse problemene. Se dokumentasjonen ↗ for mer informasjon.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Vennligst dobbeltsjekk installasjonsveiledningen ↗, og se etter feil og advarsler i loggen.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Krypteringen alene gir ikke noen garanti for systemets sikkerhet. Vennligst se i Nextcloud dokumentasjonen for mer informasjon om hvordan krypteringsappen virker, og de fungerende brukeeksemplene.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "For å migrere til en annen database, bruk kommandolinjeverktøyet: 'occ db:convert-type', eller les i dokumentasjonen ↗.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Denne appen har ingen laveste versjon av Nextcloud definert. Dette vil være en feil i Nextcloud 11 og senere.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Denne appen har ingen maksimum versjon av Nextcloud definert. Dette vil være en feil i Nextcloud 11 og senere.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Hvis du vil støtte prosjektet \n\t\tdelta i utviklingen\n\t\tor\n\t\thjelp andre brukere!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Utviklet av {communityopen}Nextcloud mijøet{linkclose}, {githubopen}kildekoden{linkclose} er lisensiert under {licenseopen}AGPL{linkclose}." + "Last Login" : "Siste innlogging" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js index 2875154fbd2ca711e2d3fbe5ae052c1df3a8c25f..91f2987d33af2c85cfafda2d28a8176d6e903ab8 100644 --- a/settings/l10n/nl.js +++ b/settings/l10n/nl.js @@ -25,6 +25,7 @@ OC.L10N.register( "You need to set your user email before being able to send test emails." : "Je moet je e-mailadres invoeren voordat je testberichten kunt versturen.", "Invalid request" : "Ongeldige aanvraag", "Invalid mail address" : "Ongeldig e-mailadres", + "No valid group selected" : "Geen geldige groep geselecteerd", "A user with that name already exists." : "Er bestaat al een gebruiker met die naam.", "Unable to create user." : "Kan gebruiker niet aanmaken.", "Your %s account was created" : "Je %s account is aangemaakt", @@ -39,9 +40,6 @@ OC.L10N.register( "Email saved" : "E-mail opgeslagen", "Password confirmation is required" : "Wachtwoordbevestiging vereist", "Couldn't remove app." : "Kon app niet verwijderen.", - "Admins can't remove themself from the admin group" : "Admins kunnen zichzelf niet uit de admin groep verwijderen", - "Unable to add user to group %s" : "Niet in staat om gebruiker toe te voegen aan groep %s", - "Unable to remove user from group %s" : "Niet in staat om gebruiker te verwijderen uit groep %s", "Couldn't update app." : "Kon de app niet bijwerken.", "Are you really sure you want add {domain} as trusted domain?" : "Bent u er zeker van om {domain} als vertrouwd domein toe te voegen?", "Add trusted domain" : "Vertrouwd domein toevoegen", @@ -58,7 +56,7 @@ OC.L10N.register( "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Officiële apps worden ontwikkeld door en binnen de community. Ze bieden centrale functionaliteit en zijn klaar voor productie.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Goedgekeurde apps zijn ontwikkeld door vertrouwde ontwikkelaars en hebben een beveiligingscontrole ondergaan. Ze worden actief onderhouden in een open code repository en hun ontwikkelaars vinden ze stabiel genoeg voor informeel of normaal gebruik.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Deze app is niet gecontroleerd op beveiligingsproblemen en is nieuw of staat bekend als onstabiel. Installeren op eigen risico.", - "Please wait...." : "Even geduld a.u.b.", + "Enabling app …" : "Activeren app ...", "Error while disabling app" : "Fout tijdens het uitzetten van de app", "Disable" : "Uitschakelen", "Enable" : "Activeer", @@ -125,6 +123,8 @@ OC.L10N.register( "undo" : "ongedaan maken", "never" : "geen", "deleted {userName}" : "verwijderd {userName}", + "Unable to add user to group {group}" : "Kan niet worden toegevoegd aan gebruikersgroep {group}", + "Unable to remove user from group {group}" : "Gebruiker kan niet worden verwijderd van groep {group}", "Add group" : "Groep toevoegen", "Invalid quota value \"{val}\"" : "Ongeldige quota waarde \"{val}\"", "no group" : "geen groep", @@ -247,7 +247,7 @@ OC.L10N.register( "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Deze app heeft geen maximum Nextcloud versie toegewezen gekregen. In de toekomst wordt dit wordt een fout.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Deze app kan niet worden geïnstalleerd, omdat de volgende afhankelijkheden niet zijn ingevuld:", "Enable only for specific groups" : "Alleen voor bepaalde groepen activeren", - "Uninstall App" : "De-installeren app", + "Uninstall app" : "De-installeren app", "SSL Root Certificates" : "SSL Root Certificaten", "Common Name" : "Common Name", "Valid until" : "Geldig tot", @@ -341,7 +341,11 @@ OC.L10N.register( "Default" : "Standaard", "log-level out of allowed range" : "loggingniveau buiten toegestane bereik", "Language changed" : "Taal aangepast", + "Admins can't remove themself from the admin group" : "Admins kunnen zichzelf niet uit de admin groep verwijderen", + "Unable to add user to group %s" : "Niet in staat om gebruiker toe te voegen aan groep %s", + "Unable to remove user from group %s" : "Niet in staat om gebruiker te verwijderen uit groep %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Weet je zeker dat je \"{domain}\" als een vertrouwd domein wilt toevoegen?", + "Please wait...." : "Even geduld a.u.b.", "iPhone" : "iPhone", "add group" : "groep toevoegen", "Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale problemen, fouten, waarschuwingen, info, debug)", @@ -361,6 +365,7 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Vooral wanneer de desktop client wordt gebruik voor bestandssynchronisatie wordt gebruik van sqlite afgeraden.", "Experimental applications ahead" : "Experimentele applicaties vooraan", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Experimentele apps zijn niet gecontroleerd op beveiligingsproblemen, zijn nieuw of staan bekend als instabiel en worden volop ontwikkeld. Installatie kan leiden tot gegevensverlies of beveiligingsincidenten.", + "Uninstall App" : "De-installeren app", "Enable experimental apps" : "Inschakelen experimentele apps", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hallo daar,

    we willen je laten weten dat je nu een %s account hebt.

    Je gebruikersnaam: %s
    Ga naar: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hallo,\n\nwe willen je laten weten dat je nu een %s account hebt.\n\nJe gebruikersnaam: %s\nGa naar: %s\n\n", @@ -372,24 +377,6 @@ OC.L10N.register( "Group Admin for" : "Groepsbeheerder voor", "Storage Location" : "Opslaglocatie", "User Backend" : "Backend gebruiker", - "Last Login" : "Laatste inlog", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Externe opslag", - "Updates" : "Updates", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Officiële apps worden ontwikkeld door en binnen de Nextcloud community. Ze bieden cruciale functionaliteit voor Nextcloud en zijn klaar voor productie.", - "No apps found for \"{query}\"" : "Geen apps gevonden voor {query}", - "An error occurred: {message}" : "Er heeft zich een fout voorgedaan: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Lees de installatiedocumentatie ↗ voor php configuratienotities en de php configuratie van je server, zeker bij gebruik van php-fpm.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Je database draait niet met \"READ COMMITED\" transactie isolatie niveau. Dit kan problemen opleveren als er meerdere acties tegelijkertijd worden uitgevoerd.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Je server draait op Microsoft Windows. We adviseren je om een linux server te gebruiken voor een optimale gebruikerservaring.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Transactionele bestandlocking is gedeactiveerd, dat zou kunnen leiden tot versiebeheerproblemen. Schakel 'filelocking enabled' in config.php in om deze problemen te voorkomen. Zie de documentatie ↗ voor meer informatie.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Lees de installatiehandleiding ↗ goed door en controleer op fouten en waarschuwingen in de logging.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Versleuteling alleen garandeert geen beveiliging van het systeem. Lees de Nextcloud documentatie voor meer achtergronden over de werking van de crypto app en de relevante use cases.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Om te migreren naar een andere database moet u de commandoregel tool gebruiken: 'occ db:convert-type', of lees de documentatie ↗.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Deze app heeft geen minimum Nextcloud versie toegewezen gekregen. Dit wordt een fout in Nextcloud 11 en later.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Deze app heeft geen maximum Nextcloud versie toegewezen gekregen. Dit wordt een fout in Nextcloud 11 en later.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Als je dit project wilt ondersteunen\n\t\thelp mee met ontwikkelen\n\t\tof\n\t\thelp andere gebruikers!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Ontwikkeld door de {communityopen}Nextcloud community{linkclose}, de {githubopen}broncode{linkclose} is gelicenseerd onder de {licenseopen}AGPL{linkclose}." + "Last Login" : "Laatste inlog" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/nl.json b/settings/l10n/nl.json index 7cc83b182fef78a1b78f1cf1a9b2f5e1d2678643..68b8e1ab060dc37e377e8142f77a29c2c09aa1b1 100644 --- a/settings/l10n/nl.json +++ b/settings/l10n/nl.json @@ -23,6 +23,7 @@ "You need to set your user email before being able to send test emails." : "Je moet je e-mailadres invoeren voordat je testberichten kunt versturen.", "Invalid request" : "Ongeldige aanvraag", "Invalid mail address" : "Ongeldig e-mailadres", + "No valid group selected" : "Geen geldige groep geselecteerd", "A user with that name already exists." : "Er bestaat al een gebruiker met die naam.", "Unable to create user." : "Kan gebruiker niet aanmaken.", "Your %s account was created" : "Je %s account is aangemaakt", @@ -37,9 +38,6 @@ "Email saved" : "E-mail opgeslagen", "Password confirmation is required" : "Wachtwoordbevestiging vereist", "Couldn't remove app." : "Kon app niet verwijderen.", - "Admins can't remove themself from the admin group" : "Admins kunnen zichzelf niet uit de admin groep verwijderen", - "Unable to add user to group %s" : "Niet in staat om gebruiker toe te voegen aan groep %s", - "Unable to remove user from group %s" : "Niet in staat om gebruiker te verwijderen uit groep %s", "Couldn't update app." : "Kon de app niet bijwerken.", "Are you really sure you want add {domain} as trusted domain?" : "Bent u er zeker van om {domain} als vertrouwd domein toe te voegen?", "Add trusted domain" : "Vertrouwd domein toevoegen", @@ -56,7 +54,7 @@ "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Officiële apps worden ontwikkeld door en binnen de community. Ze bieden centrale functionaliteit en zijn klaar voor productie.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Goedgekeurde apps zijn ontwikkeld door vertrouwde ontwikkelaars en hebben een beveiligingscontrole ondergaan. Ze worden actief onderhouden in een open code repository en hun ontwikkelaars vinden ze stabiel genoeg voor informeel of normaal gebruik.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Deze app is niet gecontroleerd op beveiligingsproblemen en is nieuw of staat bekend als onstabiel. Installeren op eigen risico.", - "Please wait...." : "Even geduld a.u.b.", + "Enabling app …" : "Activeren app ...", "Error while disabling app" : "Fout tijdens het uitzetten van de app", "Disable" : "Uitschakelen", "Enable" : "Activeer", @@ -123,6 +121,8 @@ "undo" : "ongedaan maken", "never" : "geen", "deleted {userName}" : "verwijderd {userName}", + "Unable to add user to group {group}" : "Kan niet worden toegevoegd aan gebruikersgroep {group}", + "Unable to remove user from group {group}" : "Gebruiker kan niet worden verwijderd van groep {group}", "Add group" : "Groep toevoegen", "Invalid quota value \"{val}\"" : "Ongeldige quota waarde \"{val}\"", "no group" : "geen groep", @@ -245,7 +245,7 @@ "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Deze app heeft geen maximum Nextcloud versie toegewezen gekregen. In de toekomst wordt dit wordt een fout.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Deze app kan niet worden geïnstalleerd, omdat de volgende afhankelijkheden niet zijn ingevuld:", "Enable only for specific groups" : "Alleen voor bepaalde groepen activeren", - "Uninstall App" : "De-installeren app", + "Uninstall app" : "De-installeren app", "SSL Root Certificates" : "SSL Root Certificaten", "Common Name" : "Common Name", "Valid until" : "Geldig tot", @@ -339,7 +339,11 @@ "Default" : "Standaard", "log-level out of allowed range" : "loggingniveau buiten toegestane bereik", "Language changed" : "Taal aangepast", + "Admins can't remove themself from the admin group" : "Admins kunnen zichzelf niet uit de admin groep verwijderen", + "Unable to add user to group %s" : "Niet in staat om gebruiker toe te voegen aan groep %s", + "Unable to remove user from group %s" : "Niet in staat om gebruiker te verwijderen uit groep %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Weet je zeker dat je \"{domain}\" als een vertrouwd domein wilt toevoegen?", + "Please wait...." : "Even geduld a.u.b.", "iPhone" : "iPhone", "add group" : "groep toevoegen", "Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale problemen, fouten, waarschuwingen, info, debug)", @@ -359,6 +363,7 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Vooral wanneer de desktop client wordt gebruik voor bestandssynchronisatie wordt gebruik van sqlite afgeraden.", "Experimental applications ahead" : "Experimentele applicaties vooraan", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Experimentele apps zijn niet gecontroleerd op beveiligingsproblemen, zijn nieuw of staan bekend als instabiel en worden volop ontwikkeld. Installatie kan leiden tot gegevensverlies of beveiligingsincidenten.", + "Uninstall App" : "De-installeren app", "Enable experimental apps" : "Inschakelen experimentele apps", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hallo daar,

    we willen je laten weten dat je nu een %s account hebt.

    Je gebruikersnaam: %s
    Ga naar: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hallo,\n\nwe willen je laten weten dat je nu een %s account hebt.\n\nJe gebruikersnaam: %s\nGa naar: %s\n\n", @@ -370,24 +375,6 @@ "Group Admin for" : "Groepsbeheerder voor", "Storage Location" : "Opslaglocatie", "User Backend" : "Backend gebruiker", - "Last Login" : "Laatste inlog", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Externe opslag", - "Updates" : "Updates", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Officiële apps worden ontwikkeld door en binnen de Nextcloud community. Ze bieden cruciale functionaliteit voor Nextcloud en zijn klaar voor productie.", - "No apps found for \"{query}\"" : "Geen apps gevonden voor {query}", - "An error occurred: {message}" : "Er heeft zich een fout voorgedaan: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Lees de installatiedocumentatie ↗ voor php configuratienotities en de php configuratie van je server, zeker bij gebruik van php-fpm.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Je database draait niet met \"READ COMMITED\" transactie isolatie niveau. Dit kan problemen opleveren als er meerdere acties tegelijkertijd worden uitgevoerd.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Je server draait op Microsoft Windows. We adviseren je om een linux server te gebruiken voor een optimale gebruikerservaring.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Transactionele bestandlocking is gedeactiveerd, dat zou kunnen leiden tot versiebeheerproblemen. Schakel 'filelocking enabled' in config.php in om deze problemen te voorkomen. Zie de documentatie ↗ voor meer informatie.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Lees de installatiehandleiding ↗ goed door en controleer op fouten en waarschuwingen in de logging.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Versleuteling alleen garandeert geen beveiliging van het systeem. Lees de Nextcloud documentatie voor meer achtergronden over de werking van de crypto app en de relevante use cases.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Om te migreren naar een andere database moet u de commandoregel tool gebruiken: 'occ db:convert-type', of lees de documentatie ↗.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Deze app heeft geen minimum Nextcloud versie toegewezen gekregen. Dit wordt een fout in Nextcloud 11 en later.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Deze app heeft geen maximum Nextcloud versie toegewezen gekregen. Dit wordt een fout in Nextcloud 11 en later.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Als je dit project wilt ondersteunen\n\t\thelp mee met ontwikkelen\n\t\tof\n\t\thelp andere gebruikers!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Ontwikkeld door de {communityopen}Nextcloud community{linkclose}, de {githubopen}broncode{linkclose} is gelicenseerd onder de {licenseopen}AGPL{linkclose}." + "Last Login" : "Laatste inlog" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/nn_NO.js b/settings/l10n/nn_NO.js index cef991514b199c2ab818673f438aee0188fa574d..a3715eaf4d8956f064d066927971ba6a113db491 100644 --- a/settings/l10n/nn_NO.js +++ b/settings/l10n/nn_NO.js @@ -10,12 +10,8 @@ OC.L10N.register( "Email sent" : "E-post sendt", "Invalid request" : "Ugyldig førespurnad", "Email saved" : "E-postadresse lagra", - "Admins can't remove themself from the admin group" : "Administratorar kan ikkje fjerna seg sjølve frå admin-gruppa", - "Unable to add user to group %s" : "Klarte ikkje leggja til brukaren til gruppa %s", - "Unable to remove user from group %s" : "Klarte ikkje fjerna brukaren frå gruppa %s", "Couldn't update app." : "Klarte ikkje oppdatera programmet.", "All" : "Alle", - "Please wait...." : "Ver venleg og vent …", "Error while disabling app" : "Klarte ikkje å skru av programmet", "Disable" : "Slå av", "Enable" : "Slå på", @@ -73,6 +69,10 @@ OC.L10N.register( "set new password" : "lag nytt passord", "Default" : "Standard", "Language changed" : "Språk endra", + "Admins can't remove themself from the admin group" : "Administratorar kan ikkje fjerna seg sjølve frå admin-gruppa", + "Unable to add user to group %s" : "Klarte ikkje leggja til brukaren til gruppa %s", + "Unable to remove user from group %s" : "Klarte ikkje fjerna brukaren frå gruppa %s", + "Please wait...." : "Ver venleg og vent …", "Log" : "Logg", "More" : "Meir", "Less" : "Mindre", diff --git a/settings/l10n/nn_NO.json b/settings/l10n/nn_NO.json index 2872655fd16b3636d939e2fb7ac10074b9cff5a1..940aa42c3b1f59f3e9848ea72eb3292c858486db 100644 --- a/settings/l10n/nn_NO.json +++ b/settings/l10n/nn_NO.json @@ -8,12 +8,8 @@ "Email sent" : "E-post sendt", "Invalid request" : "Ugyldig førespurnad", "Email saved" : "E-postadresse lagra", - "Admins can't remove themself from the admin group" : "Administratorar kan ikkje fjerna seg sjølve frå admin-gruppa", - "Unable to add user to group %s" : "Klarte ikkje leggja til brukaren til gruppa %s", - "Unable to remove user from group %s" : "Klarte ikkje fjerna brukaren frå gruppa %s", "Couldn't update app." : "Klarte ikkje oppdatera programmet.", "All" : "Alle", - "Please wait...." : "Ver venleg og vent …", "Error while disabling app" : "Klarte ikkje å skru av programmet", "Disable" : "Slå av", "Enable" : "Slå på", @@ -71,6 +67,10 @@ "set new password" : "lag nytt passord", "Default" : "Standard", "Language changed" : "Språk endra", + "Admins can't remove themself from the admin group" : "Administratorar kan ikkje fjerna seg sjølve frå admin-gruppa", + "Unable to add user to group %s" : "Klarte ikkje leggja til brukaren til gruppa %s", + "Unable to remove user from group %s" : "Klarte ikkje fjerna brukaren frå gruppa %s", + "Please wait...." : "Ver venleg og vent …", "Log" : "Logg", "More" : "Meir", "Less" : "Mindre", diff --git a/settings/l10n/pl.js b/settings/l10n/pl.js index daeb2258589d00ca2c2c3881a5275562489394e4..b746aadd750492f0b1f2cf885659de858409cbf9 100644 --- a/settings/l10n/pl.js +++ b/settings/l10n/pl.js @@ -19,6 +19,7 @@ OC.L10N.register( "Unable to add group." : "Nie można dodać grupy.", "Unable to delete group." : "Nie można usunąć grupy.", "test email settings" : "przetestuj ustawienia email", + "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Wystąpił błąd podczas wysyłania wiadomości e-mail. Proszę zmienić swoje ustawienia. (Error: %s)", "Email sent" : "E-mail wysłany", "You need to set your user email before being able to send test emails." : "Musisz najpierw ustawić użytkownika e-mail, aby móc wysyłać wiadomości testowe.", "Invalid request" : "Nieprawidłowe żądanie", @@ -27,17 +28,18 @@ OC.L10N.register( "Unable to create user." : "Nie można utworzyć użytkownika.", "Your %s account was created" : "Twoje konto %s zostało stworzone", "Unable to delete user." : "Nie można usunąć użytkownika.", + "Settings saved" : "Ustawienia zachowane", "Unable to change full name" : "Nie można zmienić pełnej nazwy", + "Unable to change email address" : "Nie można zmienić adresu e-mail", "Your full name has been changed." : "Twoja pełna nazwa została zmieniona.", "Forbidden" : "Zabronione", "Invalid user" : "Nieprawidłowy użytkownik", "Unable to change mail address" : "Nie można zmienić adresu email", "Email saved" : "E-mail zapisany", + "Password confirmation is required" : "Wymagane jest potwierdzenie hasła", "Couldn't remove app." : "Nie można usunąć aplikacji.", - "Admins can't remove themself from the admin group" : "Administratorzy nie mogą usunąć siebie samych z grupy administratorów", - "Unable to add user to group %s" : "Nie można dodać użytkownika do grupy %s", - "Unable to remove user from group %s" : "Nie można usunąć użytkownika z grupy %s", "Couldn't update app." : "Nie można uaktualnić aplikacji.", + "Are you really sure you want add {domain} as trusted domain?" : "Czy jesteś pewien/pewna że chcesz dodać \"{domain}\" jako zaufaną domenę?", "Add trusted domain" : "Dodaj zaufaną domenę", "Migration in progress. Please wait until the migration is finished" : "Trwa migracja. Proszę poczekać, aż migracja dobiegnie końca.", "Migration started …" : "Migracja rozpoczęta...", @@ -46,33 +48,43 @@ OC.L10N.register( "Official" : "Oficjalny", "All" : "Wszystkie", "Update to %s" : "Uaktualnij do %s", - "_You have %n app update pending_::_You have %n app updates pending_" : ["Masz %n oczekującą aktualizację aplikacji","Masz %n oczekujące aktualizacje aplikacji","Masz %n oczekujących aktualizacji aplikacji"], + "_You have %n app update pending_::_You have %n app updates pending_" : ["Masz %n oczekującą aktualizację aplikacji","Masz %n oczekujące aktualizacje aplikacji","Masz %n oczekujących aktualizacji aplikacji","Masz %n oczekujących aktualizacji aplikacji"], "No apps found for your version" : "Nie znaleziono aplikacji dla twojej wersji", - "Please wait...." : "Proszę czekać...", + "The app will be downloaded from the app store" : "Aplikacja zostanie pobrana z App Store", "Error while disabling app" : "Błąd podczas wyłączania aplikacji", "Disable" : "Wyłącz", "Enable" : "Włącz", "Error while enabling app" : "Błąd podczas włączania aplikacji", + "Error: this app cannot be enabled because it makes the server unstable" : "Błąd: ta aplikacja nie może być włączona, ponieważ sprawia, że serwer jest niestabilny", + "Error: could not disable broken app" : "Błąd: nie można wyłączyć zepsutą aplikację", + "Error while disabling broken app" : "Błąd podczas wyłączania zepsutej aplikacji", "Updating...." : "Aktualizacja w toku...", "Error while updating app" : "Błąd podczas aktualizacji aplikacji", "Updated" : "Zaktualizowano", "Uninstalling ...." : "Odinstalowywanie....", "Error while uninstalling app" : "Błąd przy odinstalowywaniu aplikacji", "Uninstall" : "Odinstaluj", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikacja została włączona i musi być aktualizowana. Zostaniesz przekierowany na stronę aktualizacji za 5 sekund.", "App update" : "Aktualizacja aplikacji", "Approved" : "Zatwierdzony", "Experimental" : "Eksperymentalny", + "No apps found for {query}" : "Nie znaleziono aplikacji dla {query}", + "Allow filesystem access" : "Zezwalaj na dostęp do systemu plików", "Disconnect" : "Odłącz", + "Revoke" : "Cofnij", "Internet Explorer" : "Internet Explorer", "Edge" : "Edge", "Firefox" : "Firefox", "Google Chrome" : "Google Chrome", "Safari" : "Safari", "Google Chrome for Android" : "Google Chrome dla Android", + "iPhone iOS" : "iPhone iOS", + "iPad iOS" : "iPad iOS", "iOS Client" : "Klient iOS", "Android Client" : "Klient Android", "Sync client - {os}" : "Klient synchronizacji - {os}", "This session" : "Ta sesja", + "Copy" : "Skopiuj", "Copied!" : "Skopiowano!", "Not supported!" : "Nieobsługiwany!", "Press ⌘-C to copy." : "Wciśnij ⌘-C by skopiować.", @@ -80,8 +92,17 @@ OC.L10N.register( "Error while loading browser sessions and device tokens" : "Błąd podczas ładowania sesji przeglądarek i tokenów urządzeń", "Error while creating device token" : "Błąd podczas tworzenia tokena urządzenia.", "Error while deleting the token" : "Błąd podczas usuwania tokena.", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Wystąpił błąd. Proszę przesłać certyfikat PEM w kodowaniu ASCII.", "Valid until {date}" : "Ważny do {date}", "Delete" : "Usuń", + "Local" : "Lokalny", + "Private" : "Prywatny", + "Only visible to local users" : "Widoczne tylko dla użytkowników lokalnych", + "Only visible to you" : "Widoczne tylko dla Ciebie", + "Contacts" : "Kontakty", + "Visible to local users and to trusted servers" : "Widoczne dla lokalnych użytkowników i zaufanych serwerów", + "Public" : "Publiczny", + "Will be synced to a global and public address book" : "Będą zsynchronizowane z globalną i publiczną książką adresową", "Select a profile picture" : "Wybierz zdjęcie profilu", "Very weak password" : "Bardzo słabe hasło", "Weak password" : "Słabe hasło", @@ -97,9 +118,11 @@ OC.L10N.register( "never" : "nigdy", "deleted {userName}" : "usunięto {userName}", "Add group" : "Dodaj grupę", + "Invalid quota value \"{val}\"" : "Nieprawidłowa wartość quota \"{val}\"", "no group" : "brak grupy", "Password successfully changed" : "Zmiana hasła udana.", "Changing the password will result in data loss, because data recovery is not available for this user" : "Zmiana hasła spowoduje utratę danych, ponieważ odzyskiwanie danych nie jest włączone dla tego użytkownika", + "Could not change the users email" : "Nie można zmienić adresu e-mail użytkowników", "A valid username must be provided" : "Należy podać prawidłową nazwę użytkownika", "Error creating user: {message}" : "Błąd podczas tworzenia użytkownika: {message}", "A valid password must be provided" : "Należy podać prawidłowe hasło", @@ -135,10 +158,13 @@ OC.L10N.register( "Send email" : "Wyślij email", "Server-side encryption" : "Szyfrowanie po stronie serwera", "Enable server-side encryption" : "Włącz szyfrowanie po stronie serwera", + "Please read carefully before activating server-side encryption: " : "Proszę przeczytać uważnie przed aktywowaniem szyfrowania po stronie serwera:", "Be aware that encryption always increases the file size." : "Należy pamiętać, że szyfrowanie zawsze zwiększa rozmiar pliku.", "This is the final warning: Do you really want to enable encryption?" : "To ostatnie ostrzeżenie: Czy na pewno chcesz włączyć szyfrowanie?", "Enable encryption" : "Włącz szyfrowanie", + "No encryption module loaded, please enable an encryption module in the app menu." : "Moduł szyfrowania nie jest załadowany, należy włączyć moduł szyfrowania w menu aplikacji.", "Select default encryption module:" : "Wybierz domyślny moduł szyfrujący:", + "Start migration" : "Rozpocznij migrację", "Security & setup warnings" : "Ostrzeżenia bezpieczeństwa i konfiguracji", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Wygląda na to, że ustawienia PHP ucinają bloki wklejonych dokumentów. To sprawi, że niektóre wbudowane aplikacje będą niedostępne.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Dzieje się tak prawdopodobnie przez cache lub akcelerator taki jak Zend OPcache lub eAccelerator.", @@ -146,6 +172,8 @@ OC.L10N.register( "System locale can not be set to a one which supports UTF-8." : "Ustawienia regionalne systemu nie można ustawić na jeden, który obsługuje UTF-8.", "This means that there might be problems with certain characters in file names." : "Oznacza to, że mogą być problemy z niektórymi znakami w nazwach plików.", "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Zalecamy instalację na Twoim systemie komponentów wymaganych do obsługi języków: %s", + "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Nie było możliwe do wykonania przez cron CLI. Pojawiły się następujące błędy techniczne:", + "All checks passed." : "Wszystkie testy przeszły poprawnie.", "Cron" : "Cron", "Last cron job execution: %s." : "Ostatnie wykonanie zadania przez cron: %s.", "Last cron job execution: %s. Something seems wrong." : "Ostatnie wykonanie zadania przez cron: %s. Wydaje się być błędny.", @@ -153,6 +181,7 @@ OC.L10N.register( "Execute one task with each page loaded" : "Wykonuj jedno zadanie wraz z każdą wczytaną stroną", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php jest zarejestrowany w serwisie webcron do uruchamiania cron.php raz na 15 minut przez http.", "Use system's cron service to call the cron.php file every 15 minutes." : "Użyj systemowej usługi cron do wywoływania cron.php co 15 minut.", + "The cron.php needs to be executed by the system user \"%s\"." : "Cron.php musi być wykonywany przez użytkownika systemu \"%s\".", "Version" : "Wersja", "Sharing" : "Udostępnianie", "Allow apps to use the Share API" : "Zezwalaj aplikacjom na korzystanie z API udostępniania", @@ -170,6 +199,7 @@ OC.L10N.register( "These groups will still be able to receive shares, but not to initiate them." : "Grupy te nadal będą mogli otrzymywać udostępnione udziały, ale nie do ich inicjowania.", "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Pozwól użytkownikowi na autouzupełnianie w oknie użytkownika. Jeśli ta opcja jest wyłączona, to pełna nazwa musi być wprowadzona.", "Tips & tricks" : "Porady i wskazówki", + "This is particularly recommended when using the desktop client for file synchronisation." : "Jest to szczególnie zalecane w przypadku korzystania z desktopowego klienta do synchronizacji plików.", "How to do backups" : "Jak zrobić kopie zapasowe", "Advanced monitoring" : "Zaawansowane monitorowanie", "Performance tuning" : "Podnoszenie wydajności", @@ -177,6 +207,7 @@ OC.L10N.register( "Theming" : "Motyw", "Hardening and security guidance" : "Kierowanie i wzmacnianie bezpieczeństwa", "Developer documentation" : "Dokumentacja dewelopera", + "by %s" : "przez %s", "Documentation:" : "Dokumentacja:", "User documentation" : "Dokumentacja użytkownika", "Admin documentation" : "Dokumentacja Administratora", @@ -185,9 +216,10 @@ OC.L10N.register( "Show description …" : "Pokaż opis ...", "Hide description …" : "Ukryj opis ...", "This app has an update available." : "Ta aplikacja ma dostępną aktualizację.", + "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Ta aplikacja nie ma przypisanej minimalnej wersji Nextcloud. W przyszłości będzie to błąd.", + "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Ta aplikacja nie ma przypisanej maksymalnej wersji Nextcloud. W przyszłości będzie to błąd.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Ta aplikacja nie może być zainstalowana, ponieważ nie są spełnione następujące zależności:", "Enable only for specific groups" : "Włącz tylko dla określonych grup", - "Uninstall App" : "Odinstaluj aplikację", "Common Name" : "Nazwa CN", "Valid until" : "Ważny do", "Issued By" : "Wydany przez", @@ -197,6 +229,7 @@ OC.L10N.register( "Administrator documentation" : "Dokumentacja Administratora", "Online documentation" : "Dokumentacja Online", "Forum" : "Forum", + "Getting help" : "Otrzymać pomoc", "Commercial support" : "Wsparcie komercyjne", "You are using %s of %s" : "Używasz %s z %s", "Profile picture" : "Zdjęcie profilu", @@ -204,6 +237,7 @@ OC.L10N.register( "Select from Files" : "Wybierz z Plików", "Remove image" : "Usuń zdjęcie", "png or jpg, max. 20 MB" : "png lub jpg, maks. 20 MB", + "Picture provided by original account" : "Zdjęcie dostarczone przez oryginalne konto", "Cancel" : "Anuluj", "Choose as profile picture" : "Wybierz zdjęcie profilu", "Full name" : "Pełna nazwa", @@ -212,6 +246,13 @@ OC.L10N.register( "Your email address" : "Twój adres e-mail", "No email address set" : "Brak adresu email", "For password recovery and notifications" : "W celu odzyskania hasła i powiadomień", + "Phone number" : "Numer telefonu", + "Your phone number" : "Twój numer telefonu", + "Address" : "Adres", + "Your postal address" : "Twój kod pocztowy", + "Website" : "Strona WWW", + "Your website" : "Twoja strona WWW", + "Twitter" : "Twitter", "You are member of the following groups:" : "Jesteś członkiem następujących grup:", "Password" : "Hasło", "Current password" : "Bieżące hasło", @@ -232,10 +273,14 @@ OC.L10N.register( "App name" : "Nazwa aplikacji", "Create new app password" : "Utwórz nowe hasło do aplikacji", "Use the credentials below to configure your app or device." : "Skonfiguruj aplikację lub urządzenie, aby skorzystać z poniższego poświadczenia.", + "For security reasons this password will only be shown once." : "Ze względów bezpieczeństwa hasło zostanie pokazane tylko raz.", "Username" : "Nazwa użytkownika", "Done" : "Ukończono", "Follow us on Google Plus!" : "Śledź nas na Google Plus!", "Like our facebook page!" : "Polub naszą stronę na Facebook!", + "Subscribe to our twitter channel!" : "Zapisz się do naszego kanału na Twitterze!", + "Subscribe to our news feed!" : "Zapisz się do naszego kanału informacyjnego!", + "Subscribe to our newsletter!" : "Zapisz się do naszego newslettera!", "Show storage location" : "Pokaż miejsce przechowywania", "Show last log in" : "Pokaż ostatni login", "Show user backend" : "Pokaż moduł użytkownika", @@ -245,6 +290,7 @@ OC.L10N.register( "Create" : "Utwórz", "Admin Recovery Password" : "Hasło klucza odzyskiwania", "Enter the recovery password in order to recover the users files during password change" : "Wpisz hasło odzyskiwania, aby odzyskać pliki użytkowników podczas zmiany hasła", + "Group name" : "Nazwa grupy", "Everyone" : "Wszyscy", "Admins" : "Administratorzy", "Default quota" : "Domyślny udział", @@ -253,6 +299,7 @@ OC.L10N.register( "Group admin for" : "Grupa admin dla", "Quota" : "Udział", "Storage location" : "Lokalizacja magazynu", + "User backend" : "Moduł użytkownika", "Last login" : "Ostatnio zalogowany", "change full name" : "Zmień pełna nazwę", "set new password" : "ustaw nowe hasło", @@ -260,7 +307,11 @@ OC.L10N.register( "Default" : "Domyślny", "log-level out of allowed range" : "wartość log-level spoza dozwolonego zakresu", "Language changed" : "Zmieniono język", + "Admins can't remove themself from the admin group" : "Administratorzy nie mogą usunąć siebie samych z grupy administratorów", + "Unable to add user to group %s" : "Nie można dodać użytkownika do grupy %s", + "Unable to remove user from group %s" : "Nie można usunąć użytkownika z grupy %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Czy jesteś pewien/pewna że chcesz dodać \"{domain}\" jako zaufaną domenę?", + "Please wait...." : "Proszę czekać...", "iPhone" : "iPhone", "add group" : "dodaj grupę", "Everything (fatal issues, errors, warnings, info, debug)" : "Wszystko (Informacje, ostrzeżenia, błędy i poważne problemy, debug)", @@ -276,6 +327,7 @@ OC.L10N.register( "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Plik log jest większy niż 100MB. Ściąganie może trochę potrwać!", "Allow users to send mail notification for shared files" : "Zezwól użytkownikom na wysyłanie powiadomień email dla udostępnionych plików", "Allow users to send mail notification for shared files to other users" : "Zezwalaj użytkownikom na wysyłanie powiadomień pocztą dla współdzielonych plików do innych użytkowników", + "Uninstall App" : "Odinstaluj aplikację", "Enable experimental apps" : "Włącz eksperymentalne aplikacje", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Witaj,

    informujemy, że teraz masz konto na %s .

    Twoja nazwa użytkownika: %s
    Dostęp pod adresem: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Witaj,\n\ninformujemy, że teraz masz konto na %s .\n\nTwoja nazwa użytkownika:: %s\nDostęp pod adresem: %s\n\n", @@ -283,13 +335,9 @@ OC.L10N.register( "Group" : "Grupa", "Default Quota" : "Domyślny udział", "Full Name" : "Pełna nazwa", + "Group Admin for" : "Grupa Admin dla", "Storage Location" : "Lokalizacja magazynu", - "Last Login" : "Ostatnio zalogowany", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Zewnętrzna zasoby dyskowe", - "Updates" : "Aktualizacje", - "An error occurred: {message}" : "Wystąpił błąd: {message}", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Twój serwer działa na platformie Windows. Zalecamy Linuxa dla optymalnych doświadczeń użytkownika." + "User Backend" : "Moduł użytkownika", + "Last Login" : "Ostatnio zalogowany" }, "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/settings/l10n/pl.json b/settings/l10n/pl.json index 035dcea7514f87bef77ed0f430abb8add2027286..e060b28d5ed087455b97be9beee4acabf64e7b1d 100644 --- a/settings/l10n/pl.json +++ b/settings/l10n/pl.json @@ -17,6 +17,7 @@ "Unable to add group." : "Nie można dodać grupy.", "Unable to delete group." : "Nie można usunąć grupy.", "test email settings" : "przetestuj ustawienia email", + "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Wystąpił błąd podczas wysyłania wiadomości e-mail. Proszę zmienić swoje ustawienia. (Error: %s)", "Email sent" : "E-mail wysłany", "You need to set your user email before being able to send test emails." : "Musisz najpierw ustawić użytkownika e-mail, aby móc wysyłać wiadomości testowe.", "Invalid request" : "Nieprawidłowe żądanie", @@ -25,17 +26,18 @@ "Unable to create user." : "Nie można utworzyć użytkownika.", "Your %s account was created" : "Twoje konto %s zostało stworzone", "Unable to delete user." : "Nie można usunąć użytkownika.", + "Settings saved" : "Ustawienia zachowane", "Unable to change full name" : "Nie można zmienić pełnej nazwy", + "Unable to change email address" : "Nie można zmienić adresu e-mail", "Your full name has been changed." : "Twoja pełna nazwa została zmieniona.", "Forbidden" : "Zabronione", "Invalid user" : "Nieprawidłowy użytkownik", "Unable to change mail address" : "Nie można zmienić adresu email", "Email saved" : "E-mail zapisany", + "Password confirmation is required" : "Wymagane jest potwierdzenie hasła", "Couldn't remove app." : "Nie można usunąć aplikacji.", - "Admins can't remove themself from the admin group" : "Administratorzy nie mogą usunąć siebie samych z grupy administratorów", - "Unable to add user to group %s" : "Nie można dodać użytkownika do grupy %s", - "Unable to remove user from group %s" : "Nie można usunąć użytkownika z grupy %s", "Couldn't update app." : "Nie można uaktualnić aplikacji.", + "Are you really sure you want add {domain} as trusted domain?" : "Czy jesteś pewien/pewna że chcesz dodać \"{domain}\" jako zaufaną domenę?", "Add trusted domain" : "Dodaj zaufaną domenę", "Migration in progress. Please wait until the migration is finished" : "Trwa migracja. Proszę poczekać, aż migracja dobiegnie końca.", "Migration started …" : "Migracja rozpoczęta...", @@ -44,33 +46,43 @@ "Official" : "Oficjalny", "All" : "Wszystkie", "Update to %s" : "Uaktualnij do %s", - "_You have %n app update pending_::_You have %n app updates pending_" : ["Masz %n oczekującą aktualizację aplikacji","Masz %n oczekujące aktualizacje aplikacji","Masz %n oczekujących aktualizacji aplikacji"], + "_You have %n app update pending_::_You have %n app updates pending_" : ["Masz %n oczekującą aktualizację aplikacji","Masz %n oczekujące aktualizacje aplikacji","Masz %n oczekujących aktualizacji aplikacji","Masz %n oczekujących aktualizacji aplikacji"], "No apps found for your version" : "Nie znaleziono aplikacji dla twojej wersji", - "Please wait...." : "Proszę czekać...", + "The app will be downloaded from the app store" : "Aplikacja zostanie pobrana z App Store", "Error while disabling app" : "Błąd podczas wyłączania aplikacji", "Disable" : "Wyłącz", "Enable" : "Włącz", "Error while enabling app" : "Błąd podczas włączania aplikacji", + "Error: this app cannot be enabled because it makes the server unstable" : "Błąd: ta aplikacja nie może być włączona, ponieważ sprawia, że serwer jest niestabilny", + "Error: could not disable broken app" : "Błąd: nie można wyłączyć zepsutą aplikację", + "Error while disabling broken app" : "Błąd podczas wyłączania zepsutej aplikacji", "Updating...." : "Aktualizacja w toku...", "Error while updating app" : "Błąd podczas aktualizacji aplikacji", "Updated" : "Zaktualizowano", "Uninstalling ...." : "Odinstalowywanie....", "Error while uninstalling app" : "Błąd przy odinstalowywaniu aplikacji", "Uninstall" : "Odinstaluj", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikacja została włączona i musi być aktualizowana. Zostaniesz przekierowany na stronę aktualizacji za 5 sekund.", "App update" : "Aktualizacja aplikacji", "Approved" : "Zatwierdzony", "Experimental" : "Eksperymentalny", + "No apps found for {query}" : "Nie znaleziono aplikacji dla {query}", + "Allow filesystem access" : "Zezwalaj na dostęp do systemu plików", "Disconnect" : "Odłącz", + "Revoke" : "Cofnij", "Internet Explorer" : "Internet Explorer", "Edge" : "Edge", "Firefox" : "Firefox", "Google Chrome" : "Google Chrome", "Safari" : "Safari", "Google Chrome for Android" : "Google Chrome dla Android", + "iPhone iOS" : "iPhone iOS", + "iPad iOS" : "iPad iOS", "iOS Client" : "Klient iOS", "Android Client" : "Klient Android", "Sync client - {os}" : "Klient synchronizacji - {os}", "This session" : "Ta sesja", + "Copy" : "Skopiuj", "Copied!" : "Skopiowano!", "Not supported!" : "Nieobsługiwany!", "Press ⌘-C to copy." : "Wciśnij ⌘-C by skopiować.", @@ -78,8 +90,17 @@ "Error while loading browser sessions and device tokens" : "Błąd podczas ładowania sesji przeglądarek i tokenów urządzeń", "Error while creating device token" : "Błąd podczas tworzenia tokena urządzenia.", "Error while deleting the token" : "Błąd podczas usuwania tokena.", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Wystąpił błąd. Proszę przesłać certyfikat PEM w kodowaniu ASCII.", "Valid until {date}" : "Ważny do {date}", "Delete" : "Usuń", + "Local" : "Lokalny", + "Private" : "Prywatny", + "Only visible to local users" : "Widoczne tylko dla użytkowników lokalnych", + "Only visible to you" : "Widoczne tylko dla Ciebie", + "Contacts" : "Kontakty", + "Visible to local users and to trusted servers" : "Widoczne dla lokalnych użytkowników i zaufanych serwerów", + "Public" : "Publiczny", + "Will be synced to a global and public address book" : "Będą zsynchronizowane z globalną i publiczną książką adresową", "Select a profile picture" : "Wybierz zdjęcie profilu", "Very weak password" : "Bardzo słabe hasło", "Weak password" : "Słabe hasło", @@ -95,9 +116,11 @@ "never" : "nigdy", "deleted {userName}" : "usunięto {userName}", "Add group" : "Dodaj grupę", + "Invalid quota value \"{val}\"" : "Nieprawidłowa wartość quota \"{val}\"", "no group" : "brak grupy", "Password successfully changed" : "Zmiana hasła udana.", "Changing the password will result in data loss, because data recovery is not available for this user" : "Zmiana hasła spowoduje utratę danych, ponieważ odzyskiwanie danych nie jest włączone dla tego użytkownika", + "Could not change the users email" : "Nie można zmienić adresu e-mail użytkowników", "A valid username must be provided" : "Należy podać prawidłową nazwę użytkownika", "Error creating user: {message}" : "Błąd podczas tworzenia użytkownika: {message}", "A valid password must be provided" : "Należy podać prawidłowe hasło", @@ -133,10 +156,13 @@ "Send email" : "Wyślij email", "Server-side encryption" : "Szyfrowanie po stronie serwera", "Enable server-side encryption" : "Włącz szyfrowanie po stronie serwera", + "Please read carefully before activating server-side encryption: " : "Proszę przeczytać uważnie przed aktywowaniem szyfrowania po stronie serwera:", "Be aware that encryption always increases the file size." : "Należy pamiętać, że szyfrowanie zawsze zwiększa rozmiar pliku.", "This is the final warning: Do you really want to enable encryption?" : "To ostatnie ostrzeżenie: Czy na pewno chcesz włączyć szyfrowanie?", "Enable encryption" : "Włącz szyfrowanie", + "No encryption module loaded, please enable an encryption module in the app menu." : "Moduł szyfrowania nie jest załadowany, należy włączyć moduł szyfrowania w menu aplikacji.", "Select default encryption module:" : "Wybierz domyślny moduł szyfrujący:", + "Start migration" : "Rozpocznij migrację", "Security & setup warnings" : "Ostrzeżenia bezpieczeństwa i konfiguracji", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Wygląda na to, że ustawienia PHP ucinają bloki wklejonych dokumentów. To sprawi, że niektóre wbudowane aplikacje będą niedostępne.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Dzieje się tak prawdopodobnie przez cache lub akcelerator taki jak Zend OPcache lub eAccelerator.", @@ -144,6 +170,8 @@ "System locale can not be set to a one which supports UTF-8." : "Ustawienia regionalne systemu nie można ustawić na jeden, który obsługuje UTF-8.", "This means that there might be problems with certain characters in file names." : "Oznacza to, że mogą być problemy z niektórymi znakami w nazwach plików.", "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Zalecamy instalację na Twoim systemie komponentów wymaganych do obsługi języków: %s", + "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Nie było możliwe do wykonania przez cron CLI. Pojawiły się następujące błędy techniczne:", + "All checks passed." : "Wszystkie testy przeszły poprawnie.", "Cron" : "Cron", "Last cron job execution: %s." : "Ostatnie wykonanie zadania przez cron: %s.", "Last cron job execution: %s. Something seems wrong." : "Ostatnie wykonanie zadania przez cron: %s. Wydaje się być błędny.", @@ -151,6 +179,7 @@ "Execute one task with each page loaded" : "Wykonuj jedno zadanie wraz z każdą wczytaną stroną", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php jest zarejestrowany w serwisie webcron do uruchamiania cron.php raz na 15 minut przez http.", "Use system's cron service to call the cron.php file every 15 minutes." : "Użyj systemowej usługi cron do wywoływania cron.php co 15 minut.", + "The cron.php needs to be executed by the system user \"%s\"." : "Cron.php musi być wykonywany przez użytkownika systemu \"%s\".", "Version" : "Wersja", "Sharing" : "Udostępnianie", "Allow apps to use the Share API" : "Zezwalaj aplikacjom na korzystanie z API udostępniania", @@ -168,6 +197,7 @@ "These groups will still be able to receive shares, but not to initiate them." : "Grupy te nadal będą mogli otrzymywać udostępnione udziały, ale nie do ich inicjowania.", "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Pozwól użytkownikowi na autouzupełnianie w oknie użytkownika. Jeśli ta opcja jest wyłączona, to pełna nazwa musi być wprowadzona.", "Tips & tricks" : "Porady i wskazówki", + "This is particularly recommended when using the desktop client for file synchronisation." : "Jest to szczególnie zalecane w przypadku korzystania z desktopowego klienta do synchronizacji plików.", "How to do backups" : "Jak zrobić kopie zapasowe", "Advanced monitoring" : "Zaawansowane monitorowanie", "Performance tuning" : "Podnoszenie wydajności", @@ -175,6 +205,7 @@ "Theming" : "Motyw", "Hardening and security guidance" : "Kierowanie i wzmacnianie bezpieczeństwa", "Developer documentation" : "Dokumentacja dewelopera", + "by %s" : "przez %s", "Documentation:" : "Dokumentacja:", "User documentation" : "Dokumentacja użytkownika", "Admin documentation" : "Dokumentacja Administratora", @@ -183,9 +214,10 @@ "Show description …" : "Pokaż opis ...", "Hide description …" : "Ukryj opis ...", "This app has an update available." : "Ta aplikacja ma dostępną aktualizację.", + "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Ta aplikacja nie ma przypisanej minimalnej wersji Nextcloud. W przyszłości będzie to błąd.", + "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Ta aplikacja nie ma przypisanej maksymalnej wersji Nextcloud. W przyszłości będzie to błąd.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Ta aplikacja nie może być zainstalowana, ponieważ nie są spełnione następujące zależności:", "Enable only for specific groups" : "Włącz tylko dla określonych grup", - "Uninstall App" : "Odinstaluj aplikację", "Common Name" : "Nazwa CN", "Valid until" : "Ważny do", "Issued By" : "Wydany przez", @@ -195,6 +227,7 @@ "Administrator documentation" : "Dokumentacja Administratora", "Online documentation" : "Dokumentacja Online", "Forum" : "Forum", + "Getting help" : "Otrzymać pomoc", "Commercial support" : "Wsparcie komercyjne", "You are using %s of %s" : "Używasz %s z %s", "Profile picture" : "Zdjęcie profilu", @@ -202,6 +235,7 @@ "Select from Files" : "Wybierz z Plików", "Remove image" : "Usuń zdjęcie", "png or jpg, max. 20 MB" : "png lub jpg, maks. 20 MB", + "Picture provided by original account" : "Zdjęcie dostarczone przez oryginalne konto", "Cancel" : "Anuluj", "Choose as profile picture" : "Wybierz zdjęcie profilu", "Full name" : "Pełna nazwa", @@ -210,6 +244,13 @@ "Your email address" : "Twój adres e-mail", "No email address set" : "Brak adresu email", "For password recovery and notifications" : "W celu odzyskania hasła i powiadomień", + "Phone number" : "Numer telefonu", + "Your phone number" : "Twój numer telefonu", + "Address" : "Adres", + "Your postal address" : "Twój kod pocztowy", + "Website" : "Strona WWW", + "Your website" : "Twoja strona WWW", + "Twitter" : "Twitter", "You are member of the following groups:" : "Jesteś członkiem następujących grup:", "Password" : "Hasło", "Current password" : "Bieżące hasło", @@ -230,10 +271,14 @@ "App name" : "Nazwa aplikacji", "Create new app password" : "Utwórz nowe hasło do aplikacji", "Use the credentials below to configure your app or device." : "Skonfiguruj aplikację lub urządzenie, aby skorzystać z poniższego poświadczenia.", + "For security reasons this password will only be shown once." : "Ze względów bezpieczeństwa hasło zostanie pokazane tylko raz.", "Username" : "Nazwa użytkownika", "Done" : "Ukończono", "Follow us on Google Plus!" : "Śledź nas na Google Plus!", "Like our facebook page!" : "Polub naszą stronę na Facebook!", + "Subscribe to our twitter channel!" : "Zapisz się do naszego kanału na Twitterze!", + "Subscribe to our news feed!" : "Zapisz się do naszego kanału informacyjnego!", + "Subscribe to our newsletter!" : "Zapisz się do naszego newslettera!", "Show storage location" : "Pokaż miejsce przechowywania", "Show last log in" : "Pokaż ostatni login", "Show user backend" : "Pokaż moduł użytkownika", @@ -243,6 +288,7 @@ "Create" : "Utwórz", "Admin Recovery Password" : "Hasło klucza odzyskiwania", "Enter the recovery password in order to recover the users files during password change" : "Wpisz hasło odzyskiwania, aby odzyskać pliki użytkowników podczas zmiany hasła", + "Group name" : "Nazwa grupy", "Everyone" : "Wszyscy", "Admins" : "Administratorzy", "Default quota" : "Domyślny udział", @@ -251,6 +297,7 @@ "Group admin for" : "Grupa admin dla", "Quota" : "Udział", "Storage location" : "Lokalizacja magazynu", + "User backend" : "Moduł użytkownika", "Last login" : "Ostatnio zalogowany", "change full name" : "Zmień pełna nazwę", "set new password" : "ustaw nowe hasło", @@ -258,7 +305,11 @@ "Default" : "Domyślny", "log-level out of allowed range" : "wartość log-level spoza dozwolonego zakresu", "Language changed" : "Zmieniono język", + "Admins can't remove themself from the admin group" : "Administratorzy nie mogą usunąć siebie samych z grupy administratorów", + "Unable to add user to group %s" : "Nie można dodać użytkownika do grupy %s", + "Unable to remove user from group %s" : "Nie można usunąć użytkownika z grupy %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Czy jesteś pewien/pewna że chcesz dodać \"{domain}\" jako zaufaną domenę?", + "Please wait...." : "Proszę czekać...", "iPhone" : "iPhone", "add group" : "dodaj grupę", "Everything (fatal issues, errors, warnings, info, debug)" : "Wszystko (Informacje, ostrzeżenia, błędy i poważne problemy, debug)", @@ -274,6 +325,7 @@ "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Plik log jest większy niż 100MB. Ściąganie może trochę potrwać!", "Allow users to send mail notification for shared files" : "Zezwól użytkownikom na wysyłanie powiadomień email dla udostępnionych plików", "Allow users to send mail notification for shared files to other users" : "Zezwalaj użytkownikom na wysyłanie powiadomień pocztą dla współdzielonych plików do innych użytkowników", + "Uninstall App" : "Odinstaluj aplikację", "Enable experimental apps" : "Włącz eksperymentalne aplikacje", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Witaj,

    informujemy, że teraz masz konto na %s .

    Twoja nazwa użytkownika: %s
    Dostęp pod adresem: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Witaj,\n\ninformujemy, że teraz masz konto na %s .\n\nTwoja nazwa użytkownika:: %s\nDostęp pod adresem: %s\n\n", @@ -281,13 +333,9 @@ "Group" : "Grupa", "Default Quota" : "Domyślny udział", "Full Name" : "Pełna nazwa", + "Group Admin for" : "Grupa Admin dla", "Storage Location" : "Lokalizacja magazynu", - "Last Login" : "Ostatnio zalogowany", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Zewnętrzna zasoby dyskowe", - "Updates" : "Aktualizacje", - "An error occurred: {message}" : "Wystąpił błąd: {message}", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Twój serwer działa na platformie Windows. Zalecamy Linuxa dla optymalnych doświadczeń użytkownika." + "User Backend" : "Moduł użytkownika", + "Last Login" : "Ostatnio zalogowany" },"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" } \ No newline at end of file diff --git a/settings/l10n/pt_BR.js b/settings/l10n/pt_BR.js index ce8433c25b7efdcbaacf9e60b6c71b6875691548..e7a42c40addb2c0df492bea00eb7473e9d606b0c 100644 --- a/settings/l10n/pt_BR.js +++ b/settings/l10n/pt_BR.js @@ -25,6 +25,7 @@ OC.L10N.register( "You need to set your user email before being able to send test emails." : "Você precisa configurar seu e-mail de usuário antes de ser capaz de enviar e-mails de teste.", "Invalid request" : "Pedido inválido", "Invalid mail address" : "Endereço de e-mail inválido", + "No valid group selected" : "Nenhum grupo válido foi selecionado", "A user with that name already exists." : "Um usuário com esse nome já existe.", "Unable to create user." : "Não é possível criar usuário.", "Your %s account was created" : "Sua conta %s foi criada", @@ -39,9 +40,6 @@ OC.L10N.register( "Email saved" : "E-mail salvo", "Password confirmation is required" : "A confirmação da senha é necessária", "Couldn't remove app." : "Não foi possível remover aplicativos.", - "Admins can't remove themself from the admin group" : "Administradores não pode remover a si mesmos do grupo de administração", - "Unable to add user to group %s" : "Não foi possível adicionar usuário ao grupo %s", - "Unable to remove user from group %s" : "Não foi possível remover usuário do grupo %s", "Couldn't update app." : "Não foi possível atualizar a app.", "Are you really sure you want add {domain} as trusted domain?" : "Tem certeza que deseja adicionar {domain} como um domínio confiável", "Add trusted domain" : "Adicionar domínio confiável", @@ -58,7 +56,7 @@ OC.L10N.register( "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Aplicativos oficiais são desenvolvidos pela comunidade e dentro da comunidade. Eles oferecem funcionalidades centrais e estão prontos para uso em produção.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Aplicativos aprovados são desenvolvidos pelos desenvolvedores confiáveis e passaram por uma verificação de segurança superficial. Eles são ativamente mantidos em um repositório de código aberto e seus mantenedores consideram que eles para sejam estáveis para um casual uso normal.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Este aplicativo não foi verificado para as questões de segurança e é novo ou conhecido por ser instável. Instale por seu próprio risco.", - "Please wait...." : "Por favor, aguarde...", + "Enabling app …" : "Ativando app ...", "Error while disabling app" : "Erro enquanto desabilitava o aplicativo", "Disable" : "Desabilitar", "Enable" : "Habilitar", @@ -125,6 +123,8 @@ OC.L10N.register( "undo" : "desfazer", "never" : "nunca", "deleted {userName}" : "eliminado {userName}", + "Unable to add user to group {group}" : "Não é possível adicionar usuário ao grupo {group}", + "Unable to remove user from group {group}" : "Não é possível remover usuário do grupo {group}", "Add group" : "Adicionar grupo", "Invalid quota value \"{val}\"" : "Valor da quota inválido \"{val}\"", "no group" : "nenhum grupo", @@ -247,7 +247,7 @@ OC.L10N.register( "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Este aplicativo não possui versão máxima atribuida para uso no Nextcloud. Isto poderá se converter em um erro no futuro.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Este aplicativo não pode ser instalado porque as seguintes dependências não forão cumpridas:", "Enable only for specific groups" : "Ativar apenas para grupos específicos", - "Uninstall App" : "Desinstalar Aplicativo", + "Uninstall app" : "Desinstalando app", "SSL Root Certificates" : "Certificados Raiz SSL", "Common Name" : "Nome", "Valid until" : "Válido até", @@ -341,7 +341,11 @@ OC.L10N.register( "Default" : "Padrão", "log-level out of allowed range" : "log-nível acima do permitido", "Language changed" : "Idioma alterado", + "Admins can't remove themself from the admin group" : "Administradores não pode remover a si mesmos do grupo de administração", + "Unable to add user to group %s" : "Não foi possível adicionar usuário ao grupo %s", + "Unable to remove user from group %s" : "Não foi possível remover usuário do grupo %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Deseja realemente adicionar \"{domain}\" como domínio confiável?", + "Please wait...." : "Por favor, aguarde...", "iPhone" : "iPhone", "add group" : "adicionar grupo", "Everything (fatal issues, errors, warnings, info, debug)" : "Tudo (questões fatais, erros, avisos, informações, depuração)", @@ -361,6 +365,7 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Especialmente quando se utiliza o cliente de desktop para sincronização de arquivos o uso de SQLite é desencorajado.", "Experimental applications ahead" : "Aplicações experimentais à frente", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Aplicativos experimentais não são marcados por questões de segurança, por serem novos ou conhecidos como instáveis e sob forte desenvolvimento. Instalá-los pode causar perda de dados ou falhas de segurança.", + "Uninstall App" : "Desinstalar Aplicativo", "Enable experimental apps" : "Habilitar aplicativos experimentais", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Olá,

    somente para lembrar que agora você tem uma conta %s.

    Seu nome de usuário é: %s
    Acesse em: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Olá,\n\nsomente para lembrar que agora você tem uma conta %s.\n\nSeu nome de usuário é: %s\nAcesse em: %s\n\n", @@ -372,24 +377,6 @@ OC.L10N.register( "Group Admin for" : "Grupo Admin para", "Storage Location" : "Local de Armazenamento", "User Backend" : "Administrador do Usuário", - "Last Login" : "Último Login", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Armazenamento externo", - "Updates" : "Atualizações", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Aplicativos oficiais são desenvolvidos por e dentro da comunidade Nextcloud. Eles oferecem funcionalidade central para Nextcloud e está pronto para uso em produção.", - "No apps found for \"{query}\"" : "Nenhum aplicativo encontrado para \"{query}\"", - "An error occurred: {message}" : "Ocorreu um erro: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Por favor verifique o documento de instalação ↗ para as notas de configuração do PHP e a configuração do PHP do seu servidor, especialmente ao usar php-fpm.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Seu banco de dados não é executado com nível de isolamento de transação \"READ COMMITTED\" . Isto pode causar problemas quando várias ações são executadas em paralelo.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "O servidor está em execução no Microsoft Windows. É altamente recomendável Linux para uma experiência ideal de para o usuário.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "O bloqueio de arquivos transacionais está desativado, isso pode levar a problemas com as condições de execução. Ative 'file locking.enabled' em config.php para evitar esses problemas. Veja a documentação ↗ para mais informações.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Por favor verifique o guia de instalação ↗, e verifique qualquer erro ou advertência no log.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Criptografia por si só não garante a segurança do sistema. Por favor consulte a documentação Nextcloud para obter mais informações sobre como o aplicativo de criptografia funciona, e os casos de uso suportados.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Para migrar para outro banco de dados usar a ferramenta de linha de comando: 'occ db:convert-type', ou consulte a documentação ↗.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Este aplicativo não tem nenhuma versão mínima atribuída ao Nextcloud. Isto será um erro no Nextcloud 11 e posterior.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Este aplicativo não tem nenhuma versão máxima atribuída ao Nextcloud. Isto será um erro no Nextcloud 11 e posterior.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Se quiser dar suporte ao projeto\n\t\tjunte-se ao desenvolvimento\n\t\tou\n\t\tajude outros usuários!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Desenvolvido pela {communityopen}comunidade Nextcloud {linkclose}, e {githubopen}source code{linkclose} licenciado sob {licenseopen}AGPL{linkclose}." + "Last Login" : "Último Login" }, "nplurals=2; plural=(n > 1);"); diff --git a/settings/l10n/pt_BR.json b/settings/l10n/pt_BR.json index b828e7559b8c91a9a93dff2ad794cc83f62011a4..86d9c215b5c97882dc0b49782ccb0f2f7c6fba65 100644 --- a/settings/l10n/pt_BR.json +++ b/settings/l10n/pt_BR.json @@ -23,6 +23,7 @@ "You need to set your user email before being able to send test emails." : "Você precisa configurar seu e-mail de usuário antes de ser capaz de enviar e-mails de teste.", "Invalid request" : "Pedido inválido", "Invalid mail address" : "Endereço de e-mail inválido", + "No valid group selected" : "Nenhum grupo válido foi selecionado", "A user with that name already exists." : "Um usuário com esse nome já existe.", "Unable to create user." : "Não é possível criar usuário.", "Your %s account was created" : "Sua conta %s foi criada", @@ -37,9 +38,6 @@ "Email saved" : "E-mail salvo", "Password confirmation is required" : "A confirmação da senha é necessária", "Couldn't remove app." : "Não foi possível remover aplicativos.", - "Admins can't remove themself from the admin group" : "Administradores não pode remover a si mesmos do grupo de administração", - "Unable to add user to group %s" : "Não foi possível adicionar usuário ao grupo %s", - "Unable to remove user from group %s" : "Não foi possível remover usuário do grupo %s", "Couldn't update app." : "Não foi possível atualizar a app.", "Are you really sure you want add {domain} as trusted domain?" : "Tem certeza que deseja adicionar {domain} como um domínio confiável", "Add trusted domain" : "Adicionar domínio confiável", @@ -56,7 +54,7 @@ "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Aplicativos oficiais são desenvolvidos pela comunidade e dentro da comunidade. Eles oferecem funcionalidades centrais e estão prontos para uso em produção.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Aplicativos aprovados são desenvolvidos pelos desenvolvedores confiáveis e passaram por uma verificação de segurança superficial. Eles são ativamente mantidos em um repositório de código aberto e seus mantenedores consideram que eles para sejam estáveis para um casual uso normal.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Este aplicativo não foi verificado para as questões de segurança e é novo ou conhecido por ser instável. Instale por seu próprio risco.", - "Please wait...." : "Por favor, aguarde...", + "Enabling app …" : "Ativando app ...", "Error while disabling app" : "Erro enquanto desabilitava o aplicativo", "Disable" : "Desabilitar", "Enable" : "Habilitar", @@ -123,6 +121,8 @@ "undo" : "desfazer", "never" : "nunca", "deleted {userName}" : "eliminado {userName}", + "Unable to add user to group {group}" : "Não é possível adicionar usuário ao grupo {group}", + "Unable to remove user from group {group}" : "Não é possível remover usuário do grupo {group}", "Add group" : "Adicionar grupo", "Invalid quota value \"{val}\"" : "Valor da quota inválido \"{val}\"", "no group" : "nenhum grupo", @@ -245,7 +245,7 @@ "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Este aplicativo não possui versão máxima atribuida para uso no Nextcloud. Isto poderá se converter em um erro no futuro.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Este aplicativo não pode ser instalado porque as seguintes dependências não forão cumpridas:", "Enable only for specific groups" : "Ativar apenas para grupos específicos", - "Uninstall App" : "Desinstalar Aplicativo", + "Uninstall app" : "Desinstalando app", "SSL Root Certificates" : "Certificados Raiz SSL", "Common Name" : "Nome", "Valid until" : "Válido até", @@ -339,7 +339,11 @@ "Default" : "Padrão", "log-level out of allowed range" : "log-nível acima do permitido", "Language changed" : "Idioma alterado", + "Admins can't remove themself from the admin group" : "Administradores não pode remover a si mesmos do grupo de administração", + "Unable to add user to group %s" : "Não foi possível adicionar usuário ao grupo %s", + "Unable to remove user from group %s" : "Não foi possível remover usuário do grupo %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Deseja realemente adicionar \"{domain}\" como domínio confiável?", + "Please wait...." : "Por favor, aguarde...", "iPhone" : "iPhone", "add group" : "adicionar grupo", "Everything (fatal issues, errors, warnings, info, debug)" : "Tudo (questões fatais, erros, avisos, informações, depuração)", @@ -359,6 +363,7 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Especialmente quando se utiliza o cliente de desktop para sincronização de arquivos o uso de SQLite é desencorajado.", "Experimental applications ahead" : "Aplicações experimentais à frente", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Aplicativos experimentais não são marcados por questões de segurança, por serem novos ou conhecidos como instáveis e sob forte desenvolvimento. Instalá-los pode causar perda de dados ou falhas de segurança.", + "Uninstall App" : "Desinstalar Aplicativo", "Enable experimental apps" : "Habilitar aplicativos experimentais", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Olá,

    somente para lembrar que agora você tem uma conta %s.

    Seu nome de usuário é: %s
    Acesse em: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Olá,\n\nsomente para lembrar que agora você tem uma conta %s.\n\nSeu nome de usuário é: %s\nAcesse em: %s\n\n", @@ -370,24 +375,6 @@ "Group Admin for" : "Grupo Admin para", "Storage Location" : "Local de Armazenamento", "User Backend" : "Administrador do Usuário", - "Last Login" : "Último Login", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Armazenamento externo", - "Updates" : "Atualizações", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Aplicativos oficiais são desenvolvidos por e dentro da comunidade Nextcloud. Eles oferecem funcionalidade central para Nextcloud e está pronto para uso em produção.", - "No apps found for \"{query}\"" : "Nenhum aplicativo encontrado para \"{query}\"", - "An error occurred: {message}" : "Ocorreu um erro: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Por favor verifique o documento de instalação ↗ para as notas de configuração do PHP e a configuração do PHP do seu servidor, especialmente ao usar php-fpm.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Seu banco de dados não é executado com nível de isolamento de transação \"READ COMMITTED\" . Isto pode causar problemas quando várias ações são executadas em paralelo.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "O servidor está em execução no Microsoft Windows. É altamente recomendável Linux para uma experiência ideal de para o usuário.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "O bloqueio de arquivos transacionais está desativado, isso pode levar a problemas com as condições de execução. Ative 'file locking.enabled' em config.php para evitar esses problemas. Veja a documentação ↗ para mais informações.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Por favor verifique o guia de instalação ↗, e verifique qualquer erro ou advertência no log.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Criptografia por si só não garante a segurança do sistema. Por favor consulte a documentação Nextcloud para obter mais informações sobre como o aplicativo de criptografia funciona, e os casos de uso suportados.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Para migrar para outro banco de dados usar a ferramenta de linha de comando: 'occ db:convert-type', ou consulte a documentação ↗.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Este aplicativo não tem nenhuma versão mínima atribuída ao Nextcloud. Isto será um erro no Nextcloud 11 e posterior.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "Este aplicativo não tem nenhuma versão máxima atribuída ao Nextcloud. Isto será um erro no Nextcloud 11 e posterior.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Se quiser dar suporte ao projeto\n\t\tjunte-se ao desenvolvimento\n\t\tou\n\t\tajude outros usuários!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Desenvolvido pela {communityopen}comunidade Nextcloud {linkclose}, e {githubopen}source code{linkclose} licenciado sob {licenseopen}AGPL{linkclose}." + "Last Login" : "Último Login" },"pluralForm" :"nplurals=2; plural=(n > 1);" } \ No newline at end of file diff --git a/settings/l10n/pt_PT.js b/settings/l10n/pt_PT.js index 680dee23011b4141d3bf4cd64dc8c97b501a9226..3662b709bc936598820f791bc1f8a312ad6aff5b 100644 --- a/settings/l10n/pt_PT.js +++ b/settings/l10n/pt_PT.js @@ -36,9 +36,6 @@ OC.L10N.register( "Unable to change mail address" : "Não foi possível alterar o teu endereço de email", "Email saved" : "E-mail guardado", "Couldn't remove app." : "Não foi possível remover a aplicação.", - "Admins can't remove themself from the admin group" : "Os administradores não se podem remover a eles próprios do grupo 'admin'.", - "Unable to add user to group %s" : "Não é possível adicionar o utilizador ao grupo %s", - "Unable to remove user from group %s" : "Não é possível remover o utilizador do grupo %s", "Couldn't update app." : "Não foi possível atualizar a app.", "Add trusted domain" : "Adicionar domínio confiável ", "Migration in progress. Please wait until the migration is finished" : "Migração em progresso. Por favor, aguarde até que a mesma esteja concluída..", @@ -52,7 +49,6 @@ OC.L10N.register( "The app will be downloaded from the app store" : "A aplicação será descarregada da loja de aplicações", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "As aplicações aprovadas são desenvolvidas por developers de confiança e passaram numa verificação de segurança. São mantidas ativamente num repositório de código aberto e quem as mantém considera-as estáveis para uso casual a normal.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Esta aplicação não foi verificada por problemas de segurança e é nova ou conhecida por ser instável. Instale-a por sua conta e risco.", - "Please wait...." : "Por favor, aguarde...", "Error while disabling app" : "Ocorreu um erro enquanto desativava a app", "Disable" : "Desativar", "Enable" : "Ativar", @@ -194,7 +190,6 @@ OC.L10N.register( "This app has an update available." : "Esta aplicação tem uma atualização disponível.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Esta aplicação não pode ser instalada porque as seguintes dependências não podem ser realizadas:", "Enable only for specific groups" : "Activar só para grupos específicos", - "Uninstall App" : "Desinstalar aplicação", "SSL Root Certificates" : "Certificados SSL Root", "Common Name" : "Nome Comum", "Valid until" : "Válido até", @@ -256,7 +251,11 @@ OC.L10N.register( "Default" : "Padrão", "log-level out of allowed range" : "log-level fora do alcance permitido", "Language changed" : "Idioma alterado", + "Admins can't remove themself from the admin group" : "Os administradores não se podem remover a eles próprios do grupo 'admin'.", + "Unable to add user to group %s" : "Não é possível adicionar o utilizador ao grupo %s", + "Unable to remove user from group %s" : "Não é possível remover o utilizador do grupo %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Você tem certeza que quer adicionar \"{domain}\" como domínio confiável?", + "Please wait...." : "Por favor, aguarde...", "Everything (fatal issues, errors, warnings, info, debug)" : "Tudo (problemas fatais, erros, avisos, informação, depuração)", "Info, warnings, errors and fatal issues" : "Informação, avisos, erros e problemas fatais", "Warnings, errors and fatal issues" : "Avisos, erros e problemas fatais", @@ -274,14 +273,10 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "O uso de SQLite é desencorajado especialmente se estiver a pensar em dar uso ao cliente desktop para sincronizar os seus ficheiros no seu computador.", "Experimental applications ahead" : "Aplicações experimentais de futuro", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "As apps experimentais não estão selecionadas para problemas de segurança, nova ou conhecida como instável e em forte desenvolvimento. Ao instalá-las pode causar a perda de dados ou quebra de segurança.", + "Uninstall App" : "Desinstalar aplicação", "Enable experimental apps" : "Ativar apps experimentais", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Olá,

    apenas para informar que você tem uma conta %s.

    O seu nome de utilizador: %s
    Acesse à sua conta: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Olá,\n\napenas para informar que você tem uma conta %s.\n\nO seu nome de utilizador: %s\nAcesse à sua conta: %s\n\n", - "Group" : "Grupo", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Armazenamento Externo", - "Updates" : "Atualizações", - "An error occurred: {message}" : "Ocorreu um erro: {message}" + "Group" : "Grupo" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/pt_PT.json b/settings/l10n/pt_PT.json index 0deefe93119467adbabe3de7f56a1367c2a6fbd3..28f83d064dde065a239728adbbe9e8eb040ce401 100644 --- a/settings/l10n/pt_PT.json +++ b/settings/l10n/pt_PT.json @@ -34,9 +34,6 @@ "Unable to change mail address" : "Não foi possível alterar o teu endereço de email", "Email saved" : "E-mail guardado", "Couldn't remove app." : "Não foi possível remover a aplicação.", - "Admins can't remove themself from the admin group" : "Os administradores não se podem remover a eles próprios do grupo 'admin'.", - "Unable to add user to group %s" : "Não é possível adicionar o utilizador ao grupo %s", - "Unable to remove user from group %s" : "Não é possível remover o utilizador do grupo %s", "Couldn't update app." : "Não foi possível atualizar a app.", "Add trusted domain" : "Adicionar domínio confiável ", "Migration in progress. Please wait until the migration is finished" : "Migração em progresso. Por favor, aguarde até que a mesma esteja concluída..", @@ -50,7 +47,6 @@ "The app will be downloaded from the app store" : "A aplicação será descarregada da loja de aplicações", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "As aplicações aprovadas são desenvolvidas por developers de confiança e passaram numa verificação de segurança. São mantidas ativamente num repositório de código aberto e quem as mantém considera-as estáveis para uso casual a normal.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Esta aplicação não foi verificada por problemas de segurança e é nova ou conhecida por ser instável. Instale-a por sua conta e risco.", - "Please wait...." : "Por favor, aguarde...", "Error while disabling app" : "Ocorreu um erro enquanto desativava a app", "Disable" : "Desativar", "Enable" : "Ativar", @@ -192,7 +188,6 @@ "This app has an update available." : "Esta aplicação tem uma atualização disponível.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Esta aplicação não pode ser instalada porque as seguintes dependências não podem ser realizadas:", "Enable only for specific groups" : "Activar só para grupos específicos", - "Uninstall App" : "Desinstalar aplicação", "SSL Root Certificates" : "Certificados SSL Root", "Common Name" : "Nome Comum", "Valid until" : "Válido até", @@ -254,7 +249,11 @@ "Default" : "Padrão", "log-level out of allowed range" : "log-level fora do alcance permitido", "Language changed" : "Idioma alterado", + "Admins can't remove themself from the admin group" : "Os administradores não se podem remover a eles próprios do grupo 'admin'.", + "Unable to add user to group %s" : "Não é possível adicionar o utilizador ao grupo %s", + "Unable to remove user from group %s" : "Não é possível remover o utilizador do grupo %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Você tem certeza que quer adicionar \"{domain}\" como domínio confiável?", + "Please wait...." : "Por favor, aguarde...", "Everything (fatal issues, errors, warnings, info, debug)" : "Tudo (problemas fatais, erros, avisos, informação, depuração)", "Info, warnings, errors and fatal issues" : "Informação, avisos, erros e problemas fatais", "Warnings, errors and fatal issues" : "Avisos, erros e problemas fatais", @@ -272,14 +271,10 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "O uso de SQLite é desencorajado especialmente se estiver a pensar em dar uso ao cliente desktop para sincronizar os seus ficheiros no seu computador.", "Experimental applications ahead" : "Aplicações experimentais de futuro", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "As apps experimentais não estão selecionadas para problemas de segurança, nova ou conhecida como instável e em forte desenvolvimento. Ao instalá-las pode causar a perda de dados ou quebra de segurança.", + "Uninstall App" : "Desinstalar aplicação", "Enable experimental apps" : "Ativar apps experimentais", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Olá,

    apenas para informar que você tem uma conta %s.

    O seu nome de utilizador: %s
    Acesse à sua conta: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Olá,\n\napenas para informar que você tem uma conta %s.\n\nO seu nome de utilizador: %s\nAcesse à sua conta: %s\n\n", - "Group" : "Grupo", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Armazenamento Externo", - "Updates" : "Atualizações", - "An error occurred: {message}" : "Ocorreu um erro: {message}" + "Group" : "Grupo" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/ro.js b/settings/l10n/ro.js index 14ca21c54e66f396d8aa98080f0775497a3b52e4..d6a2d9976862a7355663e1aa19cb31ebeb65be5c 100644 --- a/settings/l10n/ro.js +++ b/settings/l10n/ro.js @@ -32,9 +32,6 @@ OC.L10N.register( "Unable to change mail address" : "Nu s-a putut schimba adresa email", "Email saved" : "E-mail salvat", "Couldn't remove app." : "Nu s-a putut înlătura aplicația.", - "Admins can't remove themself from the admin group" : "Administratorii nu se pot șterge singuri din grupul adminnistrativ", - "Unable to add user to group %s" : "Nu s-a putut adăuga utilizatorul în grupul %s", - "Unable to remove user from group %s" : "Nu s-a putut elimina utilizatorul din grupul %s", "Couldn't update app." : "Aplicaţia nu s-a putut actualiza.", "Add trusted domain" : "Adaugă domeniu de încredere", "Migration in progress. Please wait until the migration is finished" : "Migrare în progres. Așteaptă până când migrarea este finalizată", @@ -45,7 +42,6 @@ OC.L10N.register( "_You have %n app update pending_::_You have %n app updates pending_" : ["Ai %n actualizare de aplicație în așteptare","Ai %n actualizări de aplicație în așteptare","Ai %n actualizări de aplicație în așteptare"], "No apps found for your version" : "Nu au fost găsite aplicații pentru versiunea ta", "The app will be downloaded from the app store" : "Aplicația va fi descărcată din magazin", - "Please wait...." : "Aşteptaţi vă rog....", "Error while disabling app" : "Eroare în timpul dezactivării aplicației", "Disable" : "Dezactivați", "Enable" : "Activare", @@ -145,7 +141,6 @@ OC.L10N.register( "Hide description …" : "Ascunde descriere ...", "This app has an update available." : "Este disponibilă o actualizare pentru această aplicație.", "Enable only for specific groups" : "Activează doar pentru grupuri specifice", - "Uninstall App" : "Dezinstalează aplicația", "SSL Root Certificates" : "Certificate SSL rădăcină", "Common Name" : "Nume comun", "Valid until" : "Valabil până la", @@ -190,6 +185,10 @@ OC.L10N.register( "Default" : "Implicită", "log-level out of allowed range" : "NIvelul de logare este în afara plajei admise", "Language changed" : "Limba a fost schimbată", + "Admins can't remove themself from the admin group" : "Administratorii nu se pot șterge singuri din grupul adminnistrativ", + "Unable to add user to group %s" : "Nu s-a putut adăuga utilizatorul în grupul %s", + "Unable to remove user from group %s" : "Nu s-a putut elimina utilizatorul din grupul %s", + "Please wait...." : "Aşteptaţi vă rog....", "Everything (fatal issues, errors, warnings, info, debug)" : "Tot (erori fatale, erori, avertizări, informări, depanare)", "Info, warnings, errors and fatal issues" : "Informări, avertizări, erori și erori fatale", "Warnings, errors and fatal issues" : "Avertizări, erori și erori fatale", @@ -204,11 +203,8 @@ OC.L10N.register( "Allow users to send mail notification for shared files" : "Permite utilizatorilor sa expedieze notificări prin e-mail pentru dosarele comune", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite e folosit ca o bază de date. Pentru instalări mari recomandăm folosirea unei alte baze de date.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "În special atunci când este folosit clientul desktop pentru sincronizarea fișierelor, utilizarea SQLite este nerecomandată.", + "Uninstall App" : "Dezinstalează aplicația", "Enable experimental apps" : "Activează aplicațiile experimentale", - "Group" : "Grup", - "Redis" : "Redis", - "External Storage" : "Stocare externă", - "Updates" : "Actualizări", - "An error occurred: {message}" : "A apărut o eroare: {message}" + "Group" : "Grup" }, "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"); diff --git a/settings/l10n/ro.json b/settings/l10n/ro.json index a0ede124ba2adc43f2fa95c3bcc2834514c55c74..3edcf42290f099ce2e961f5c251dc63d31836d11 100644 --- a/settings/l10n/ro.json +++ b/settings/l10n/ro.json @@ -30,9 +30,6 @@ "Unable to change mail address" : "Nu s-a putut schimba adresa email", "Email saved" : "E-mail salvat", "Couldn't remove app." : "Nu s-a putut înlătura aplicația.", - "Admins can't remove themself from the admin group" : "Administratorii nu se pot șterge singuri din grupul adminnistrativ", - "Unable to add user to group %s" : "Nu s-a putut adăuga utilizatorul în grupul %s", - "Unable to remove user from group %s" : "Nu s-a putut elimina utilizatorul din grupul %s", "Couldn't update app." : "Aplicaţia nu s-a putut actualiza.", "Add trusted domain" : "Adaugă domeniu de încredere", "Migration in progress. Please wait until the migration is finished" : "Migrare în progres. Așteaptă până când migrarea este finalizată", @@ -43,7 +40,6 @@ "_You have %n app update pending_::_You have %n app updates pending_" : ["Ai %n actualizare de aplicație în așteptare","Ai %n actualizări de aplicație în așteptare","Ai %n actualizări de aplicație în așteptare"], "No apps found for your version" : "Nu au fost găsite aplicații pentru versiunea ta", "The app will be downloaded from the app store" : "Aplicația va fi descărcată din magazin", - "Please wait...." : "Aşteptaţi vă rog....", "Error while disabling app" : "Eroare în timpul dezactivării aplicației", "Disable" : "Dezactivați", "Enable" : "Activare", @@ -143,7 +139,6 @@ "Hide description …" : "Ascunde descriere ...", "This app has an update available." : "Este disponibilă o actualizare pentru această aplicație.", "Enable only for specific groups" : "Activează doar pentru grupuri specifice", - "Uninstall App" : "Dezinstalează aplicația", "SSL Root Certificates" : "Certificate SSL rădăcină", "Common Name" : "Nume comun", "Valid until" : "Valabil până la", @@ -188,6 +183,10 @@ "Default" : "Implicită", "log-level out of allowed range" : "NIvelul de logare este în afara plajei admise", "Language changed" : "Limba a fost schimbată", + "Admins can't remove themself from the admin group" : "Administratorii nu se pot șterge singuri din grupul adminnistrativ", + "Unable to add user to group %s" : "Nu s-a putut adăuga utilizatorul în grupul %s", + "Unable to remove user from group %s" : "Nu s-a putut elimina utilizatorul din grupul %s", + "Please wait...." : "Aşteptaţi vă rog....", "Everything (fatal issues, errors, warnings, info, debug)" : "Tot (erori fatale, erori, avertizări, informări, depanare)", "Info, warnings, errors and fatal issues" : "Informări, avertizări, erori și erori fatale", "Warnings, errors and fatal issues" : "Avertizări, erori și erori fatale", @@ -202,11 +201,8 @@ "Allow users to send mail notification for shared files" : "Permite utilizatorilor sa expedieze notificări prin e-mail pentru dosarele comune", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite e folosit ca o bază de date. Pentru instalări mari recomandăm folosirea unei alte baze de date.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "În special atunci când este folosit clientul desktop pentru sincronizarea fișierelor, utilizarea SQLite este nerecomandată.", + "Uninstall App" : "Dezinstalează aplicația", "Enable experimental apps" : "Activează aplicațiile experimentale", - "Group" : "Grup", - "Redis" : "Redis", - "External Storage" : "Stocare externă", - "Updates" : "Actualizări", - "An error occurred: {message}" : "A apărut o eroare: {message}" + "Group" : "Grup" },"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));" } \ No newline at end of file diff --git a/settings/l10n/ru.js b/settings/l10n/ru.js index fc6a289e9a20e247d52a013d1e86d0f2bce20bfe..6c5ad892fdab044684ee44ab5ff620ae09531b41 100644 --- a/settings/l10n/ru.js +++ b/settings/l10n/ru.js @@ -22,24 +22,26 @@ OC.L10N.register( "test email settings" : "проверить настройки почты", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Во время отправки письма произошла ошибка. Пожалуйста проверьте настройки. (Ошибка: %s)", "Email sent" : "Письмо отправлено", - "You need to set your user email before being able to send test emails." : "Вы должны настроить свой адрес электронной почты прежде чем отправлять тестовые сообщения.", + "You need to set your user email before being able to send test emails." : "Вы должны настроить ваш собственный адрес электронной почты прежде чем отправлять тестовые сообщения.", "Invalid request" : "Неправильный запрос", "Invalid mail address" : "Некорректный адрес электронной почты", + "No valid group selected" : "Не выбрана верная группа", "A user with that name already exists." : "Пользователь с таким именем уже существует.", "Unable to create user." : "Невозможно создать пользователя.", "Your %s account was created" : "Учетная запись %s создана", "Unable to delete user." : "Невозможно удалить пользователя.", + "Settings saved" : "Настройки сохранены", "Unable to change full name" : "Невозможно изменить полное имя", + "Unable to change email address" : "Невозможно изменить адрес электронной почты", "Your full name has been changed." : "Ваше полное имя было изменено.", "Forbidden" : "Запрещено", "Invalid user" : "Неверный пользователь", "Unable to change mail address" : "Невозможно изменить адрес электронной почты", "Email saved" : "Адрес сохранен", + "Password confirmation is required" : "Требуется подтверждение пароля", "Couldn't remove app." : "Не удалось удалить приложение.", - "Admins can't remove themself from the admin group" : "Администратор не может удалить сам себя из группы администраторов", - "Unable to add user to group %s" : "Невозможно добавить пользователя в группу %s", - "Unable to remove user from group %s" : "Невозможно удалить пользователя из группы %s", "Couldn't update app." : "Невозможно обновить приложение", + "Are you really sure you want add {domain} as trusted domain?" : "Вы действительно хотите добавить домен {domain} как доверенный?", "Add trusted domain" : "Добавить доверенный домен", "Migration in progress. Please wait until the migration is finished" : "Миграция в процессе. Пожалуйста, подождите завершения миграции", "Migration started …" : "Начата миграция ...", @@ -48,15 +50,15 @@ OC.L10N.register( "Official" : "Официальное", "All" : "Все", "Update to %s" : "Обновить до %s", - "_You have %n app update pending_::_You have %n app updates pending_" : ["%n обновление в очереди","%n обновлений в очереди","%n обновлений в очереди","У вас есть %n доступных обновлений"], + "_You have %n app update pending_::_You have %n app updates pending_" : ["У вас есть %n доступное обновление","У вас есть %n доступных обновления","У вас есть %n доступных обновлений","У вас есть %n доступных обновлений"], "No apps found for your version" : "Не найдено приложений для вашей версии", "The app will be downloaded from the app store" : "Приложение будет скачано из магазина приложений", "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Официальные приложения разработаны вместе с сообществом. Они предлагают базовую функциональность и готовы для использования.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Подтвержденные приложения разработаны доверенными разработчиками и прошли краткую проверку на наличие проблем с безопасностью. Они активно поддерживаются в открытых репозиториях и сопровождающие их разработчики подтверждают, что приложения достаточно стабильны для нормальной работы.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Это приложение не проверялось на наличие проблем с безопасностью, также оно может работать нестабильно. Устанавливайте на свой страх и риск.", - "Please wait...." : "Пожалуйста подождите...", + "Enabling app …" : "Включение приложения", "Error while disabling app" : "Ошибка при отключении приложения", - "Disable" : "Выключить", + "Disable" : "Отключить", "Enable" : "Включить", "Error while enabling app" : "Ошибка при включении приложения", "Error: this app cannot be enabled because it makes the server unstable" : "Ошибка: это приложение не может быть включено, так как оно делает сервер нестабильным", @@ -73,16 +75,22 @@ OC.L10N.register( "Approved" : "Подтвержденное", "Experimental" : "Экспериментальное", "No apps found for {query}" : "Приложения не найдены по {query}", + "Allow filesystem access" : "Разрешить доступ к файловой системе", "Disconnect" : "Отключить", + "Revoke" : "Отменить", + "Internet Explorer" : "Internet Explorer", "Edge" : "Edge", "Firefox" : "Firefox", "Google Chrome" : "Google Chrome", "Safari" : "Safari", "Google Chrome for Android" : "Google Chrome для Android", + "iPhone iOS" : "iPhone iOS", + "iPad iOS" : "iPad iOS", "iOS Client" : "Клиент iOS", "Android Client" : "Клиент Android", "Sync client - {os}" : "Клиент синхронизации - {os}", "This session" : "Эта сессия", + "Copy" : "Копировать", "Copied!" : "Скопировано!", "Not supported!" : "Не поддерживается!", "Press ⌘-C to copy." : "Нажмите ⌘-C для копирования.", @@ -93,6 +101,14 @@ OC.L10N.register( "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Произошла ошибка. Пожалуйста загрузите сертификат PEM в ASCII кодировке.", "Valid until {date}" : "Действительно до {дата}", "Delete" : "Удалить", + "Local" : "Локально", + "Private" : "Закрытый", + "Only visible to local users" : "Виден только локальным пользователям", + "Only visible to you" : "Виден только вам", + "Contacts" : "Контакты", + "Visible to local users and to trusted servers" : "Виден локальным пользователям и доверенным серверам", + "Public" : "Открытый", + "Will be synced to a global and public address book" : "Будет синхронизирован с глобальной и открытой адресной книгой", "Select a profile picture" : "Выберите аватар", "Very weak password" : "Очень слабый пароль", "Weak password" : "Слабый пароль", @@ -107,11 +123,14 @@ OC.L10N.register( "undo" : "отмена", "never" : "никогда", "deleted {userName}" : "удалён {userName}", + "Unable to add user to group {group}" : "Невозможно добавить пользователя в группу {group}", + "Unable to remove user from group {group}" : "Невозможно удалить пользователя из группы {group}", "Add group" : "Добавить группу", "Invalid quota value \"{val}\"" : "Недопустимая величина квоты \"{val}\"", "no group" : "Без группы", "Password successfully changed" : "Пароль успешно изменен.", "Changing the password will result in data loss, because data recovery is not available for this user" : "Изменение пароля приведёт к потере данных, так как восстановление данных не доступно для этого пользователя", + "Could not change the users email" : "Невозможно изменить электронный адрес пользователя", "A valid username must be provided" : "Укажите правильное имя пользователя", "Error creating user: {message}" : "Ошибка создания пользователя: {message}", "A valid password must be provided" : "Должен быть указан правильный пароль", @@ -126,6 +145,7 @@ OC.L10N.register( "Login" : "Логин", "Plain" : "Простой", "NT LAN Manager" : "Менеджер NT LAN", + "SSL/TLS" : "SSL/TLS", "STARTTLS" : "STARTTLS", "Email server" : "Почтовый сервер", "Open documentation" : "Открыть документацию", @@ -182,6 +202,8 @@ OC.L10N.register( "Execute one task with each page loaded" : "Выполнять одно задание с каждой загруженной страницей", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php зарегистрирован в webcron и будет вызываться каждые 15 минут по http.", "Use system's cron service to call the cron.php file every 15 minutes." : "Использовать системный cron для вызова cron.php каждые 15 минут.", + "The cron.php needs to be executed by the system user \"%s\"." : "cron.php должен исполняться из под пользователя \"%s\".", + "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Для запуска вам необходимо расширение PHP posix. Для более подробной информации смотрите {linkstart}PHP документацию{linkend}", "Version" : "Версия", "Sharing" : "Общий доступ", "Allow apps to use the Share API" : "Позволить приложениям использовать API общего доступа", @@ -201,6 +223,8 @@ OC.L10N.register( "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Показать текст об отказе на странице загрузки публичной ссылки (Показывать только когда список файлов скрыт)", "This text will be shown on the public link upload page when the file list is hidden." : "Этот текст будет показан при переходе по публичной ссылке на загрузку при скрытом списке файлов", "Tips & tricks" : "Советы и трюки", + "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "В качестве базы данных используется SQLite. Для больших установок мы рекомендуем переключиться на другую серверную базу данных.", + "This is particularly recommended when using the desktop client for file synchronisation." : "Рекомендуется при синхронизации файлов с использованием клиента для ПК.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Для миграции на другую базу данных используйте команду: 'occ db:convert-type' или обратитесь к a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">документации ↗.", "How to do backups" : "Как сделать резервные копии", "Advanced monitoring" : "Расширенный мониторинг", @@ -223,17 +247,20 @@ OC.L10N.register( "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Для этого приложения не указана максимальная версия Nextcloud. В будущем это будет ошибкой.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Приложение не может быть установлено, следующие зависимости не удовлетворены:", "Enable only for specific groups" : "Включить только для этих групп", - "Uninstall App" : "Удалить приложение", + "Uninstall app" : "Удалить приложение", "SSL Root Certificates" : "Корневые сертификаты SSL", "Common Name" : "Общее Имя", "Valid until" : "Действительно до", "Issued By" : "Выдан", "Valid until %s" : "Действительно до %s", "Import root certificate" : "Импорт корневого сертификата", + "Hey there,

    just letting you know that you now have a %s account.

    Your username: %s
    Access it: %s

    " : "Здравствуйте,

    просто хотим сообщить, что теперь у вас есть учетная запись на %s.

    Ваше имя пользователя: %s
    Зайти: %s

    ", "Cheers!" : "Удачи!", + "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Здравствуйте,\n\nПросто хотим сообщить, что теперь у вас есть учетная запись на %s.\n\nИмя пользователя: %s\nЗайти: %s\n", "Administrator documentation" : "Документация администратора", "Online documentation" : "Online-документация", "Forum" : "Форум", + "Getting help" : "Помощь", "Commercial support" : "Коммерческая поддержка", "You are using %s of %s" : "Вы используете %s из %s", "Profile picture" : "Аватар", @@ -250,6 +277,14 @@ OC.L10N.register( "Your email address" : "Ваш адрес электронной почты", "No email address set" : "Адрес не указан", "For password recovery and notifications" : "Для восстановления пароля и уведомлений", + "Phone number" : "Номер телефона", + "Your phone number" : "Ваш номер телефона", + "Address" : "Адрес", + "Your postal address" : "Ваш почтовый адрес", + "Website" : "Сайт", + "Your website" : "Ваш сайт", + "Twitter" : "Twitter", + "Your Twitter handle" : "Ваше имя в Twiter", "You are member of the following groups:" : "Вы являетесь членом следующих групп:", "Password" : "Пароль", "Current password" : "Текущий пароль", @@ -261,6 +296,7 @@ OC.L10N.register( "Desktop client" : "Клиент для ПК", "Android app" : "Android приложение", "iOS app" : "iOS приложение", + "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Если хотите поддержать проект - {contributeopen}присоединяйтесь к разработке{linkclose} или {contributeopen}расскажите о нем другим{linkclose}!", "Show First Run Wizard again" : "Показать помощник настройки снова", "Web, desktop and mobile clients currently logged in to your account." : "Веб, настольные и мобильные клиенты, которые в настоящий момент авторизованы вашей учётной записью.", "Device" : "Устройство", @@ -288,6 +324,7 @@ OC.L10N.register( "Create" : "Создать", "Admin Recovery Password" : "Пароль административного восстановления", "Enter the recovery password in order to recover the users files during password change" : "Введите пароль для того, чтобы восстановить файлы пользователей при смене пароля", + "Group name" : "Название группы", "Everyone" : "Все", "Admins" : "Администраторы", "Default quota" : "Квота по умолчанию", @@ -304,7 +341,11 @@ OC.L10N.register( "Default" : "По умолчанию", "log-level out of allowed range" : "уровень журнала вышел за разрешенный диапазон", "Language changed" : "Язык изменён", + "Admins can't remove themself from the admin group" : "Администратор не может удалить сам себя из группы администраторов", + "Unable to add user to group %s" : "Невозможно добавить пользователя в группу %s", + "Unable to remove user from group %s" : "Невозможно удалить пользователя из группы %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Вы действительно хотите добавить домен \"{domain}\" как доверенный?", + "Please wait...." : "Пожалуйста подождите...", "iPhone" : "iPhone", "add group" : "Добавить группу", "Everything (fatal issues, errors, warnings, info, debug)" : "Все (критические проблемы, ошибки, предупреждения, информационные, отладочные)", @@ -324,10 +365,11 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Особенно вызывает сомнение использование SQLite при синхронизации файлов с использованием клиента для ПК.", "Experimental applications ahead" : "Экспериментальные приложения", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Экспериментальные приложения не проверялись на наличие уязвимостей безопасности, они также могут быть нестабильны, т.к. находятся в активной разработке. Их установка может повлечь потерю информации или нарушение безопасности.", + "Uninstall App" : "Удалить приложение", "Enable experimental apps" : "Включить экспериментальные приложения", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Здравствуйте,

    просто хотим сообщить, что теперь у вас есть учетная запись на %s.

    Ваше имя пользователя: %s
    Зайти: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Здравствуйте,\n\nПросто хотим сообщить, что теперь у вас есть учетная запись на %s.\n\nИмя пользователя: %s\nЗайти: %s\n", - "If you want to support the project\n\t\tjoin development\n\t\t\n\t\tspread the word!" : "Если вы хотите поддержать проект\n\t\tприсоединяйтесь к разработке\n\t\tили\n\t\tрасскажите о нас!", + "If you want to support the project\n\t\tjoin development\n\t\t\n\t\tspread the word!" : "Если вы хотите поддержать проект\n\tприсоединяйтесь к разработке\n\tили\n\tрасскажите о нас!", "Add Group" : "Добавить группу", "Group" : "Группа", "Default Quota" : "Квота по умолчанию", @@ -335,24 +377,6 @@ OC.L10N.register( "Group Admin for" : "Администратор групп", "Storage Location" : "Место хранилища", "User Backend" : "Механизм учёта пользователей", - "Last Login" : "Последний вход", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Внешнее хранилище", - "Updates" : "Обновления", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Официальные приложения разрабатываются в рамках сообщества Nextcloud. Они предлагают базовую функциональность Nextcloud и готовы для использования.", - "No apps found for \"{query}\"" : "Приложения не найдены по \"{query}\"", - "An error occurred: {message}" : "Произошла ошибка: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Пожалуйста, обратитесь к руководству по установке ↗ для получения подсказок по настройке php на вашем сервере, особенно если используете php-fpm.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Ваша база данных не работает в режиме изоляции транзакций \"READ COMMITED\". Это может вызвать проблемы, если несколько действий выполняется одновременно.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Ваш сервер работает на ОС Microsoft Windows. Мы настоятельно рекомендуем использовать ОС семейства Linux для достижения наилучших условий использования.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Блокировка передаваемых файлов отключена, это может вызвать ошибки. Для решения проблемы включите параметр 'filelocking.enabled' в файле config.php. Для получения дополнительной информации обратитесь к документации ↗.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Пожалуйста, еще раз внимательно прочитайте руководство по установке ↗ и проверьте журнал на наличие ошибок.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Шифрование не гарантирует безопасность системы . Пожалуйста, смотрите документацию по Nextcloud для получения дополнительной информации о том, как работает приложение шифрования и поддерживаемых вариантов использования.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Для миграции на другую базу данных используйте команду 'occ db:convert-type' или обратитесь к документации ↗.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "У этого приложения не указанна минимальная версия Nextcloud. Это приведет к ошибке в Nextcloud 11 и позже.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "У этого приложения не указанна минимальная версия Nextcloud. Это приведет к ошибке в Nextcloud 11 и позже.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Если вы хотите поддержать проект,\n\t\tприсоединяйтесь к разработке\n\t\tили\n\t\tпомогите другим пользователям!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Разработано {communityopen}сообществом Nextcloud{linkclose}, {githubopen}исходный код{linkclose} лицензируется в соответствии с условиями {licenseopen}AGPL{linkclose}." + "Last Login" : "Последний вход" }, "nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/settings/l10n/ru.json b/settings/l10n/ru.json index 6dd348342971434d0de3836448a87355f3223a37..e9c916fde669286d92e61f5f852cc83f929a78be 100644 --- a/settings/l10n/ru.json +++ b/settings/l10n/ru.json @@ -20,24 +20,26 @@ "test email settings" : "проверить настройки почты", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Во время отправки письма произошла ошибка. Пожалуйста проверьте настройки. (Ошибка: %s)", "Email sent" : "Письмо отправлено", - "You need to set your user email before being able to send test emails." : "Вы должны настроить свой адрес электронной почты прежде чем отправлять тестовые сообщения.", + "You need to set your user email before being able to send test emails." : "Вы должны настроить ваш собственный адрес электронной почты прежде чем отправлять тестовые сообщения.", "Invalid request" : "Неправильный запрос", "Invalid mail address" : "Некорректный адрес электронной почты", + "No valid group selected" : "Не выбрана верная группа", "A user with that name already exists." : "Пользователь с таким именем уже существует.", "Unable to create user." : "Невозможно создать пользователя.", "Your %s account was created" : "Учетная запись %s создана", "Unable to delete user." : "Невозможно удалить пользователя.", + "Settings saved" : "Настройки сохранены", "Unable to change full name" : "Невозможно изменить полное имя", + "Unable to change email address" : "Невозможно изменить адрес электронной почты", "Your full name has been changed." : "Ваше полное имя было изменено.", "Forbidden" : "Запрещено", "Invalid user" : "Неверный пользователь", "Unable to change mail address" : "Невозможно изменить адрес электронной почты", "Email saved" : "Адрес сохранен", + "Password confirmation is required" : "Требуется подтверждение пароля", "Couldn't remove app." : "Не удалось удалить приложение.", - "Admins can't remove themself from the admin group" : "Администратор не может удалить сам себя из группы администраторов", - "Unable to add user to group %s" : "Невозможно добавить пользователя в группу %s", - "Unable to remove user from group %s" : "Невозможно удалить пользователя из группы %s", "Couldn't update app." : "Невозможно обновить приложение", + "Are you really sure you want add {domain} as trusted domain?" : "Вы действительно хотите добавить домен {domain} как доверенный?", "Add trusted domain" : "Добавить доверенный домен", "Migration in progress. Please wait until the migration is finished" : "Миграция в процессе. Пожалуйста, подождите завершения миграции", "Migration started …" : "Начата миграция ...", @@ -46,15 +48,15 @@ "Official" : "Официальное", "All" : "Все", "Update to %s" : "Обновить до %s", - "_You have %n app update pending_::_You have %n app updates pending_" : ["%n обновление в очереди","%n обновлений в очереди","%n обновлений в очереди","У вас есть %n доступных обновлений"], + "_You have %n app update pending_::_You have %n app updates pending_" : ["У вас есть %n доступное обновление","У вас есть %n доступных обновления","У вас есть %n доступных обновлений","У вас есть %n доступных обновлений"], "No apps found for your version" : "Не найдено приложений для вашей версии", "The app will be downloaded from the app store" : "Приложение будет скачано из магазина приложений", "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Официальные приложения разработаны вместе с сообществом. Они предлагают базовую функциональность и готовы для использования.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Подтвержденные приложения разработаны доверенными разработчиками и прошли краткую проверку на наличие проблем с безопасностью. Они активно поддерживаются в открытых репозиториях и сопровождающие их разработчики подтверждают, что приложения достаточно стабильны для нормальной работы.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Это приложение не проверялось на наличие проблем с безопасностью, также оно может работать нестабильно. Устанавливайте на свой страх и риск.", - "Please wait...." : "Пожалуйста подождите...", + "Enabling app …" : "Включение приложения", "Error while disabling app" : "Ошибка при отключении приложения", - "Disable" : "Выключить", + "Disable" : "Отключить", "Enable" : "Включить", "Error while enabling app" : "Ошибка при включении приложения", "Error: this app cannot be enabled because it makes the server unstable" : "Ошибка: это приложение не может быть включено, так как оно делает сервер нестабильным", @@ -71,16 +73,22 @@ "Approved" : "Подтвержденное", "Experimental" : "Экспериментальное", "No apps found for {query}" : "Приложения не найдены по {query}", + "Allow filesystem access" : "Разрешить доступ к файловой системе", "Disconnect" : "Отключить", + "Revoke" : "Отменить", + "Internet Explorer" : "Internet Explorer", "Edge" : "Edge", "Firefox" : "Firefox", "Google Chrome" : "Google Chrome", "Safari" : "Safari", "Google Chrome for Android" : "Google Chrome для Android", + "iPhone iOS" : "iPhone iOS", + "iPad iOS" : "iPad iOS", "iOS Client" : "Клиент iOS", "Android Client" : "Клиент Android", "Sync client - {os}" : "Клиент синхронизации - {os}", "This session" : "Эта сессия", + "Copy" : "Копировать", "Copied!" : "Скопировано!", "Not supported!" : "Не поддерживается!", "Press ⌘-C to copy." : "Нажмите ⌘-C для копирования.", @@ -91,6 +99,14 @@ "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Произошла ошибка. Пожалуйста загрузите сертификат PEM в ASCII кодировке.", "Valid until {date}" : "Действительно до {дата}", "Delete" : "Удалить", + "Local" : "Локально", + "Private" : "Закрытый", + "Only visible to local users" : "Виден только локальным пользователям", + "Only visible to you" : "Виден только вам", + "Contacts" : "Контакты", + "Visible to local users and to trusted servers" : "Виден локальным пользователям и доверенным серверам", + "Public" : "Открытый", + "Will be synced to a global and public address book" : "Будет синхронизирован с глобальной и открытой адресной книгой", "Select a profile picture" : "Выберите аватар", "Very weak password" : "Очень слабый пароль", "Weak password" : "Слабый пароль", @@ -105,11 +121,14 @@ "undo" : "отмена", "never" : "никогда", "deleted {userName}" : "удалён {userName}", + "Unable to add user to group {group}" : "Невозможно добавить пользователя в группу {group}", + "Unable to remove user from group {group}" : "Невозможно удалить пользователя из группы {group}", "Add group" : "Добавить группу", "Invalid quota value \"{val}\"" : "Недопустимая величина квоты \"{val}\"", "no group" : "Без группы", "Password successfully changed" : "Пароль успешно изменен.", "Changing the password will result in data loss, because data recovery is not available for this user" : "Изменение пароля приведёт к потере данных, так как восстановление данных не доступно для этого пользователя", + "Could not change the users email" : "Невозможно изменить электронный адрес пользователя", "A valid username must be provided" : "Укажите правильное имя пользователя", "Error creating user: {message}" : "Ошибка создания пользователя: {message}", "A valid password must be provided" : "Должен быть указан правильный пароль", @@ -124,6 +143,7 @@ "Login" : "Логин", "Plain" : "Простой", "NT LAN Manager" : "Менеджер NT LAN", + "SSL/TLS" : "SSL/TLS", "STARTTLS" : "STARTTLS", "Email server" : "Почтовый сервер", "Open documentation" : "Открыть документацию", @@ -180,6 +200,8 @@ "Execute one task with each page loaded" : "Выполнять одно задание с каждой загруженной страницей", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php зарегистрирован в webcron и будет вызываться каждые 15 минут по http.", "Use system's cron service to call the cron.php file every 15 minutes." : "Использовать системный cron для вызова cron.php каждые 15 минут.", + "The cron.php needs to be executed by the system user \"%s\"." : "cron.php должен исполняться из под пользователя \"%s\".", + "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Для запуска вам необходимо расширение PHP posix. Для более подробной информации смотрите {linkstart}PHP документацию{linkend}", "Version" : "Версия", "Sharing" : "Общий доступ", "Allow apps to use the Share API" : "Позволить приложениям использовать API общего доступа", @@ -199,6 +221,8 @@ "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Показать текст об отказе на странице загрузки публичной ссылки (Показывать только когда список файлов скрыт)", "This text will be shown on the public link upload page when the file list is hidden." : "Этот текст будет показан при переходе по публичной ссылке на загрузку при скрытом списке файлов", "Tips & tricks" : "Советы и трюки", + "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "В качестве базы данных используется SQLite. Для больших установок мы рекомендуем переключиться на другую серверную базу данных.", + "This is particularly recommended when using the desktop client for file synchronisation." : "Рекомендуется при синхронизации файлов с использованием клиента для ПК.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Для миграции на другую базу данных используйте команду: 'occ db:convert-type' или обратитесь к a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">документации ↗.", "How to do backups" : "Как сделать резервные копии", "Advanced monitoring" : "Расширенный мониторинг", @@ -221,17 +245,20 @@ "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Для этого приложения не указана максимальная версия Nextcloud. В будущем это будет ошибкой.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Приложение не может быть установлено, следующие зависимости не удовлетворены:", "Enable only for specific groups" : "Включить только для этих групп", - "Uninstall App" : "Удалить приложение", + "Uninstall app" : "Удалить приложение", "SSL Root Certificates" : "Корневые сертификаты SSL", "Common Name" : "Общее Имя", "Valid until" : "Действительно до", "Issued By" : "Выдан", "Valid until %s" : "Действительно до %s", "Import root certificate" : "Импорт корневого сертификата", + "Hey there,

    just letting you know that you now have a %s account.

    Your username: %s
    Access it: %s

    " : "Здравствуйте,

    просто хотим сообщить, что теперь у вас есть учетная запись на %s.

    Ваше имя пользователя: %s
    Зайти: %s

    ", "Cheers!" : "Удачи!", + "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Здравствуйте,\n\nПросто хотим сообщить, что теперь у вас есть учетная запись на %s.\n\nИмя пользователя: %s\nЗайти: %s\n", "Administrator documentation" : "Документация администратора", "Online documentation" : "Online-документация", "Forum" : "Форум", + "Getting help" : "Помощь", "Commercial support" : "Коммерческая поддержка", "You are using %s of %s" : "Вы используете %s из %s", "Profile picture" : "Аватар", @@ -248,6 +275,14 @@ "Your email address" : "Ваш адрес электронной почты", "No email address set" : "Адрес не указан", "For password recovery and notifications" : "Для восстановления пароля и уведомлений", + "Phone number" : "Номер телефона", + "Your phone number" : "Ваш номер телефона", + "Address" : "Адрес", + "Your postal address" : "Ваш почтовый адрес", + "Website" : "Сайт", + "Your website" : "Ваш сайт", + "Twitter" : "Twitter", + "Your Twitter handle" : "Ваше имя в Twiter", "You are member of the following groups:" : "Вы являетесь членом следующих групп:", "Password" : "Пароль", "Current password" : "Текущий пароль", @@ -259,6 +294,7 @@ "Desktop client" : "Клиент для ПК", "Android app" : "Android приложение", "iOS app" : "iOS приложение", + "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Если хотите поддержать проект - {contributeopen}присоединяйтесь к разработке{linkclose} или {contributeopen}расскажите о нем другим{linkclose}!", "Show First Run Wizard again" : "Показать помощник настройки снова", "Web, desktop and mobile clients currently logged in to your account." : "Веб, настольные и мобильные клиенты, которые в настоящий момент авторизованы вашей учётной записью.", "Device" : "Устройство", @@ -286,6 +322,7 @@ "Create" : "Создать", "Admin Recovery Password" : "Пароль административного восстановления", "Enter the recovery password in order to recover the users files during password change" : "Введите пароль для того, чтобы восстановить файлы пользователей при смене пароля", + "Group name" : "Название группы", "Everyone" : "Все", "Admins" : "Администраторы", "Default quota" : "Квота по умолчанию", @@ -302,7 +339,11 @@ "Default" : "По умолчанию", "log-level out of allowed range" : "уровень журнала вышел за разрешенный диапазон", "Language changed" : "Язык изменён", + "Admins can't remove themself from the admin group" : "Администратор не может удалить сам себя из группы администраторов", + "Unable to add user to group %s" : "Невозможно добавить пользователя в группу %s", + "Unable to remove user from group %s" : "Невозможно удалить пользователя из группы %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Вы действительно хотите добавить домен \"{domain}\" как доверенный?", + "Please wait...." : "Пожалуйста подождите...", "iPhone" : "iPhone", "add group" : "Добавить группу", "Everything (fatal issues, errors, warnings, info, debug)" : "Все (критические проблемы, ошибки, предупреждения, информационные, отладочные)", @@ -322,10 +363,11 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Особенно вызывает сомнение использование SQLite при синхронизации файлов с использованием клиента для ПК.", "Experimental applications ahead" : "Экспериментальные приложения", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Экспериментальные приложения не проверялись на наличие уязвимостей безопасности, они также могут быть нестабильны, т.к. находятся в активной разработке. Их установка может повлечь потерю информации или нарушение безопасности.", + "Uninstall App" : "Удалить приложение", "Enable experimental apps" : "Включить экспериментальные приложения", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Здравствуйте,

    просто хотим сообщить, что теперь у вас есть учетная запись на %s.

    Ваше имя пользователя: %s
    Зайти: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Здравствуйте,\n\nПросто хотим сообщить, что теперь у вас есть учетная запись на %s.\n\nИмя пользователя: %s\nЗайти: %s\n", - "If you want to support the project\n\t\tjoin development\n\t\t\n\t\tspread the word!" : "Если вы хотите поддержать проект\n\t\tприсоединяйтесь к разработке\n\t\tили\n\t\tрасскажите о нас!", + "If you want to support the project\n\t\tjoin development\n\t\t\n\t\tspread the word!" : "Если вы хотите поддержать проект\n\tприсоединяйтесь к разработке\n\tили\n\tрасскажите о нас!", "Add Group" : "Добавить группу", "Group" : "Группа", "Default Quota" : "Квота по умолчанию", @@ -333,24 +375,6 @@ "Group Admin for" : "Администратор групп", "Storage Location" : "Место хранилища", "User Backend" : "Механизм учёта пользователей", - "Last Login" : "Последний вход", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Внешнее хранилище", - "Updates" : "Обновления", - "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Официальные приложения разрабатываются в рамках сообщества Nextcloud. Они предлагают базовую функциональность Nextcloud и готовы для использования.", - "No apps found for \"{query}\"" : "Приложения не найдены по \"{query}\"", - "An error occurred: {message}" : "Произошла ошибка: {message}", - "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Пожалуйста, обратитесь к руководству по установке ↗ для получения подсказок по настройке php на вашем сервере, особенно если используете php-fpm.", - "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Ваша база данных не работает в режиме изоляции транзакций \"READ COMMITED\". Это может вызвать проблемы, если несколько действий выполняется одновременно.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Ваш сервер работает на ОС Microsoft Windows. Мы настоятельно рекомендуем использовать ОС семейства Linux для достижения наилучших условий использования.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Блокировка передаваемых файлов отключена, это может вызвать ошибки. Для решения проблемы включите параметр 'filelocking.enabled' в файле config.php. Для получения дополнительной информации обратитесь к документации ↗.", - "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Пожалуйста, еще раз внимательно прочитайте руководство по установке ↗ и проверьте журнал на наличие ошибок.", - "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Шифрование не гарантирует безопасность системы . Пожалуйста, смотрите документацию по Nextcloud для получения дополнительной информации о том, как работает приложение шифрования и поддерживаемых вариантов использования.", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Для миграции на другую базу данных используйте команду 'occ db:convert-type' или обратитесь к документации ↗.", - "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "У этого приложения не указанна минимальная версия Nextcloud. Это приведет к ошибке в Nextcloud 11 и позже.", - "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "У этого приложения не указанна минимальная версия Nextcloud. Это приведет к ошибке в Nextcloud 11 и позже.", - "If you want to support the project\n\t\tjoin development\n\t\tor\n\t\thelp other users!" : "Если вы хотите поддержать проект,\n\t\tприсоединяйтесь к разработке\n\t\tили\n\t\tпомогите другим пользователям!", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Разработано {communityopen}сообществом Nextcloud{linkclose}, {githubopen}исходный код{linkclose} лицензируется в соответствии с условиями {licenseopen}AGPL{linkclose}." + "Last Login" : "Последний вход" },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" } \ No newline at end of file diff --git a/settings/l10n/si_LK.js b/settings/l10n/si_LK.js index 76adad6876c6fc24cbf57d4d59992d7a0de55c1e..4ea33986970bc2e10cb96811400f4f36998195a5 100644 --- a/settings/l10n/si_LK.js +++ b/settings/l10n/si_LK.js @@ -4,8 +4,6 @@ OC.L10N.register( "Authentication error" : "සත්‍යාපන දෝෂයක්", "Invalid request" : "අවලංගු අයැදුමක්", "Email saved" : "වි-තැපෑල සුරකින ලදී", - "Unable to add user to group %s" : "පරිශීලකයා %s කණ්ඩායමට එකතු කළ නොහැක", - "Unable to remove user from group %s" : "පරිශීලකයා %s කණ්ඩායමින් ඉවත් කළ නොහැක", "All" : "සියල්ල", "Disable" : "අක්‍රිය කරන්න", "Enable" : "සක්‍රිය කරන්න", @@ -36,9 +34,10 @@ OC.L10N.register( "Other" : "වෙනත්", "Quota" : "සලාකය", "Language changed" : "භාෂාව ාවනස් කිරීම", + "Unable to add user to group %s" : "පරිශීලකයා %s කණ්ඩායමට එකතු කළ නොහැක", + "Unable to remove user from group %s" : "පරිශීලකයා %s කණ්ඩායමින් ඉවත් කළ නොහැක", "Log" : "ලඝුව", "More" : "වැඩි", - "Less" : "අඩු", - "External Storage" : "භාහිර ගබඩාව" + "Less" : "අඩු" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/si_LK.json b/settings/l10n/si_LK.json index d6055fb31f7e1b51c1647facf822fb085eebf857..0f9ebafcd6ed97b4688721ea7e9abfde9883e985 100644 --- a/settings/l10n/si_LK.json +++ b/settings/l10n/si_LK.json @@ -2,8 +2,6 @@ "Authentication error" : "සත්‍යාපන දෝෂයක්", "Invalid request" : "අවලංගු අයැදුමක්", "Email saved" : "වි-තැපෑල සුරකින ලදී", - "Unable to add user to group %s" : "පරිශීලකයා %s කණ්ඩායමට එකතු කළ නොහැක", - "Unable to remove user from group %s" : "පරිශීලකයා %s කණ්ඩායමින් ඉවත් කළ නොහැක", "All" : "සියල්ල", "Disable" : "අක්‍රිය කරන්න", "Enable" : "සක්‍රිය කරන්න", @@ -34,9 +32,10 @@ "Other" : "වෙනත්", "Quota" : "සලාකය", "Language changed" : "භාෂාව ාවනස් කිරීම", + "Unable to add user to group %s" : "පරිශීලකයා %s කණ්ඩායමට එකතු කළ නොහැක", + "Unable to remove user from group %s" : "පරිශීලකයා %s කණ්ඩායමින් ඉවත් කළ නොහැක", "Log" : "ලඝුව", "More" : "වැඩි", - "Less" : "අඩු", - "External Storage" : "භාහිර ගබඩාව" + "Less" : "අඩු" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/sk_SK.js b/settings/l10n/sk_SK.js index 8f4f6276f4b309421b45350e478f2438c242cbf4..2d3e4a3560930bcd7ba2f88cf43f52a105836dde 100644 --- a/settings/l10n/sk_SK.js +++ b/settings/l10n/sk_SK.js @@ -27,40 +27,76 @@ OC.L10N.register( "Unable to create user." : "Nie je možné vytvoriť používateľa.", "Your %s account was created" : "Váš účet %s bol vytvorený", "Unable to delete user." : "Nie je možné zmazať používateľa.", + "Settings saved" : "Nastavenia uložené", "Unable to change full name" : "Nemožno zmeniť meno a priezvisko", + "Unable to change email address" : "Nemožno zmeniť emailovú adresu", "Your full name has been changed." : "Vaše meno a priezvisko bolo zmenené.", "Forbidden" : "Zakázané", "Invalid user" : "Neplatný používateľ", "Unable to change mail address" : "Nemožno zmeniť emailovú adresu", "Email saved" : "Email uložený", + "Password confirmation is required" : "Vyžaduje sa overenie heslom", "Couldn't remove app." : "Nemožno odstrániť aplikáciu.", - "Admins can't remove themself from the admin group" : "Administrátori nesmú odstrániť sami seba zo skupiny admin", - "Unable to add user to group %s" : "Nie je možné pridať používateľa do skupiny %s", - "Unable to remove user from group %s" : "Nie je možné odstrániť používateľa zo skupiny %s", "Couldn't update app." : "Nemožno aktualizovať aplikáciu.", + "Are you really sure you want add {domain} as trusted domain?" : "Ste si istí, že chcete pridať {domain} medzi dôveryhodné domény?", "Add trusted domain" : "Pridať dôveryhodnú doménu", "Migration in progress. Please wait until the migration is finished" : "Prebieha migrácia. Počkajte prosím, kým sa skončí", "Migration started …" : "Migrácia spustená ...", + "Not saved" : "Neuložené", "Sending..." : "Odosielam...", "Official" : "Oficiálny", "All" : "Všetky", "Update to %s" : "Aktualizovať na %s", + "_You have %n app update pending_::_You have %n app updates pending_" : ["Prebieha aktualizácia %n aplikácie","Prebieha aktualizácia %n aplikácií","Prebieha aktualizácia %n aplikácií"], "No apps found for your version" : "Aplikácie pre vašu verziu sa nenašli", - "Please wait...." : "Čakajte prosím...", + "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Táto aplikácia nie je skontrolovaná na bezpečnostné chyby, je nová, alebo patrí medzi nestabilné. Inštalácia na vlastné riziko.", + "Enabling app …" : "Povoľujem aplikáciu …", "Error while disabling app" : "Chyba pri zakázaní aplikácie", "Disable" : "Zakázať", "Enable" : "Zapnúť", "Error while enabling app" : "Chyba pri povoľovaní aplikácie", + "Error: this app cannot be enabled because it makes the server unstable" : "Chyba: aplikáciu nie je možné povoliť, lebo naruší stabilitu servera", + "Error: could not disable broken app" : "Chyba: nebolo možné zakázať poškodenú aplikáciu", + "Error while disabling broken app" : "Nastala chyba počas zakazovania poškodenej aplikácie", "Updating...." : "Aktualizujem...", "Error while updating app" : "chyba pri aktualizácii aplikácie", "Updated" : "Aktualizované", "Uninstalling ...." : "Prebieha odinštalovanie...", "Error while uninstalling app" : "Chyba pri odinštalovaní aplikácie", "Uninstall" : "Odinštalácia", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikácia bola povolená, ale je potrebné ju aktualizovať. O 5 sekúnd budete presmerovaní na aktualizačnú stránku.", + "App update" : "Aktualizácia aplikácie", "Approved" : "Schválené", "Experimental" : "Experimentálny", + "No apps found for {query}" : "Žiadna aplikácia nebola nájdená pre {query}", + "Allow filesystem access" : "Povoliť prístup ku súborovému systému", + "Disconnect" : "Odpojiť", + "Revoke" : "Odvolať", + "Internet Explorer" : "Internet Explorer", + "Firefox" : "Firefox", + "Google Chrome" : "Google Chrome", + "Safari" : "Safari", + "Google Chrome for Android" : "Google Chrome pre Android", + "iPhone iOS" : "iPhone iOS", + "iPad iOS" : "iPad iOS", + "iOS Client" : "iOS Klient", + "Android Client" : "Android Klient", + "Copy" : "Kopírovať", + "Copied!" : "Skopírované!", + "Not supported!" : "Nie je podporované!", + "Press ⌘-C to copy." : "Stlač ⌘-C pre skopírovanie.", + "Press Ctrl-C to copy." : "Stlač Ctrl-C pre skopírovanie.", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Vyskytla sa chyba. Nahrajte prosím PEM certifikát v ASCII kódovaní.", "Valid until {date}" : "Platný do {date}", "Delete" : "Zmazať", + "Local" : "Lokálny", + "Private" : "Súkromný", + "Only visible to local users" : "Viditeľné iba pre lokálnych používateľov", + "Only visible to you" : "Viditeľné iba pre seba", + "Contacts" : "Kontakty", + "Visible to local users and to trusted servers" : "Viditeľné pre lokálnych používateľov a dôveryhodné servery", + "Public" : "Verejné", + "Will be synced to a global and public address book" : "Bude synchronizované s globálnym a verejným adresárom", "Select a profile picture" : "Vybrať avatara", "Very weak password" : "Veľmi slabé heslo", "Weak password" : "Slabé heslo", @@ -69,23 +105,32 @@ OC.L10N.register( "Strong password" : "Silné heslo", "Groups" : "Skupiny", "Unable to delete {objName}" : "Nemožno vymazať {objName}", + "Error creating group: {message}" : "Chyba pri vytváraní skupiny: {message}", "A valid group name must be provided" : "Musíte zadať platný názov skupiny", "deleted {groupName}" : "vymazaná {groupName}", "undo" : "vrátiť", "never" : "nikdy", "deleted {userName}" : "vymazané {userName}", + "Add group" : "Pridať skupinu", + "Invalid quota value \"{val}\"" : "Neplatná hodnota kvóty \"{val}\"", + "Password successfully changed" : "Heslo úspešne zmenené", "Changing the password will result in data loss, because data recovery is not available for this user" : "Zmena hesla bude mať za následok stratu dát, pretože obnova dát nie je k dispozícii pre tohto používateľa", + "Could not change the users email" : "Nemožno zmeniť email používateľa", "A valid username must be provided" : "Musíte zadať platné používateľské meno", + "Error creating user: {message}" : "Chyba pri vytváraní používateľa: {message}", "A valid password must be provided" : "Musíte zadať platné heslo", "A valid email must be provided" : "Musíte zadať platnú emailovú adresu", "__language_name__" : "Slovensky", "Unlimited" : "Nelimitované", "Personal info" : "Osobné informácie", + "App passwords" : "Heslá aplikácie", "Sync clients" : "Klienti synchronizácie", "None" : "Žiadny", "Login" : "Prihlásenie", "Plain" : "Neformátovaný", "NT LAN Manager" : "NT LAN Manager", + "SSL/TLS" : "SSL/TLS", + "STARTTLS" : "STARTTLS", "Email server" : "Email server", "Open documentation" : "Otvoriť dokumentáciu", "This is used for sending out notifications." : "Používa sa na odosielanie upozornení.", @@ -105,7 +150,12 @@ OC.L10N.register( "Send email" : "Odoslať email", "Server-side encryption" : "Šifrovanie na serveri", "Enable server-side encryption" : "Povoliť šifrovanie na serveri", + "Please read carefully before activating server-side encryption: " : "Prečítajte prosím pozorne pred použitím šifrovania na serveri:", + "Be aware that encryption always increases the file size." : "Majte na vedomí, že šifrovanie vždy zväčší veľkosť súborov.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Je dobré vytvárať pravidelné zálohy vašich dát, uistite sa, že v prípade šifrovania spolu s vašimi dátami zálohujete aj šifrovacie kľúče.", + "This is the final warning: Do you really want to enable encryption?" : "Toto je posledné varovanie: Vážne si prajete povoliť šifrovanie?", "Enable encryption" : "Povoliť šifrovanie", + "No encryption module loaded, please enable an encryption module in the app menu." : "Nebol načítaný žiadny šifrovací modul, povoľte prosím šifrovací modul v menu aplikácií.", "Select default encryption module:" : "Vybrať predvolený šifrovací modul:", "Start migration" : "Začať migráciu", "Security & setup warnings" : "Bezpečnosť a nastavenia upozornení", @@ -117,6 +167,7 @@ OC.L10N.register( "This means that there might be problems with certain characters in file names." : "To znamená, že sa môžu vyskytnúť problémy s niektorými znakmi v názvoch súborov.", "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Dôrazne doporučujeme nainštalovať na váš systém požadované balíčky podporujúce jednu z nasledovných znakových sád: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Inštalácia mimo koreňový priečinok domény a používanie systémového príkazu cron môže spôsobiť problém s generovaním správnej URL. Pre zabránenie týmto chybám nastavte prosím správnu cestu v svojom config.php súbore pre hodnotu \"overwrite.cli.url\" (Doporučujeme: \"%s\")", + "All checks passed." : "Všetky kontroly prešli úspešne.", "Cron" : "Cron", "Last cron job execution: %s." : "Posledný cron prebehol: %s.", "Last cron job execution: %s. Something seems wrong." : "Posledný cron prebehol: %s. Zdá sa, že niečo nie je vporiadku.", @@ -124,6 +175,7 @@ OC.L10N.register( "Execute one task with each page loaded" : "Vykonať jednu úlohu s každým načítaní stránky", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php je zaregistrovaná v službe WebCron a zavolá cron.php každých 15 minút cez http.", "Use system's cron service to call the cron.php file every 15 minutes." : "Použiť systémovú službu cron na spúšťanie súboru cron.php každých 15 minút.", + "The cron.php needs to be executed by the system user \"%s\"." : "Je potrebné, aby cron.php bol spustený systémovým používateľom \"%s\".", "Version" : "Verzia", "Sharing" : "Sprístupňovanie", "Allow apps to use the Share API" : "Povoliť aplikáciám používať API pre sprístupňovanie", @@ -135,6 +187,7 @@ OC.L10N.register( "days" : "dni", "Enforce expiration date" : "Vynútiť dátum expirácie", "Allow resharing" : "Povoliť sprístupňovanie ďalej", + "Allow sharing with groups" : "Povoliť sprístupnenie so skupinami", "Restrict users to only share with users in their groups" : "Povoliť používateľom sprístupňovanie obsahu len v rámci ich skupiny", "Exclude groups from sharing" : "Nesprístupniť obsah skupinám", "These groups will still be able to receive shares, but not to initiate them." : "Tieto skupiny nebudú mocť sprístupňovať obsah, môžu však stále čítať sprístupnené súbory", @@ -146,33 +199,57 @@ OC.L10N.register( "Theming" : "Vzhľady tém", "Hardening and security guidance" : "Sprievodca vylepšením bezpečnosti", "Developer documentation" : "Dokumentácia vývojára", + "by %s" : "od %s", + "%s-licensed" : "%s-licencovaný", "Documentation:" : "Dokumentácia:", "User documentation" : "Príručka používateľa", "Admin documentation" : "Príručka administrátora", + "Visit website" : "Navštíviť webstránku", + "Report a bug" : "Nahlásiť chybu", "Show description …" : "Zobraziť popis …", "Hide description …" : "Skryť popis …", + "This app has an update available." : "Pre túto aplikáciu je dostupná aktualizácia.", + "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Pre túto aplikáciu nie je zadaná minimálna verzia Nextcloudu. Toto v budúcnosti spôsobí chybu.", + "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Pre túto aplikáciu nie je zadaná maximálna verzia Nextcloudu. Toto v budúcnosti spôsobí chybu.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Túto aplikáciu nemožno nainštalovať, pretože nie sú splnené nasledovné závislosti:", "Enable only for specific groups" : "Povoliť len pre vybrané skupiny", - "Uninstall App" : "Odinštalovanie aplikácie", + "Uninstall app" : "Odinštalovať aplikáciu", + "SSL Root Certificates" : "Koreňové certifikáty SSL", "Common Name" : "Bežný názov", "Valid until" : "Platný do", "Issued By" : "Vydal", "Valid until %s" : "Platný do %s", "Import root certificate" : "Importovať koreňový certifikát", + "Hey there,

    just letting you know that you now have a %s account.

    Your username: %s
    Access it: %s

    " : "Dobrý deň,

    toto je oznámenie o novo vytvorenom účte %s.

    Vaše používateľské meno: %s
    Prihlásiť sa môžete tu: %s

    ", "Cheers!" : "Pekný deň!", + "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Dobrý deň,\n\ntoto je oznámenie o novo vytvorenom účte %s.\n\nVaše používateľské meno: %s\nPrihlásiť sa môžete tu: %s\n\n", "Administrator documentation" : "Príručka administrátora", "Online documentation" : "Online príručka", "Forum" : "Fórum", + "Getting help" : "Získať pomoc", "Commercial support" : "Komerčná podpora", + "You are using %s of %s" : "Využívate %s z %s", "Profile picture" : "Avatar", "Upload new" : "Nahrať nový", + "Select from Files" : "Vybrať zo súborov", "Remove image" : "Zmazať obrázok", + "png or jpg, max. 20 MB" : "png alebo jpg, max. 20 MB", + "Picture provided by original account" : "Obrázok poskytnutý originálnym účtom", "Cancel" : "Zrušiť", + "Choose as profile picture" : "Použiť ako obrázok avatara", "Full name" : "Meno a priezvisko", "No display name set" : "Zobrazované meno nie je nastavené", "Email" : "Email", "Your email address" : "Vaša emailová adresa", "No email address set" : "Emailová adresa nie je nastavená", + "For password recovery and notifications" : "Pre obnovu hesla a oznámenia", + "Phone number" : "Telefónne číslo", + "Your phone number" : "Vaše telefónne číslo", + "Address" : "Adresa", + "Your postal address" : "Vaša poštová adresa", + "Website" : "Webstránka", + "Your website" : "Vaša webstránka", + "Twitter" : "Twitter", "You are member of the following groups:" : "Ste členom nasledovných skupín:", "Password" : "Heslo", "Current password" : "Aktuálne heslo", @@ -184,10 +261,20 @@ OC.L10N.register( "Desktop client" : "Desktopový klient", "Android app" : "Android aplikácia", "iOS app" : "iOS aplikácia", + "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Ak chcete podporiť projekt {contributeopen}zapojte sa do vývoja{linkclose}, alebo {contributeopen}dajte o nás vedieť{linkclose}!", "Show First Run Wizard again" : "Znovu zobraziť sprievodcu prvým spustením", + "Web, desktop and mobile clients currently logged in to your account." : "Weboví, desktopoví, alebo mobilní klienti práve prihlásení na váš účet.", + "Device" : "Zariadenie", + "Last activity" : "Posledná aktivita", + "Passcodes that give an app or device permissions to access your account." : "Prístupové heslá, ktoré dovolia aplikáciam alebo zariadeniam prístup na váš účet.", "Name" : "Názov", + "App name" : "Názov aplikácie", + "Create new app password" : "Vytvoriť nové heslo aplikácie", + "Use the credentials below to configure your app or device." : "Pre konfiguráciu vašej aplikácie, alebo zariadenia použite nižšie uvedené prihlasovacie údaje.", + "For security reasons this password will only be shown once." : "Z dôvodu bezpečnosti toto heslo bude zobrazené iba jeden krát.", "Username" : "Používateľské meno", "Done" : "Hotovo", + "Follow us on Google Plus!" : "Sleduj nás na Google Plus!", "Show storage location" : "Zobraziť umiestnenie úložiska", "Show last log in" : "Zobraziť posledné prihlásenie", "Show user backend" : "Zobraziť backend používateľa", @@ -197,24 +284,37 @@ OC.L10N.register( "Create" : "Vytvoriť", "Admin Recovery Password" : "Obnovenie hesla administrátora", "Enter the recovery password in order to recover the users files during password change" : "Zadajte heslo pre obnovenie súborov používateľa pri zmene hesla", + "Group name" : "Názov skupiny", "Everyone" : "Všetci", "Admins" : "Administrátori", + "Default quota" : "Predvolená kvóta", "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Prosím zadajte kvótu úložného priestoru (napr.: \"512 MB​​\" alebo \"12 GB\")", "Other" : "Iné", + "Group admin for" : "Administrátor skupiny pre", "Quota" : "Kvóta", + "Storage location" : "Umiestnenie úložiska", + "User backend" : "Backend používateľa", + "Last login" : "Posledné prihlásenie", "change full name" : "zmeniť meno a priezvisko", "set new password" : "nastaviť nové heslo", "change email address" : "zmeniť emailovú adresu", "Default" : "Predvolené", "log-level out of allowed range" : "úroveň logovania z povoleného rozpätia", "Language changed" : "Jazyk zmenený", + "Admins can't remove themself from the admin group" : "Administrátori nesmú odstrániť sami seba zo skupiny admin", + "Unable to add user to group %s" : "Nie je možné pridať používateľa do skupiny %s", + "Unable to remove user from group %s" : "Nie je možné odstrániť používateľa zo skupiny %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ste si istí, že chcete pridať \"{domain}\" medzi dôveryhodné domény?", + "Please wait...." : "Čakajte prosím...", + "iPhone" : "iPhone", + "add group" : "pridať skupinu", "Everything (fatal issues, errors, warnings, info, debug)" : "Všetko (fatálne problémy, chyby, upozornenia, info, debug)", "Info, warnings, errors and fatal issues" : "Info, upozornenia, chyby a fatálne problémy", "Warnings, errors and fatal issues" : "Upozornenia, chyby a fatálne problémy", "Errors and fatal issues" : "Chyby a fatálne problémy", "Fatal issues only" : "Len fatálne problémy", "Log" : "Záznam", + "What to log" : "Čo sa má zaznamenávať", "Download logfile" : "Stiahnuť súbor logu", "More" : "Viac", "Less" : "Menej", @@ -225,13 +325,17 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Najmä pri používaní aplikácie na synchronizáciu s desktopom nie je databáza SQLite doporučená.", "Experimental applications ahead" : "Experimentálna aplikácia v poradí", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Experimentálne aplikácie nie sú preverované na bezpečnostné chyby, môžu byť nestabilné a veľmi sa meniť. Ich inštaláciou môžete spôsobiť stratu dát alebo bezpečnostné problémy.", + "Uninstall App" : "Odinštalovanie aplikácie", "Enable experimental apps" : "Povoliť experimentálne aplikácie", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Dobrý deň,

    toto je oznámenie o novo vytvorenom účte %s.

    Vaše používateľské meno: %s
    Prihlásiť sa môžete tu: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Ahoj,\n\ntoto je oznámenie o novo vytvorenom účte %s.\n\nVaše používateľské meno: %s\nPrihlásiť sa môžete tu: %s\n\n", + "Add Group" : "Pridať skupinu", "Group" : "Skupina", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Externé úložisko", - "Updates" : "Aktualizácie" + "Default Quota" : "Predvolená kvóta", + "Full Name" : "Meno a priezvisko", + "Group Admin for" : "Administrátor skupiny pre", + "Storage Location" : "Umiestnenie úložiska", + "User Backend" : "Backend používateľa", + "Last Login" : "Posledné prihlásenie" }, "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/settings/l10n/sk_SK.json b/settings/l10n/sk_SK.json index 2f588591ed628b12e732ef4cf36d40f8c4ff4cea..227e9b1b0617309aa6476ee459f914071a0d62ca 100644 --- a/settings/l10n/sk_SK.json +++ b/settings/l10n/sk_SK.json @@ -25,40 +25,76 @@ "Unable to create user." : "Nie je možné vytvoriť používateľa.", "Your %s account was created" : "Váš účet %s bol vytvorený", "Unable to delete user." : "Nie je možné zmazať používateľa.", + "Settings saved" : "Nastavenia uložené", "Unable to change full name" : "Nemožno zmeniť meno a priezvisko", + "Unable to change email address" : "Nemožno zmeniť emailovú adresu", "Your full name has been changed." : "Vaše meno a priezvisko bolo zmenené.", "Forbidden" : "Zakázané", "Invalid user" : "Neplatný používateľ", "Unable to change mail address" : "Nemožno zmeniť emailovú adresu", "Email saved" : "Email uložený", + "Password confirmation is required" : "Vyžaduje sa overenie heslom", "Couldn't remove app." : "Nemožno odstrániť aplikáciu.", - "Admins can't remove themself from the admin group" : "Administrátori nesmú odstrániť sami seba zo skupiny admin", - "Unable to add user to group %s" : "Nie je možné pridať používateľa do skupiny %s", - "Unable to remove user from group %s" : "Nie je možné odstrániť používateľa zo skupiny %s", "Couldn't update app." : "Nemožno aktualizovať aplikáciu.", + "Are you really sure you want add {domain} as trusted domain?" : "Ste si istí, že chcete pridať {domain} medzi dôveryhodné domény?", "Add trusted domain" : "Pridať dôveryhodnú doménu", "Migration in progress. Please wait until the migration is finished" : "Prebieha migrácia. Počkajte prosím, kým sa skončí", "Migration started …" : "Migrácia spustená ...", + "Not saved" : "Neuložené", "Sending..." : "Odosielam...", "Official" : "Oficiálny", "All" : "Všetky", "Update to %s" : "Aktualizovať na %s", + "_You have %n app update pending_::_You have %n app updates pending_" : ["Prebieha aktualizácia %n aplikácie","Prebieha aktualizácia %n aplikácií","Prebieha aktualizácia %n aplikácií"], "No apps found for your version" : "Aplikácie pre vašu verziu sa nenašli", - "Please wait...." : "Čakajte prosím...", + "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Táto aplikácia nie je skontrolovaná na bezpečnostné chyby, je nová, alebo patrí medzi nestabilné. Inštalácia na vlastné riziko.", + "Enabling app …" : "Povoľujem aplikáciu …", "Error while disabling app" : "Chyba pri zakázaní aplikácie", "Disable" : "Zakázať", "Enable" : "Zapnúť", "Error while enabling app" : "Chyba pri povoľovaní aplikácie", + "Error: this app cannot be enabled because it makes the server unstable" : "Chyba: aplikáciu nie je možné povoliť, lebo naruší stabilitu servera", + "Error: could not disable broken app" : "Chyba: nebolo možné zakázať poškodenú aplikáciu", + "Error while disabling broken app" : "Nastala chyba počas zakazovania poškodenej aplikácie", "Updating...." : "Aktualizujem...", "Error while updating app" : "chyba pri aktualizácii aplikácie", "Updated" : "Aktualizované", "Uninstalling ...." : "Prebieha odinštalovanie...", "Error while uninstalling app" : "Chyba pri odinštalovaní aplikácie", "Uninstall" : "Odinštalácia", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikácia bola povolená, ale je potrebné ju aktualizovať. O 5 sekúnd budete presmerovaní na aktualizačnú stránku.", + "App update" : "Aktualizácia aplikácie", "Approved" : "Schválené", "Experimental" : "Experimentálny", + "No apps found for {query}" : "Žiadna aplikácia nebola nájdená pre {query}", + "Allow filesystem access" : "Povoliť prístup ku súborovému systému", + "Disconnect" : "Odpojiť", + "Revoke" : "Odvolať", + "Internet Explorer" : "Internet Explorer", + "Firefox" : "Firefox", + "Google Chrome" : "Google Chrome", + "Safari" : "Safari", + "Google Chrome for Android" : "Google Chrome pre Android", + "iPhone iOS" : "iPhone iOS", + "iPad iOS" : "iPad iOS", + "iOS Client" : "iOS Klient", + "Android Client" : "Android Klient", + "Copy" : "Kopírovať", + "Copied!" : "Skopírované!", + "Not supported!" : "Nie je podporované!", + "Press ⌘-C to copy." : "Stlač ⌘-C pre skopírovanie.", + "Press Ctrl-C to copy." : "Stlač Ctrl-C pre skopírovanie.", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Vyskytla sa chyba. Nahrajte prosím PEM certifikát v ASCII kódovaní.", "Valid until {date}" : "Platný do {date}", "Delete" : "Zmazať", + "Local" : "Lokálny", + "Private" : "Súkromný", + "Only visible to local users" : "Viditeľné iba pre lokálnych používateľov", + "Only visible to you" : "Viditeľné iba pre seba", + "Contacts" : "Kontakty", + "Visible to local users and to trusted servers" : "Viditeľné pre lokálnych používateľov a dôveryhodné servery", + "Public" : "Verejné", + "Will be synced to a global and public address book" : "Bude synchronizované s globálnym a verejným adresárom", "Select a profile picture" : "Vybrať avatara", "Very weak password" : "Veľmi slabé heslo", "Weak password" : "Slabé heslo", @@ -67,23 +103,32 @@ "Strong password" : "Silné heslo", "Groups" : "Skupiny", "Unable to delete {objName}" : "Nemožno vymazať {objName}", + "Error creating group: {message}" : "Chyba pri vytváraní skupiny: {message}", "A valid group name must be provided" : "Musíte zadať platný názov skupiny", "deleted {groupName}" : "vymazaná {groupName}", "undo" : "vrátiť", "never" : "nikdy", "deleted {userName}" : "vymazané {userName}", + "Add group" : "Pridať skupinu", + "Invalid quota value \"{val}\"" : "Neplatná hodnota kvóty \"{val}\"", + "Password successfully changed" : "Heslo úspešne zmenené", "Changing the password will result in data loss, because data recovery is not available for this user" : "Zmena hesla bude mať za následok stratu dát, pretože obnova dát nie je k dispozícii pre tohto používateľa", + "Could not change the users email" : "Nemožno zmeniť email používateľa", "A valid username must be provided" : "Musíte zadať platné používateľské meno", + "Error creating user: {message}" : "Chyba pri vytváraní používateľa: {message}", "A valid password must be provided" : "Musíte zadať platné heslo", "A valid email must be provided" : "Musíte zadať platnú emailovú adresu", "__language_name__" : "Slovensky", "Unlimited" : "Nelimitované", "Personal info" : "Osobné informácie", + "App passwords" : "Heslá aplikácie", "Sync clients" : "Klienti synchronizácie", "None" : "Žiadny", "Login" : "Prihlásenie", "Plain" : "Neformátovaný", "NT LAN Manager" : "NT LAN Manager", + "SSL/TLS" : "SSL/TLS", + "STARTTLS" : "STARTTLS", "Email server" : "Email server", "Open documentation" : "Otvoriť dokumentáciu", "This is used for sending out notifications." : "Používa sa na odosielanie upozornení.", @@ -103,7 +148,12 @@ "Send email" : "Odoslať email", "Server-side encryption" : "Šifrovanie na serveri", "Enable server-side encryption" : "Povoliť šifrovanie na serveri", + "Please read carefully before activating server-side encryption: " : "Prečítajte prosím pozorne pred použitím šifrovania na serveri:", + "Be aware that encryption always increases the file size." : "Majte na vedomí, že šifrovanie vždy zväčší veľkosť súborov.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Je dobré vytvárať pravidelné zálohy vašich dát, uistite sa, že v prípade šifrovania spolu s vašimi dátami zálohujete aj šifrovacie kľúče.", + "This is the final warning: Do you really want to enable encryption?" : "Toto je posledné varovanie: Vážne si prajete povoliť šifrovanie?", "Enable encryption" : "Povoliť šifrovanie", + "No encryption module loaded, please enable an encryption module in the app menu." : "Nebol načítaný žiadny šifrovací modul, povoľte prosím šifrovací modul v menu aplikácií.", "Select default encryption module:" : "Vybrať predvolený šifrovací modul:", "Start migration" : "Začať migráciu", "Security & setup warnings" : "Bezpečnosť a nastavenia upozornení", @@ -115,6 +165,7 @@ "This means that there might be problems with certain characters in file names." : "To znamená, že sa môžu vyskytnúť problémy s niektorými znakmi v názvoch súborov.", "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Dôrazne doporučujeme nainštalovať na váš systém požadované balíčky podporujúce jednu z nasledovných znakových sád: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Inštalácia mimo koreňový priečinok domény a používanie systémového príkazu cron môže spôsobiť problém s generovaním správnej URL. Pre zabránenie týmto chybám nastavte prosím správnu cestu v svojom config.php súbore pre hodnotu \"overwrite.cli.url\" (Doporučujeme: \"%s\")", + "All checks passed." : "Všetky kontroly prešli úspešne.", "Cron" : "Cron", "Last cron job execution: %s." : "Posledný cron prebehol: %s.", "Last cron job execution: %s. Something seems wrong." : "Posledný cron prebehol: %s. Zdá sa, že niečo nie je vporiadku.", @@ -122,6 +173,7 @@ "Execute one task with each page loaded" : "Vykonať jednu úlohu s každým načítaní stránky", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php je zaregistrovaná v službe WebCron a zavolá cron.php každých 15 minút cez http.", "Use system's cron service to call the cron.php file every 15 minutes." : "Použiť systémovú službu cron na spúšťanie súboru cron.php každých 15 minút.", + "The cron.php needs to be executed by the system user \"%s\"." : "Je potrebné, aby cron.php bol spustený systémovým používateľom \"%s\".", "Version" : "Verzia", "Sharing" : "Sprístupňovanie", "Allow apps to use the Share API" : "Povoliť aplikáciám používať API pre sprístupňovanie", @@ -133,6 +185,7 @@ "days" : "dni", "Enforce expiration date" : "Vynútiť dátum expirácie", "Allow resharing" : "Povoliť sprístupňovanie ďalej", + "Allow sharing with groups" : "Povoliť sprístupnenie so skupinami", "Restrict users to only share with users in their groups" : "Povoliť používateľom sprístupňovanie obsahu len v rámci ich skupiny", "Exclude groups from sharing" : "Nesprístupniť obsah skupinám", "These groups will still be able to receive shares, but not to initiate them." : "Tieto skupiny nebudú mocť sprístupňovať obsah, môžu však stále čítať sprístupnené súbory", @@ -144,33 +197,57 @@ "Theming" : "Vzhľady tém", "Hardening and security guidance" : "Sprievodca vylepšením bezpečnosti", "Developer documentation" : "Dokumentácia vývojára", + "by %s" : "od %s", + "%s-licensed" : "%s-licencovaný", "Documentation:" : "Dokumentácia:", "User documentation" : "Príručka používateľa", "Admin documentation" : "Príručka administrátora", + "Visit website" : "Navštíviť webstránku", + "Report a bug" : "Nahlásiť chybu", "Show description …" : "Zobraziť popis …", "Hide description …" : "Skryť popis …", + "This app has an update available." : "Pre túto aplikáciu je dostupná aktualizácia.", + "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Pre túto aplikáciu nie je zadaná minimálna verzia Nextcloudu. Toto v budúcnosti spôsobí chybu.", + "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Pre túto aplikáciu nie je zadaná maximálna verzia Nextcloudu. Toto v budúcnosti spôsobí chybu.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Túto aplikáciu nemožno nainštalovať, pretože nie sú splnené nasledovné závislosti:", "Enable only for specific groups" : "Povoliť len pre vybrané skupiny", - "Uninstall App" : "Odinštalovanie aplikácie", + "Uninstall app" : "Odinštalovať aplikáciu", + "SSL Root Certificates" : "Koreňové certifikáty SSL", "Common Name" : "Bežný názov", "Valid until" : "Platný do", "Issued By" : "Vydal", "Valid until %s" : "Platný do %s", "Import root certificate" : "Importovať koreňový certifikát", + "Hey there,

    just letting you know that you now have a %s account.

    Your username: %s
    Access it: %s

    " : "Dobrý deň,

    toto je oznámenie o novo vytvorenom účte %s.

    Vaše používateľské meno: %s
    Prihlásiť sa môžete tu: %s

    ", "Cheers!" : "Pekný deň!", + "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Dobrý deň,\n\ntoto je oznámenie o novo vytvorenom účte %s.\n\nVaše používateľské meno: %s\nPrihlásiť sa môžete tu: %s\n\n", "Administrator documentation" : "Príručka administrátora", "Online documentation" : "Online príručka", "Forum" : "Fórum", + "Getting help" : "Získať pomoc", "Commercial support" : "Komerčná podpora", + "You are using %s of %s" : "Využívate %s z %s", "Profile picture" : "Avatar", "Upload new" : "Nahrať nový", + "Select from Files" : "Vybrať zo súborov", "Remove image" : "Zmazať obrázok", + "png or jpg, max. 20 MB" : "png alebo jpg, max. 20 MB", + "Picture provided by original account" : "Obrázok poskytnutý originálnym účtom", "Cancel" : "Zrušiť", + "Choose as profile picture" : "Použiť ako obrázok avatara", "Full name" : "Meno a priezvisko", "No display name set" : "Zobrazované meno nie je nastavené", "Email" : "Email", "Your email address" : "Vaša emailová adresa", "No email address set" : "Emailová adresa nie je nastavená", + "For password recovery and notifications" : "Pre obnovu hesla a oznámenia", + "Phone number" : "Telefónne číslo", + "Your phone number" : "Vaše telefónne číslo", + "Address" : "Adresa", + "Your postal address" : "Vaša poštová adresa", + "Website" : "Webstránka", + "Your website" : "Vaša webstránka", + "Twitter" : "Twitter", "You are member of the following groups:" : "Ste členom nasledovných skupín:", "Password" : "Heslo", "Current password" : "Aktuálne heslo", @@ -182,10 +259,20 @@ "Desktop client" : "Desktopový klient", "Android app" : "Android aplikácia", "iOS app" : "iOS aplikácia", + "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Ak chcete podporiť projekt {contributeopen}zapojte sa do vývoja{linkclose}, alebo {contributeopen}dajte o nás vedieť{linkclose}!", "Show First Run Wizard again" : "Znovu zobraziť sprievodcu prvým spustením", + "Web, desktop and mobile clients currently logged in to your account." : "Weboví, desktopoví, alebo mobilní klienti práve prihlásení na váš účet.", + "Device" : "Zariadenie", + "Last activity" : "Posledná aktivita", + "Passcodes that give an app or device permissions to access your account." : "Prístupové heslá, ktoré dovolia aplikáciam alebo zariadeniam prístup na váš účet.", "Name" : "Názov", + "App name" : "Názov aplikácie", + "Create new app password" : "Vytvoriť nové heslo aplikácie", + "Use the credentials below to configure your app or device." : "Pre konfiguráciu vašej aplikácie, alebo zariadenia použite nižšie uvedené prihlasovacie údaje.", + "For security reasons this password will only be shown once." : "Z dôvodu bezpečnosti toto heslo bude zobrazené iba jeden krát.", "Username" : "Používateľské meno", "Done" : "Hotovo", + "Follow us on Google Plus!" : "Sleduj nás na Google Plus!", "Show storage location" : "Zobraziť umiestnenie úložiska", "Show last log in" : "Zobraziť posledné prihlásenie", "Show user backend" : "Zobraziť backend používateľa", @@ -195,24 +282,37 @@ "Create" : "Vytvoriť", "Admin Recovery Password" : "Obnovenie hesla administrátora", "Enter the recovery password in order to recover the users files during password change" : "Zadajte heslo pre obnovenie súborov používateľa pri zmene hesla", + "Group name" : "Názov skupiny", "Everyone" : "Všetci", "Admins" : "Administrátori", + "Default quota" : "Predvolená kvóta", "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Prosím zadajte kvótu úložného priestoru (napr.: \"512 MB​​\" alebo \"12 GB\")", "Other" : "Iné", + "Group admin for" : "Administrátor skupiny pre", "Quota" : "Kvóta", + "Storage location" : "Umiestnenie úložiska", + "User backend" : "Backend používateľa", + "Last login" : "Posledné prihlásenie", "change full name" : "zmeniť meno a priezvisko", "set new password" : "nastaviť nové heslo", "change email address" : "zmeniť emailovú adresu", "Default" : "Predvolené", "log-level out of allowed range" : "úroveň logovania z povoleného rozpätia", "Language changed" : "Jazyk zmenený", + "Admins can't remove themself from the admin group" : "Administrátori nesmú odstrániť sami seba zo skupiny admin", + "Unable to add user to group %s" : "Nie je možné pridať používateľa do skupiny %s", + "Unable to remove user from group %s" : "Nie je možné odstrániť používateľa zo skupiny %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ste si istí, že chcete pridať \"{domain}\" medzi dôveryhodné domény?", + "Please wait...." : "Čakajte prosím...", + "iPhone" : "iPhone", + "add group" : "pridať skupinu", "Everything (fatal issues, errors, warnings, info, debug)" : "Všetko (fatálne problémy, chyby, upozornenia, info, debug)", "Info, warnings, errors and fatal issues" : "Info, upozornenia, chyby a fatálne problémy", "Warnings, errors and fatal issues" : "Upozornenia, chyby a fatálne problémy", "Errors and fatal issues" : "Chyby a fatálne problémy", "Fatal issues only" : "Len fatálne problémy", "Log" : "Záznam", + "What to log" : "Čo sa má zaznamenávať", "Download logfile" : "Stiahnuť súbor logu", "More" : "Viac", "Less" : "Menej", @@ -223,13 +323,17 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Najmä pri používaní aplikácie na synchronizáciu s desktopom nie je databáza SQLite doporučená.", "Experimental applications ahead" : "Experimentálna aplikácia v poradí", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Experimentálne aplikácie nie sú preverované na bezpečnostné chyby, môžu byť nestabilné a veľmi sa meniť. Ich inštaláciou môžete spôsobiť stratu dát alebo bezpečnostné problémy.", + "Uninstall App" : "Odinštalovanie aplikácie", "Enable experimental apps" : "Povoliť experimentálne aplikácie", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Dobrý deň,

    toto je oznámenie o novo vytvorenom účte %s.

    Vaše používateľské meno: %s
    Prihlásiť sa môžete tu: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Ahoj,\n\ntoto je oznámenie o novo vytvorenom účte %s.\n\nVaše používateľské meno: %s\nPrihlásiť sa môžete tu: %s\n\n", + "Add Group" : "Pridať skupinu", "Group" : "Skupina", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Externé úložisko", - "Updates" : "Aktualizácie" + "Default Quota" : "Predvolená kvóta", + "Full Name" : "Meno a priezvisko", + "Group Admin for" : "Administrátor skupiny pre", + "Storage Location" : "Umiestnenie úložiska", + "User Backend" : "Backend používateľa", + "Last Login" : "Posledné prihlásenie" },"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" } \ No newline at end of file diff --git a/settings/l10n/sl.js b/settings/l10n/sl.js index 4cec0ddce20b98775178999da52d80ef29d5cf68..35b1758f16b9a82dda58fc4e617dad85d57f2643 100644 --- a/settings/l10n/sl.js +++ b/settings/l10n/sl.js @@ -35,9 +35,6 @@ OC.L10N.register( "Unable to change mail address" : "Ni mogoče spremeniti naslova elektronske pošte.", "Email saved" : "Elektronski naslov je shranjen", "Couldn't remove app." : "Ni mogoče odstraniti programa.", - "Admins can't remove themself from the admin group" : "Skrbnikov ni mogoče odstraniti iz skupine skrbnikov (admin)", - "Unable to add user to group %s" : "Uporabnika ni mogoče dodati k skupini %s", - "Unable to remove user from group %s" : "Uporabnika ni mogoče odstraniti iz skupine %s", "Couldn't update app." : "Programa ni mogoče posodobiti.", "Add trusted domain" : "Dodaj varno domeno", "Migration in progress. Please wait until the migration is finished" : "V teku je selitev. Počakajte, da se zaključi.", @@ -49,7 +46,6 @@ OC.L10N.register( "_You have %n app update pending_::_You have %n app updates pending_" : ["Na čakanju je %n posodobitev","Na čakanju sta %n posodobitvi","Na čakanju so %n posodobitve","Na čakanju je %n posodobitev"], "No apps found for your version" : "Za to različico ni na voljo noben vstavek", "The app will be downloaded from the app store" : "Program bo prejet iz zbirke programov", - "Please wait...." : "Počakajte ...", "Error while disabling app" : "Napaka onemogočanja programa", "Disable" : "Onemogoči", "Enable" : "Omogoči", @@ -180,7 +176,6 @@ OC.L10N.register( "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Ta aplikacija nima določene maksimalne NextCloud verzije. V prihodnosti bo to napaka.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Programa ni mogoče namestiti zaradi nerešenih odvisnosti:", "Enable only for specific groups" : "Omogoči le za posamezne skupine", - "Uninstall App" : "Odstrani program", "SSL Root Certificates" : "Korenska potrdila SSL", "Common Name" : "Splošno ime", "Valid until" : "Veljavno do", @@ -244,7 +239,11 @@ OC.L10N.register( "Default" : "Privzeto", "log-level out of allowed range" : "stopnja zapisovanja je izven dovoljenega območja", "Language changed" : "Jezik je spremenjen", + "Admins can't remove themself from the admin group" : "Skrbnikov ni mogoče odstraniti iz skupine skrbnikov (admin)", + "Unable to add user to group %s" : "Uporabnika ni mogoče dodati k skupini %s", + "Unable to remove user from group %s" : "Uporabnika ni mogoče odstraniti iz skupine %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ali ste prepričani, da želite dodati \"{domain}\" kot varno domeno?", + "Please wait...." : "Počakajte ...", "Everything (fatal issues, errors, warnings, info, debug)" : "Vse (podrobnosti, opozorila, hrošče, napake in usodne dogodke)", "Info, warnings, errors and fatal issues" : "Podrobnosti, opozorila, napake in usodne dogodke", "Warnings, errors and fatal issues" : "Opozorila, napake in usodne dogodke", @@ -261,14 +260,10 @@ OC.L10N.register( "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Uporabljena zbirka je SQLite. Za obsežnejše sisteme je priporočljiv prehod na drugo vrsto zbirke.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Uporaba SQLite ni priporočljiva iz varnostnih razlogov, to še posebej velja, če se sistem krajevno usklajuje z namizjem prek odjemalca.", "Experimental applications ahead" : "Preizkusni programi", + "Uninstall App" : "Odstrani program", "Enable experimental apps" : "Omogoči preizkusne programe", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Pozdravljeni,

    obveščamo vas, da je račun %s pripravljen.

    Uporabniško ime: %s
    Dostop: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Pozdravljeni,\n\nobveščamo vas, da je račun %s pripravljen.\n\nUporabniško ime: %s\nDostop: %s\n", - "Group" : "Skupina", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Zunanja podatkovna shramba", - "Updates" : "Posodobitve", - "An error occurred: {message}" : "Prišlo je do napake: {message}" + "Group" : "Skupina" }, "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"); diff --git a/settings/l10n/sl.json b/settings/l10n/sl.json index 7fb4fdd940249a16fcefb9e03e913950faa3b13b..e4a83311a03bb0ca590bf3ae3c21552de97eab84 100644 --- a/settings/l10n/sl.json +++ b/settings/l10n/sl.json @@ -33,9 +33,6 @@ "Unable to change mail address" : "Ni mogoče spremeniti naslova elektronske pošte.", "Email saved" : "Elektronski naslov je shranjen", "Couldn't remove app." : "Ni mogoče odstraniti programa.", - "Admins can't remove themself from the admin group" : "Skrbnikov ni mogoče odstraniti iz skupine skrbnikov (admin)", - "Unable to add user to group %s" : "Uporabnika ni mogoče dodati k skupini %s", - "Unable to remove user from group %s" : "Uporabnika ni mogoče odstraniti iz skupine %s", "Couldn't update app." : "Programa ni mogoče posodobiti.", "Add trusted domain" : "Dodaj varno domeno", "Migration in progress. Please wait until the migration is finished" : "V teku je selitev. Počakajte, da se zaključi.", @@ -47,7 +44,6 @@ "_You have %n app update pending_::_You have %n app updates pending_" : ["Na čakanju je %n posodobitev","Na čakanju sta %n posodobitvi","Na čakanju so %n posodobitve","Na čakanju je %n posodobitev"], "No apps found for your version" : "Za to različico ni na voljo noben vstavek", "The app will be downloaded from the app store" : "Program bo prejet iz zbirke programov", - "Please wait...." : "Počakajte ...", "Error while disabling app" : "Napaka onemogočanja programa", "Disable" : "Onemogoči", "Enable" : "Omogoči", @@ -178,7 +174,6 @@ "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Ta aplikacija nima določene maksimalne NextCloud verzije. V prihodnosti bo to napaka.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Programa ni mogoče namestiti zaradi nerešenih odvisnosti:", "Enable only for specific groups" : "Omogoči le za posamezne skupine", - "Uninstall App" : "Odstrani program", "SSL Root Certificates" : "Korenska potrdila SSL", "Common Name" : "Splošno ime", "Valid until" : "Veljavno do", @@ -242,7 +237,11 @@ "Default" : "Privzeto", "log-level out of allowed range" : "stopnja zapisovanja je izven dovoljenega območja", "Language changed" : "Jezik je spremenjen", + "Admins can't remove themself from the admin group" : "Skrbnikov ni mogoče odstraniti iz skupine skrbnikov (admin)", + "Unable to add user to group %s" : "Uporabnika ni mogoče dodati k skupini %s", + "Unable to remove user from group %s" : "Uporabnika ni mogoče odstraniti iz skupine %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ali ste prepričani, da želite dodati \"{domain}\" kot varno domeno?", + "Please wait...." : "Počakajte ...", "Everything (fatal issues, errors, warnings, info, debug)" : "Vse (podrobnosti, opozorila, hrošče, napake in usodne dogodke)", "Info, warnings, errors and fatal issues" : "Podrobnosti, opozorila, napake in usodne dogodke", "Warnings, errors and fatal issues" : "Opozorila, napake in usodne dogodke", @@ -259,14 +258,10 @@ "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Uporabljena zbirka je SQLite. Za obsežnejše sisteme je priporočljiv prehod na drugo vrsto zbirke.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Uporaba SQLite ni priporočljiva iz varnostnih razlogov, to še posebej velja, če se sistem krajevno usklajuje z namizjem prek odjemalca.", "Experimental applications ahead" : "Preizkusni programi", + "Uninstall App" : "Odstrani program", "Enable experimental apps" : "Omogoči preizkusne programe", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Pozdravljeni,

    obveščamo vas, da je račun %s pripravljen.

    Uporabniško ime: %s
    Dostop: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Pozdravljeni,\n\nobveščamo vas, da je račun %s pripravljen.\n\nUporabniško ime: %s\nDostop: %s\n", - "Group" : "Skupina", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Zunanja podatkovna shramba", - "Updates" : "Posodobitve", - "An error occurred: {message}" : "Prišlo je do napake: {message}" + "Group" : "Skupina" },"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);" } \ No newline at end of file diff --git a/settings/l10n/sq.js b/settings/l10n/sq.js index d419481a36f1e43d900ca831a9a6b937b899b3a1..0f55b61956ebeb2a4b175fc5df25d83f485e51d6 100644 --- a/settings/l10n/sq.js +++ b/settings/l10n/sq.js @@ -26,23 +26,25 @@ OC.L10N.register( "Invalid request" : "Kërkesë e pavlefshme", "Invalid mail address" : "Adresë email e pavlefshme", "A user with that name already exists." : "Ka tashmë një përdorues me këtë emër.", - "Unable to create user." : "S’arrin të krijojë përdoruesi.", + "Unable to create user." : "S’u arrit krijimi i përdoruesit.", "Your %s account was created" : "Llogaria juaj %s u krijua", "Unable to delete user." : "S’arrin të fshijë përdorues.", + "Settings saved" : "Konfigurimet u ruajtën", "Unable to change full name" : "S’arrin të ndryshojë emrin e plotë", + "Unable to change email address" : "Nuk mund të ndryshohet adresa e email-it", "Your full name has been changed." : "Emri juaj i plotë u ndryshua.", "Forbidden" : "E ndaluar", "Invalid user" : "Përdorues i pavlefshëm", "Unable to change mail address" : "S’arrin të ndryshojë adresë email", "Email saved" : "Email-i u ruajt", + "Password confirmation is required" : "Kërkohet konfirmimi i fjalëkalimit", "Couldn't remove app." : "S’hoqi dot aplikacionin.", - "Admins can't remove themself from the admin group" : "Administratorët s’mund të heqin veten prej grupit admin", - "Unable to add user to group %s" : "S’arrin të shtojë përdorues te grupi %s", - "Unable to remove user from group %s" : "S’arrin të heqë përdorues nga grupi %s", "Couldn't update app." : "S’përditësoi dot aplikacionin.", + "Are you really sure you want add {domain} as trusted domain?" : "Jeni i sigurt se doni ta shtoni {domain} si një domain të besuar?", "Add trusted domain" : "Shtoni përkatësi të besuar", "Migration in progress. Please wait until the migration is finished" : "Migrimi në rrugë e sipër. Ju lutemi, pritni, teksa migrimi përfundon", "Migration started …" : "Migrimi filloi …", + "Not saved" : "Nuk u ruajt", "Sending..." : "Po dërgohet…", "Official" : "Zyrtare", "All" : "Krejt", @@ -50,9 +52,10 @@ OC.L10N.register( "_You have %n app update pending_::_You have %n app updates pending_" : ["Keni %n përditësim aplikacioni në pritje","Keni %n përditësime aplikacionesh në pritje"], "No apps found for your version" : "S’u gjetën aplikacione për versionin tuaj", "The app will be downloaded from the app store" : "Aplikacioni do të shkarkohet nga shitorja e aplikacioneve", + "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Aplikacionet zyrtare zhvillohen nga komuniteti dhe brenta tij. Ato ofrojnë funksionalitet qëndror dhe janë gati për përdorim.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Aplikacionet e miratuara ndërtohen nga zhvillues të besuar dhe kanë kaluar një kontroll të përciptë sigurie. Mirëmbahen aktivisht në një depo të hapur kodi dhe mirëmbajtësit e tyre i konsiderojnë të qëndrueshme për përdorime nga të rastit deri në ato normale.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ky aplikacion s’është kontrolluar për probleme sigurie dhe është i ri ose i njohur si i paqëndrueshëm. Instalojeni duke e mbajtur vetë përgjegjësinë.", - "Please wait...." : "Ju lutemi, prisni…", + "Enabling app …" : "Duke aktivizuar aplikacionin ...", "Error while disabling app" : "Gabim në çaktivizimin e aplikacionit", "Disable" : "Çaktivizoje", "Enable" : "Aktivizoje", @@ -71,13 +74,40 @@ OC.L10N.register( "Approved" : "Të miratuara", "Experimental" : "Eksperimentale", "No apps found for {query}" : "S’u gjetën aplikacione për {query}", + "Allow filesystem access" : "Lejo aksesin e sistemit të skedarëve", "Disconnect" : "Shkëputu", + "Revoke" : "Anulo", + "Internet Explorer" : "Internet Explorer", + "Edge" : "Edge", + "Firefox" : "Firefox", + "Google Chrome" : "Google Chrome", + "Safari" : "Safari", + "Google Chrome for Android" : "Google Chrome për Android", + "iPhone iOS" : "iPhone iOS", + "iPad iOS" : "iPad iOS", + "iOS Client" : "Klient iOS", + "Android Client" : "Klient Android", + "Sync client - {os}" : "Sinkronizo klientin - {os}", + "This session" : "Ky sesion", + "Copy" : "Kopjo", + "Copied!" : "U kopjua!", + "Not supported!" : "Nuk suportohet!", + "Press ⌘-C to copy." : "Shtyp ⌘-C për të kopjuar.", + "Press Ctrl-C to copy." : "Shtyp Ctrl-C për të kopjuar.", "Error while loading browser sessions and device tokens" : "Gabim gjatë ngarkimit të sesioneve të shfletuesit dhe token-ësh pajisjesh", "Error while creating device token" : "Gabim gjatë krijimit të token-ëve të pajisjejeve", "Error while deleting the token" : "Gabim gjatë fshirjes së token-it", "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Ndodhi një gabim. Ju lutemi, ngarkoni një dëshmi PEM të koduar me ASCII.", "Valid until {date}" : "E vlefshme deri më {date}", "Delete" : "Fshije", + "Local" : "Lokale", + "Private" : "Private", + "Only visible to local users" : "E dukshme vetëm për përdoruesit lokal", + "Only visible to you" : "E dukshme vetëm për ju", + "Contacts" : "Kontaktet", + "Visible to local users and to trusted servers" : "E dukshme për përdoruesit lokal dhe serverat e besuar", + "Public" : "Publiku", + "Will be synced to a global and public address book" : "Do të sinkronizohet te një libër adresash publik dhe global", "Select a profile picture" : "Përzgjidhni një foto profili", "Very weak password" : "Fjalëkalim shumë i dobët", "Weak password" : "Fjalëkalim i dobët", @@ -92,7 +122,12 @@ OC.L10N.register( "undo" : "zhbëje", "never" : "kurrë", "deleted {userName}" : "u fshi {userName}", + "Add group" : "Shto grup", + "Invalid quota value \"{val}\"" : "Vlera e kuotës \"{val}\" e pavlefshme", + "no group" : "asnjë grup", + "Password successfully changed" : "Fjalëkalimi u ndryshua me sukses", "Changing the password will result in data loss, because data recovery is not available for this user" : "Ndryshimi i fjalëkalimit do të sjellë humbje të dhënash, ngaqë rikthimi i të dhënave s’është i përdorshëm për këtë përdorues", + "Could not change the users email" : "Nuk mund të ndryshohej email-i i përdoruesëve", "A valid username must be provided" : "Duhet dhënë një emër të vlefshëm përdoruesi", "Error creating user: {message}" : "Gabim gjatë krijimit të përdoruesit: {message}", "A valid password must be provided" : "Duhet dhënë një fjalëkalim i vlefshëm", @@ -107,6 +142,8 @@ OC.L10N.register( "Login" : "Hyrje", "Plain" : "E thjeshtë", "NT LAN Manager" : "Përgjegjës Rrjeti NT", + "SSL/TLS" : "SSL/TLS", + "STARTTLS" : "STARTTLS", "Email server" : "Shërbyes email-esh", "Open documentation" : "Hapni dokumentimin", "This is used for sending out notifications." : "Ky përdoret për të dërguar njoftime.", @@ -128,6 +165,7 @@ OC.L10N.register( "Enable server-side encryption" : "Aktivizo fshehtëzim më anë të shërbyesit", "Please read carefully before activating server-side encryption: " : "Ju lutemi, lexoni me kujdes përpara aktivizimit të fshehtëzimeve më anë shërbyesi: ", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Pasi të jetë aktivizuar fshehtëzimi, krejt kartelat e ngarkuara te shërbyesi nga kjo pikë e tutje do të fshehtëzohen pasi të jenë depozituar në shërbyes. Çaktivizimi i fshehtëzimit në një datë të mëvonshme do të jetë i mundur vetëm nëse moduli aktiv i fshehtëzimeve e mbulon këtë funksion, dhe nëse plotësohen krejt parakushtet (p.sh. caktimi i një kyçi rimarrjesh).", + "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "Vetëm shifrimi nuk garaton sigurinë e sistemit. Ju lutem shikoni dokumentimin për më shumë informacion mbi mënyrën si applikacioni punon, dhe përdorimin e rasteve të suportuara.", "Be aware that encryption always increases the file size." : "Kini parasysh që fshehtëzimi e rrit gjithnjë madhësinë e kartelës.", "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Është gjithmonë ide e mirë të krijohen kopjeruajtje të rregullta të të dhënave tuaja, në rast fshehtëzimi sigurohuni që bëni kopjeruajtje të kyçeve të fshehtëzimit, tok me të dhënat tuaja.", "This is the final warning: Do you really want to enable encryption?" : "Ky është sinjalizimi përfundimtar: Doni vërtet të aktivizohet fshehtëzimi?", @@ -143,6 +181,7 @@ OC.L10N.register( "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Rregullimi Vetëm-Lexim u aktivizua. Kjo parandalon rregullimin e disa parametrave përmes ndërfaqes web. Më tej, për çdo përditësim kartela lyp të kalohet dorazi si e shkrueshme.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Duket se PHP-ja është rregulluar që të heqë blloqe të brendshme dokumentimi. Kjo do t’i bëjë të papërdrshme disa aplikacione bazë.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Kjo ka gjasa të jetë shkaktuar nga një fshehtinë/përshpejtues i tillë si Zend OPcache ose eAccelerator.", + "Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Baza juaj e të dhënave nuk ekzekutohet me nivelin \"READ COMMITED\" e izolimit për ndërveprimet. Kjo mund të shkaktojë probleme, kur kryhen paralelisht disa veprime njëherësh.", "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "Ka të instaluar %1$s nën versionin %2$s, për arsye qëndrueshmërie dhe performance këshillojmë të përditësohet me një version %1$s më të ri.", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Moduli PHP 'fileinfo' mungon. Ju këshillojmë me forcë ta aktivizoni këtë modul, për të patur përfundimet më të mira në zbulim llojesh MIME.", "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Kyçja e kartelave gjatë transaksioneve është e çaktivizuar, kjo mund të sjellë probleme me gjendje race conditions. Që të shmangni këto probleme, aktivizoni 'filelocking.enabled' te config.php. Për më tepër të dhëna, shihni dokumentimin ↗.", @@ -151,6 +190,7 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Këshillojmë me forcë instalimin në sistemin tuaj të paketave të domosdoshme për mbulim të një prej vendoreve vijuese: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Nëse instalimi juaj nuk është bërë në rrënjë të përkatësisë dhe përdor cron sistemi, mund të ketë probleme me prodhimin e URL-së. Që të shmangen këto probleme, ju lutemi, jepini mundësisë \"overwrite.cli.url\" te kartela juaj config.php vlerën e shtegut webroot të instalimit tuaj (E këshillueshme: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "S’qe e mundur të përmbushej akti cron përmes CLI-së. U shfaqën gabimet teknike vijuese:", + "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Ju lutem riverifikoni udhëzuesin e instalimit ,, dhe kontrolloni për ndonjë gabim apo njoftim paraprak në log.", "All checks passed." : "I kaloi krejt kontrollet.", "Cron" : "Cron", "Last cron job execution: %s." : "Përmbushja e fundit e aktit cron: %s.", @@ -159,6 +199,8 @@ OC.L10N.register( "Execute one task with each page loaded" : "Kryeni vetëm një veprim me secilën prej faqeve të ngarkuara", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php është regjistruar te një shërbim webcron që ta aktivizojë cron.php-në çdo 15 minuta përmes http-je.", "Use system's cron service to call the cron.php file every 15 minutes." : "Përdorni shërbimin cron të sistemit që ta aktivizojë cron.php-në çdo 15 minuta.", + "The cron.php needs to be executed by the system user \"%s\"." : "con.php duhet të ekzekutohet bga përdoruesi i sistemit \"%s\".", + "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Për të bërë këtë ekzekutim ju duhet shtesa PHP posix. Shikoni {linkstart} dokumentacionin e PHP {linkend} pë më shumë detaje.", "Version" : "Version", "Sharing" : "Ndarje me të tjerët", "Allow apps to use the Share API" : "Lejoni aplikacionet të përdorin API Share", @@ -175,7 +217,11 @@ OC.L10N.register( "Exclude groups from sharing" : "Përjashtoni grupe nga ndarjet", "These groups will still be able to receive shares, but not to initiate them." : "Këto grupe prapë do të jenë në gjendje të marrin ndarje nga të tjerët, por jo të fillojnë të tilla.", "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Lejo vetëplotësim emra përdoruesish te dialogu i ndarjeve me të tjerët. Nëse kjo është e çaktivizuar, do të duhet të jepen emra përdoruesish.", + "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Shfaqni tekstin e mospranimit në linkun publik të faqes së ngarkuar. (Shfaqet vetëm kur lista e skedarit është e fshehur.)", + "This text will be shown on the public link upload page when the file list is hidden." : "Ky tekst do të shfaqet në linkun publik të faqes së ngarkuar kur lista e skedarit të jetë e fshehur.", "Tips & tricks" : "Ndihmëza & rrengje", + "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite po përdoret si bazë të dhënash e programit klient. Për instalime më të ngarkuara, këshillojmë të kalohet në një program tjetër klient baze të dhënash.", + "This is particularly recommended when using the desktop client for file synchronisation." : "Kjo është veçanërisht e rekomanduar gjatë përdorimit të desktopit të klientit për sinkronizimin skedari. ", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Për të kaluar te një tjetër bazë të dhënash përdorni mjetin rresht urdhrash: 'occ db:convert-type', ose shihni dokumentimin ↗.", "How to do backups" : "Si të bëhen kopjeruajtje", "Advanced monitoring" : "Mbikëqyrje e mëtejshme", @@ -194,19 +240,24 @@ OC.L10N.register( "Show description …" : "Shfaq përshkrim …", "Hide description …" : "Fshihe përshkrimin …", "This app has an update available." : "Ka gati një përditësim për këtë aplikacion.", + "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Ky aplikacion nuk ka të caktuar një minimum versioni të Nextcloud. Ky do të jetë një gabim në të ardhmen.", + "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Ky aplikacion nuk ka të caktuar një maksimum versioni të Nextcloud. Ky do të jetë një gabim në të ardhmen.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Ky aplikacion s’mund të instalohet, ngaqë për të nuk plotësohen varësitë vijuese:", "Enable only for specific groups" : "Aktivizoje vetëm për grupe të veçantë", - "Uninstall App" : "Çinstaloje Aplikacionin", + "Uninstall app" : "Çinstaloje Aplikacionin", "SSL Root Certificates" : "Dëshmi SSL Rrënjë", "Common Name" : "Emër i Rëndomtë", "Valid until" : "E vlefshme deri më", "Issued By" : "Lëshuar Nga", "Valid until %s" : "E vlefshme deri më %s", "Import root certificate" : "Importoni dëshmi rrënjë", + "Hey there,

    just letting you know that you now have a %s account.

    Your username: %s
    Access it: %s

    " : "Njatjeta,

    thjesht po ju bëjmë të ditur që tani keni një llogari %s.

    Emri juaj i përdoruesit: %s
    Hyni në të te: %s

    ", "Cheers!" : "Gëzuar!", + "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Njatjeta,\n\nthjesht po ju bëjmë të ditur që tani keni një llogari %s.\n\nEmri juaj i përdoruesit: %s\nHyni në të te: %s\n\n", "Administrator documentation" : "Dokumentim për përgjegjës", "Online documentation" : "Dokumentim në Internet", "Forum" : "Forum", + "Getting help" : "Kërkoni ndihmë", "Commercial support" : "Asistencë komerciale", "You are using %s of %s" : "Po përdorni %s nga %s", "Profile picture" : "Foto profili", @@ -223,6 +274,14 @@ OC.L10N.register( "Your email address" : "Adresa juaj email", "No email address set" : "S’është caktuar adresë email", "For password recovery and notifications" : "Për rimarrje fjalëkalimesh dhe njoftime ", + "Phone number" : "Numri i telefonit", + "Your phone number" : "Numri juaj i telefonit", + "Address" : "Adresa", + "Your postal address" : "Adresa juaj postale", + "Website" : "Website", + "Your website" : "Website-i juaj", + "Twitter" : "Twitter", + "Your Twitter handle" : "Emri i përdoruesit tuaj në Twitter", "You are member of the following groups:" : "Jeni anëtar i grupeve vijuese:", "Password" : "Fjalëkalim", "Current password" : "Fjalëkalimi i tanishëm", @@ -234,12 +293,25 @@ OC.L10N.register( "Desktop client" : "Klient desktopi", "Android app" : "Aplikacion për Android", "iOS app" : "Aplikacion për iOS", + "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Nëse doni të mbështesni projektin {contributeopen} bashkohu me grupin e zhvillimit {linkclose} ose {contributeopen} përhap fjalën {linkclose}!", "Show First Run Wizard again" : "Shfaqe sërish Ndihmësin e Herës së Parë", + "Web, desktop and mobile clients currently logged in to your account." : "Klientë në rrjet, desktop dhe celular kanë hyrë aktualisht në llogarinë tuaj.", + "Device" : "Pajisje", + "Last activity" : "Aktiviteti i fundit", + "Passcodes that give an app or device permissions to access your account." : "Fjalëkalimet të cilat i japin një aplikacioni ose pajisje lejen për të aksesuar llogarinë tuaj.", "Name" : "Emër", "App name" : "Emër aplikacioni", "Create new app password" : "Krijoni fjalëkalim aplikacioni të ri", + "Use the credentials below to configure your app or device." : "Përdorni kredencialet e mëposhtme për të konfiguruar aplikacionin apo pajisjen tuaj.", + "For security reasons this password will only be shown once." : "Për arsye siguri ky fjalëkalim do të shofaqet vetëm një herv.", "Username" : "Emër përdoruesi", "Done" : "U bë", + "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Zhvilluar nga {communityopen}komuniteti Nextcloud {linkclose}, {githubopen}kodi i hapur{linkclose} iështë licensuar sipar {licenseopen}AGPL{linkclose}.", + "Follow us on Google Plus!" : "Na ndiqni në Google Plus!", + "Like our facebook page!" : "Pëlqeni faqen tonë në facebook!", + "Subscribe to our twitter channel!" : "Abonohuni në kanalin tonë në twitter!", + "Subscribe to our news feed!" : "Abonohuni në kanalin tonë në twitter!", + "Subscribe to our newsletter!" : "Abonohuni në buletinin tonë informativ!", "Show storage location" : "Shfaq vendndodhje depozite", "Show last log in" : "Shfaq hyrjen e fundit", "Show user backend" : "Shfaq programin klient të përdoruesit", @@ -249,18 +321,30 @@ OC.L10N.register( "Create" : "Krijoje", "Admin Recovery Password" : "Fjalëkalim Rikthimesh Nga Përgjegjësi", "Enter the recovery password in order to recover the users files during password change" : "Jepni fjalëkalim rimarrje që të mund të rimerrni kartela përdoruesi gjatë ndryshimit të fjalëkalimit", + "Group name" : "Emri i grupit", "Everyone" : "Kushdo", "Admins" : "Administratorë", + "Default quota" : "Kuota Parazgjedhje", "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Ju lutemi, jepni kuotë depozitimi (psh: \"512 MB\" ose \"12 GB\")", "Other" : "Tjetër", + "Group admin for" : "Administratori i grupit për", "Quota" : "Kuota", + "Storage location" : "Vendndodhje Depozite", + "User backend" : "Program klient i përdoruesit", + "Last login" : "Hyrja e fundit", "change full name" : "ndryshoni emrin e plotë", "set new password" : "caktoni fjalëkalim të ri", "change email address" : "ndryshoni adresën email", "Default" : "Parazgjedhje", "log-level out of allowed range" : "nivel regjistrimi jashtë intervalit të lejuar", "Language changed" : "Gjuha u ndryshua", + "Admins can't remove themself from the admin group" : "Administratorët s’mund të heqin veten prej grupit admin", + "Unable to add user to group %s" : "S’arrin të shtojë përdorues te grupi %s", + "Unable to remove user from group %s" : "S’arrin të heqë përdorues nga grupi %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jeni vërtet i sigurt se doni të shtoni \"{domain}\" si përkatësi të besuar?", + "Please wait...." : "Ju lutemi, prisni…", + "iPhone" : "iPhone", + "add group" : "shtoni grup", "Everything (fatal issues, errors, warnings, info, debug)" : "Gjithçka (probleme fatale, gabime, sinjalizime, të dhëna, diagnostikim)", "Info, warnings, errors and fatal issues" : "Të dhëna, sinjalizime, gabime dhe probleme fatale", "Warnings, errors and fatal issues" : "Sinjalizime, gabime dhe probleme fatale", @@ -278,14 +362,18 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Përdorimi i SQLite-it nuk këshillohet veçanërisht kur përdoret klienti desktop për njëkohësim kartelash.", "Experimental applications ahead" : "Keni përpara aplikacione eksperimentale", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Aplikacionet eksperimentale nuk kontrollohen për probleme sigurie, mund të jenë të rinj ose të njohur si të paqëndrueshëm, dhe nën zhvillim intensiv. Instalimi i tyre mund të shkaktojë humbje të dhënash ose cenim të sigurisë.", + "Uninstall App" : "Çinstaloje Aplikacionin", "Enable experimental apps" : "Aktivizo aplikacione eksperimentale", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Njatjeta,

    thjesht po ju bëjmë të ditur që tani keni një llogar %s.

    Emri juaj i përdoruesit: %s
    Hyni në të te: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Njatjeta,\n\nthjesht po ju bëjmë të ditur që tani keni një llogari %s.\n\nEmri juaj i përdoruesit: %s\nHyni në të te: %s\n\n", + "If you want to support the project\n\t\tjoin development\n\t\t\n\t\tspread the word!" : "Nëse doni të mbështesni projektin\n⇥⇥bashkohu skuadrës së zhvillimit\n⇥⇥\n⇥⇥shpërndaj fjalën!", + "Add Group" : "Shtoni Grup", "Group" : "Grup", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Depozitim i Jashtëm", - "Updates" : "Përditësime", - "An error occurred: {message}" : "Ndodhi një gabim: {message}" + "Default Quota" : "Kuota Parazgjedhje", + "Full Name" : "Emri i Plotë", + "Group Admin for" : "Admini Grupi për", + "Storage Location" : "Vendndodhje Depozite", + "User Backend" : "Program klient i përdoruesit", + "Last Login" : "Hyrja e fundit" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/sq.json b/settings/l10n/sq.json index 8e46003c070f7afb1bfa8838c9474e7050bf9082..62d72bb52dcd74e7436509060ac6bac67483513d 100644 --- a/settings/l10n/sq.json +++ b/settings/l10n/sq.json @@ -24,23 +24,25 @@ "Invalid request" : "Kërkesë e pavlefshme", "Invalid mail address" : "Adresë email e pavlefshme", "A user with that name already exists." : "Ka tashmë një përdorues me këtë emër.", - "Unable to create user." : "S’arrin të krijojë përdoruesi.", + "Unable to create user." : "S’u arrit krijimi i përdoruesit.", "Your %s account was created" : "Llogaria juaj %s u krijua", "Unable to delete user." : "S’arrin të fshijë përdorues.", + "Settings saved" : "Konfigurimet u ruajtën", "Unable to change full name" : "S’arrin të ndryshojë emrin e plotë", + "Unable to change email address" : "Nuk mund të ndryshohet adresa e email-it", "Your full name has been changed." : "Emri juaj i plotë u ndryshua.", "Forbidden" : "E ndaluar", "Invalid user" : "Përdorues i pavlefshëm", "Unable to change mail address" : "S’arrin të ndryshojë adresë email", "Email saved" : "Email-i u ruajt", + "Password confirmation is required" : "Kërkohet konfirmimi i fjalëkalimit", "Couldn't remove app." : "S’hoqi dot aplikacionin.", - "Admins can't remove themself from the admin group" : "Administratorët s’mund të heqin veten prej grupit admin", - "Unable to add user to group %s" : "S’arrin të shtojë përdorues te grupi %s", - "Unable to remove user from group %s" : "S’arrin të heqë përdorues nga grupi %s", "Couldn't update app." : "S’përditësoi dot aplikacionin.", + "Are you really sure you want add {domain} as trusted domain?" : "Jeni i sigurt se doni ta shtoni {domain} si një domain të besuar?", "Add trusted domain" : "Shtoni përkatësi të besuar", "Migration in progress. Please wait until the migration is finished" : "Migrimi në rrugë e sipër. Ju lutemi, pritni, teksa migrimi përfundon", "Migration started …" : "Migrimi filloi …", + "Not saved" : "Nuk u ruajt", "Sending..." : "Po dërgohet…", "Official" : "Zyrtare", "All" : "Krejt", @@ -48,9 +50,10 @@ "_You have %n app update pending_::_You have %n app updates pending_" : ["Keni %n përditësim aplikacioni në pritje","Keni %n përditësime aplikacionesh në pritje"], "No apps found for your version" : "S’u gjetën aplikacione për versionin tuaj", "The app will be downloaded from the app store" : "Aplikacioni do të shkarkohet nga shitorja e aplikacioneve", + "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Aplikacionet zyrtare zhvillohen nga komuniteti dhe brenta tij. Ato ofrojnë funksionalitet qëndror dhe janë gati për përdorim.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Aplikacionet e miratuara ndërtohen nga zhvillues të besuar dhe kanë kaluar një kontroll të përciptë sigurie. Mirëmbahen aktivisht në një depo të hapur kodi dhe mirëmbajtësit e tyre i konsiderojnë të qëndrueshme për përdorime nga të rastit deri në ato normale.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ky aplikacion s’është kontrolluar për probleme sigurie dhe është i ri ose i njohur si i paqëndrueshëm. Instalojeni duke e mbajtur vetë përgjegjësinë.", - "Please wait...." : "Ju lutemi, prisni…", + "Enabling app …" : "Duke aktivizuar aplikacionin ...", "Error while disabling app" : "Gabim në çaktivizimin e aplikacionit", "Disable" : "Çaktivizoje", "Enable" : "Aktivizoje", @@ -69,13 +72,40 @@ "Approved" : "Të miratuara", "Experimental" : "Eksperimentale", "No apps found for {query}" : "S’u gjetën aplikacione për {query}", + "Allow filesystem access" : "Lejo aksesin e sistemit të skedarëve", "Disconnect" : "Shkëputu", + "Revoke" : "Anulo", + "Internet Explorer" : "Internet Explorer", + "Edge" : "Edge", + "Firefox" : "Firefox", + "Google Chrome" : "Google Chrome", + "Safari" : "Safari", + "Google Chrome for Android" : "Google Chrome për Android", + "iPhone iOS" : "iPhone iOS", + "iPad iOS" : "iPad iOS", + "iOS Client" : "Klient iOS", + "Android Client" : "Klient Android", + "Sync client - {os}" : "Sinkronizo klientin - {os}", + "This session" : "Ky sesion", + "Copy" : "Kopjo", + "Copied!" : "U kopjua!", + "Not supported!" : "Nuk suportohet!", + "Press ⌘-C to copy." : "Shtyp ⌘-C për të kopjuar.", + "Press Ctrl-C to copy." : "Shtyp Ctrl-C për të kopjuar.", "Error while loading browser sessions and device tokens" : "Gabim gjatë ngarkimit të sesioneve të shfletuesit dhe token-ësh pajisjesh", "Error while creating device token" : "Gabim gjatë krijimit të token-ëve të pajisjejeve", "Error while deleting the token" : "Gabim gjatë fshirjes së token-it", "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Ndodhi një gabim. Ju lutemi, ngarkoni një dëshmi PEM të koduar me ASCII.", "Valid until {date}" : "E vlefshme deri më {date}", "Delete" : "Fshije", + "Local" : "Lokale", + "Private" : "Private", + "Only visible to local users" : "E dukshme vetëm për përdoruesit lokal", + "Only visible to you" : "E dukshme vetëm për ju", + "Contacts" : "Kontaktet", + "Visible to local users and to trusted servers" : "E dukshme për përdoruesit lokal dhe serverat e besuar", + "Public" : "Publiku", + "Will be synced to a global and public address book" : "Do të sinkronizohet te një libër adresash publik dhe global", "Select a profile picture" : "Përzgjidhni një foto profili", "Very weak password" : "Fjalëkalim shumë i dobët", "Weak password" : "Fjalëkalim i dobët", @@ -90,7 +120,12 @@ "undo" : "zhbëje", "never" : "kurrë", "deleted {userName}" : "u fshi {userName}", + "Add group" : "Shto grup", + "Invalid quota value \"{val}\"" : "Vlera e kuotës \"{val}\" e pavlefshme", + "no group" : "asnjë grup", + "Password successfully changed" : "Fjalëkalimi u ndryshua me sukses", "Changing the password will result in data loss, because data recovery is not available for this user" : "Ndryshimi i fjalëkalimit do të sjellë humbje të dhënash, ngaqë rikthimi i të dhënave s’është i përdorshëm për këtë përdorues", + "Could not change the users email" : "Nuk mund të ndryshohej email-i i përdoruesëve", "A valid username must be provided" : "Duhet dhënë një emër të vlefshëm përdoruesi", "Error creating user: {message}" : "Gabim gjatë krijimit të përdoruesit: {message}", "A valid password must be provided" : "Duhet dhënë një fjalëkalim i vlefshëm", @@ -105,6 +140,8 @@ "Login" : "Hyrje", "Plain" : "E thjeshtë", "NT LAN Manager" : "Përgjegjës Rrjeti NT", + "SSL/TLS" : "SSL/TLS", + "STARTTLS" : "STARTTLS", "Email server" : "Shërbyes email-esh", "Open documentation" : "Hapni dokumentimin", "This is used for sending out notifications." : "Ky përdoret për të dërguar njoftime.", @@ -126,6 +163,7 @@ "Enable server-side encryption" : "Aktivizo fshehtëzim më anë të shërbyesit", "Please read carefully before activating server-side encryption: " : "Ju lutemi, lexoni me kujdes përpara aktivizimit të fshehtëzimeve më anë shërbyesi: ", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Pasi të jetë aktivizuar fshehtëzimi, krejt kartelat e ngarkuara te shërbyesi nga kjo pikë e tutje do të fshehtëzohen pasi të jenë depozituar në shërbyes. Çaktivizimi i fshehtëzimit në një datë të mëvonshme do të jetë i mundur vetëm nëse moduli aktiv i fshehtëzimeve e mbulon këtë funksion, dhe nëse plotësohen krejt parakushtet (p.sh. caktimi i një kyçi rimarrjesh).", + "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "Vetëm shifrimi nuk garaton sigurinë e sistemit. Ju lutem shikoni dokumentimin për më shumë informacion mbi mënyrën si applikacioni punon, dhe përdorimin e rasteve të suportuara.", "Be aware that encryption always increases the file size." : "Kini parasysh që fshehtëzimi e rrit gjithnjë madhësinë e kartelës.", "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Është gjithmonë ide e mirë të krijohen kopjeruajtje të rregullta të të dhënave tuaja, në rast fshehtëzimi sigurohuni që bëni kopjeruajtje të kyçeve të fshehtëzimit, tok me të dhënat tuaja.", "This is the final warning: Do you really want to enable encryption?" : "Ky është sinjalizimi përfundimtar: Doni vërtet të aktivizohet fshehtëzimi?", @@ -141,6 +179,7 @@ "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Rregullimi Vetëm-Lexim u aktivizua. Kjo parandalon rregullimin e disa parametrave përmes ndërfaqes web. Më tej, për çdo përditësim kartela lyp të kalohet dorazi si e shkrueshme.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Duket se PHP-ja është rregulluar që të heqë blloqe të brendshme dokumentimi. Kjo do t’i bëjë të papërdrshme disa aplikacione bazë.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Kjo ka gjasa të jetë shkaktuar nga një fshehtinë/përshpejtues i tillë si Zend OPcache ose eAccelerator.", + "Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Baza juaj e të dhënave nuk ekzekutohet me nivelin \"READ COMMITED\" e izolimit për ndërveprimet. Kjo mund të shkaktojë probleme, kur kryhen paralelisht disa veprime njëherësh.", "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "Ka të instaluar %1$s nën versionin %2$s, për arsye qëndrueshmërie dhe performance këshillojmë të përditësohet me një version %1$s më të ri.", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Moduli PHP 'fileinfo' mungon. Ju këshillojmë me forcë ta aktivizoni këtë modul, për të patur përfundimet më të mira në zbulim llojesh MIME.", "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Kyçja e kartelave gjatë transaksioneve është e çaktivizuar, kjo mund të sjellë probleme me gjendje race conditions. Që të shmangni këto probleme, aktivizoni 'filelocking.enabled' te config.php. Për më tepër të dhëna, shihni dokumentimin ↗.", @@ -149,6 +188,7 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Këshillojmë me forcë instalimin në sistemin tuaj të paketave të domosdoshme për mbulim të një prej vendoreve vijuese: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Nëse instalimi juaj nuk është bërë në rrënjë të përkatësisë dhe përdor cron sistemi, mund të ketë probleme me prodhimin e URL-së. Që të shmangen këto probleme, ju lutemi, jepini mundësisë \"overwrite.cli.url\" te kartela juaj config.php vlerën e shtegut webroot të instalimit tuaj (E këshillueshme: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "S’qe e mundur të përmbushej akti cron përmes CLI-së. U shfaqën gabimet teknike vijuese:", + "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Ju lutem riverifikoni udhëzuesin e instalimit ,, dhe kontrolloni për ndonjë gabim apo njoftim paraprak në log.", "All checks passed." : "I kaloi krejt kontrollet.", "Cron" : "Cron", "Last cron job execution: %s." : "Përmbushja e fundit e aktit cron: %s.", @@ -157,6 +197,8 @@ "Execute one task with each page loaded" : "Kryeni vetëm një veprim me secilën prej faqeve të ngarkuara", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php është regjistruar te një shërbim webcron që ta aktivizojë cron.php-në çdo 15 minuta përmes http-je.", "Use system's cron service to call the cron.php file every 15 minutes." : "Përdorni shërbimin cron të sistemit që ta aktivizojë cron.php-në çdo 15 minuta.", + "The cron.php needs to be executed by the system user \"%s\"." : "con.php duhet të ekzekutohet bga përdoruesi i sistemit \"%s\".", + "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Për të bërë këtë ekzekutim ju duhet shtesa PHP posix. Shikoni {linkstart} dokumentacionin e PHP {linkend} pë më shumë detaje.", "Version" : "Version", "Sharing" : "Ndarje me të tjerët", "Allow apps to use the Share API" : "Lejoni aplikacionet të përdorin API Share", @@ -173,7 +215,11 @@ "Exclude groups from sharing" : "Përjashtoni grupe nga ndarjet", "These groups will still be able to receive shares, but not to initiate them." : "Këto grupe prapë do të jenë në gjendje të marrin ndarje nga të tjerët, por jo të fillojnë të tilla.", "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Lejo vetëplotësim emra përdoruesish te dialogu i ndarjeve me të tjerët. Nëse kjo është e çaktivizuar, do të duhet të jepen emra përdoruesish.", + "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Shfaqni tekstin e mospranimit në linkun publik të faqes së ngarkuar. (Shfaqet vetëm kur lista e skedarit është e fshehur.)", + "This text will be shown on the public link upload page when the file list is hidden." : "Ky tekst do të shfaqet në linkun publik të faqes së ngarkuar kur lista e skedarit të jetë e fshehur.", "Tips & tricks" : "Ndihmëza & rrengje", + "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite po përdoret si bazë të dhënash e programit klient. Për instalime më të ngarkuara, këshillojmë të kalohet në një program tjetër klient baze të dhënash.", + "This is particularly recommended when using the desktop client for file synchronisation." : "Kjo është veçanërisht e rekomanduar gjatë përdorimit të desktopit të klientit për sinkronizimin skedari. ", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Për të kaluar te një tjetër bazë të dhënash përdorni mjetin rresht urdhrash: 'occ db:convert-type', ose shihni dokumentimin ↗.", "How to do backups" : "Si të bëhen kopjeruajtje", "Advanced monitoring" : "Mbikëqyrje e mëtejshme", @@ -192,19 +238,24 @@ "Show description …" : "Shfaq përshkrim …", "Hide description …" : "Fshihe përshkrimin …", "This app has an update available." : "Ka gati një përditësim për këtë aplikacion.", + "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Ky aplikacion nuk ka të caktuar një minimum versioni të Nextcloud. Ky do të jetë një gabim në të ardhmen.", + "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Ky aplikacion nuk ka të caktuar një maksimum versioni të Nextcloud. Ky do të jetë një gabim në të ardhmen.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Ky aplikacion s’mund të instalohet, ngaqë për të nuk plotësohen varësitë vijuese:", "Enable only for specific groups" : "Aktivizoje vetëm për grupe të veçantë", - "Uninstall App" : "Çinstaloje Aplikacionin", + "Uninstall app" : "Çinstaloje Aplikacionin", "SSL Root Certificates" : "Dëshmi SSL Rrënjë", "Common Name" : "Emër i Rëndomtë", "Valid until" : "E vlefshme deri më", "Issued By" : "Lëshuar Nga", "Valid until %s" : "E vlefshme deri më %s", "Import root certificate" : "Importoni dëshmi rrënjë", + "Hey there,

    just letting you know that you now have a %s account.

    Your username: %s
    Access it: %s

    " : "Njatjeta,

    thjesht po ju bëjmë të ditur që tani keni një llogari %s.

    Emri juaj i përdoruesit: %s
    Hyni në të te: %s

    ", "Cheers!" : "Gëzuar!", + "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Njatjeta,\n\nthjesht po ju bëjmë të ditur që tani keni një llogari %s.\n\nEmri juaj i përdoruesit: %s\nHyni në të te: %s\n\n", "Administrator documentation" : "Dokumentim për përgjegjës", "Online documentation" : "Dokumentim në Internet", "Forum" : "Forum", + "Getting help" : "Kërkoni ndihmë", "Commercial support" : "Asistencë komerciale", "You are using %s of %s" : "Po përdorni %s nga %s", "Profile picture" : "Foto profili", @@ -221,6 +272,14 @@ "Your email address" : "Adresa juaj email", "No email address set" : "S’është caktuar adresë email", "For password recovery and notifications" : "Për rimarrje fjalëkalimesh dhe njoftime ", + "Phone number" : "Numri i telefonit", + "Your phone number" : "Numri juaj i telefonit", + "Address" : "Adresa", + "Your postal address" : "Adresa juaj postale", + "Website" : "Website", + "Your website" : "Website-i juaj", + "Twitter" : "Twitter", + "Your Twitter handle" : "Emri i përdoruesit tuaj në Twitter", "You are member of the following groups:" : "Jeni anëtar i grupeve vijuese:", "Password" : "Fjalëkalim", "Current password" : "Fjalëkalimi i tanishëm", @@ -232,12 +291,25 @@ "Desktop client" : "Klient desktopi", "Android app" : "Aplikacion për Android", "iOS app" : "Aplikacion për iOS", + "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Nëse doni të mbështesni projektin {contributeopen} bashkohu me grupin e zhvillimit {linkclose} ose {contributeopen} përhap fjalën {linkclose}!", "Show First Run Wizard again" : "Shfaqe sërish Ndihmësin e Herës së Parë", + "Web, desktop and mobile clients currently logged in to your account." : "Klientë në rrjet, desktop dhe celular kanë hyrë aktualisht në llogarinë tuaj.", + "Device" : "Pajisje", + "Last activity" : "Aktiviteti i fundit", + "Passcodes that give an app or device permissions to access your account." : "Fjalëkalimet të cilat i japin një aplikacioni ose pajisje lejen për të aksesuar llogarinë tuaj.", "Name" : "Emër", "App name" : "Emër aplikacioni", "Create new app password" : "Krijoni fjalëkalim aplikacioni të ri", + "Use the credentials below to configure your app or device." : "Përdorni kredencialet e mëposhtme për të konfiguruar aplikacionin apo pajisjen tuaj.", + "For security reasons this password will only be shown once." : "Për arsye siguri ky fjalëkalim do të shofaqet vetëm një herv.", "Username" : "Emër përdoruesi", "Done" : "U bë", + "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Zhvilluar nga {communityopen}komuniteti Nextcloud {linkclose}, {githubopen}kodi i hapur{linkclose} iështë licensuar sipar {licenseopen}AGPL{linkclose}.", + "Follow us on Google Plus!" : "Na ndiqni në Google Plus!", + "Like our facebook page!" : "Pëlqeni faqen tonë në facebook!", + "Subscribe to our twitter channel!" : "Abonohuni në kanalin tonë në twitter!", + "Subscribe to our news feed!" : "Abonohuni në kanalin tonë në twitter!", + "Subscribe to our newsletter!" : "Abonohuni në buletinin tonë informativ!", "Show storage location" : "Shfaq vendndodhje depozite", "Show last log in" : "Shfaq hyrjen e fundit", "Show user backend" : "Shfaq programin klient të përdoruesit", @@ -247,18 +319,30 @@ "Create" : "Krijoje", "Admin Recovery Password" : "Fjalëkalim Rikthimesh Nga Përgjegjësi", "Enter the recovery password in order to recover the users files during password change" : "Jepni fjalëkalim rimarrje që të mund të rimerrni kartela përdoruesi gjatë ndryshimit të fjalëkalimit", + "Group name" : "Emri i grupit", "Everyone" : "Kushdo", "Admins" : "Administratorë", + "Default quota" : "Kuota Parazgjedhje", "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Ju lutemi, jepni kuotë depozitimi (psh: \"512 MB\" ose \"12 GB\")", "Other" : "Tjetër", + "Group admin for" : "Administratori i grupit për", "Quota" : "Kuota", + "Storage location" : "Vendndodhje Depozite", + "User backend" : "Program klient i përdoruesit", + "Last login" : "Hyrja e fundit", "change full name" : "ndryshoni emrin e plotë", "set new password" : "caktoni fjalëkalim të ri", "change email address" : "ndryshoni adresën email", "Default" : "Parazgjedhje", "log-level out of allowed range" : "nivel regjistrimi jashtë intervalit të lejuar", "Language changed" : "Gjuha u ndryshua", + "Admins can't remove themself from the admin group" : "Administratorët s’mund të heqin veten prej grupit admin", + "Unable to add user to group %s" : "S’arrin të shtojë përdorues te grupi %s", + "Unable to remove user from group %s" : "S’arrin të heqë përdorues nga grupi %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jeni vërtet i sigurt se doni të shtoni \"{domain}\" si përkatësi të besuar?", + "Please wait...." : "Ju lutemi, prisni…", + "iPhone" : "iPhone", + "add group" : "shtoni grup", "Everything (fatal issues, errors, warnings, info, debug)" : "Gjithçka (probleme fatale, gabime, sinjalizime, të dhëna, diagnostikim)", "Info, warnings, errors and fatal issues" : "Të dhëna, sinjalizime, gabime dhe probleme fatale", "Warnings, errors and fatal issues" : "Sinjalizime, gabime dhe probleme fatale", @@ -276,14 +360,18 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Përdorimi i SQLite-it nuk këshillohet veçanërisht kur përdoret klienti desktop për njëkohësim kartelash.", "Experimental applications ahead" : "Keni përpara aplikacione eksperimentale", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Aplikacionet eksperimentale nuk kontrollohen për probleme sigurie, mund të jenë të rinj ose të njohur si të paqëndrueshëm, dhe nën zhvillim intensiv. Instalimi i tyre mund të shkaktojë humbje të dhënash ose cenim të sigurisë.", + "Uninstall App" : "Çinstaloje Aplikacionin", "Enable experimental apps" : "Aktivizo aplikacione eksperimentale", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Njatjeta,

    thjesht po ju bëjmë të ditur që tani keni një llogar %s.

    Emri juaj i përdoruesit: %s
    Hyni në të te: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Njatjeta,\n\nthjesht po ju bëjmë të ditur që tani keni një llogari %s.\n\nEmri juaj i përdoruesit: %s\nHyni në të te: %s\n\n", + "If you want to support the project\n\t\tjoin development\n\t\t\n\t\tspread the word!" : "Nëse doni të mbështesni projektin\n⇥⇥bashkohu skuadrës së zhvillimit\n⇥⇥\n⇥⇥shpërndaj fjalën!", + "Add Group" : "Shtoni Grup", "Group" : "Grup", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Depozitim i Jashtëm", - "Updates" : "Përditësime", - "An error occurred: {message}" : "Ndodhi një gabim: {message}" + "Default Quota" : "Kuota Parazgjedhje", + "Full Name" : "Emri i Plotë", + "Group Admin for" : "Admini Grupi për", + "Storage Location" : "Vendndodhje Depozite", + "User Backend" : "Program klient i përdoruesit", + "Last Login" : "Hyrja e fundit" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/sr.js b/settings/l10n/sr.js index 3aa65db95196ff701417ab8175d61294c1b0985b..2ee6f9f0ce63fb52e9e72fb1767b7267ad937281 100644 --- a/settings/l10n/sr.js +++ b/settings/l10n/sr.js @@ -34,9 +34,6 @@ OC.L10N.register( "Unable to change mail address" : "Не могу да изменим е-адресу", "Email saved" : "Е-порука сачувана", "Couldn't remove app." : "Не могу да уклоним апликацију.", - "Admins can't remove themself from the admin group" : "Администратор не може себе да уклони из admin групе", - "Unable to add user to group %s" : "Не могу да додам корисника у групу %s", - "Unable to remove user from group %s" : "Не могу да уклоним корисника из групе %s", "Couldn't update app." : "Не могу да ажурирам апликацију.", "Add trusted domain" : "Додај поуздан домен", "Migration in progress. Please wait until the migration is finished" : "Пресељење је у току. Сачекајте док се не заврши", @@ -48,7 +45,6 @@ OC.L10N.register( "No apps found for your version" : "Нема апликација за вашу верзију", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Одобрене апликације су развили проверени програмери и апликације су прошле основне безбедносне провере. Оне се активно одржавају у репозиторијуму за апликације отвореног кода и њихови одржаватељи сматрају да су стабилне за уобичајену употребу.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ова апликација није проверена по питању безбедности и нова је или зна да буде нестабилна. Инсталирате је на сопствену одговорност.", - "Please wait...." : "Сачекајте…", "Error while disabling app" : "Грешка при искључивању апликације", "Disable" : "Искључи", "Enable" : "Укључи", @@ -161,7 +157,6 @@ OC.L10N.register( "Hide description …" : "Сакриј опис…", "This app cannot be installed because the following dependencies are not fulfilled:" : "Апликација се не може инсталирати јер следеће зависности нису испуњене:", "Enable only for specific groups" : "Укључи само за одређене групе", - "Uninstall App" : "Деинсталирај апликацију", "Common Name" : "Уобичајено име", "Valid until" : "Важи до", "Issued By" : "Издавач", @@ -216,7 +211,11 @@ OC.L10N.register( "Default" : "Подразумевано", "log-level out of allowed range" : "ниво бележења је ван дозвољеног опсега", "Language changed" : "Језик је промењен", + "Admins can't remove themself from the admin group" : "Администратор не може себе да уклони из admin групе", + "Unable to add user to group %s" : "Не могу да додам корисника у групу %s", + "Unable to remove user from group %s" : "Не могу да уклоним корисника из групе %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Да ли заиста желите да додате „{domain}“ као поуздан домен?", + "Please wait...." : "Сачекајте…", "Everything (fatal issues, errors, warnings, info, debug)" : "Све (фаталне проблеме, грешке, упозорења, информације, отклањање грешака)", "Info, warnings, errors and fatal issues" : "Информације, упозорења, грешке и фатални проблеми", "Warnings, errors and fatal issues" : "Упозорења, грешке и фатални проблеми", @@ -233,13 +232,10 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Нарочито ако се користи клијент програм у графичком окружењу, коришћење СКуЛајта није препоручљиво.", "Experimental applications ahead" : "Експериментална апликација", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Експерименталне апликације се непроверене што се тиче безбедности и могу бити нестабилне и недовршене. Инсталирање може довести до губитка података или нарушавања безбедности.", + "Uninstall App" : "Деинсталирај апликацију", "Enable experimental apps" : "Укључи експерименталне апликације", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Поздрав,

    само вас обавештавам да сад имате %s налог.

    Ваше корисничко име: %s
    Приступите му на: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Поздрав.\n\nСамо да знате да сада имате %s налог.\n\nВаше корисничко име: %s\nПриступите му на: %s\n", - "Group" : "Група", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Спољашње складиште", - "Updates" : "Ажурирања" + "Group" : "Група" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/settings/l10n/sr.json b/settings/l10n/sr.json index 20567600fbda99f07d78ec2d6d6b320b9dd4dbda..399d1df09a352881b7e4fde3fba1bd58fa29dd62 100644 --- a/settings/l10n/sr.json +++ b/settings/l10n/sr.json @@ -32,9 +32,6 @@ "Unable to change mail address" : "Не могу да изменим е-адресу", "Email saved" : "Е-порука сачувана", "Couldn't remove app." : "Не могу да уклоним апликацију.", - "Admins can't remove themself from the admin group" : "Администратор не може себе да уклони из admin групе", - "Unable to add user to group %s" : "Не могу да додам корисника у групу %s", - "Unable to remove user from group %s" : "Не могу да уклоним корисника из групе %s", "Couldn't update app." : "Не могу да ажурирам апликацију.", "Add trusted domain" : "Додај поуздан домен", "Migration in progress. Please wait until the migration is finished" : "Пресељење је у току. Сачекајте док се не заврши", @@ -46,7 +43,6 @@ "No apps found for your version" : "Нема апликација за вашу верзију", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Одобрене апликације су развили проверени програмери и апликације су прошле основне безбедносне провере. Оне се активно одржавају у репозиторијуму за апликације отвореног кода и њихови одржаватељи сматрају да су стабилне за уобичајену употребу.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ова апликација није проверена по питању безбедности и нова је или зна да буде нестабилна. Инсталирате је на сопствену одговорност.", - "Please wait...." : "Сачекајте…", "Error while disabling app" : "Грешка при искључивању апликације", "Disable" : "Искључи", "Enable" : "Укључи", @@ -159,7 +155,6 @@ "Hide description …" : "Сакриј опис…", "This app cannot be installed because the following dependencies are not fulfilled:" : "Апликација се не може инсталирати јер следеће зависности нису испуњене:", "Enable only for specific groups" : "Укључи само за одређене групе", - "Uninstall App" : "Деинсталирај апликацију", "Common Name" : "Уобичајено име", "Valid until" : "Важи до", "Issued By" : "Издавач", @@ -214,7 +209,11 @@ "Default" : "Подразумевано", "log-level out of allowed range" : "ниво бележења је ван дозвољеног опсега", "Language changed" : "Језик је промењен", + "Admins can't remove themself from the admin group" : "Администратор не може себе да уклони из admin групе", + "Unable to add user to group %s" : "Не могу да додам корисника у групу %s", + "Unable to remove user from group %s" : "Не могу да уклоним корисника из групе %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Да ли заиста желите да додате „{domain}“ као поуздан домен?", + "Please wait...." : "Сачекајте…", "Everything (fatal issues, errors, warnings, info, debug)" : "Све (фаталне проблеме, грешке, упозорења, информације, отклањање грешака)", "Info, warnings, errors and fatal issues" : "Информације, упозорења, грешке и фатални проблеми", "Warnings, errors and fatal issues" : "Упозорења, грешке и фатални проблеми", @@ -231,13 +230,10 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Нарочито ако се користи клијент програм у графичком окружењу, коришћење СКуЛајта није препоручљиво.", "Experimental applications ahead" : "Експериментална апликација", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Експерименталне апликације се непроверене што се тиче безбедности и могу бити нестабилне и недовршене. Инсталирање може довести до губитка података или нарушавања безбедности.", + "Uninstall App" : "Деинсталирај апликацију", "Enable experimental apps" : "Укључи експерименталне апликације", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Поздрав,

    само вас обавештавам да сад имате %s налог.

    Ваше корисничко име: %s
    Приступите му на: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Поздрав.\n\nСамо да знате да сада имате %s налог.\n\nВаше корисничко име: %s\nПриступите му на: %s\n", - "Group" : "Група", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Спољашње складиште", - "Updates" : "Ажурирања" + "Group" : "Група" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" } \ No newline at end of file diff --git a/settings/l10n/sv.js b/settings/l10n/sv.js index 2d9d3f205fec1009273a8aa3bd05b7e436be4731..964c65427cdba4ddb7fc3959a717c619e50bd1cc 100644 --- a/settings/l10n/sv.js +++ b/settings/l10n/sv.js @@ -10,9 +10,9 @@ OC.L10N.register( "Authentication error" : "Fel vid autentisering", "Please provide an admin recovery password, otherwise all user data will be lost" : "Ange ett återställningslösenord för administratören. Annars kommer all användardata förloras", "Wrong admin recovery password. Please check the password and try again." : "Felaktigt återställningslösenord för administratör. Kolla lösenordet och prova igen.", - "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Backend stödjer ej lösenordsbyte, men användarens ändring av krypteringsnyckel lyckades.", - "installing and updating apps via the app store or Federated Cloud Sharing" : "installering och uppdatering utav applikationer eller Federate Cloud delning.", - "Federated Cloud Sharing" : "Federate Cloud delning", + "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Backend stödjer inte lösenordsbyte, men användarens ändring av krypteringsnyckel lyckades.", + "installing and updating apps via the app store or Federated Cloud Sharing" : "installering och uppdatering utav applikationer eller Federerad Moln-delning.", + "Federated Cloud Sharing" : "Federerad Moln-delning", "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL använder en föråldrad %s version (%s). Var god uppdatera ditt operativsystem annars kan funktioner som %s sluta fungera pålitligt.", "A problem occurred, please check your log files (Error: %s)" : "Ett problem uppstod, var god kontrollera loggfiler (Error: %s)", "Migration Completed" : "Migrering Färdigställd", @@ -29,20 +29,22 @@ OC.L10N.register( "Unable to create user." : "Kan inte skapa användare.", "Your %s account was created" : "Ditt %s konto skapades", "Unable to delete user." : "Kan inte radera användare.", - "Unable to change full name" : "Kunde inte ändra hela namnet", + "Settings saved" : "Inställningar sparade", + "Unable to change full name" : "Kunde inte ändra namn", + "Unable to change email address" : "Kunde inte ändra e-postadress", "Your full name has been changed." : "Hela ditt namn har ändrats", "Forbidden" : "Förbjuden", "Invalid user" : "Ogiltig användare", "Unable to change mail address" : "Kan inte ändra e-postadress", "Email saved" : "E-post sparad", + "Password confirmation is required" : "Lösenordsbekräftelse krävs", "Couldn't remove app." : "Kunde inte ta bort applikationen.", - "Admins can't remove themself from the admin group" : "Administratörer kan inte ta bort sig själva från admingruppen", - "Unable to add user to group %s" : "Kan inte lägga till användare i gruppen %s", - "Unable to remove user from group %s" : "Kan inte radera användare från gruppen %s", "Couldn't update app." : "Kunde inte uppdatera appen.", + "Are you really sure you want add {domain} as trusted domain?" : "Är du verkligen säker att du vill lägga till (domain) som tillförlitlig domän?", "Add trusted domain" : "Lägg till betrodd domän", "Migration in progress. Please wait until the migration is finished" : "Migrering pågår. Var god vänta tills migreringen är färdigställd.", "Migration started …" : "Migrering påbörjad ...", + "Not saved" : "Inte sparad", "Sending..." : "Skickar ...", "Official" : "Officiell", "All" : "Alla", @@ -50,15 +52,16 @@ OC.L10N.register( "_You have %n app update pending_::_You have %n app updates pending_" : ["Du har %n applikationsuppdatering väntandes.","Du har %n applikationsuppdateringar väntandes."], "No apps found for your version" : "Inga appar funna för din version", "The app will be downloaded from the app store" : "Appen kommer hämtas från appstore", + "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Officiella appar är utvecklade av Nextclouds community. De erbjuder central funktionalitet och är redo för att användas i produktion.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Godkända appar är utvecklade av betrodda utvecklare och har genomgått enklare säkerhetstester. De är aktivt utvecklade i ett öppet kodbibliotek och deras underhållare anser dom stabila nog för enklare till normalt användande.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Denna applikation är ej kontrollerad för säkerhetsbrister och är ny eller känd att orsaka instabilitetsproblem. Installera på egen risk.", - "Please wait...." : "Var god vänta ...", + "Enabling app …" : "Aktiverar app ...", "Error while disabling app" : "Fel vid inaktivering av app", - "Disable" : "Deaktivera", + "Disable" : "Inaktivera", "Enable" : "Aktivera", "Error while enabling app" : "Fel vid aktivering av app", "Error: this app cannot be enabled because it makes the server unstable" : "Fel uppstod: Denna applikation kan ej startas för det gör servern ostabil.", - "Error: could not disable broken app" : "Fel: Gick ej att inaktivera trasig applikation.", + "Error: could not disable broken app" : "Fel: Gick inte att inaktivera trasig applikation.", "Error while disabling broken app" : "Fel under inaktivering av trasig applikation.", "Updating...." : "Uppdaterar ...", "Error while updating app" : "Fel uppstod vid uppdatering av appen", @@ -71,13 +74,40 @@ OC.L10N.register( "Approved" : "Godkänd", "Experimental" : "Experimentiell", "No apps found for {query}" : "Inga applikationer funna för {query}", + "Allow filesystem access" : "Tillåt åtkomst till filsystemet", "Disconnect" : "Koppla från", + "Revoke" : "Återkalla", + "Internet Explorer" : "Internet Explorer", + "Edge" : "Edge", + "Firefox" : "Firefox", + "Google Chrome" : "Google Chrome", + "Safari" : "Safari", + "Google Chrome for Android" : "Google Chrome för Android", + "iPhone iOS" : "iPhone iOS", + "iPad iOS" : "iPad iOS", + "iOS Client" : "iOS-app", + "Android Client" : "Android-app", + "Sync client - {os}" : "Synk-klient - (os)", + "This session" : "Denna session ", + "Copy" : "Kopiera", + "Copied!" : "Kopierad!", + "Not supported!" : "Stöds ej!", + "Press ⌘-C to copy." : "Tryck ⌘-C för att kopiera.", + "Press Ctrl-C to copy." : "Tryck Ctrl-C för att kopiera.", "Error while loading browser sessions and device tokens" : "Fel vid inläsning av webbläsarsessioner och enhetstoken.", "Error while creating device token" : "Fel vid skapande av enhetstoken", "Error while deleting the token" : "Fel vid borttagning av token", "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Ett fel uppstod. Var god ladda upp ett ASCII-kodad PEM certifikat.", "Valid until {date}" : "Giltig t.o.m. {date}", "Delete" : "Radera", + "Local" : "Lokal", + "Private" : "Privat", + "Only visible to local users" : "Endast synlig för lokala användare", + "Only visible to you" : "Endast synlig för dig", + "Contacts" : "Kontakter", + "Visible to local users and to trusted servers" : "Synlig för lokala användare och tillförlitliga servrar", + "Public" : "Offentlig", + "Will be synced to a global and public address book" : "Kommer att synkroniseras till global och offentlig adressbok", "Select a profile picture" : "Välj en profilbild", "Very weak password" : "Väldigt svagt lösenord", "Weak password" : "Svagt lösenord", @@ -92,20 +122,28 @@ OC.L10N.register( "undo" : "ångra", "never" : "aldrig", "deleted {userName}" : "raderade {userName}", + "Add group" : "Lägg till grupp", + "Invalid quota value \"{val}\"" : "Ogiltigt quota värde \"{val}\"", + "no group" : "ingen grupp", + "Password successfully changed" : "Ändringen av lösenordet lyckades.", "Changing the password will result in data loss, because data recovery is not available for this user" : "Ändring utav lösenord kommer resultera i förlorad data, eftersom dataåterställning ej är tillgängligt för denna användare.", + "Could not change the users email" : "Kunde inte ändra användarens e-postadress", "A valid username must be provided" : "Ett giltigt användarnamn måste anges", "Error creating user: {message}" : "Fel uppstod när användare skulle skapas: {message}", "A valid password must be provided" : "Ett giltigt lösenord måste anges", "A valid email must be provided" : "En giltig e-postadress måste anges", "__language_name__" : "Svenska", - "Unlimited" : "Obegränsad", + "Unlimited" : "Obegränsat", "Personal info" : "Personlig information", "Sessions" : "Sessioner", + "App passwords" : "Applösenord", "Sync clients" : "Synk-klienter", "None" : "Ingen", "Login" : "Logga in", "Plain" : "Enkel", "NT LAN Manager" : "NT LAN Manager", + "SSL/TLS" : "SSL/TLS", + "STARTTLS" : "STARTTLS", "Email server" : "E-post server", "Open documentation" : "Öppna dokumentation", "This is used for sending out notifications." : "Detta används för att skicka ut notifieringar.", @@ -127,12 +165,13 @@ OC.L10N.register( "Enable server-side encryption" : "Aktivera kryptering på server.", "Please read carefully before activating server-side encryption: " : "OBS: Var god läs noga innan kryptering aktiveras på servern.", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "När kryptering är aktiverat, så kommer alla filer som laddas upp till servern från den tidpunkt och frammåt bli krypterad på servern. Det kommer bara vara möjligt att inaktivera kryptering vid ett senare tillfälle om krypteringsmodulen stödjer den funktionen och alla förvillkor (exempelvis använder återställningsnyckel) är mötta.", + "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "Enbart kryptering garanterar inte säkerhet i systemet. Vänligen se dokumentationen för ytterligare information om hur krypteringsappen fungerar, och de supporterade användarfallen.", "Be aware that encryption always increases the file size." : "OBS! Observera att kryptering alltid ökar filstorleken", "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Det är alltid en god ide att skapa regelbundna säkerhetskopior av din data, om kryptering används var säker på att även krypteringsnycklarna säkerhetskopieras tillsammans med din data.", "This is the final warning: Do you really want to enable encryption?" : "Detta är en slutgiltig varning: Vill du verkligen aktivera kryptering?", "Enable encryption" : "Aktivera kryptering", "No encryption module loaded, please enable an encryption module in the app menu." : "Ingen krypteringsmodul laddad, var god aktivera krypteringsmodulen i applikationsmenyn.", - "Select default encryption module:" : "Välj standard krypteringsmodul:", + "Select default encryption module:" : "Välj krypteringsmodul:", "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run 'occ encryption:migrate'" : "Du behöver migrera dina krypteringsnycklar från den gamla krypteringen (owncloud <= 8.0) till den nya. Var god aktivera \"Default encryption module\" och kör 'occ encryption:migrate'.", "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Du behöver migrera dina krypteringsnycklar från den gamla krypteringen (owncloud <= 8.0) till den nya.", "Start migration" : "Starta migrering", @@ -142,25 +181,29 @@ OC.L10N.register( "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Läs-bara konfigureringen har blivit aktiv. Detta förhindrar att några konfigureringar kan sättas via web-gränssnittet.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP är tydligen inställd för att rensa inline doc block. Detta kommer att göra flera kärnapplikationer otillgängliga.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Detta orsakas troligtvis av en cache/accelerator som t ex Zend OPchache eller eAccelerator.", + "Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Din databas kör inte \"READ COMMITED\" transaktionsisoleringsnvån. Detta kan orsaka problem när flera åtgärder körs parallellt.", "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s under version %2$s är installerad, för stabilitet och prestanda rekommenderar vi uppdatering till en nyare %1$s version.", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP-modulen 'fileinfo' saknas. Vi rekommenderar starkt att aktivera den här modulen för att kunna upptäcka korrekt mime-typ.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Transactional file locking är inaktiverad, detta kan innebära konkurrenstillstånd. Aktivera \"filelocking.enabled' i config.php för att undvika dessa problem. Se dokumentationen ↗ för mer information.", + "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "\"Transactional file locking\" är inaktiverad, detta kan innebära konkurrenstillstånd. Aktivera \"filelocking.enabled' i config.php för att undvika dessa problem. Se dokumentationen ↗ för mer information.", "System locale can not be set to a one which supports UTF-8." : "Systemspråk kan inte ställas in till ett som stödjer UTF-8.", "This means that there might be problems with certain characters in file names." : "Detta betyder att där kan komma att uppstå problem med vissa tecken i filnamn.", "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vi rekommenderar starkt att installera de nödvändiga paketen på ditt system för att stödja en av följande språkversioner: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Om din installation inte installerades på roten av domänen och använder system cron så kan det uppstå problem med URL-genereringen. För att undvika dessa problem, var vänlig sätt \"overwrite.cli.url\"-inställningen i din config.php-fil till webbrotsökvägen av din installation (Föreslagen: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Det var ej möjligt att exekvera cronjob via CLI. Följande tekniska fel har uppstått:", + "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Var god att dubbelkolla installationsguiden ↗, och kolla efter några ändringar eller varningar i loggfilen.", "All checks passed." : "Alla kontroller lyckades!", "Cron" : "Cron", - "Last cron job execution: %s." : "Sista cron kördes %s", - "Last cron job execution: %s. Something seems wrong." : "Sista cron kördes %s. Något verkar vara fel.", + "Last cron job execution: %s." : "Sista cron kördes för %s", + "Last cron job execution: %s. Something seems wrong." : "Sista cron kördes för %s. Något verkar vara fel.", "Cron was not executed yet!" : "Cron har inte körts ännu!", "Execute one task with each page loaded" : "Exekvera en uppgift vid varje sidladdning", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php är registrerad som en webcron service att ropa på cron.php varje 15 minuter över http.", "Use system's cron service to call the cron.php file every 15 minutes." : "Använd systemets cron-tjänst för att anropa cron.php var 15:e minut.", + "The cron.php needs to be executed by the system user \"%s\"." : "Cron.php behöver exekveras av systemanvändaren \"%s\".", + "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "För att köra detta behöver du PHP posix tillägget. Se {linkstart}PHP dokumentationen{linkend} för ytterligare detaljer.", "Version" : "Version", "Sharing" : "Dela", - "Allow apps to use the Share API" : "Tillåt applikationer att använda delat API", + "Allow apps to use the Share API" : "Tillåt applikationer att använda API för delning", "Allow users to share via link" : "Tillåt användare att dela via länk", "Allow public uploads" : "Tillåt offentlig uppladdning", "Enforce password protection" : "Tillämpa lösenordskydd", @@ -174,7 +217,11 @@ OC.L10N.register( "Exclude groups from sharing" : "Exkludera grupp från att dela", "These groups will still be able to receive shares, but not to initiate them." : "Dessa grupper kommer fortfarande kunna ta emot delningar, men inte skapa delningar.", "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Tillåt användarnamn att autokompletteras i delningsfönstret. Om det är inaktiverat krävs fullständigt användarnamn i rutan.", + "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Visa friskrivningstext på offentliga uppladdningssidan. (Visas endast när fil-listan är gömd.)", + "This text will be shown on the public link upload page when the file list is hidden." : "Denna text kommer att visa på den offentliga uppladdnings-sidan när fil-listan är gömd.", "Tips & tricks" : "Tips & tricks", + "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite används som databas. För större installationer så rekommenderar vi ett byte till en annan databasbackend.", + "This is particularly recommended when using the desktop client for file synchronisation." : "Detta rekommenderas speciellt när skrivbordsklienten används för att synkronisera filer.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "För att migrera till en annan databas använd kommandoverktyget 'occ db:convert-type' eller se dokumentationen ↗", "How to do backups" : "Hur man skapar säkerhetskopior", "Advanced monitoring" : "Advancerad bevakning", @@ -182,7 +229,7 @@ OC.L10N.register( "Improving the config.php" : "Förbättra config.php", "Theming" : "Teman", "Hardening and security guidance" : "Säkerhetsriktlinjer", - "Developer documentation" : "Utvecklar dokumentation", + "Developer documentation" : "Utvecklardokumentation", "by %s" : "av %s", "%s-licensed" : "%s-licensierad.", "Documentation:" : "Dokumentation:", @@ -193,19 +240,24 @@ OC.L10N.register( "Show description …" : "Visa beskrivning", "Hide description …" : "Dölj beskrivning", "This app has an update available." : "Denna applikation har en uppdatering tillgänglig.", + "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Denna app har ingen max Nextcloudversion tilldelad. Detta kommer att innebära ett problem i framtiden.", + "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Denna app har ingen minimum Nextcloudversion tilldelad. Detta kommer att innebära ett problem i framtiden.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Denna applikation kan inte installeras då följande beroenden inte är uppfyllda: %s", "Enable only for specific groups" : "Aktivera endast för specifika grupper", - "Uninstall App" : "Avinstallera applikation", + "Uninstall app" : "Avinstallera app", "SSL Root Certificates" : "SSL Root certifikat", "Common Name" : "Vanligt namn", "Valid until" : "Giltigt till", "Issued By" : "Utfärdat av", "Valid until %s" : "Giltigt till %s", "Import root certificate" : "Importera root certifikat", + "Hey there,

    just letting you know that you now have a %s account.

    Your username: %s
    Access it: %s

    " : "Hej där,

    Tänkte bara informera om att du du nu har ett %s konto.

    Ditt användarnamn: %s
    Logga in: %s

    ", "Cheers!" : "Ha de fint!", + "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hej där,\n\nTänkte bara informera om att du nu har ett %s konto.\n\nDitt användarnamn: %s\nLogga in: %s\n\n", "Administrator documentation" : "Administratörsdokumentation", "Online documentation" : "Online dokumentation", "Forum" : "Forum", + "Getting help" : "Få hjälp", "Commercial support" : "Kommersiell support", "You are using %s of %s" : "Du använder %s av %s", "Profile picture" : "Profilbild", @@ -216,12 +268,20 @@ OC.L10N.register( "Picture provided by original account" : "Bild gjordes tillgänglig av orginal konto", "Cancel" : "Avbryt", "Choose as profile picture" : "Välj som profilbild", - "Full name" : "Fullständigt namn", + "Full name" : "Namn", "No display name set" : "Inget visningsnamn angivet", "Email" : "E-post", "Your email address" : "Din e-postadress", "No email address set" : "Ingen e-postadress angiven", "For password recovery and notifications" : "För lösenordsåterställning och notifieringar", + "Phone number" : "Telefonnummer", + "Your phone number" : "Ditt telefonnummer", + "Address" : "Adress", + "Your postal address" : "Din postadress", + "Website" : "Webbsida", + "Your website" : "Din webbsida", + "Twitter" : "Twitter", + "Your Twitter handle" : "Ditt Twitterkonto", "You are member of the following groups:" : "Du är medlem i följande grupper:", "Password" : "Lösenord", "Current password" : "Nuvarande lösenord", @@ -233,10 +293,25 @@ OC.L10N.register( "Desktop client" : "Skrivbordsklient", "Android app" : "Android-app", "iOS app" : "iOS-app", + "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Om du vill stödja projektet {contributeopen}, delta i utvecklinngen{linkclose} eller {contributeopen}sprida det vidare{linkclose}!", "Show First Run Wizard again" : "Visa Första uppstarts-guiden igen", + "Web, desktop and mobile clients currently logged in to your account." : "Webb, skrivbordsklienter och mobila klienter som är inloggade på ditt konto just nu.", + "Device" : "Enhet", + "Last activity" : "Senaste aktivitet", + "Passcodes that give an app or device permissions to access your account." : "Lösenordskod som ger en applikation eller enhet rättigheter att ansluta till ditt konto.", "Name" : "Namn", + "App name" : "Appnamn", + "Create new app password" : "Skapa nytt applösenord", + "Use the credentials below to configure your app or device." : "Använd följande autentiseringsuppgifter för att konfigurera din app eller enhet", + "For security reasons this password will only be shown once." : "Av säkerhetsskäl kommer lösenordet endast att visas en gång", "Username" : "Användarnamn", "Done" : "Färdig", + "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Utvecklat av {communityopen}Nextclouds community{linkclose}, {githubopen}källkoden{linkclose} är licensierad enligt {licenseopen}AGPL-standard{linkclose}.", + "Follow us on Google Plus!" : "Fälj oss på Google Plus!", + "Like our facebook page!" : "Gilla vår Facebooksida!", + "Subscribe to our twitter channel!" : "Prenumerera på vårt Twitterkonto!", + "Subscribe to our news feed!" : "Prenumerera på vårt nyhetsflöde!", + "Subscribe to our newsletter!" : "Prenumerera på vårt nyhetsbrev!", "Show storage location" : "Visa lagringsplats", "Show last log in" : "Visa senaste inloggning", "Show user backend" : "Visa användar-backend", @@ -244,20 +319,32 @@ OC.L10N.register( "Show email address" : "Visa e-postadress", "E-Mail" : "E-post", "Create" : "Skapa", - "Admin Recovery Password" : "Admin-återställningslösenord", + "Admin Recovery Password" : "Admin-återställningslösen", "Enter the recovery password in order to recover the users files during password change" : "Ange återställningslösenordet för att återställa användarnas filer vid lösenordsbyte", + "Group name" : "Gruppnamn", "Everyone" : "Alla", "Admins" : "Administratörer", - "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Var god skriv in lagringskvot (ex: \"512MB\" eller \"12 GB\")", + "Default quota" : "Förvalt lagringsutrymme", + "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Ange storlek på lagringsutrymmet (t.ex: \"512 MB\" eller \"12 GB\")", "Other" : "Annat", - "Quota" : "Kvot", - "change full name" : "ändra hela namnet", + "Group admin for" : "Gruppadministratör för", + "Quota" : "Lagringsutrymme", + "Storage location" : "Lagringsplats", + "User backend" : "Användarbackend", + "Last login" : "Senaste inloggning", + "change full name" : "ändra namn", "set new password" : "ange nytt lösenord", "change email address" : "ändra e-postadress", "Default" : "Förvald", "log-level out of allowed range" : "logg-nivå utanför tillåtet område", "Language changed" : "Språk ändrades", + "Admins can't remove themself from the admin group" : "Administratörer kan inte ta bort sig själva från admingruppen", + "Unable to add user to group %s" : "Kan inte lägga till användare i gruppen %s", + "Unable to remove user from group %s" : "Kan inte radera användare från gruppen %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Är du verkligen säker på att du vill lägga till \"{domain}\" som en trusted domian?", + "Please wait...." : "Var god vänta ...", + "iPhone" : "iPhone", + "add group" : "lägg till grupp", "Everything (fatal issues, errors, warnings, info, debug)" : "Allting (allvarliga fel, fel, varningar, info, debug)", "Info, warnings, errors and fatal issues" : "Info, varningar och allvarliga fel", "Warnings, errors and fatal issues" : "Varningar, fel och allvarliga fel", @@ -265,24 +352,28 @@ OC.L10N.register( "Fatal issues only" : "Endast allvarliga fel", "Log" : "Logg", "What to log" : "Vad som ska loggas", - "Download logfile" : "Ladda ner loggfil", + "Download logfile" : "Ladda ned loggfil", "More" : "Mer", "Less" : "Mindre", - "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Logfilen är större än 100 MB. Nerladdningen kan ta en stund!", + "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Logfilen är större än 100 MB. Nedladdningen kan ta en stund!", "Allow users to send mail notification for shared files" : "Tillåt användare att skicka mailnotifieringar för delade filer", "Allow users to send mail notification for shared files to other users" : "Tillåt användare att skicka mejlnotifiering för delade filer till andra användare", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite används som databas. För större installationer så rekommenderar vi ett byte till en annan databasmotor.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Speciellt när desktop klienten för filsynkronisering används så avråds användande av SQLite.", "Experimental applications ahead" : "Experimentiella applikationer framför", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Experimentella applikationer är ej kontrollerade för säkerhetsproblem, nya eller kända att vara instabila och under föränderlig utveckling. Installation utav dessa kan orsaka dataförlust eller säkerhetsbrott.", + "Uninstall App" : "Avinstallera applikation", "Enable experimental apps" : "Aktivera experimentiella applikationer", - "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hej där,

    vill bara informera dig om att du nu har ett %s konto.

    Ditt användarnamn: %s
    Accessa det genom: %s

    ", - "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hej där,\n\nvill bara informera dig om att du nu har ett %s konto.\n\nDitt användarnamn: %s\nAccessa det genom: %s\n", + "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hej där,

    Tänkte bara informera dig om att du nu har ett %s konto.

    Ditt användarnamn: %s
    Accessa det här: %s

    ", + "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hej där,\n\nTänkte bara informera dig om att du nu har ett %s konto.\n\nDitt användarnamn: %s\nAccessa det här: %s\n", + "If you want to support the project\n\t\tjoin development\n\t\t\n\t\tspread the word!" : "Om du vill stödja projektet\n\t\tdelta i uvecklingen\n\t\t\n\t\tsprid det vidare!", + "Add Group" : "Lägg till Grupp", "Group" : "Grupp", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Extern lagring", - "Updates" : "Uppdateringar", - "An error occurred: {message}" : "Ett fel inträffade: {message}" + "Default Quota" : "Förvald datakvot", + "Full Name" : "Namn", + "Group Admin for" : "Gruppadmin för", + "Storage Location" : "Lagringsplats", + "User Backend" : "Användarbackend", + "Last Login" : "Senaste inloggining" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/sv.json b/settings/l10n/sv.json index 5c92b9ddfa0a2a29e7bd04bd7119c5fe4080ad30..8bfa6e9b38e3c923faf087f1e71cbe0e9c0a2b84 100644 --- a/settings/l10n/sv.json +++ b/settings/l10n/sv.json @@ -8,9 +8,9 @@ "Authentication error" : "Fel vid autentisering", "Please provide an admin recovery password, otherwise all user data will be lost" : "Ange ett återställningslösenord för administratören. Annars kommer all användardata förloras", "Wrong admin recovery password. Please check the password and try again." : "Felaktigt återställningslösenord för administratör. Kolla lösenordet och prova igen.", - "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Backend stödjer ej lösenordsbyte, men användarens ändring av krypteringsnyckel lyckades.", - "installing and updating apps via the app store or Federated Cloud Sharing" : "installering och uppdatering utav applikationer eller Federate Cloud delning.", - "Federated Cloud Sharing" : "Federate Cloud delning", + "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Backend stödjer inte lösenordsbyte, men användarens ändring av krypteringsnyckel lyckades.", + "installing and updating apps via the app store or Federated Cloud Sharing" : "installering och uppdatering utav applikationer eller Federerad Moln-delning.", + "Federated Cloud Sharing" : "Federerad Moln-delning", "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL använder en föråldrad %s version (%s). Var god uppdatera ditt operativsystem annars kan funktioner som %s sluta fungera pålitligt.", "A problem occurred, please check your log files (Error: %s)" : "Ett problem uppstod, var god kontrollera loggfiler (Error: %s)", "Migration Completed" : "Migrering Färdigställd", @@ -27,20 +27,22 @@ "Unable to create user." : "Kan inte skapa användare.", "Your %s account was created" : "Ditt %s konto skapades", "Unable to delete user." : "Kan inte radera användare.", - "Unable to change full name" : "Kunde inte ändra hela namnet", + "Settings saved" : "Inställningar sparade", + "Unable to change full name" : "Kunde inte ändra namn", + "Unable to change email address" : "Kunde inte ändra e-postadress", "Your full name has been changed." : "Hela ditt namn har ändrats", "Forbidden" : "Förbjuden", "Invalid user" : "Ogiltig användare", "Unable to change mail address" : "Kan inte ändra e-postadress", "Email saved" : "E-post sparad", + "Password confirmation is required" : "Lösenordsbekräftelse krävs", "Couldn't remove app." : "Kunde inte ta bort applikationen.", - "Admins can't remove themself from the admin group" : "Administratörer kan inte ta bort sig själva från admingruppen", - "Unable to add user to group %s" : "Kan inte lägga till användare i gruppen %s", - "Unable to remove user from group %s" : "Kan inte radera användare från gruppen %s", "Couldn't update app." : "Kunde inte uppdatera appen.", + "Are you really sure you want add {domain} as trusted domain?" : "Är du verkligen säker att du vill lägga till (domain) som tillförlitlig domän?", "Add trusted domain" : "Lägg till betrodd domän", "Migration in progress. Please wait until the migration is finished" : "Migrering pågår. Var god vänta tills migreringen är färdigställd.", "Migration started …" : "Migrering påbörjad ...", + "Not saved" : "Inte sparad", "Sending..." : "Skickar ...", "Official" : "Officiell", "All" : "Alla", @@ -48,15 +50,16 @@ "_You have %n app update pending_::_You have %n app updates pending_" : ["Du har %n applikationsuppdatering väntandes.","Du har %n applikationsuppdateringar väntandes."], "No apps found for your version" : "Inga appar funna för din version", "The app will be downloaded from the app store" : "Appen kommer hämtas från appstore", + "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Officiella appar är utvecklade av Nextclouds community. De erbjuder central funktionalitet och är redo för att användas i produktion.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Godkända appar är utvecklade av betrodda utvecklare och har genomgått enklare säkerhetstester. De är aktivt utvecklade i ett öppet kodbibliotek och deras underhållare anser dom stabila nog för enklare till normalt användande.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Denna applikation är ej kontrollerad för säkerhetsbrister och är ny eller känd att orsaka instabilitetsproblem. Installera på egen risk.", - "Please wait...." : "Var god vänta ...", + "Enabling app …" : "Aktiverar app ...", "Error while disabling app" : "Fel vid inaktivering av app", - "Disable" : "Deaktivera", + "Disable" : "Inaktivera", "Enable" : "Aktivera", "Error while enabling app" : "Fel vid aktivering av app", "Error: this app cannot be enabled because it makes the server unstable" : "Fel uppstod: Denna applikation kan ej startas för det gör servern ostabil.", - "Error: could not disable broken app" : "Fel: Gick ej att inaktivera trasig applikation.", + "Error: could not disable broken app" : "Fel: Gick inte att inaktivera trasig applikation.", "Error while disabling broken app" : "Fel under inaktivering av trasig applikation.", "Updating...." : "Uppdaterar ...", "Error while updating app" : "Fel uppstod vid uppdatering av appen", @@ -69,13 +72,40 @@ "Approved" : "Godkänd", "Experimental" : "Experimentiell", "No apps found for {query}" : "Inga applikationer funna för {query}", + "Allow filesystem access" : "Tillåt åtkomst till filsystemet", "Disconnect" : "Koppla från", + "Revoke" : "Återkalla", + "Internet Explorer" : "Internet Explorer", + "Edge" : "Edge", + "Firefox" : "Firefox", + "Google Chrome" : "Google Chrome", + "Safari" : "Safari", + "Google Chrome for Android" : "Google Chrome för Android", + "iPhone iOS" : "iPhone iOS", + "iPad iOS" : "iPad iOS", + "iOS Client" : "iOS-app", + "Android Client" : "Android-app", + "Sync client - {os}" : "Synk-klient - (os)", + "This session" : "Denna session ", + "Copy" : "Kopiera", + "Copied!" : "Kopierad!", + "Not supported!" : "Stöds ej!", + "Press ⌘-C to copy." : "Tryck ⌘-C för att kopiera.", + "Press Ctrl-C to copy." : "Tryck Ctrl-C för att kopiera.", "Error while loading browser sessions and device tokens" : "Fel vid inläsning av webbläsarsessioner och enhetstoken.", "Error while creating device token" : "Fel vid skapande av enhetstoken", "Error while deleting the token" : "Fel vid borttagning av token", "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Ett fel uppstod. Var god ladda upp ett ASCII-kodad PEM certifikat.", "Valid until {date}" : "Giltig t.o.m. {date}", "Delete" : "Radera", + "Local" : "Lokal", + "Private" : "Privat", + "Only visible to local users" : "Endast synlig för lokala användare", + "Only visible to you" : "Endast synlig för dig", + "Contacts" : "Kontakter", + "Visible to local users and to trusted servers" : "Synlig för lokala användare och tillförlitliga servrar", + "Public" : "Offentlig", + "Will be synced to a global and public address book" : "Kommer att synkroniseras till global och offentlig adressbok", "Select a profile picture" : "Välj en profilbild", "Very weak password" : "Väldigt svagt lösenord", "Weak password" : "Svagt lösenord", @@ -90,20 +120,28 @@ "undo" : "ångra", "never" : "aldrig", "deleted {userName}" : "raderade {userName}", + "Add group" : "Lägg till grupp", + "Invalid quota value \"{val}\"" : "Ogiltigt quota värde \"{val}\"", + "no group" : "ingen grupp", + "Password successfully changed" : "Ändringen av lösenordet lyckades.", "Changing the password will result in data loss, because data recovery is not available for this user" : "Ändring utav lösenord kommer resultera i förlorad data, eftersom dataåterställning ej är tillgängligt för denna användare.", + "Could not change the users email" : "Kunde inte ändra användarens e-postadress", "A valid username must be provided" : "Ett giltigt användarnamn måste anges", "Error creating user: {message}" : "Fel uppstod när användare skulle skapas: {message}", "A valid password must be provided" : "Ett giltigt lösenord måste anges", "A valid email must be provided" : "En giltig e-postadress måste anges", "__language_name__" : "Svenska", - "Unlimited" : "Obegränsad", + "Unlimited" : "Obegränsat", "Personal info" : "Personlig information", "Sessions" : "Sessioner", + "App passwords" : "Applösenord", "Sync clients" : "Synk-klienter", "None" : "Ingen", "Login" : "Logga in", "Plain" : "Enkel", "NT LAN Manager" : "NT LAN Manager", + "SSL/TLS" : "SSL/TLS", + "STARTTLS" : "STARTTLS", "Email server" : "E-post server", "Open documentation" : "Öppna dokumentation", "This is used for sending out notifications." : "Detta används för att skicka ut notifieringar.", @@ -125,12 +163,13 @@ "Enable server-side encryption" : "Aktivera kryptering på server.", "Please read carefully before activating server-side encryption: " : "OBS: Var god läs noga innan kryptering aktiveras på servern.", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "När kryptering är aktiverat, så kommer alla filer som laddas upp till servern från den tidpunkt och frammåt bli krypterad på servern. Det kommer bara vara möjligt att inaktivera kryptering vid ett senare tillfälle om krypteringsmodulen stödjer den funktionen och alla förvillkor (exempelvis använder återställningsnyckel) är mötta.", + "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "Enbart kryptering garanterar inte säkerhet i systemet. Vänligen se dokumentationen för ytterligare information om hur krypteringsappen fungerar, och de supporterade användarfallen.", "Be aware that encryption always increases the file size." : "OBS! Observera att kryptering alltid ökar filstorleken", "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Det är alltid en god ide att skapa regelbundna säkerhetskopior av din data, om kryptering används var säker på att även krypteringsnycklarna säkerhetskopieras tillsammans med din data.", "This is the final warning: Do you really want to enable encryption?" : "Detta är en slutgiltig varning: Vill du verkligen aktivera kryptering?", "Enable encryption" : "Aktivera kryptering", "No encryption module loaded, please enable an encryption module in the app menu." : "Ingen krypteringsmodul laddad, var god aktivera krypteringsmodulen i applikationsmenyn.", - "Select default encryption module:" : "Välj standard krypteringsmodul:", + "Select default encryption module:" : "Välj krypteringsmodul:", "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run 'occ encryption:migrate'" : "Du behöver migrera dina krypteringsnycklar från den gamla krypteringen (owncloud <= 8.0) till den nya. Var god aktivera \"Default encryption module\" och kör 'occ encryption:migrate'.", "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Du behöver migrera dina krypteringsnycklar från den gamla krypteringen (owncloud <= 8.0) till den nya.", "Start migration" : "Starta migrering", @@ -140,25 +179,29 @@ "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Läs-bara konfigureringen har blivit aktiv. Detta förhindrar att några konfigureringar kan sättas via web-gränssnittet.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP är tydligen inställd för att rensa inline doc block. Detta kommer att göra flera kärnapplikationer otillgängliga.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Detta orsakas troligtvis av en cache/accelerator som t ex Zend OPchache eller eAccelerator.", + "Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Din databas kör inte \"READ COMMITED\" transaktionsisoleringsnvån. Detta kan orsaka problem när flera åtgärder körs parallellt.", "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s under version %2$s är installerad, för stabilitet och prestanda rekommenderar vi uppdatering till en nyare %1$s version.", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP-modulen 'fileinfo' saknas. Vi rekommenderar starkt att aktivera den här modulen för att kunna upptäcka korrekt mime-typ.", - "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "Transactional file locking är inaktiverad, detta kan innebära konkurrenstillstånd. Aktivera \"filelocking.enabled' i config.php för att undvika dessa problem. Se dokumentationen ↗ för mer information.", + "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "\"Transactional file locking\" är inaktiverad, detta kan innebära konkurrenstillstånd. Aktivera \"filelocking.enabled' i config.php för att undvika dessa problem. Se dokumentationen ↗ för mer information.", "System locale can not be set to a one which supports UTF-8." : "Systemspråk kan inte ställas in till ett som stödjer UTF-8.", "This means that there might be problems with certain characters in file names." : "Detta betyder att där kan komma att uppstå problem med vissa tecken i filnamn.", "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vi rekommenderar starkt att installera de nödvändiga paketen på ditt system för att stödja en av följande språkversioner: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Om din installation inte installerades på roten av domänen och använder system cron så kan det uppstå problem med URL-genereringen. För att undvika dessa problem, var vänlig sätt \"overwrite.cli.url\"-inställningen i din config.php-fil till webbrotsökvägen av din installation (Föreslagen: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Det var ej möjligt att exekvera cronjob via CLI. Följande tekniska fel har uppstått:", + "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Var god att dubbelkolla installationsguiden ↗, och kolla efter några ändringar eller varningar i loggfilen.", "All checks passed." : "Alla kontroller lyckades!", "Cron" : "Cron", - "Last cron job execution: %s." : "Sista cron kördes %s", - "Last cron job execution: %s. Something seems wrong." : "Sista cron kördes %s. Något verkar vara fel.", + "Last cron job execution: %s." : "Sista cron kördes för %s", + "Last cron job execution: %s. Something seems wrong." : "Sista cron kördes för %s. Något verkar vara fel.", "Cron was not executed yet!" : "Cron har inte körts ännu!", "Execute one task with each page loaded" : "Exekvera en uppgift vid varje sidladdning", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php är registrerad som en webcron service att ropa på cron.php varje 15 minuter över http.", "Use system's cron service to call the cron.php file every 15 minutes." : "Använd systemets cron-tjänst för att anropa cron.php var 15:e minut.", + "The cron.php needs to be executed by the system user \"%s\"." : "Cron.php behöver exekveras av systemanvändaren \"%s\".", + "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "För att köra detta behöver du PHP posix tillägget. Se {linkstart}PHP dokumentationen{linkend} för ytterligare detaljer.", "Version" : "Version", "Sharing" : "Dela", - "Allow apps to use the Share API" : "Tillåt applikationer att använda delat API", + "Allow apps to use the Share API" : "Tillåt applikationer att använda API för delning", "Allow users to share via link" : "Tillåt användare att dela via länk", "Allow public uploads" : "Tillåt offentlig uppladdning", "Enforce password protection" : "Tillämpa lösenordskydd", @@ -172,7 +215,11 @@ "Exclude groups from sharing" : "Exkludera grupp från att dela", "These groups will still be able to receive shares, but not to initiate them." : "Dessa grupper kommer fortfarande kunna ta emot delningar, men inte skapa delningar.", "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Tillåt användarnamn att autokompletteras i delningsfönstret. Om det är inaktiverat krävs fullständigt användarnamn i rutan.", + "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Visa friskrivningstext på offentliga uppladdningssidan. (Visas endast när fil-listan är gömd.)", + "This text will be shown on the public link upload page when the file list is hidden." : "Denna text kommer att visa på den offentliga uppladdnings-sidan när fil-listan är gömd.", "Tips & tricks" : "Tips & tricks", + "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite används som databas. För större installationer så rekommenderar vi ett byte till en annan databasbackend.", + "This is particularly recommended when using the desktop client for file synchronisation." : "Detta rekommenderas speciellt när skrivbordsklienten används för att synkronisera filer.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "För att migrera till en annan databas använd kommandoverktyget 'occ db:convert-type' eller se dokumentationen ↗", "How to do backups" : "Hur man skapar säkerhetskopior", "Advanced monitoring" : "Advancerad bevakning", @@ -180,7 +227,7 @@ "Improving the config.php" : "Förbättra config.php", "Theming" : "Teman", "Hardening and security guidance" : "Säkerhetsriktlinjer", - "Developer documentation" : "Utvecklar dokumentation", + "Developer documentation" : "Utvecklardokumentation", "by %s" : "av %s", "%s-licensed" : "%s-licensierad.", "Documentation:" : "Dokumentation:", @@ -191,19 +238,24 @@ "Show description …" : "Visa beskrivning", "Hide description …" : "Dölj beskrivning", "This app has an update available." : "Denna applikation har en uppdatering tillgänglig.", + "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Denna app har ingen max Nextcloudversion tilldelad. Detta kommer att innebära ett problem i framtiden.", + "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Denna app har ingen minimum Nextcloudversion tilldelad. Detta kommer att innebära ett problem i framtiden.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Denna applikation kan inte installeras då följande beroenden inte är uppfyllda: %s", "Enable only for specific groups" : "Aktivera endast för specifika grupper", - "Uninstall App" : "Avinstallera applikation", + "Uninstall app" : "Avinstallera app", "SSL Root Certificates" : "SSL Root certifikat", "Common Name" : "Vanligt namn", "Valid until" : "Giltigt till", "Issued By" : "Utfärdat av", "Valid until %s" : "Giltigt till %s", "Import root certificate" : "Importera root certifikat", + "Hey there,

    just letting you know that you now have a %s account.

    Your username: %s
    Access it: %s

    " : "Hej där,

    Tänkte bara informera om att du du nu har ett %s konto.

    Ditt användarnamn: %s
    Logga in: %s

    ", "Cheers!" : "Ha de fint!", + "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hej där,\n\nTänkte bara informera om att du nu har ett %s konto.\n\nDitt användarnamn: %s\nLogga in: %s\n\n", "Administrator documentation" : "Administratörsdokumentation", "Online documentation" : "Online dokumentation", "Forum" : "Forum", + "Getting help" : "Få hjälp", "Commercial support" : "Kommersiell support", "You are using %s of %s" : "Du använder %s av %s", "Profile picture" : "Profilbild", @@ -214,12 +266,20 @@ "Picture provided by original account" : "Bild gjordes tillgänglig av orginal konto", "Cancel" : "Avbryt", "Choose as profile picture" : "Välj som profilbild", - "Full name" : "Fullständigt namn", + "Full name" : "Namn", "No display name set" : "Inget visningsnamn angivet", "Email" : "E-post", "Your email address" : "Din e-postadress", "No email address set" : "Ingen e-postadress angiven", "For password recovery and notifications" : "För lösenordsåterställning och notifieringar", + "Phone number" : "Telefonnummer", + "Your phone number" : "Ditt telefonnummer", + "Address" : "Adress", + "Your postal address" : "Din postadress", + "Website" : "Webbsida", + "Your website" : "Din webbsida", + "Twitter" : "Twitter", + "Your Twitter handle" : "Ditt Twitterkonto", "You are member of the following groups:" : "Du är medlem i följande grupper:", "Password" : "Lösenord", "Current password" : "Nuvarande lösenord", @@ -231,10 +291,25 @@ "Desktop client" : "Skrivbordsklient", "Android app" : "Android-app", "iOS app" : "iOS-app", + "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Om du vill stödja projektet {contributeopen}, delta i utvecklinngen{linkclose} eller {contributeopen}sprida det vidare{linkclose}!", "Show First Run Wizard again" : "Visa Första uppstarts-guiden igen", + "Web, desktop and mobile clients currently logged in to your account." : "Webb, skrivbordsklienter och mobila klienter som är inloggade på ditt konto just nu.", + "Device" : "Enhet", + "Last activity" : "Senaste aktivitet", + "Passcodes that give an app or device permissions to access your account." : "Lösenordskod som ger en applikation eller enhet rättigheter att ansluta till ditt konto.", "Name" : "Namn", + "App name" : "Appnamn", + "Create new app password" : "Skapa nytt applösenord", + "Use the credentials below to configure your app or device." : "Använd följande autentiseringsuppgifter för att konfigurera din app eller enhet", + "For security reasons this password will only be shown once." : "Av säkerhetsskäl kommer lösenordet endast att visas en gång", "Username" : "Användarnamn", "Done" : "Färdig", + "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Utvecklat av {communityopen}Nextclouds community{linkclose}, {githubopen}källkoden{linkclose} är licensierad enligt {licenseopen}AGPL-standard{linkclose}.", + "Follow us on Google Plus!" : "Fälj oss på Google Plus!", + "Like our facebook page!" : "Gilla vår Facebooksida!", + "Subscribe to our twitter channel!" : "Prenumerera på vårt Twitterkonto!", + "Subscribe to our news feed!" : "Prenumerera på vårt nyhetsflöde!", + "Subscribe to our newsletter!" : "Prenumerera på vårt nyhetsbrev!", "Show storage location" : "Visa lagringsplats", "Show last log in" : "Visa senaste inloggning", "Show user backend" : "Visa användar-backend", @@ -242,20 +317,32 @@ "Show email address" : "Visa e-postadress", "E-Mail" : "E-post", "Create" : "Skapa", - "Admin Recovery Password" : "Admin-återställningslösenord", + "Admin Recovery Password" : "Admin-återställningslösen", "Enter the recovery password in order to recover the users files during password change" : "Ange återställningslösenordet för att återställa användarnas filer vid lösenordsbyte", + "Group name" : "Gruppnamn", "Everyone" : "Alla", "Admins" : "Administratörer", - "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Var god skriv in lagringskvot (ex: \"512MB\" eller \"12 GB\")", + "Default quota" : "Förvalt lagringsutrymme", + "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Ange storlek på lagringsutrymmet (t.ex: \"512 MB\" eller \"12 GB\")", "Other" : "Annat", - "Quota" : "Kvot", - "change full name" : "ändra hela namnet", + "Group admin for" : "Gruppadministratör för", + "Quota" : "Lagringsutrymme", + "Storage location" : "Lagringsplats", + "User backend" : "Användarbackend", + "Last login" : "Senaste inloggning", + "change full name" : "ändra namn", "set new password" : "ange nytt lösenord", "change email address" : "ändra e-postadress", "Default" : "Förvald", "log-level out of allowed range" : "logg-nivå utanför tillåtet område", "Language changed" : "Språk ändrades", + "Admins can't remove themself from the admin group" : "Administratörer kan inte ta bort sig själva från admingruppen", + "Unable to add user to group %s" : "Kan inte lägga till användare i gruppen %s", + "Unable to remove user from group %s" : "Kan inte radera användare från gruppen %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Är du verkligen säker på att du vill lägga till \"{domain}\" som en trusted domian?", + "Please wait...." : "Var god vänta ...", + "iPhone" : "iPhone", + "add group" : "lägg till grupp", "Everything (fatal issues, errors, warnings, info, debug)" : "Allting (allvarliga fel, fel, varningar, info, debug)", "Info, warnings, errors and fatal issues" : "Info, varningar och allvarliga fel", "Warnings, errors and fatal issues" : "Varningar, fel och allvarliga fel", @@ -263,24 +350,28 @@ "Fatal issues only" : "Endast allvarliga fel", "Log" : "Logg", "What to log" : "Vad som ska loggas", - "Download logfile" : "Ladda ner loggfil", + "Download logfile" : "Ladda ned loggfil", "More" : "Mer", "Less" : "Mindre", - "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Logfilen är större än 100 MB. Nerladdningen kan ta en stund!", + "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Logfilen är större än 100 MB. Nedladdningen kan ta en stund!", "Allow users to send mail notification for shared files" : "Tillåt användare att skicka mailnotifieringar för delade filer", "Allow users to send mail notification for shared files to other users" : "Tillåt användare att skicka mejlnotifiering för delade filer till andra användare", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite används som databas. För större installationer så rekommenderar vi ett byte till en annan databasmotor.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Speciellt när desktop klienten för filsynkronisering används så avråds användande av SQLite.", "Experimental applications ahead" : "Experimentiella applikationer framför", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Experimentella applikationer är ej kontrollerade för säkerhetsproblem, nya eller kända att vara instabila och under föränderlig utveckling. Installation utav dessa kan orsaka dataförlust eller säkerhetsbrott.", + "Uninstall App" : "Avinstallera applikation", "Enable experimental apps" : "Aktivera experimentiella applikationer", - "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hej där,

    vill bara informera dig om att du nu har ett %s konto.

    Ditt användarnamn: %s
    Accessa det genom: %s

    ", - "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hej där,\n\nvill bara informera dig om att du nu har ett %s konto.\n\nDitt användarnamn: %s\nAccessa det genom: %s\n", + "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Hej där,

    Tänkte bara informera dig om att du nu har ett %s konto.

    Ditt användarnamn: %s
    Accessa det här: %s

    ", + "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hej där,\n\nTänkte bara informera dig om att du nu har ett %s konto.\n\nDitt användarnamn: %s\nAccessa det här: %s\n", + "If you want to support the project\n\t\tjoin development\n\t\t\n\t\tspread the word!" : "Om du vill stödja projektet\n\t\tdelta i uvecklingen\n\t\t\n\t\tsprid det vidare!", + "Add Group" : "Lägg till Grupp", "Group" : "Grupp", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Extern lagring", - "Updates" : "Uppdateringar", - "An error occurred: {message}" : "Ett fel inträffade: {message}" + "Default Quota" : "Förvald datakvot", + "Full Name" : "Namn", + "Group Admin for" : "Gruppadmin för", + "Storage Location" : "Lagringsplats", + "User Backend" : "Användarbackend", + "Last Login" : "Senaste inloggining" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/ta_LK.js b/settings/l10n/ta_LK.js index 5691031789e0a11e185d722dffa147ab5e420851..ff63cae0124e59958de87a8a790a655255cd6dc3 100644 --- a/settings/l10n/ta_LK.js +++ b/settings/l10n/ta_LK.js @@ -4,8 +4,6 @@ OC.L10N.register( "Authentication error" : "அத்தாட்சிப்படுத்தலில் வழு", "Invalid request" : "செல்லுபடியற்ற வேண்டுகோள்", "Email saved" : "மின்னஞ்சல் சேமிக்கப்பட்டது", - "Unable to add user to group %s" : "குழு %s இல் பயனாளரை சேர்க்க முடியாது", - "Unable to remove user from group %s" : "குழு %s இலிருந்து பயனாளரை நீக்கமுடியாது", "All" : "எல்லாம்", "Disable" : "இயலுமைப்ப", "Enable" : "இயலுமைப்படுத்துக", @@ -35,8 +33,9 @@ OC.L10N.register( "Other" : "மற்றவை", "Quota" : "பங்கு", "Language changed" : "மொழி மாற்றப்பட்டது", + "Unable to add user to group %s" : "குழு %s இல் பயனாளரை சேர்க்க முடியாது", + "Unable to remove user from group %s" : "குழு %s இலிருந்து பயனாளரை நீக்கமுடியாது", "More" : "மேலதிக", - "Less" : "குறைவான", - "External Storage" : "வெளி சேமிப்பு" + "Less" : "குறைவான" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/ta_LK.json b/settings/l10n/ta_LK.json index 917526629f867994af6df570038a9750d72eaa07..7a862136b816db6068e59744966117552a4d3d16 100644 --- a/settings/l10n/ta_LK.json +++ b/settings/l10n/ta_LK.json @@ -2,8 +2,6 @@ "Authentication error" : "அத்தாட்சிப்படுத்தலில் வழு", "Invalid request" : "செல்லுபடியற்ற வேண்டுகோள்", "Email saved" : "மின்னஞ்சல் சேமிக்கப்பட்டது", - "Unable to add user to group %s" : "குழு %s இல் பயனாளரை சேர்க்க முடியாது", - "Unable to remove user from group %s" : "குழு %s இலிருந்து பயனாளரை நீக்கமுடியாது", "All" : "எல்லாம்", "Disable" : "இயலுமைப்ப", "Enable" : "இயலுமைப்படுத்துக", @@ -33,8 +31,9 @@ "Other" : "மற்றவை", "Quota" : "பங்கு", "Language changed" : "மொழி மாற்றப்பட்டது", + "Unable to add user to group %s" : "குழு %s இல் பயனாளரை சேர்க்க முடியாது", + "Unable to remove user from group %s" : "குழு %s இலிருந்து பயனாளரை நீக்கமுடியாது", "More" : "மேலதிக", - "Less" : "குறைவான", - "External Storage" : "வெளி சேமிப்பு" + "Less" : "குறைவான" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/th_TH.js b/settings/l10n/th_TH.js index efb6b92bedf8d66e9bc113c2016c7194a593c655..f2a1d599c1d9de20cce2eeeb766a78d9ddc0251f 100644 --- a/settings/l10n/th_TH.js +++ b/settings/l10n/th_TH.js @@ -36,9 +36,6 @@ OC.L10N.register( "Unable to change mail address" : "ไม่สามารถที่จะเปลี่ยนที่อยู่อีเมล", "Email saved" : "อีเมลถูกบันทึกแล้ว", "Couldn't remove app." : "ไม่สามารถลบแอพฯ", - "Admins can't remove themself from the admin group" : "ผู้ดูแลระบบไม่สามารถลบตัวเองออกจากกลุ่มผู้ดูแลได้", - "Unable to add user to group %s" : "ไม่สามารถเพิ่มผู้ใช้งานเข้าไปที่กลุ่ม %s ได้", - "Unable to remove user from group %s" : "ไม่สามารถลบผู้ใช้งานออกจากกลุ่ม %s ได้", "Couldn't update app." : "ไม่สามารถอัพเดทแอปฯ", "Add trusted domain" : "เพิ่มโดเมนที่เชื่อถือได้", "Migration in progress. Please wait until the migration is finished" : "ในระหว่างดำเนินการโยกย้าย กรุณารอสักครู่จนกว่าการโยกย้ายจะเสร็จสิ้น", @@ -52,7 +49,6 @@ OC.L10N.register( "The app will be downloaded from the app store" : "แอพฯจะดาวน์โหลดได้จากแอพสโตร์", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "แอพพลิเคชันได้รับการอนุมัติและพัฒนาโดยนักพัฒนาที่น่าเชื่อถือและได้ผ่านการตรวจสอบความปลอดภัยคร่าวๆ พวกเขาจะได้รับการบำรุงรักษาอย่างดีในการเก็บข้อมูลรหัสเปิด มันอาจยังไม่เสถียรพอสำหรับการเปิดใช้งานปกติ", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "แอพฯ นี้ไม่ได้ตรวจสอบปัญหาด้านความปลอดภัยและเป็นแอพฯใหม่หรือที่รู้จักกันคือจะไม่เสถียร ติดตั้งบนความเสี่ยงของคุณเอง", - "Please wait...." : "กรุณารอสักครู่...", "Error while disabling app" : "เกิดข้อผิดพลาดขณะปิดการใช้งานแอพพลิเคชัน", "Disable" : "ปิดใช้งาน", "Enable" : "เปิดใช้งาน", @@ -184,7 +180,6 @@ OC.L10N.register( "Hide description …" : "ซ่อนรายละเอียด ...", "This app cannot be installed because the following dependencies are not fulfilled:" : "ไม่สามารถติดตั้งแอพฯนี้เพราะไม่มีตัวอ้างอิงต่อไปนี้:", "Enable only for specific groups" : "เปิดใช้งานเพียงเฉพาะกลุ่ม", - "Uninstall App" : "ถอนการติดตั้งแอพฯ", "SSL Root Certificates" : "ใบรับรอง SSL", "Common Name" : "ชื่อทั่วไป", "Valid until" : "ใช้ได้จนถึง", @@ -246,7 +241,11 @@ OC.L10N.register( "Default" : "ค่าเริ่มต้น", "log-level out of allowed range" : "ระดับ-บันทึก ไม่ได้อยู่ในช่วงที่ได้รับอนุญาต", "Language changed" : "เปลี่ยนภาษาเรียบร้อยแล้ว", + "Admins can't remove themself from the admin group" : "ผู้ดูแลระบบไม่สามารถลบตัวเองออกจากกลุ่มผู้ดูแลได้", + "Unable to add user to group %s" : "ไม่สามารถเพิ่มผู้ใช้งานเข้าไปที่กลุ่ม %s ได้", + "Unable to remove user from group %s" : "ไม่สามารถลบผู้ใช้งานออกจากกลุ่ม %s ได้", "Are you really sure you want add \"{domain}\" as trusted domain?" : "คุณแน่ใจจริงๆ ว่าคุณต้องการเพิ่ม \"{domain}\" เป็นโดเมนที่เชื่อถือได้?", + "Please wait...." : "กรุณารอสักครู่...", "Everything (fatal issues, errors, warnings, info, debug)" : "ทุกอย่าง (ปัญหาร้ายแรง ข้อผิดพลาด คำเตือน ข้อมูล การแก้ปัญหา)", "Info, warnings, errors and fatal issues" : "ข้อมูล คำเตือน ข้อผิดพลาดและปัญหาร้ายแรง", "Warnings, errors and fatal issues" : "คำเตือนข้อผิดพลาดและปัญหาที่ร้ายแรง", @@ -264,14 +263,10 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "โดยเฉพาะอย่างยิ่งเมื่อใช้ไคลเอนต์เดสก์ทอปสำหรับการประสานข้อมูลโดย SQLite", "Experimental applications ahead" : "การใช้งานก่อนการทดลอง", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "การทดลองแอพพลิเคชันไม่ได้ถูกตรวจสอบปัญหาด้านความปลอดภัย การติดตั้งพวกเขาสามารถก่อให้เกิดการสูญเสียข้อมูลหรือการละเมิดความปลอดภัย", + "Uninstall App" : "ถอนการติดตั้งแอพฯ", "Enable experimental apps" : "เปิดใช้งานแอพพลิเคชั่นทดลอง", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "นี่คุณ

    อยากจะแจ้งให้คุณทราบว่าขณะนี้คุณมีบัญชี %s

    ชื่อผู้ใช้ของคุณคือ: %s
    เข้าไปงานได้ที่: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "นี่คุณ\n\nอยากให้คุณทราบว่าขณะนี้คุณมี %s บัญชี\n\nชื่อผู้ใช้ของคุณ: %s\nดูได้ที่: %s\n", - "Group" : "กลุ่ม", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "พื้นทีจัดเก็บข้อมูลจากภายนอก", - "Updates" : "อัพเดท", - "An error occurred: {message}" : "เกิดข้อผิดพลาด: {message}" + "Group" : "กลุ่ม" }, "nplurals=1; plural=0;"); diff --git a/settings/l10n/th_TH.json b/settings/l10n/th_TH.json index e926161b59279f565def3ad49ab3d1202163a762..e3cc8835b531edd87c8da52a5ae6085432036b35 100644 --- a/settings/l10n/th_TH.json +++ b/settings/l10n/th_TH.json @@ -34,9 +34,6 @@ "Unable to change mail address" : "ไม่สามารถที่จะเปลี่ยนที่อยู่อีเมล", "Email saved" : "อีเมลถูกบันทึกแล้ว", "Couldn't remove app." : "ไม่สามารถลบแอพฯ", - "Admins can't remove themself from the admin group" : "ผู้ดูแลระบบไม่สามารถลบตัวเองออกจากกลุ่มผู้ดูแลได้", - "Unable to add user to group %s" : "ไม่สามารถเพิ่มผู้ใช้งานเข้าไปที่กลุ่ม %s ได้", - "Unable to remove user from group %s" : "ไม่สามารถลบผู้ใช้งานออกจากกลุ่ม %s ได้", "Couldn't update app." : "ไม่สามารถอัพเดทแอปฯ", "Add trusted domain" : "เพิ่มโดเมนที่เชื่อถือได้", "Migration in progress. Please wait until the migration is finished" : "ในระหว่างดำเนินการโยกย้าย กรุณารอสักครู่จนกว่าการโยกย้ายจะเสร็จสิ้น", @@ -50,7 +47,6 @@ "The app will be downloaded from the app store" : "แอพฯจะดาวน์โหลดได้จากแอพสโตร์", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "แอพพลิเคชันได้รับการอนุมัติและพัฒนาโดยนักพัฒนาที่น่าเชื่อถือและได้ผ่านการตรวจสอบความปลอดภัยคร่าวๆ พวกเขาจะได้รับการบำรุงรักษาอย่างดีในการเก็บข้อมูลรหัสเปิด มันอาจยังไม่เสถียรพอสำหรับการเปิดใช้งานปกติ", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "แอพฯ นี้ไม่ได้ตรวจสอบปัญหาด้านความปลอดภัยและเป็นแอพฯใหม่หรือที่รู้จักกันคือจะไม่เสถียร ติดตั้งบนความเสี่ยงของคุณเอง", - "Please wait...." : "กรุณารอสักครู่...", "Error while disabling app" : "เกิดข้อผิดพลาดขณะปิดการใช้งานแอพพลิเคชัน", "Disable" : "ปิดใช้งาน", "Enable" : "เปิดใช้งาน", @@ -182,7 +178,6 @@ "Hide description …" : "ซ่อนรายละเอียด ...", "This app cannot be installed because the following dependencies are not fulfilled:" : "ไม่สามารถติดตั้งแอพฯนี้เพราะไม่มีตัวอ้างอิงต่อไปนี้:", "Enable only for specific groups" : "เปิดใช้งานเพียงเฉพาะกลุ่ม", - "Uninstall App" : "ถอนการติดตั้งแอพฯ", "SSL Root Certificates" : "ใบรับรอง SSL", "Common Name" : "ชื่อทั่วไป", "Valid until" : "ใช้ได้จนถึง", @@ -244,7 +239,11 @@ "Default" : "ค่าเริ่มต้น", "log-level out of allowed range" : "ระดับ-บันทึก ไม่ได้อยู่ในช่วงที่ได้รับอนุญาต", "Language changed" : "เปลี่ยนภาษาเรียบร้อยแล้ว", + "Admins can't remove themself from the admin group" : "ผู้ดูแลระบบไม่สามารถลบตัวเองออกจากกลุ่มผู้ดูแลได้", + "Unable to add user to group %s" : "ไม่สามารถเพิ่มผู้ใช้งานเข้าไปที่กลุ่ม %s ได้", + "Unable to remove user from group %s" : "ไม่สามารถลบผู้ใช้งานออกจากกลุ่ม %s ได้", "Are you really sure you want add \"{domain}\" as trusted domain?" : "คุณแน่ใจจริงๆ ว่าคุณต้องการเพิ่ม \"{domain}\" เป็นโดเมนที่เชื่อถือได้?", + "Please wait...." : "กรุณารอสักครู่...", "Everything (fatal issues, errors, warnings, info, debug)" : "ทุกอย่าง (ปัญหาร้ายแรง ข้อผิดพลาด คำเตือน ข้อมูล การแก้ปัญหา)", "Info, warnings, errors and fatal issues" : "ข้อมูล คำเตือน ข้อผิดพลาดและปัญหาร้ายแรง", "Warnings, errors and fatal issues" : "คำเตือนข้อผิดพลาดและปัญหาที่ร้ายแรง", @@ -262,14 +261,10 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "โดยเฉพาะอย่างยิ่งเมื่อใช้ไคลเอนต์เดสก์ทอปสำหรับการประสานข้อมูลโดย SQLite", "Experimental applications ahead" : "การใช้งานก่อนการทดลอง", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "การทดลองแอพพลิเคชันไม่ได้ถูกตรวจสอบปัญหาด้านความปลอดภัย การติดตั้งพวกเขาสามารถก่อให้เกิดการสูญเสียข้อมูลหรือการละเมิดความปลอดภัย", + "Uninstall App" : "ถอนการติดตั้งแอพฯ", "Enable experimental apps" : "เปิดใช้งานแอพพลิเคชั่นทดลอง", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "นี่คุณ

    อยากจะแจ้งให้คุณทราบว่าขณะนี้คุณมีบัญชี %s

    ชื่อผู้ใช้ของคุณคือ: %s
    เข้าไปงานได้ที่: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "นี่คุณ\n\nอยากให้คุณทราบว่าขณะนี้คุณมี %s บัญชี\n\nชื่อผู้ใช้ของคุณ: %s\nดูได้ที่: %s\n", - "Group" : "กลุ่ม", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "พื้นทีจัดเก็บข้อมูลจากภายนอก", - "Updates" : "อัพเดท", - "An error occurred: {message}" : "เกิดข้อผิดพลาด: {message}" + "Group" : "กลุ่ม" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/settings/l10n/tr.js b/settings/l10n/tr.js index 299a33b7a26ecd5f649c3742c23bb23ea3671bc9..418854fb4dcef3a1490e5406682e2df1e40194f9 100644 --- a/settings/l10n/tr.js +++ b/settings/l10n/tr.js @@ -36,9 +36,6 @@ OC.L10N.register( "Unable to change mail address" : "Posta adresini değiştirme başarısız", "Email saved" : "E-posta kaydedildi", "Couldn't remove app." : "Uygulama kaldırılamadı.", - "Admins can't remove themself from the admin group" : "Yöneticiler kendilerini admin grubundan kaldıramaz", - "Unable to add user to group %s" : "Kullanıcı %s grubuna eklenemiyor", - "Unable to remove user from group %s" : "%s grubundan kullanıcı kaldırılamıyor", "Couldn't update app." : "Uygulama güncellenemedi.", "Add trusted domain" : "Güvenilir alan adı ekle", "Migration in progress. Please wait until the migration is finished" : "Taşınma sürüyor. Lütfen taşınma tamamlanana kadar bekleyin", @@ -53,7 +50,6 @@ OC.L10N.register( "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Resmi uygulamalar topluluk tarafından geliştirilmiştir. Merkezi işlevleri yerine getirdikleri gibi kullanıma da hazırdırlar.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Onaylanan uygulamalar güvenilir geliştiriciler tarafından geliştirilir ve detaylı olmayan bir güvenlik kontrolünden geçirilir. Bunlar açık kaynak kod deposunda bulunmakta ve normal kullanım için kararlı oldukları varsayılmaktadır.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Bu uygulama güvenlik kontrolünden geçmedi veya yeni ya da kararsız olarak bilinmektedir. Kendiniz bu riski alarak yükleyebilirsiniz.", - "Please wait...." : "Lütfen bekleyin....", "Error while disabling app" : "Uygulama devre dışı bırakılırken hata", "Disable" : "Devre Dışı Bırak", "Enable" : "Etkinleştir", @@ -213,7 +209,6 @@ OC.L10N.register( "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Bu uygulama için atanan en yüksek Nextcloud sürümü bulunmuyor. Bu ileride bir hata olacaktır.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Bu uygulama, aşağıdaki bağımlılıklar sağlanmadığından yüklenemiyor:", "Enable only for specific groups" : "Sadece belirli gruplar için etkinleştir", - "Uninstall App" : "Uygulamayı Kaldır", "SSL Root Certificates" : "SSL Kök Sertifikaları", "Common Name" : "Ortak Ad", "Valid until" : "Geçerlilik", @@ -287,7 +282,11 @@ OC.L10N.register( "Default" : "Öntanımlı", "log-level out of allowed range" : "günlük seviyesi izin verilen aralık dışında", "Language changed" : "Dil değiştirildi", + "Admins can't remove themself from the admin group" : "Yöneticiler kendilerini admin grubundan kaldıramaz", + "Unable to add user to group %s" : "Kullanıcı %s grubuna eklenemiyor", + "Unable to remove user from group %s" : "%s grubundan kullanıcı kaldırılamıyor", "Are you really sure you want add \"{domain}\" as trusted domain?" : "\"{domain}\" alan adını güvenilir alan adı olarak eklemek istediğinizden emin misiniz?", + "Please wait...." : "Lütfen bekleyin....", "iPhone" : "iPhone", "Everything (fatal issues, errors, warnings, info, debug)" : "Her şey (Ciddi sorunlar, hatalar, uyarılar, bilgi, hata ayıklama)", "Info, warnings, errors and fatal issues" : "Bilgi, uyarılar, hatalar ve ciddi sorunlar", @@ -306,14 +305,10 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Özellikle dosya eşitleme için masaüstü istemcisi kullanılırken SQLite kullanımı önerilmez.", "Experimental applications ahead" : "İlerideki deneysel uygulamalar", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Deneysel uygulamalar güvenlik açısından denetlenmemiş, yeni veya kararsız olmaya açık ya da geliştirilme aşamasında olan uygulamalardır. Yüklemek veri kaybı veya güvenlik açıklarına sebep olabilir.", + "Uninstall App" : "Uygulamayı Kaldır", "Enable experimental apps" : "Deneysel uygulamaları etkinleştir", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Merhaba,

    Sadece artık bir %s hesabınızın olduğunu söylemek istedim.

    Kullanıcı adınız: %s
    Şuradan erişin: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Merhaba,\n\nSadece, artık bir %s hesabınızın olduğunu söylemek istedim.\n\nKullanıcı adınız: %s\nErişim: %s\n\n", - "Group" : "Grup", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Harici Depolama", - "Updates" : "Güncellemeler", - "An error occurred: {message}" : "Bir hata oluştu: {message}" + "Group" : "Grup" }, "nplurals=2; plural=(n > 1);"); diff --git a/settings/l10n/tr.json b/settings/l10n/tr.json index 4051f85b81c357e917b76672385b3c3051804636..4472e7f824232056c1bc04311774b7afba87a98c 100644 --- a/settings/l10n/tr.json +++ b/settings/l10n/tr.json @@ -34,9 +34,6 @@ "Unable to change mail address" : "Posta adresini değiştirme başarısız", "Email saved" : "E-posta kaydedildi", "Couldn't remove app." : "Uygulama kaldırılamadı.", - "Admins can't remove themself from the admin group" : "Yöneticiler kendilerini admin grubundan kaldıramaz", - "Unable to add user to group %s" : "Kullanıcı %s grubuna eklenemiyor", - "Unable to remove user from group %s" : "%s grubundan kullanıcı kaldırılamıyor", "Couldn't update app." : "Uygulama güncellenemedi.", "Add trusted domain" : "Güvenilir alan adı ekle", "Migration in progress. Please wait until the migration is finished" : "Taşınma sürüyor. Lütfen taşınma tamamlanana kadar bekleyin", @@ -51,7 +48,6 @@ "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Resmi uygulamalar topluluk tarafından geliştirilmiştir. Merkezi işlevleri yerine getirdikleri gibi kullanıma da hazırdırlar.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Onaylanan uygulamalar güvenilir geliştiriciler tarafından geliştirilir ve detaylı olmayan bir güvenlik kontrolünden geçirilir. Bunlar açık kaynak kod deposunda bulunmakta ve normal kullanım için kararlı oldukları varsayılmaktadır.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Bu uygulama güvenlik kontrolünden geçmedi veya yeni ya da kararsız olarak bilinmektedir. Kendiniz bu riski alarak yükleyebilirsiniz.", - "Please wait...." : "Lütfen bekleyin....", "Error while disabling app" : "Uygulama devre dışı bırakılırken hata", "Disable" : "Devre Dışı Bırak", "Enable" : "Etkinleştir", @@ -211,7 +207,6 @@ "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Bu uygulama için atanan en yüksek Nextcloud sürümü bulunmuyor. Bu ileride bir hata olacaktır.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Bu uygulama, aşağıdaki bağımlılıklar sağlanmadığından yüklenemiyor:", "Enable only for specific groups" : "Sadece belirli gruplar için etkinleştir", - "Uninstall App" : "Uygulamayı Kaldır", "SSL Root Certificates" : "SSL Kök Sertifikaları", "Common Name" : "Ortak Ad", "Valid until" : "Geçerlilik", @@ -285,7 +280,11 @@ "Default" : "Öntanımlı", "log-level out of allowed range" : "günlük seviyesi izin verilen aralık dışında", "Language changed" : "Dil değiştirildi", + "Admins can't remove themself from the admin group" : "Yöneticiler kendilerini admin grubundan kaldıramaz", + "Unable to add user to group %s" : "Kullanıcı %s grubuna eklenemiyor", + "Unable to remove user from group %s" : "%s grubundan kullanıcı kaldırılamıyor", "Are you really sure you want add \"{domain}\" as trusted domain?" : "\"{domain}\" alan adını güvenilir alan adı olarak eklemek istediğinizden emin misiniz?", + "Please wait...." : "Lütfen bekleyin....", "iPhone" : "iPhone", "Everything (fatal issues, errors, warnings, info, debug)" : "Her şey (Ciddi sorunlar, hatalar, uyarılar, bilgi, hata ayıklama)", "Info, warnings, errors and fatal issues" : "Bilgi, uyarılar, hatalar ve ciddi sorunlar", @@ -304,14 +303,10 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Özellikle dosya eşitleme için masaüstü istemcisi kullanılırken SQLite kullanımı önerilmez.", "Experimental applications ahead" : "İlerideki deneysel uygulamalar", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Deneysel uygulamalar güvenlik açısından denetlenmemiş, yeni veya kararsız olmaya açık ya da geliştirilme aşamasında olan uygulamalardır. Yüklemek veri kaybı veya güvenlik açıklarına sebep olabilir.", + "Uninstall App" : "Uygulamayı Kaldır", "Enable experimental apps" : "Deneysel uygulamaları etkinleştir", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Merhaba,

    Sadece artık bir %s hesabınızın olduğunu söylemek istedim.

    Kullanıcı adınız: %s
    Şuradan erişin: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Merhaba,\n\nSadece, artık bir %s hesabınızın olduğunu söylemek istedim.\n\nKullanıcı adınız: %s\nErişim: %s\n\n", - "Group" : "Grup", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "Harici Depolama", - "Updates" : "Güncellemeler", - "An error occurred: {message}" : "Bir hata oluştu: {message}" + "Group" : "Grup" },"pluralForm" :"nplurals=2; plural=(n > 1);" } \ No newline at end of file diff --git a/settings/l10n/ug.js b/settings/l10n/ug.js index 23c82ac55cea2915b97e7da50c3b0182e5c4e3a1..c93f085439de1d0ae6e6c0acea21b55bf05b290f 100644 --- a/settings/l10n/ug.js +++ b/settings/l10n/ug.js @@ -4,12 +4,8 @@ OC.L10N.register( "Authentication error" : "سالاھىيەت دەلىللەش خاتالىقى", "Invalid request" : "ئىناۋەتسىز ئىلتىماس", "Email saved" : "تورخەت ساقلاندى", - "Admins can't remove themself from the admin group" : "باشقۇرغۇچى ئۆزىنى باشقۇرۇش گۇرۇپپىسىدىن چىقىرىۋېتەلمەيدۇ", - "Unable to add user to group %s" : "ئىشلەتكۈچىنى %s گۇرۇپپىغا قوشالمايدۇ", - "Unable to remove user from group %s" : "ئىشلەتكۈچىنى %s گۇرۇپپىدىن چىقىرىۋېتەلمەيدۇ", "Couldn't update app." : "ئەپنى يېڭىلىيالمايدۇ.", "All" : "ھەممىسى", - "Please wait...." : "سەل كۈتۈڭ…", "Disable" : "چەكلە", "Enable" : "قوزغات", "Updating...." : "يېڭىلاۋاتىدۇ…", @@ -47,6 +43,10 @@ OC.L10N.register( "set new password" : "يېڭى ئىم تەڭشە", "Default" : "كۆڭۈلدىكى", "Language changed" : "تىل ئۆزگەردى", + "Admins can't remove themself from the admin group" : "باشقۇرغۇچى ئۆزىنى باشقۇرۇش گۇرۇپپىسىدىن چىقىرىۋېتەلمەيدۇ", + "Unable to add user to group %s" : "ئىشلەتكۈچىنى %s گۇرۇپپىغا قوشالمايدۇ", + "Unable to remove user from group %s" : "ئىشلەتكۈچىنى %s گۇرۇپپىدىن چىقىرىۋېتەلمەيدۇ", + "Please wait...." : "سەل كۈتۈڭ…", "Log" : "خاتىرە", "More" : "تېخىمۇ كۆپ", "Less" : "ئاز" diff --git a/settings/l10n/ug.json b/settings/l10n/ug.json index 5130f148f2662406833ec04c27111f95c26d8bcd..70a46e94da034e3ddb8ce32b5b24baaa98c34851 100644 --- a/settings/l10n/ug.json +++ b/settings/l10n/ug.json @@ -2,12 +2,8 @@ "Authentication error" : "سالاھىيەت دەلىللەش خاتالىقى", "Invalid request" : "ئىناۋەتسىز ئىلتىماس", "Email saved" : "تورخەت ساقلاندى", - "Admins can't remove themself from the admin group" : "باشقۇرغۇچى ئۆزىنى باشقۇرۇش گۇرۇپپىسىدىن چىقىرىۋېتەلمەيدۇ", - "Unable to add user to group %s" : "ئىشلەتكۈچىنى %s گۇرۇپپىغا قوشالمايدۇ", - "Unable to remove user from group %s" : "ئىشلەتكۈچىنى %s گۇرۇپپىدىن چىقىرىۋېتەلمەيدۇ", "Couldn't update app." : "ئەپنى يېڭىلىيالمايدۇ.", "All" : "ھەممىسى", - "Please wait...." : "سەل كۈتۈڭ…", "Disable" : "چەكلە", "Enable" : "قوزغات", "Updating...." : "يېڭىلاۋاتىدۇ…", @@ -45,6 +41,10 @@ "set new password" : "يېڭى ئىم تەڭشە", "Default" : "كۆڭۈلدىكى", "Language changed" : "تىل ئۆزگەردى", + "Admins can't remove themself from the admin group" : "باشقۇرغۇچى ئۆزىنى باشقۇرۇش گۇرۇپپىسىدىن چىقىرىۋېتەلمەيدۇ", + "Unable to add user to group %s" : "ئىشلەتكۈچىنى %s گۇرۇپپىغا قوشالمايدۇ", + "Unable to remove user from group %s" : "ئىشلەتكۈچىنى %s گۇرۇپپىدىن چىقىرىۋېتەلمەيدۇ", + "Please wait...." : "سەل كۈتۈڭ…", "Log" : "خاتىرە", "More" : "تېخىمۇ كۆپ", "Less" : "ئاز" diff --git a/settings/l10n/uk.js b/settings/l10n/uk.js index 1df27fc1acc43f4014c00a52f9b506db1fa0249a..0ba5efbf720d60b10148acafed46598741a3a4bc 100644 --- a/settings/l10n/uk.js +++ b/settings/l10n/uk.js @@ -36,9 +36,6 @@ OC.L10N.register( "Unable to change mail address" : "Неможливо поміняти email адресу", "Email saved" : "Адресу збережено", "Couldn't remove app." : "Неможливо видалити додаток.", - "Admins can't remove themself from the admin group" : "Адміністратор не може видалити себе з групи адміністраторів", - "Unable to add user to group %s" : "Не вдалося додати користувача у групу %s", - "Unable to remove user from group %s" : "Не вдалося видалити користувача із групи %s", "Couldn't update app." : "Не вдалося оновити додаток. ", "Add trusted domain" : "Додати довірений домен", "Migration in progress. Please wait until the migration is finished" : "Міграція триває. Будь ласка, зачекайте доки процес міграції завершиться", @@ -50,7 +47,6 @@ OC.L10N.register( "No apps found for your version" : "Немає застосунків для вашої версії", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Схвалені додатки розроблені довіреними розробниками і пройшли незалежну перевірку безпеки. Їх активно супроводжують у репозиторії з відкритим кодом, а їх розробники стежать, щоб вони були стабільні й прийнятні для повсякденного використання.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ця програма не перевірена на вразливості безпеки і є новою або нестабільною. Встановлюйте її на власний ризик.", - "Please wait...." : "Зачекайте, будь ласка...", "Error while disabling app" : "Помилка вимикання додатка", "Disable" : "Вимкнути", "Enable" : "Увімкнути", @@ -163,7 +159,6 @@ OC.L10N.register( "Hide description …" : "Сховати деталі ...", "This app cannot be installed because the following dependencies are not fulfilled:" : "Ця програма не може бути встановлено, так як наступні залежності не будуть виконані:", "Enable only for specific groups" : "Включити тільки для конкретних груп", - "Uninstall App" : "Видалити додаток", "Common Name" : "Ім'я:", "Valid until" : "Дійсно до", "Issued By" : "Виданий", @@ -220,7 +215,11 @@ OC.L10N.register( "Default" : "За замовчуванням", "log-level out of allowed range" : "рівень протоколювання перевищує дозволені межі", "Language changed" : "Мову змінено", + "Admins can't remove themself from the admin group" : "Адміністратор не може видалити себе з групи адміністраторів", + "Unable to add user to group %s" : "Не вдалося додати користувача у групу %s", + "Unable to remove user from group %s" : "Не вдалося видалити користувача із групи %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ви дійсно бажаєте додати \"{domain}\" як довірений домен?", + "Please wait...." : "Зачекайте, будь ласка...", "Everything (fatal issues, errors, warnings, info, debug)" : "Усі (критичні проблеми, помилки, попередження, інформаційні, налагодження)", "Info, warnings, errors and fatal issues" : "Інформаційні, попередження, помилки та критичні проблеми", "Warnings, errors and fatal issues" : "Попередження, помилки та критичні проблеми", @@ -237,13 +236,10 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Особливо сумнівне використання SQLite при синхронізації файлів з використанням клієнта для ПК.", "Experimental applications ahead" : "Спершу експериментальні додатки", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Експериментальні додатки не перевірені на наявність проблем безпеки, нові або нестабільні і в процесі активної розробки. Встановлення їх може спричинити втрату даних або дірки в безпеці.", + "Uninstall App" : "Видалити додаток", "Enable experimental apps" : "Увімкнути експериментальні застосунки", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Агов,

    просто щоб ви знали, у вас є аккаунт %s.

    Ваше ім'я користувача: %s
    Перейдіть сюди: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Агов,\n\nпросто щоб ви знали, у вас є аккаунт %s.\n\nВаше ім'я користувача: %s\nПерейдіть сюди: %s\n\n", - "Group" : "Група", - "Redis" : "Redis", - "External Storage" : "Зовнішні сховища", - "Updates" : "Оновлення", - "An error occurred: {message}" : "Сталася помилка: {message}" + "Group" : "Група" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/settings/l10n/uk.json b/settings/l10n/uk.json index e660970f1ecb11a6ff7575121407c411ea1e476e..948dc4de7ee1e49f22ed8bf434c49bc5129f7bb5 100644 --- a/settings/l10n/uk.json +++ b/settings/l10n/uk.json @@ -34,9 +34,6 @@ "Unable to change mail address" : "Неможливо поміняти email адресу", "Email saved" : "Адресу збережено", "Couldn't remove app." : "Неможливо видалити додаток.", - "Admins can't remove themself from the admin group" : "Адміністратор не може видалити себе з групи адміністраторів", - "Unable to add user to group %s" : "Не вдалося додати користувача у групу %s", - "Unable to remove user from group %s" : "Не вдалося видалити користувача із групи %s", "Couldn't update app." : "Не вдалося оновити додаток. ", "Add trusted domain" : "Додати довірений домен", "Migration in progress. Please wait until the migration is finished" : "Міграція триває. Будь ласка, зачекайте доки процес міграції завершиться", @@ -48,7 +45,6 @@ "No apps found for your version" : "Немає застосунків для вашої версії", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Схвалені додатки розроблені довіреними розробниками і пройшли незалежну перевірку безпеки. Їх активно супроводжують у репозиторії з відкритим кодом, а їх розробники стежать, щоб вони були стабільні й прийнятні для повсякденного використання.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ця програма не перевірена на вразливості безпеки і є новою або нестабільною. Встановлюйте її на власний ризик.", - "Please wait...." : "Зачекайте, будь ласка...", "Error while disabling app" : "Помилка вимикання додатка", "Disable" : "Вимкнути", "Enable" : "Увімкнути", @@ -161,7 +157,6 @@ "Hide description …" : "Сховати деталі ...", "This app cannot be installed because the following dependencies are not fulfilled:" : "Ця програма не може бути встановлено, так як наступні залежності не будуть виконані:", "Enable only for specific groups" : "Включити тільки для конкретних груп", - "Uninstall App" : "Видалити додаток", "Common Name" : "Ім'я:", "Valid until" : "Дійсно до", "Issued By" : "Виданий", @@ -218,7 +213,11 @@ "Default" : "За замовчуванням", "log-level out of allowed range" : "рівень протоколювання перевищує дозволені межі", "Language changed" : "Мову змінено", + "Admins can't remove themself from the admin group" : "Адміністратор не може видалити себе з групи адміністраторів", + "Unable to add user to group %s" : "Не вдалося додати користувача у групу %s", + "Unable to remove user from group %s" : "Не вдалося видалити користувача із групи %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ви дійсно бажаєте додати \"{domain}\" як довірений домен?", + "Please wait...." : "Зачекайте, будь ласка...", "Everything (fatal issues, errors, warnings, info, debug)" : "Усі (критичні проблеми, помилки, попередження, інформаційні, налагодження)", "Info, warnings, errors and fatal issues" : "Інформаційні, попередження, помилки та критичні проблеми", "Warnings, errors and fatal issues" : "Попередження, помилки та критичні проблеми", @@ -235,13 +234,10 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Особливо сумнівне використання SQLite при синхронізації файлів з використанням клієнта для ПК.", "Experimental applications ahead" : "Спершу експериментальні додатки", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Експериментальні додатки не перевірені на наявність проблем безпеки, нові або нестабільні і в процесі активної розробки. Встановлення їх може спричинити втрату даних або дірки в безпеці.", + "Uninstall App" : "Видалити додаток", "Enable experimental apps" : "Увімкнути експериментальні застосунки", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "Агов,

    просто щоб ви знали, у вас є аккаунт %s.

    Ваше ім'я користувача: %s
    Перейдіть сюди: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Агов,\n\nпросто щоб ви знали, у вас є аккаунт %s.\n\nВаше ім'я користувача: %s\nПерейдіть сюди: %s\n\n", - "Group" : "Група", - "Redis" : "Redis", - "External Storage" : "Зовнішні сховища", - "Updates" : "Оновлення", - "An error occurred: {message}" : "Сталася помилка: {message}" + "Group" : "Група" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" } \ No newline at end of file diff --git a/settings/l10n/vi.js b/settings/l10n/vi.js index 7ebe8f3a66861afd306d8e9f1d352d728774fe50..cd73020bddb2bbabde8aa672beefac8d14f2a7d9 100644 --- a/settings/l10n/vi.js +++ b/settings/l10n/vi.js @@ -9,12 +9,8 @@ OC.L10N.register( "Unable to change full name" : "Họ và tên không thể đổi ", "Your full name has been changed." : "Họ và tên đã được thay đổi.", "Email saved" : "Lưu email", - "Admins can't remove themself from the admin group" : "Quản trị viên không thể loại bỏ chính họ khỏi nhóm quản lý", - "Unable to add user to group %s" : "Không thể thêm người dùng vào nhóm %s", - "Unable to remove user from group %s" : "Không thể xóa người dùng từ nhóm %s", "Couldn't update app." : "Không thể cập nhật ứng dụng", "All" : "Tất cả", - "Please wait...." : "Xin hãy đợi...", "Disable" : "Tắt", "Enable" : "Bật", "Updating...." : "Đang cập nhật...", @@ -63,10 +59,13 @@ OC.L10N.register( "set new password" : "đặt mật khẩu mới", "Default" : "Mặc định", "Language changed" : "Ngôn ngữ đã được thay đổi", + "Admins can't remove themself from the admin group" : "Quản trị viên không thể loại bỏ chính họ khỏi nhóm quản lý", + "Unable to add user to group %s" : "Không thể thêm người dùng vào nhóm %s", + "Unable to remove user from group %s" : "Không thể xóa người dùng từ nhóm %s", + "Please wait...." : "Xin hãy đợi...", "Log" : "Log", "More" : "hơn", "Less" : "ít", - "Group" : "N", - "External Storage" : "Lưu trữ ngoài" + "Group" : "N" }, "nplurals=1; plural=0;"); diff --git a/settings/l10n/vi.json b/settings/l10n/vi.json index bdbe044ba1a074535dc2f8755d5ae95677c23065..cd1a4245ca06cf3c59739c46e0ee2363d03612c3 100644 --- a/settings/l10n/vi.json +++ b/settings/l10n/vi.json @@ -7,12 +7,8 @@ "Unable to change full name" : "Họ và tên không thể đổi ", "Your full name has been changed." : "Họ và tên đã được thay đổi.", "Email saved" : "Lưu email", - "Admins can't remove themself from the admin group" : "Quản trị viên không thể loại bỏ chính họ khỏi nhóm quản lý", - "Unable to add user to group %s" : "Không thể thêm người dùng vào nhóm %s", - "Unable to remove user from group %s" : "Không thể xóa người dùng từ nhóm %s", "Couldn't update app." : "Không thể cập nhật ứng dụng", "All" : "Tất cả", - "Please wait...." : "Xin hãy đợi...", "Disable" : "Tắt", "Enable" : "Bật", "Updating...." : "Đang cập nhật...", @@ -61,10 +57,13 @@ "set new password" : "đặt mật khẩu mới", "Default" : "Mặc định", "Language changed" : "Ngôn ngữ đã được thay đổi", + "Admins can't remove themself from the admin group" : "Quản trị viên không thể loại bỏ chính họ khỏi nhóm quản lý", + "Unable to add user to group %s" : "Không thể thêm người dùng vào nhóm %s", + "Unable to remove user from group %s" : "Không thể xóa người dùng từ nhóm %s", + "Please wait...." : "Xin hãy đợi...", "Log" : "Log", "More" : "hơn", "Less" : "ít", - "Group" : "N", - "External Storage" : "Lưu trữ ngoài" + "Group" : "N" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/settings/l10n/zh_CN.js b/settings/l10n/zh_CN.js index efbb86447ddad3bfc99228ce57b9aa988ac4092f..9392b2d92e1250b9c7915039472e14111e0c2647 100644 --- a/settings/l10n/zh_CN.js +++ b/settings/l10n/zh_CN.js @@ -3,58 +3,63 @@ OC.L10N.register( { "Enabled" : "开启", "Not enabled" : "未启用", - "Wrong password" : "错误密码", + "Wrong password" : "密码错误", "Saved" : "已保存", "No user supplied" : "没有满足的用户", - "Unable to change password" : "不能更改密码", + "Unable to change password" : "无法修改密码", "Authentication error" : "认证错误", - "Please provide an admin recovery password, otherwise all user data will be lost" : "请提供管理员恢复密码,否则所有用户的数据都将遗失。", - "Wrong admin recovery password. Please check the password and try again." : "错误的管理员恢复密码。请检查密码并重试。", - "Backend doesn't support password change, but the user's encryption key was successfully updated." : "后端不支持密码更改,但用户的加密密钥已成功更新。", + "Please provide an admin recovery password, otherwise all user data will be lost" : "请提供管理员恢复密码, 否则所有用户的数据都将丢失.", + "Wrong admin recovery password. Please check the password and try again." : "错误的管理员恢复密码. 请检查密码并重试.", + "Backend doesn't support password change, but the user's encryption key was successfully updated." : "后端不支持修改密码, 但用户的加密密钥已成功更新.", "installing and updating apps via the app store or Federated Cloud Sharing" : "通过应用程序商店或联合云共享安装和更新应用程序", "Federated Cloud Sharing" : "联合云共享", - "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL使用了过时 %s 版本 (%s)。请更新你的操作系统或功能比如 %s 将无法可靠地工作。", - "A problem occurred, please check your log files (Error: %s)" : "出现了故障,请检查你的日志文件 (错误: %s)", + "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL 当前使用的过时 %s 的版本 (%s). 请更新你的操作系统或组件, 例如 %s 将无法可靠地工作.", + "A problem occurred, please check your log files (Error: %s)" : "出现了问题, 请检查您的日志文件 (错误: %s)", "Migration Completed" : "迁移完成", - "Group already exists." : "组已经存在。", - "Unable to add group." : "无法添加组。", - "Unable to delete group." : "无法删除组", + "Group already exists." : "分组已经存在.", + "Unable to add group." : "无法添加分组.", + "Unable to delete group." : "无法删除分组.", "test email settings" : "测试电子邮件设置", - "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "在发送电子邮件时出现问题。请修改您的设置。 (错误: %s)", + "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "在发送电子邮件时出现问题. 请修正您的设置. (错误: %s)", "Email sent" : "邮件已发送", - "You need to set your user email before being able to send test emails." : "在发送测试邮件前您需要设置您的用户电子邮件。", + "You need to set your user email before being able to send test emails." : "在发送测试邮件前您需要设置您的电子邮件地址.", "Invalid request" : "无效请求", "Invalid mail address" : "无效的电子邮件地址", - "A user with that name already exists." : "使用该名称的用户已存在。", - "Unable to create user." : "无法创建用户。", + "No valid group selected" : "没有选择有效的分组", + "A user with that name already exists." : "使用该名称的用户已存在.", + "Unable to create user." : "无法创建用户.", "Your %s account was created" : "你的帐户 %s 已创建", - "Unable to delete user." : "不能删除用户", + "Unable to delete user." : "无法删除用户", + "Settings saved" : "设置已保存", "Unable to change full name" : "无法修改全名", - "Your full name has been changed." : "您的全名已修改。", + "Unable to change email address" : "无法修改电子邮箱地址", + "Your full name has been changed." : "您的全名已修改.", "Forbidden" : "被禁止", - "Invalid user" : "用户无效", - "Unable to change mail address" : "无法更改邮箱地址", + "Invalid user" : "无效用户", + "Unable to change mail address" : "无法修改电子邮箱地址", "Email saved" : "电子邮件已保存", - "Couldn't remove app." : "无法删除应用。", - "Admins can't remove themself from the admin group" : "管理员不能将自己移出管理组。", - "Unable to add user to group %s" : "无法把用户增加到组 %s", - "Unable to remove user from group %s" : "无法从组%s中移除用户", - "Couldn't update app." : "无法更新应用。", - "Add trusted domain" : "添加信任域", - "Migration in progress. Please wait until the migration is finished" : "迁移正在进行中。请等待,直到完成迁移", + "Password confirmation is required" : "需要密码确认", + "Couldn't remove app." : "无法删除应用.", + "Couldn't update app." : "无法更新应用.", + "Are you really sure you want add {domain} as trusted domain?" : "您确定将 {domain} 添加为信任的域名么?", + "Add trusted domain" : "添加信任域名", + "Migration in progress. Please wait until the migration is finished" : "正在进行迁移. 请稍等, 直到迁移完成", "Migration started …" : "迁移开始...", + "Not saved" : "未保存", "Sending..." : "正在发送...", "Official" : "官方", "All" : "全部", "Update to %s" : "更新为 %s", "_You have %n app update pending_::_You have %n app updates pending_" : ["%n 个应用正在等待升级"], "No apps found for your version" : "未找到适合当前版本的应用", - "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "已认可的应用是由值得信赖的开发商开发,并已通过了一个粗略的安全检查。他们放在一个开放的代码库并且维护人员认为他们是稳定的差不多可以正常使用。", - "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "此应用未检查安全问题,它是新的或已知是不稳定的。安装风险自担。", - "Please wait...." : "请稍等....", + "The app will be downloaded from the app store" : "该应用将从应用商店下载", + "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "官方应用由社区和内部开发. 其可以提供核心功能并保证生产用途.", + "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "认证应用由值得信赖的开发者开发, 并通过了一个粗略的安全检查. 其在开放的代码库中活跃地维护, 他们的维护者认为在普通用途足够稳定.", + "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "此应用没有检查安全问题, 它是新的或已知不稳定的. 安装风险自担.", + "Enabling app …" : "正在启用应用程序...", "Error while disabling app" : "禁用应用时出错", "Disable" : "禁用", - "Enable" : "开启", + "Enable" : "启用", "Error while enabling app" : "启用应用时出错", "Error: this app cannot be enabled because it makes the server unstable" : "错误: 无法启用应用因为它会导致服务器不稳定", "Error: could not disable broken app" : "错误: 无法禁用损坏的应用", @@ -62,31 +67,70 @@ OC.L10N.register( "Updating...." : "正在更新....", "Error while updating app" : "更新应用时出错", "Updated" : "已更新", - "Uninstalling ...." : "卸载中....", + "Uninstalling ...." : "正在卸载....", "Error while uninstalling app" : "卸载应用时发生了一个错误", "Uninstall" : "卸载", - "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "该应用已启用,但是需要更新。5秒后将跳转到更新页面。", - "App update" : "应用更新", - "Approved" : "已认可", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "该应用已启用, 但是需要更新. 5秒后将跳转到更新页面.", + "App update" : "更新应用", + "Approved" : "已认证", "Experimental" : "实验", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "出现了一个错误。请上传 ASCII 编码的 PEM 证书。", + "No apps found for {query}" : "找不到符合 {query} 的应用", + "Allow filesystem access" : "允许访问文件系统", + "Disconnect" : "断开连接", + "Revoke" : "撤销", + "Internet Explorer" : "Internet Explorer", + "Edge" : "Edge", + "Firefox" : "Firefox", + "Google Chrome" : "Google Chrome", + "Safari" : "Safari", + "Google Chrome for Android" : "Google Chrome for Android", + "iPhone iOS" : "iPhone iOS", + "iPad iOS" : "iPad iOS", + "iOS Client" : "iOS 客户端", + "Android Client" : "Android 客户端", + "Sync client - {os}" : "同步客户端 - {os}", + "This session" : "当前会话", + "Copy" : "复制", + "Copied!" : "已复制!", + "Not supported!" : "不支持!", + "Press ⌘-C to copy." : "按 ⌘-C 键复制.", + "Press Ctrl-C to copy." : "按 Ctrl-C 复制.", + "Error while loading browser sessions and device tokens" : "加载浏览器会话和设备令牌时出错", + "Error while creating device token" : "创建设备令牌时出错", + "Error while deleting the token" : "删除令牌时出错", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "出现了一个错误. 请上传 ASCII 编码的 PEM 证书.", "Valid until {date}" : "有效期至 {date}", "Delete" : "删除", + "Local" : "本地", + "Private" : "私有", + "Only visible to local users" : "仅对本地用户可见", + "Only visible to you" : "仅您自己可见", + "Contacts" : "联系人", + "Visible to local users and to trusted servers" : "仅对本地用户和信任的服务器可见", + "Public" : "公开", + "Will be synced to a global and public address book" : "将同步到全局和公开地址簿中", "Select a profile picture" : "选择头像", "Very weak password" : "非常弱的密码", "Weak password" : "弱密码", "So-so password" : "一般强度的密码", "Good password" : "较强的密码", "Strong password" : "强密码", - "Groups" : "组", + "Groups" : "分组", "Unable to delete {objName}" : "无法删除 {objName}", - "Error creating group: {message}" : "创建组时出错: {message}", - "A valid group name must be provided" : "请提供一个有效的组名称", + "Error creating group: {message}" : "创建分组时出错: {message}", + "A valid group name must be provided" : "请提供一个有效的分组名称", "deleted {groupName}" : "已删除 {groupName}", "undo" : "撤销", "never" : "从不", "deleted {userName}" : "已删除 {userName}", - "Changing the password will result in data loss, because data recovery is not available for this user" : "更改密码会导致数据丢失,因为数据恢复不适用于此用户", + "Unable to add user to group {group}" : "无法将用户添加到分组 {group}", + "Unable to remove user from group {group}" : "无法从分组 {group} 中移除用户", + "Add group" : "添加分组", + "Invalid quota value \"{val}\"" : "无效的配额值 \"{val}\"", + "no group" : "没有分组", + "Password successfully changed" : "密码修改成功", + "Changing the password will result in data loss, because data recovery is not available for this user" : "修改密码会导致数据丢失, 因为数据恢复不适用于此用户", + "Could not change the users email" : "无法修改用户电子邮箱地址", "A valid username must be provided" : "必须提供合法的用户名", "Error creating user: {message}" : "创建用户出错: {message}", "A valid password must be provided" : "必须提供合法的密码", @@ -94,14 +138,18 @@ OC.L10N.register( "__language_name__" : "简体中文", "Unlimited" : "无限", "Personal info" : "个人信息", - "Sync clients" : "客户端", + "Sessions" : "会话", + "App passwords" : "应用密码", + "Sync clients" : "同步客户端", "None" : "无", "Login" : "登录", - "Plain" : "Plain", + "Plain" : "明文", "NT LAN Manager" : "NT LAN 管理器", + "SSL/TLS" : "SSL/TLS", + "STARTTLS" : "STARTTLS", "Email server" : "电子邮件服务器", "Open documentation" : "打开文档", - "This is used for sending out notifications." : "这被用于发送通知。", + "This is used for sending out notifications." : "这被用于发送通知.", "Send mode" : "发送模式", "Encryption" : "加密", "From address" : "来自地址", @@ -118,39 +166,47 @@ OC.L10N.register( "Send email" : "发送邮件", "Server-side encryption" : "服务器端加密", "Enable server-side encryption" : "启用服务器端加密", - "Please read carefully before activating server-side encryption: " : "在激活服务器端加密之前,请仔细阅读:", - "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "一旦加密被启用,之后上传到服务器的所有文件都将服务器上加密。只有当启用状态的加密模块支持解密并且所有的先决条件(例如,设定恢复键)得到满足时才能解除加密。", - "Be aware that encryption always increases the file size." : "请注意,加密会增加文件大小。", - "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "定期备份数据有利于保证数据完整,并且确保备份您的加密数据和加密密钥。", - "This is the final warning: Do you really want to enable encryption?" : "这是最后一次警告:你真的想启用加密?", + "Please read carefully before activating server-side encryption: " : "在激活服务器端加密之前, 请仔细阅读:", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "一旦加密被启用, 之后上传到服务器的所有文件都将服务器上加密. 只有当启用状态的加密模块支持解密并且所有前提都满足时 (例如: 设定恢复密钥) 才能解除加密.", + "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "单独的加密不能保证系统的安全性. 请参考加密应用工作原理和支持的用例的文档获取更多信息", + "Be aware that encryption always increases the file size." : "请注意, 加密会增加文件大小.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "定期备份数据有助于保证数据完整, 并且确保备份您的加密数据和加密密钥.", + "This is the final warning: Do you really want to enable encryption?" : "这是最后一次警告: 你确定要启用加密?", "Enable encryption" : "启用加密", - "No encryption module loaded, please enable an encryption module in the app menu." : "没有加载加密模块,请在 APP 应用菜单中启用加密模块。", - "Select default encryption module:" : "选择默认的加密模块:", - "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run 'occ encryption:migrate'" : "你需要升级你的加密密钥 (旧版 ownCloud <= 8.0) 。 请在应用中启用 \\\"Default encryption module\\\" 并运行 'occ encryption:migrate'", - "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "您需要将加密密钥从旧版(ownCloud<=8.0)迁移到新版。", + "No encryption module loaded, please enable an encryption module in the app menu." : "没有加载加密模块, 请在 APP 应用菜单中启用加密模块.", + "Select default encryption module:" : "选择默认的加密模块:", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run 'occ encryption:migrate'" : "您需要从旧版本 (ownCloud <= 8.0) 迁移您的加密密钥. 请在应用中启用 \\\"Default encryption module\\\" 并运行 'occ encryption:migrate'", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "您需要从旧版本 (ownCloud<=8.0) 迁移您的加密密钥.", "Start migration" : "开始迁移", "Security & setup warnings" : "安全及设置警告", - "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP 似乎没有设置好查询的系统环境变量。 用 getenv(\\\"PATH\\\") 测试只返回一个空值。", - "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "只读配置已启用。这样可防止通过 WEB 接口设置一些配置。此外,每次更新后该文件需要手动设置为可写。", - "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP 被设置为移除行内 块,这将导致数个核心应用无法访问。", - "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "这可能是由缓存/加速器造成的,例如 Zend OPcache 或 eAccelerator。", - "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP模块'文件信息'丢失. 我们强烈建议启用此模块以便mime类型检测取得最佳结果.", - "System locale can not be set to a one which supports UTF-8." : "系统语系无法设置为支持 UTF-8 的语系。", - "This means that there might be problems with certain characters in file names." : "这意味着一些文件名中的特定字符可能有问题。", - "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "我们强烈建议安装在系统上所需的软件包支持以下区域设置之一: %s.", - "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "如果你不是安装在网域根目录而且又使用系统定时计划任务,那么可以导致 URL 链接生成问题。为了避免这些问题,请在你的 Config.php 文件中设置 \\\"overwrite.cli.url\\\" 选项为 webroot 安装根目录 (建议: \\\"%s\\\")", - "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "由于下面的错误,无法通过 CLI 执行定时计划任务:", - "All checks passed." : "所有检查已通过。", + "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP 的设置似乎有问题, 无法获取系统环境变量. 使用 getenv(\\\"PATH\\\") 测试时仅返回空结果.", + "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "请检查 安装文档 ↗ 中关于 PHP 配置的说明并在您的服务器中进行配置, 尤其是使用 php-fpm 时.", + "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "已启用只读配置. 这将阻止在 Web 界面中进行设置. 此外, 每次更新后该文件需要手动设置为可写入.", + "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP 被设置为移除内联块, 这将导致多个核心应用无法访问.", + "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "这可能是由缓存/加速器造成的, 例如 Zend OPcache 或 eAccelerator.", + "Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "您的数据库不能在 \"READ COMMITTED\" 事务隔离级别运行. 这样可能导致在多个并行操作时出现问题.", + "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "已安装 %1$s 的低版本 %2$s. 出于稳定性和性能的原因, 我们建议您升级到更新的 %1$s 版本.", + "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP 模块 'fileinfo' 缺失. 我们强烈建议启用此模块以便在 MIME 类型检测时获得最准确的结果.", + "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "事务文件锁被禁用, 这可能导致竞争条件的问题. 在 config.php 中启用 'filelocking.enabled' 选项来避免这些问题. 请参考 文档↗ 获取更多信息.", + "System locale can not be set to a one which supports UTF-8." : "系统区域无法设置为支持 UTF-8 的区域.", + "This means that there might be problems with certain characters in file names." : "这意味着当文件名中包含特定字符时可能出现问题.", + "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "我们强烈建议在您的系统中安装需要的包以支持下列区域: %s.", + "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "如果您不是安装在域名的根目录, 并且使用系统 cron 服务时, 可能导致 URL 生成问题. 为了避免这些问题, 请在您的 config.php 文件中设置 \"overwrite.cli.url\" 选项为您的安装根目录路径 (建议: \"%s\")", + "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "由于下列的技术错误, 无法通过 CLI 执行计划任务:", + "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "请再次检查 安装指南 ↗, 并检查 日志 中的任何错误或警告.", + "All checks passed." : "所有检查已通过.", "Cron" : "计划任务", - "Last cron job execution: %s." : "上次定时任务执行于: %s.", - "Last cron job execution: %s. Something seems wrong." : "上次定时任务执行于: %s. 似乎有些问题。", - "Cron was not executed yet!" : "定时任务还未被执行!", + "Last cron job execution: %s." : "上次定时任务执行于: %s.", + "Last cron job execution: %s. Something seems wrong." : "上次定时任务执行于: %s. 但存在一些问题.", + "Cron was not executed yet!" : "定时任务还未被执行!", "Execute one task with each page loaded" : "每个页面加载后执行一个任务", - "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php 已注册于一个 webcron 服务来通过 http 每 15 分钟执行 cron.php。", - "Use system's cron service to call the cron.php file every 15 minutes." : "使用系统 CRON 服务每 15 分钟执行一次 cron.php 文件。", + "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php 注册到 webcron 服务上, 通过 http 每 15 分钟执行 cron.php.", + "Use system's cron service to call the cron.php file every 15 minutes." : "使用系统 cron 服务每 15 分钟执行一次 cron.php 文件.", + "The cron.php needs to be executed by the system user \"%s\"." : "cron.php 需要被系统用户 \"%s\" 执行.", + "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "为了运行该功能, 您需要 PHP posix 扩展. 请参考 {linkstart}PHP 文档{linkend} 获取更多信息.", "Version" : "版本", "Sharing" : "共享", - "Allow apps to use the Share API" : "允许应用软件使用共享API", + "Allow apps to use the Share API" : "允许应用使用共享 API", "Allow users to share via link" : "允许用户通过链接分享文件", "Allow public uploads" : "允许公开上传", "Enforce password protection" : "强制密码保护", @@ -158,93 +214,143 @@ OC.L10N.register( "Expire after " : "过期于", "days" : "天", "Enforce expiration date" : "强制过期日期", - "Allow resharing" : "允许再次共享", + "Allow resharing" : "允许二次共享", "Allow sharing with groups" : "允许群组共享", "Restrict users to only share with users in their groups" : "限制仅与组内用户分享", "Exclude groups from sharing" : "在分享中排除组", - "These groups will still be able to receive shares, but not to initiate them." : "这些组将仍可以获取分享,但无法向他人分享。", - "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "允许在共享对话框中的自动补全用户名。如果被禁用,需要输入用户全名。", - "Tips & tricks" : "技巧提示", - "How to do backups" : "如何做备份", + "These groups will still be able to receive shares, but not to initiate them." : "这些组将仍可以获取分享, 但无法向他人分享.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "允许在共享对话框中自动补全用户名. 如果被禁用, 需要输入完整的用户名.", + "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "在公开链接上传页中显示免责声明. (仅当文件列表隐藏时显示)", + "This text will be shown on the public link upload page when the file list is hidden." : "这些内容将在公开链接上传页中当文件列表隐藏时显示.", + "Tips & tricks" : "小提示", + "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite 当前被用作数据库. 对于较大数据量的安装和使用, 我们建议您切换到不同的数据库后端.", + "This is particularly recommended when using the desktop client for file synchronisation." : "当时用桌面客户端同步文件时特别推荐.", + "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "合并其他数据库可以使用命令行工具: 'occ db:convert-type', 或查看 文档 ↗.", + "How to do backups" : "如何备份", "Advanced monitoring" : "高级监控", "Performance tuning" : "性能优化", - "Improving the config.php" : "正在优化 config.php", + "Improving the config.php" : "优化 config.php", "Theming" : "主题", "Hardening and security guidance" : "强化和安全指南", "Developer documentation" : "开发者文档", + "by %s" : "由 %s", "%s-licensed" : "%s-许可协议", - "Documentation:" : "文档:", + "Documentation:" : "文档:", "User documentation" : "用户文档", "Admin documentation" : "管理员文档", + "Visit website" : "访问网站", + "Report a bug" : "报告问题", "Show description …" : "显示描述...", "Hide description …" : "隐藏描述...", - "This app has an update available." : "此应用有可用的更新。", - "This app cannot be installed because the following dependencies are not fulfilled:" : "此应用程序无法安装,因为以下依赖性不满足:", - "Enable only for specific groups" : "仅对特定的组开放", - "Uninstall App" : "卸载应用", + "This app has an update available." : "此应用有可用的更新.", + "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "该应用没有指定支持的 Nextcloud 最低版本. 可能会在将来出现问题.", + "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "该应用没有指定支持的 Nextcloud 最高版本. 可能会在将来出现问题.", + "This app cannot be installed because the following dependencies are not fulfilled:" : "无法安装应用, 因为无法满足下列依赖: ", + "Enable only for specific groups" : "仅特定组启用", + "Uninstall app" : "卸载应用", "SSL Root Certificates" : "SSL 根证书", "Common Name" : "通用名称", "Valid until" : "有效期至", "Issued By" : "授权由", "Valid until %s" : "有效期至 %s", "Import root certificate" : "导入根证书", - "Cheers!" : "干杯!", + "Hey there,

    just letting you know that you now have a %s account.

    Your username: %s
    Access it: %s

    " : "您好,

    您刚刚创建了 %s 账户

    您的用户名: %s
    现在访问: %s

    ", + "Cheers!" : "干杯!", + "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "您好,\n\n您刚刚创建了 %s 账户.\n\n您的用户名: %s\n现在访问: %s\n", "Administrator documentation" : "管理员文档", "Online documentation" : "在线文档", "Forum" : "论坛", + "Getting help" : "获取帮助", "Commercial support" : "商业支持", - "Profile picture" : "联系人图片", - "Upload new" : "上传新的", + "You are using %s of %s" : "您正在使用 %s of %s", + "Profile picture" : "账户头像", + "Upload new" : "上传", "Select from Files" : "选择文件", - "Remove image" : "移除图片", - "png or jpg, max. 20 MB" : "png或jpg格式最大不超过20MB大小", + "Remove image" : "删除图片", + "png or jpg, max. 20 MB" : "png 或 jpg 格式, 不超过 20MB", "Picture provided by original account" : "原始账户图片", "Cancel" : "取消", - "Choose as profile picture" : "选择图片", + "Choose as profile picture" : "选择个人头像", "Full name" : "全名", "No display name set" : "不显示名称设置", "Email" : "电子邮件", "Your email address" : "您的电子邮件", "No email address set" : "尚未设置 Email 地址", - "For password recovery and notifications" : "用户恢复密码通知", - "You are member of the following groups:" : "您是以下组的成员:", + "For password recovery and notifications" : "用于密码恢复和通知", + "Phone number" : "电话号码", + "Your phone number" : "您的电话号码", + "Address" : "地址", + "Your postal address" : "您的邮寄地址", + "Website" : "网站", + "Your website" : "您的网站", + "Twitter" : "Twitter", + "Your Twitter handle" : "您的 Twitter 账号", + "You are member of the following groups:" : "您是以下组的成员:", "Password" : "密码", "Current password" : "当前密码", "New password" : "新密码", "Change password" : "修改密码", "Language" : "语言", "Help translate" : "帮助翻译", - "Get the apps to sync your files" : "安装应用进行文件同步", + "Get the apps to sync your files" : "下载应用同步您的文件", "Desktop client" : "桌面客户端", "Android app" : "Android 应用", "iOS app" : "iOS 应用", + "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "如果您想支持这个项目 {contributeopen}一起开发{linkclose} 或 {contributeopen}帮助传播{linkclose}!", "Show First Run Wizard again" : "再次显示首次运行向导", + "Web, desktop and mobile clients currently logged in to your account." : "您账号当前登录的 Web 页面, 桌面和客户端客户端.", + "Device" : "设备", + "Last activity" : "最后活跃", + "Passcodes that give an app or device permissions to access your account." : "Passcodes 可以使应用或设备访问您的账号.", "Name" : "名称", + "App name" : "应用名", + "Create new app password" : "创建新应用密码", + "Use the credentials below to configure your app or device." : "使用下述凭据配置您的应用或设备.", + "For security reasons this password will only be shown once." : "由于安全原因, 密码仅会显示一次.", "Username" : "用户名", + "Done" : "完成", + "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "由 {communityopen}Nextcloud community{linkclose} 开发, {githubopen}源代码{linkclose} 基于 {licenseopen}AGPL{linkclose} 许可协议.", + "Follow us on Google Plus!" : "在 Google+ 上关注我们!", + "Like our facebook page!" : "点赞我们 facebook 页面!", + "Subscribe to our twitter channel!" : "关注我们的 twitter!", + "Subscribe to our news feed!" : "订阅我们 RSS 最新消息!", + "Subscribe to our newsletter!" : "订阅我们的最新消息!", "Show storage location" : "显示存储位置", "Show last log in" : "显示最后登录", - "Show user backend" : "显示用户后端", + "Show user backend" : "显示用户来源", "Send email to new user" : "发送电子邮件给新用户", "Show email address" : "显示邮件地址", "E-Mail" : "E-Mail", "Create" : "创建", "Admin Recovery Password" : "管理恢复密码", "Enter the recovery password in order to recover the users files during password change" : "输入恢复密码来在更改密码的时候恢复用户文件", + "Group name" : "分组名", "Everyone" : "所有人", "Admins" : "管理员", - "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "请输入存储限额 (ex: \"512 MB\" or \"12 GB\")", + "Default quota" : "默认配额", + "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "请输入存储配额 (例如: \"512 MB\" 或 \"12 GB\")", "Other" : "其它", + "Group admin for" : "分组管理员", "Quota" : "配额", + "Storage location" : "存储位置", + "User backend" : "用户来源", + "Last login" : "最后登录", "change full name" : "更改全名", "set new password" : "设置新密码", "change email address" : "修改电子邮箱地址", "Default" : "默认", "log-level out of allowed range" : "日志级别超出允许的范围", "Language changed" : "语言已修改", - "Are you really sure you want add \"{domain}\" as trusted domain?" : "你真的希望添加 \"{domain}\" 为信任域?", - "Everything (fatal issues, errors, warnings, info, debug)" : "所有(灾难性问题,错误,警告,信息,调试)", - "Info, warnings, errors and fatal issues" : "信息,警告,错误和灾难性问题", - "Warnings, errors and fatal issues" : "警告,错误和灾难性问题", + "Admins can't remove themself from the admin group" : "管理员不能将自己移出管理组", + "Unable to add user to group %s" : "无法将用户添加到分组 %s", + "Unable to remove user from group %s" : "无法从分组 %s 中移除用户", + "Are you really sure you want add \"{domain}\" as trusted domain?" : "您确定将 \"{domain}\" 添加为信任的域名么?", + "Please wait...." : "请稍等....", + "iPhone" : "iPhone", + "add group" : "添加分组", + "Everything (fatal issues, errors, warnings, info, debug)" : "全部 (灾难性问题, 错误, 警告, 信息, 调试)", + "Info, warnings, errors and fatal issues" : "信息, 警告, 错误和灾难性问题", + "Warnings, errors and fatal issues" : "警告, 错误和灾难性问题", "Errors and fatal issues" : "错误和灾难性问题", "Fatal issues only" : "仅灾难性问题", "Log" : "日志", @@ -252,21 +358,25 @@ OC.L10N.register( "Download logfile" : "下载日志文件", "More" : "更多", "Less" : "更少", - "The logfile is bigger than 100 MB. Downloading it may take some time!" : "日志文件超过 100 MB。下载可能需要一些时间!", + "The logfile is bigger than 100 MB. Downloading it may take some time!" : "日志文件超过了 100 MB. 下载可能需要一些时间!", "Allow users to send mail notification for shared files" : "允许用户发送共享文件的邮件通知", "Allow users to send mail notification for shared files to other users" : "允许用户发送共享文件的邮件通知给其他用户", - "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite 被用作数据库。对于较大数据量的安装和使用,我们建议您切换到不同的数据库后端。", - "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "特别当使用桌面客户端来同步文件时,不鼓励使用 SQLite 。", + "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite 被用作数据库. 对于较大数据量的安装和使用, 我们建议您切换到不同的数据库后端.", + "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "特别当使用桌面客户端同步文件时, 不建议使用 SQLite.", "Experimental applications ahead" : "未来的实验应用", - "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "实验应用程序没有在安全性的问题上作过多检查,新的或已知的不稳定 BUG 都在开发中。安装它们可能会导致数据丢失或安全漏洞。", + "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "实验性应用程序没有检查安全性问题, 它是新的或已知不稳定的. 安装它们可能会导致数据丢失或安全漏洞.", + "Uninstall App" : "卸载应用", "Enable experimental apps" : "启用实验性应用程序", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "亲,

    现在我们为你开通了 %s 私有云帐户。

    你的用户名: %s
    访问网址: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "亲,\\n\\n 现在我们为你开通了 %s 私有去帐户。\\n\\n 你的用户名: %s\\n 访问网址: %s\\n 你的初始密码需要咨询系统管理员。或者你也可以在登录页面输入任意密码登录,\\n登录窗口将出现忘记密码链接,点击通过注册邮箱重设初始密码。\\n\\n", + "If you want to support the project\n\t\tjoin development\n\t\t\n\t\tspread the word!" : "如果您想支持这个项目\n\t一起开发\n\t\n\t帮助传播!", + "Add Group" : "添加分组", "Group" : "分组", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "外部存储", - "Updates" : "更新", - "An error occurred: {message}" : "发生错误: {message}" + "Default Quota" : "默认配额", + "Full Name" : "全名", + "Group Admin for" : "分组管理员", + "Storage Location" : "存储位置", + "User Backend" : "用户来源", + "Last Login" : "最后登录" }, "nplurals=1; plural=0;"); diff --git a/settings/l10n/zh_CN.json b/settings/l10n/zh_CN.json index 17c5ba13b3273f3988b7259645cc8dfcfe8521ae..46079a83ceb38ff49cab0bc1faffb1986ab319a1 100644 --- a/settings/l10n/zh_CN.json +++ b/settings/l10n/zh_CN.json @@ -1,58 +1,63 @@ { "translations": { "Enabled" : "开启", "Not enabled" : "未启用", - "Wrong password" : "错误密码", + "Wrong password" : "密码错误", "Saved" : "已保存", "No user supplied" : "没有满足的用户", - "Unable to change password" : "不能更改密码", + "Unable to change password" : "无法修改密码", "Authentication error" : "认证错误", - "Please provide an admin recovery password, otherwise all user data will be lost" : "请提供管理员恢复密码,否则所有用户的数据都将遗失。", - "Wrong admin recovery password. Please check the password and try again." : "错误的管理员恢复密码。请检查密码并重试。", - "Backend doesn't support password change, but the user's encryption key was successfully updated." : "后端不支持密码更改,但用户的加密密钥已成功更新。", + "Please provide an admin recovery password, otherwise all user data will be lost" : "请提供管理员恢复密码, 否则所有用户的数据都将丢失.", + "Wrong admin recovery password. Please check the password and try again." : "错误的管理员恢复密码. 请检查密码并重试.", + "Backend doesn't support password change, but the user's encryption key was successfully updated." : "后端不支持修改密码, 但用户的加密密钥已成功更新.", "installing and updating apps via the app store or Federated Cloud Sharing" : "通过应用程序商店或联合云共享安装和更新应用程序", "Federated Cloud Sharing" : "联合云共享", - "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL使用了过时 %s 版本 (%s)。请更新你的操作系统或功能比如 %s 将无法可靠地工作。", - "A problem occurred, please check your log files (Error: %s)" : "出现了故障,请检查你的日志文件 (错误: %s)", + "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL 当前使用的过时 %s 的版本 (%s). 请更新你的操作系统或组件, 例如 %s 将无法可靠地工作.", + "A problem occurred, please check your log files (Error: %s)" : "出现了问题, 请检查您的日志文件 (错误: %s)", "Migration Completed" : "迁移完成", - "Group already exists." : "组已经存在。", - "Unable to add group." : "无法添加组。", - "Unable to delete group." : "无法删除组", + "Group already exists." : "分组已经存在.", + "Unable to add group." : "无法添加分组.", + "Unable to delete group." : "无法删除分组.", "test email settings" : "测试电子邮件设置", - "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "在发送电子邮件时出现问题。请修改您的设置。 (错误: %s)", + "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "在发送电子邮件时出现问题. 请修正您的设置. (错误: %s)", "Email sent" : "邮件已发送", - "You need to set your user email before being able to send test emails." : "在发送测试邮件前您需要设置您的用户电子邮件。", + "You need to set your user email before being able to send test emails." : "在发送测试邮件前您需要设置您的电子邮件地址.", "Invalid request" : "无效请求", "Invalid mail address" : "无效的电子邮件地址", - "A user with that name already exists." : "使用该名称的用户已存在。", - "Unable to create user." : "无法创建用户。", + "No valid group selected" : "没有选择有效的分组", + "A user with that name already exists." : "使用该名称的用户已存在.", + "Unable to create user." : "无法创建用户.", "Your %s account was created" : "你的帐户 %s 已创建", - "Unable to delete user." : "不能删除用户", + "Unable to delete user." : "无法删除用户", + "Settings saved" : "设置已保存", "Unable to change full name" : "无法修改全名", - "Your full name has been changed." : "您的全名已修改。", + "Unable to change email address" : "无法修改电子邮箱地址", + "Your full name has been changed." : "您的全名已修改.", "Forbidden" : "被禁止", - "Invalid user" : "用户无效", - "Unable to change mail address" : "无法更改邮箱地址", + "Invalid user" : "无效用户", + "Unable to change mail address" : "无法修改电子邮箱地址", "Email saved" : "电子邮件已保存", - "Couldn't remove app." : "无法删除应用。", - "Admins can't remove themself from the admin group" : "管理员不能将自己移出管理组。", - "Unable to add user to group %s" : "无法把用户增加到组 %s", - "Unable to remove user from group %s" : "无法从组%s中移除用户", - "Couldn't update app." : "无法更新应用。", - "Add trusted domain" : "添加信任域", - "Migration in progress. Please wait until the migration is finished" : "迁移正在进行中。请等待,直到完成迁移", + "Password confirmation is required" : "需要密码确认", + "Couldn't remove app." : "无法删除应用.", + "Couldn't update app." : "无法更新应用.", + "Are you really sure you want add {domain} as trusted domain?" : "您确定将 {domain} 添加为信任的域名么?", + "Add trusted domain" : "添加信任域名", + "Migration in progress. Please wait until the migration is finished" : "正在进行迁移. 请稍等, 直到迁移完成", "Migration started …" : "迁移开始...", + "Not saved" : "未保存", "Sending..." : "正在发送...", "Official" : "官方", "All" : "全部", "Update to %s" : "更新为 %s", "_You have %n app update pending_::_You have %n app updates pending_" : ["%n 个应用正在等待升级"], "No apps found for your version" : "未找到适合当前版本的应用", - "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "已认可的应用是由值得信赖的开发商开发,并已通过了一个粗略的安全检查。他们放在一个开放的代码库并且维护人员认为他们是稳定的差不多可以正常使用。", - "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "此应用未检查安全问题,它是新的或已知是不稳定的。安装风险自担。", - "Please wait...." : "请稍等....", + "The app will be downloaded from the app store" : "该应用将从应用商店下载", + "Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "官方应用由社区和内部开发. 其可以提供核心功能并保证生产用途.", + "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "认证应用由值得信赖的开发者开发, 并通过了一个粗略的安全检查. 其在开放的代码库中活跃地维护, 他们的维护者认为在普通用途足够稳定.", + "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "此应用没有检查安全问题, 它是新的或已知不稳定的. 安装风险自担.", + "Enabling app …" : "正在启用应用程序...", "Error while disabling app" : "禁用应用时出错", "Disable" : "禁用", - "Enable" : "开启", + "Enable" : "启用", "Error while enabling app" : "启用应用时出错", "Error: this app cannot be enabled because it makes the server unstable" : "错误: 无法启用应用因为它会导致服务器不稳定", "Error: could not disable broken app" : "错误: 无法禁用损坏的应用", @@ -60,31 +65,70 @@ "Updating...." : "正在更新....", "Error while updating app" : "更新应用时出错", "Updated" : "已更新", - "Uninstalling ...." : "卸载中....", + "Uninstalling ...." : "正在卸载....", "Error while uninstalling app" : "卸载应用时发生了一个错误", "Uninstall" : "卸载", - "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "该应用已启用,但是需要更新。5秒后将跳转到更新页面。", - "App update" : "应用更新", - "Approved" : "已认可", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "该应用已启用, 但是需要更新. 5秒后将跳转到更新页面.", + "App update" : "更新应用", + "Approved" : "已认证", "Experimental" : "实验", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "出现了一个错误。请上传 ASCII 编码的 PEM 证书。", + "No apps found for {query}" : "找不到符合 {query} 的应用", + "Allow filesystem access" : "允许访问文件系统", + "Disconnect" : "断开连接", + "Revoke" : "撤销", + "Internet Explorer" : "Internet Explorer", + "Edge" : "Edge", + "Firefox" : "Firefox", + "Google Chrome" : "Google Chrome", + "Safari" : "Safari", + "Google Chrome for Android" : "Google Chrome for Android", + "iPhone iOS" : "iPhone iOS", + "iPad iOS" : "iPad iOS", + "iOS Client" : "iOS 客户端", + "Android Client" : "Android 客户端", + "Sync client - {os}" : "同步客户端 - {os}", + "This session" : "当前会话", + "Copy" : "复制", + "Copied!" : "已复制!", + "Not supported!" : "不支持!", + "Press ⌘-C to copy." : "按 ⌘-C 键复制.", + "Press Ctrl-C to copy." : "按 Ctrl-C 复制.", + "Error while loading browser sessions and device tokens" : "加载浏览器会话和设备令牌时出错", + "Error while creating device token" : "创建设备令牌时出错", + "Error while deleting the token" : "删除令牌时出错", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "出现了一个错误. 请上传 ASCII 编码的 PEM 证书.", "Valid until {date}" : "有效期至 {date}", "Delete" : "删除", + "Local" : "本地", + "Private" : "私有", + "Only visible to local users" : "仅对本地用户可见", + "Only visible to you" : "仅您自己可见", + "Contacts" : "联系人", + "Visible to local users and to trusted servers" : "仅对本地用户和信任的服务器可见", + "Public" : "公开", + "Will be synced to a global and public address book" : "将同步到全局和公开地址簿中", "Select a profile picture" : "选择头像", "Very weak password" : "非常弱的密码", "Weak password" : "弱密码", "So-so password" : "一般强度的密码", "Good password" : "较强的密码", "Strong password" : "强密码", - "Groups" : "组", + "Groups" : "分组", "Unable to delete {objName}" : "无法删除 {objName}", - "Error creating group: {message}" : "创建组时出错: {message}", - "A valid group name must be provided" : "请提供一个有效的组名称", + "Error creating group: {message}" : "创建分组时出错: {message}", + "A valid group name must be provided" : "请提供一个有效的分组名称", "deleted {groupName}" : "已删除 {groupName}", "undo" : "撤销", "never" : "从不", "deleted {userName}" : "已删除 {userName}", - "Changing the password will result in data loss, because data recovery is not available for this user" : "更改密码会导致数据丢失,因为数据恢复不适用于此用户", + "Unable to add user to group {group}" : "无法将用户添加到分组 {group}", + "Unable to remove user from group {group}" : "无法从分组 {group} 中移除用户", + "Add group" : "添加分组", + "Invalid quota value \"{val}\"" : "无效的配额值 \"{val}\"", + "no group" : "没有分组", + "Password successfully changed" : "密码修改成功", + "Changing the password will result in data loss, because data recovery is not available for this user" : "修改密码会导致数据丢失, 因为数据恢复不适用于此用户", + "Could not change the users email" : "无法修改用户电子邮箱地址", "A valid username must be provided" : "必须提供合法的用户名", "Error creating user: {message}" : "创建用户出错: {message}", "A valid password must be provided" : "必须提供合法的密码", @@ -92,14 +136,18 @@ "__language_name__" : "简体中文", "Unlimited" : "无限", "Personal info" : "个人信息", - "Sync clients" : "客户端", + "Sessions" : "会话", + "App passwords" : "应用密码", + "Sync clients" : "同步客户端", "None" : "无", "Login" : "登录", - "Plain" : "Plain", + "Plain" : "明文", "NT LAN Manager" : "NT LAN 管理器", + "SSL/TLS" : "SSL/TLS", + "STARTTLS" : "STARTTLS", "Email server" : "电子邮件服务器", "Open documentation" : "打开文档", - "This is used for sending out notifications." : "这被用于发送通知。", + "This is used for sending out notifications." : "这被用于发送通知.", "Send mode" : "发送模式", "Encryption" : "加密", "From address" : "来自地址", @@ -116,39 +164,47 @@ "Send email" : "发送邮件", "Server-side encryption" : "服务器端加密", "Enable server-side encryption" : "启用服务器端加密", - "Please read carefully before activating server-side encryption: " : "在激活服务器端加密之前,请仔细阅读:", - "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "一旦加密被启用,之后上传到服务器的所有文件都将服务器上加密。只有当启用状态的加密模块支持解密并且所有的先决条件(例如,设定恢复键)得到满足时才能解除加密。", - "Be aware that encryption always increases the file size." : "请注意,加密会增加文件大小。", - "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "定期备份数据有利于保证数据完整,并且确保备份您的加密数据和加密密钥。", - "This is the final warning: Do you really want to enable encryption?" : "这是最后一次警告:你真的想启用加密?", + "Please read carefully before activating server-side encryption: " : "在激活服务器端加密之前, 请仔细阅读:", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "一旦加密被启用, 之后上传到服务器的所有文件都将服务器上加密. 只有当启用状态的加密模块支持解密并且所有前提都满足时 (例如: 设定恢复密钥) 才能解除加密.", + "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "单独的加密不能保证系统的安全性. 请参考加密应用工作原理和支持的用例的文档获取更多信息", + "Be aware that encryption always increases the file size." : "请注意, 加密会增加文件大小.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "定期备份数据有助于保证数据完整, 并且确保备份您的加密数据和加密密钥.", + "This is the final warning: Do you really want to enable encryption?" : "这是最后一次警告: 你确定要启用加密?", "Enable encryption" : "启用加密", - "No encryption module loaded, please enable an encryption module in the app menu." : "没有加载加密模块,请在 APP 应用菜单中启用加密模块。", - "Select default encryption module:" : "选择默认的加密模块:", - "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run 'occ encryption:migrate'" : "你需要升级你的加密密钥 (旧版 ownCloud <= 8.0) 。 请在应用中启用 \\\"Default encryption module\\\" 并运行 'occ encryption:migrate'", - "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "您需要将加密密钥从旧版(ownCloud<=8.0)迁移到新版。", + "No encryption module loaded, please enable an encryption module in the app menu." : "没有加载加密模块, 请在 APP 应用菜单中启用加密模块.", + "Select default encryption module:" : "选择默认的加密模块:", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run 'occ encryption:migrate'" : "您需要从旧版本 (ownCloud <= 8.0) 迁移您的加密密钥. 请在应用中启用 \\\"Default encryption module\\\" 并运行 'occ encryption:migrate'", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "您需要从旧版本 (ownCloud<=8.0) 迁移您的加密密钥.", "Start migration" : "开始迁移", "Security & setup warnings" : "安全及设置警告", - "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP 似乎没有设置好查询的系统环境变量。 用 getenv(\\\"PATH\\\") 测试只返回一个空值。", - "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "只读配置已启用。这样可防止通过 WEB 接口设置一些配置。此外,每次更新后该文件需要手动设置为可写。", - "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP 被设置为移除行内 块,这将导致数个核心应用无法访问。", - "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "这可能是由缓存/加速器造成的,例如 Zend OPcache 或 eAccelerator。", - "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP模块'文件信息'丢失. 我们强烈建议启用此模块以便mime类型检测取得最佳结果.", - "System locale can not be set to a one which supports UTF-8." : "系统语系无法设置为支持 UTF-8 的语系。", - "This means that there might be problems with certain characters in file names." : "这意味着一些文件名中的特定字符可能有问题。", - "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "我们强烈建议安装在系统上所需的软件包支持以下区域设置之一: %s.", - "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "如果你不是安装在网域根目录而且又使用系统定时计划任务,那么可以导致 URL 链接生成问题。为了避免这些问题,请在你的 Config.php 文件中设置 \\\"overwrite.cli.url\\\" 选项为 webroot 安装根目录 (建议: \\\"%s\\\")", - "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "由于下面的错误,无法通过 CLI 执行定时计划任务:", - "All checks passed." : "所有检查已通过。", + "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP 的设置似乎有问题, 无法获取系统环境变量. 使用 getenv(\\\"PATH\\\") 测试时仅返回空结果.", + "Please check the installation documentation ↗ for php configuration notes and the php configuration of your server, especially when using php-fpm." : "请检查 安装文档 ↗ 中关于 PHP 配置的说明并在您的服务器中进行配置, 尤其是使用 php-fpm 时.", + "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "已启用只读配置. 这将阻止在 Web 界面中进行设置. 此外, 每次更新后该文件需要手动设置为可写入.", + "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP 被设置为移除内联块, 这将导致多个核心应用无法访问.", + "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "这可能是由缓存/加速器造成的, 例如 Zend OPcache 或 eAccelerator.", + "Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "您的数据库不能在 \"READ COMMITTED\" 事务隔离级别运行. 这样可能导致在多个并行操作时出现问题.", + "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "已安装 %1$s 的低版本 %2$s. 出于稳定性和性能的原因, 我们建议您升级到更新的 %1$s 版本.", + "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP 模块 'fileinfo' 缺失. 我们强烈建议启用此模块以便在 MIME 类型检测时获得最准确的结果.", + "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the documentation ↗ for more information." : "事务文件锁被禁用, 这可能导致竞争条件的问题. 在 config.php 中启用 'filelocking.enabled' 选项来避免这些问题. 请参考 文档↗ 获取更多信息.", + "System locale can not be set to a one which supports UTF-8." : "系统区域无法设置为支持 UTF-8 的区域.", + "This means that there might be problems with certain characters in file names." : "这意味着当文件名中包含特定字符时可能出现问题.", + "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "我们强烈建议在您的系统中安装需要的包以支持下列区域: %s.", + "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "如果您不是安装在域名的根目录, 并且使用系统 cron 服务时, 可能导致 URL 生成问题. 为了避免这些问题, 请在您的 config.php 文件中设置 \"overwrite.cli.url\" 选项为您的安装根目录路径 (建议: \"%s\")", + "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "由于下列的技术错误, 无法通过 CLI 执行计划任务:", + "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "请再次检查 安装指南 ↗, 并检查 日志 中的任何错误或警告.", + "All checks passed." : "所有检查已通过.", "Cron" : "计划任务", - "Last cron job execution: %s." : "上次定时任务执行于: %s.", - "Last cron job execution: %s. Something seems wrong." : "上次定时任务执行于: %s. 似乎有些问题。", - "Cron was not executed yet!" : "定时任务还未被执行!", + "Last cron job execution: %s." : "上次定时任务执行于: %s.", + "Last cron job execution: %s. Something seems wrong." : "上次定时任务执行于: %s. 但存在一些问题.", + "Cron was not executed yet!" : "定时任务还未被执行!", "Execute one task with each page loaded" : "每个页面加载后执行一个任务", - "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php 已注册于一个 webcron 服务来通过 http 每 15 分钟执行 cron.php。", - "Use system's cron service to call the cron.php file every 15 minutes." : "使用系统 CRON 服务每 15 分钟执行一次 cron.php 文件。", + "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php 注册到 webcron 服务上, 通过 http 每 15 分钟执行 cron.php.", + "Use system's cron service to call the cron.php file every 15 minutes." : "使用系统 cron 服务每 15 分钟执行一次 cron.php 文件.", + "The cron.php needs to be executed by the system user \"%s\"." : "cron.php 需要被系统用户 \"%s\" 执行.", + "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "为了运行该功能, 您需要 PHP posix 扩展. 请参考 {linkstart}PHP 文档{linkend} 获取更多信息.", "Version" : "版本", "Sharing" : "共享", - "Allow apps to use the Share API" : "允许应用软件使用共享API", + "Allow apps to use the Share API" : "允许应用使用共享 API", "Allow users to share via link" : "允许用户通过链接分享文件", "Allow public uploads" : "允许公开上传", "Enforce password protection" : "强制密码保护", @@ -156,93 +212,143 @@ "Expire after " : "过期于", "days" : "天", "Enforce expiration date" : "强制过期日期", - "Allow resharing" : "允许再次共享", + "Allow resharing" : "允许二次共享", "Allow sharing with groups" : "允许群组共享", "Restrict users to only share with users in their groups" : "限制仅与组内用户分享", "Exclude groups from sharing" : "在分享中排除组", - "These groups will still be able to receive shares, but not to initiate them." : "这些组将仍可以获取分享,但无法向他人分享。", - "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "允许在共享对话框中的自动补全用户名。如果被禁用,需要输入用户全名。", - "Tips & tricks" : "技巧提示", - "How to do backups" : "如何做备份", + "These groups will still be able to receive shares, but not to initiate them." : "这些组将仍可以获取分享, 但无法向他人分享.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "允许在共享对话框中自动补全用户名. 如果被禁用, 需要输入完整的用户名.", + "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "在公开链接上传页中显示免责声明. (仅当文件列表隐藏时显示)", + "This text will be shown on the public link upload page when the file list is hidden." : "这些内容将在公开链接上传页中当文件列表隐藏时显示.", + "Tips & tricks" : "小提示", + "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite 当前被用作数据库. 对于较大数据量的安装和使用, 我们建议您切换到不同的数据库后端.", + "This is particularly recommended when using the desktop client for file synchronisation." : "当时用桌面客户端同步文件时特别推荐.", + "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "合并其他数据库可以使用命令行工具: 'occ db:convert-type', 或查看 文档 ↗.", + "How to do backups" : "如何备份", "Advanced monitoring" : "高级监控", "Performance tuning" : "性能优化", - "Improving the config.php" : "正在优化 config.php", + "Improving the config.php" : "优化 config.php", "Theming" : "主题", "Hardening and security guidance" : "强化和安全指南", "Developer documentation" : "开发者文档", + "by %s" : "由 %s", "%s-licensed" : "%s-许可协议", - "Documentation:" : "文档:", + "Documentation:" : "文档:", "User documentation" : "用户文档", "Admin documentation" : "管理员文档", + "Visit website" : "访问网站", + "Report a bug" : "报告问题", "Show description …" : "显示描述...", "Hide description …" : "隐藏描述...", - "This app has an update available." : "此应用有可用的更新。", - "This app cannot be installed because the following dependencies are not fulfilled:" : "此应用程序无法安装,因为以下依赖性不满足:", - "Enable only for specific groups" : "仅对特定的组开放", - "Uninstall App" : "卸载应用", + "This app has an update available." : "此应用有可用的更新.", + "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "该应用没有指定支持的 Nextcloud 最低版本. 可能会在将来出现问题.", + "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "该应用没有指定支持的 Nextcloud 最高版本. 可能会在将来出现问题.", + "This app cannot be installed because the following dependencies are not fulfilled:" : "无法安装应用, 因为无法满足下列依赖: ", + "Enable only for specific groups" : "仅特定组启用", + "Uninstall app" : "卸载应用", "SSL Root Certificates" : "SSL 根证书", "Common Name" : "通用名称", "Valid until" : "有效期至", "Issued By" : "授权由", "Valid until %s" : "有效期至 %s", "Import root certificate" : "导入根证书", - "Cheers!" : "干杯!", + "Hey there,

    just letting you know that you now have a %s account.

    Your username: %s
    Access it: %s

    " : "您好,

    您刚刚创建了 %s 账户

    您的用户名: %s
    现在访问: %s

    ", + "Cheers!" : "干杯!", + "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "您好,\n\n您刚刚创建了 %s 账户.\n\n您的用户名: %s\n现在访问: %s\n", "Administrator documentation" : "管理员文档", "Online documentation" : "在线文档", "Forum" : "论坛", + "Getting help" : "获取帮助", "Commercial support" : "商业支持", - "Profile picture" : "联系人图片", - "Upload new" : "上传新的", + "You are using %s of %s" : "您正在使用 %s of %s", + "Profile picture" : "账户头像", + "Upload new" : "上传", "Select from Files" : "选择文件", - "Remove image" : "移除图片", - "png or jpg, max. 20 MB" : "png或jpg格式最大不超过20MB大小", + "Remove image" : "删除图片", + "png or jpg, max. 20 MB" : "png 或 jpg 格式, 不超过 20MB", "Picture provided by original account" : "原始账户图片", "Cancel" : "取消", - "Choose as profile picture" : "选择图片", + "Choose as profile picture" : "选择个人头像", "Full name" : "全名", "No display name set" : "不显示名称设置", "Email" : "电子邮件", "Your email address" : "您的电子邮件", "No email address set" : "尚未设置 Email 地址", - "For password recovery and notifications" : "用户恢复密码通知", - "You are member of the following groups:" : "您是以下组的成员:", + "For password recovery and notifications" : "用于密码恢复和通知", + "Phone number" : "电话号码", + "Your phone number" : "您的电话号码", + "Address" : "地址", + "Your postal address" : "您的邮寄地址", + "Website" : "网站", + "Your website" : "您的网站", + "Twitter" : "Twitter", + "Your Twitter handle" : "您的 Twitter 账号", + "You are member of the following groups:" : "您是以下组的成员:", "Password" : "密码", "Current password" : "当前密码", "New password" : "新密码", "Change password" : "修改密码", "Language" : "语言", "Help translate" : "帮助翻译", - "Get the apps to sync your files" : "安装应用进行文件同步", + "Get the apps to sync your files" : "下载应用同步您的文件", "Desktop client" : "桌面客户端", "Android app" : "Android 应用", "iOS app" : "iOS 应用", + "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "如果您想支持这个项目 {contributeopen}一起开发{linkclose} 或 {contributeopen}帮助传播{linkclose}!", "Show First Run Wizard again" : "再次显示首次运行向导", + "Web, desktop and mobile clients currently logged in to your account." : "您账号当前登录的 Web 页面, 桌面和客户端客户端.", + "Device" : "设备", + "Last activity" : "最后活跃", + "Passcodes that give an app or device permissions to access your account." : "Passcodes 可以使应用或设备访问您的账号.", "Name" : "名称", + "App name" : "应用名", + "Create new app password" : "创建新应用密码", + "Use the credentials below to configure your app or device." : "使用下述凭据配置您的应用或设备.", + "For security reasons this password will only be shown once." : "由于安全原因, 密码仅会显示一次.", "Username" : "用户名", + "Done" : "完成", + "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "由 {communityopen}Nextcloud community{linkclose} 开发, {githubopen}源代码{linkclose} 基于 {licenseopen}AGPL{linkclose} 许可协议.", + "Follow us on Google Plus!" : "在 Google+ 上关注我们!", + "Like our facebook page!" : "点赞我们 facebook 页面!", + "Subscribe to our twitter channel!" : "关注我们的 twitter!", + "Subscribe to our news feed!" : "订阅我们 RSS 最新消息!", + "Subscribe to our newsletter!" : "订阅我们的最新消息!", "Show storage location" : "显示存储位置", "Show last log in" : "显示最后登录", - "Show user backend" : "显示用户后端", + "Show user backend" : "显示用户来源", "Send email to new user" : "发送电子邮件给新用户", "Show email address" : "显示邮件地址", "E-Mail" : "E-Mail", "Create" : "创建", "Admin Recovery Password" : "管理恢复密码", "Enter the recovery password in order to recover the users files during password change" : "输入恢复密码来在更改密码的时候恢复用户文件", + "Group name" : "分组名", "Everyone" : "所有人", "Admins" : "管理员", - "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "请输入存储限额 (ex: \"512 MB\" or \"12 GB\")", + "Default quota" : "默认配额", + "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "请输入存储配额 (例如: \"512 MB\" 或 \"12 GB\")", "Other" : "其它", + "Group admin for" : "分组管理员", "Quota" : "配额", + "Storage location" : "存储位置", + "User backend" : "用户来源", + "Last login" : "最后登录", "change full name" : "更改全名", "set new password" : "设置新密码", "change email address" : "修改电子邮箱地址", "Default" : "默认", "log-level out of allowed range" : "日志级别超出允许的范围", "Language changed" : "语言已修改", - "Are you really sure you want add \"{domain}\" as trusted domain?" : "你真的希望添加 \"{domain}\" 为信任域?", - "Everything (fatal issues, errors, warnings, info, debug)" : "所有(灾难性问题,错误,警告,信息,调试)", - "Info, warnings, errors and fatal issues" : "信息,警告,错误和灾难性问题", - "Warnings, errors and fatal issues" : "警告,错误和灾难性问题", + "Admins can't remove themself from the admin group" : "管理员不能将自己移出管理组", + "Unable to add user to group %s" : "无法将用户添加到分组 %s", + "Unable to remove user from group %s" : "无法从分组 %s 中移除用户", + "Are you really sure you want add \"{domain}\" as trusted domain?" : "您确定将 \"{domain}\" 添加为信任的域名么?", + "Please wait...." : "请稍等....", + "iPhone" : "iPhone", + "add group" : "添加分组", + "Everything (fatal issues, errors, warnings, info, debug)" : "全部 (灾难性问题, 错误, 警告, 信息, 调试)", + "Info, warnings, errors and fatal issues" : "信息, 警告, 错误和灾难性问题", + "Warnings, errors and fatal issues" : "警告, 错误和灾难性问题", "Errors and fatal issues" : "错误和灾难性问题", "Fatal issues only" : "仅灾难性问题", "Log" : "日志", @@ -250,21 +356,25 @@ "Download logfile" : "下载日志文件", "More" : "更多", "Less" : "更少", - "The logfile is bigger than 100 MB. Downloading it may take some time!" : "日志文件超过 100 MB。下载可能需要一些时间!", + "The logfile is bigger than 100 MB. Downloading it may take some time!" : "日志文件超过了 100 MB. 下载可能需要一些时间!", "Allow users to send mail notification for shared files" : "允许用户发送共享文件的邮件通知", "Allow users to send mail notification for shared files to other users" : "允许用户发送共享文件的邮件通知给其他用户", - "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite 被用作数据库。对于较大数据量的安装和使用,我们建议您切换到不同的数据库后端。", - "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "特别当使用桌面客户端来同步文件时,不鼓励使用 SQLite 。", + "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite 被用作数据库. 对于较大数据量的安装和使用, 我们建议您切换到不同的数据库后端.", + "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "特别当使用桌面客户端同步文件时, 不建议使用 SQLite.", "Experimental applications ahead" : "未来的实验应用", - "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "实验应用程序没有在安全性的问题上作过多检查,新的或已知的不稳定 BUG 都在开发中。安装它们可能会导致数据丢失或安全漏洞。", + "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "实验性应用程序没有检查安全性问题, 它是新的或已知不稳定的. 安装它们可能会导致数据丢失或安全漏洞.", + "Uninstall App" : "卸载应用", "Enable experimental apps" : "启用实验性应用程序", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "亲,

    现在我们为你开通了 %s 私有云帐户。

    你的用户名: %s
    访问网址: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "亲,\\n\\n 现在我们为你开通了 %s 私有去帐户。\\n\\n 你的用户名: %s\\n 访问网址: %s\\n 你的初始密码需要咨询系统管理员。或者你也可以在登录页面输入任意密码登录,\\n登录窗口将出现忘记密码链接,点击通过注册邮箱重设初始密码。\\n\\n", + "If you want to support the project\n\t\tjoin development\n\t\t\n\t\tspread the word!" : "如果您想支持这个项目\n\t一起开发\n\t\n\t帮助传播!", + "Add Group" : "添加分组", "Group" : "分组", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "外部存储", - "Updates" : "更新", - "An error occurred: {message}" : "发生错误: {message}" + "Default Quota" : "默认配额", + "Full Name" : "全名", + "Group Admin for" : "分组管理员", + "Storage Location" : "存储位置", + "User Backend" : "用户来源", + "Last Login" : "最后登录" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/settings/l10n/zh_HK.js b/settings/l10n/zh_HK.js index afc266ce205ecc19cbcf5e9a017c738a8aa33a9b..9fa7e6cb8a9c0b6477662089550e76f77a02aad0 100644 --- a/settings/l10n/zh_HK.js +++ b/settings/l10n/zh_HK.js @@ -9,7 +9,6 @@ OC.L10N.register( "Email sent" : "郵件已傳", "Sending..." : "發送中...", "All" : "所有", - "Please wait...." : "請稍候....", "Disable" : "停用", "Enable" : "啟用", "Updating...." : "更新中....", @@ -49,9 +48,9 @@ OC.L10N.register( "Everyone" : "所有人", "Other" : "其他", "Default" : "預設", + "Please wait...." : "請稍候....", "Log" : "日誌", "More" : "更多", - "Group" : "群組", - "Updates" : "更新" + "Group" : "群組" }, "nplurals=1; plural=0;"); diff --git a/settings/l10n/zh_HK.json b/settings/l10n/zh_HK.json index 7cfee3ec8b21f2ddfd5bc56e39961858a32bcab8..27f4b570daab7f799740f71b2f75535f009c4197 100644 --- a/settings/l10n/zh_HK.json +++ b/settings/l10n/zh_HK.json @@ -7,7 +7,6 @@ "Email sent" : "郵件已傳", "Sending..." : "發送中...", "All" : "所有", - "Please wait...." : "請稍候....", "Disable" : "停用", "Enable" : "啟用", "Updating...." : "更新中....", @@ -47,9 +46,9 @@ "Everyone" : "所有人", "Other" : "其他", "Default" : "預設", + "Please wait...." : "請稍候....", "Log" : "日誌", "More" : "更多", - "Group" : "群組", - "Updates" : "更新" + "Group" : "群組" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/settings/l10n/zh_TW.js b/settings/l10n/zh_TW.js index 57079b74b7726a844c614d655a7e8fe0c75486b7..942c29a215798647f36d44503655a8eff5eefd7f 100644 --- a/settings/l10n/zh_TW.js +++ b/settings/l10n/zh_TW.js @@ -36,9 +36,6 @@ OC.L10N.register( "Unable to change mail address" : "無法更改 email 地址", "Email saved" : "Email 已儲存", "Couldn't remove app." : "無法移除應用程式", - "Admins can't remove themself from the admin group" : "管理者帳號無法從管理者群組中移除", - "Unable to add user to group %s" : "無法將使用者加入群組 %s", - "Unable to remove user from group %s" : "無法將使用者移出群組 %s", "Couldn't update app." : "無法更新應用程式", "Add trusted domain" : "新增信任的網域", "Migration in progress. Please wait until the migration is finished" : "資料搬移中,請耐心等候直到資料搬移結束", @@ -52,7 +49,6 @@ OC.L10N.register( "The app will be downloaded from the app store" : "將會從應用程式商店下載這個應用程式", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "審查通過的應用程式經由可信任的開發人員所設計,並且經過一連串的安全測試,他們在開放的程式庫中維護這些應用程式,而且確保這些應用程式能穩定運作", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "這個新應用程式並沒有經過安全檢測,可能會是不穩定的,如果您要安裝的話,風險自行負責。", - "Please wait...." : "請稍候…", "Error while disabling app" : "停用應用程式錯誤", "Disable" : "停用", "Enable" : "啟用", @@ -195,7 +191,6 @@ OC.L10N.register( "This app has an update available." : "此應用程式有可用的更新", "This app cannot be installed because the following dependencies are not fulfilled:" : "這個應用程式無法被安裝,因為欠缺下列相依套件:", "Enable only for specific groups" : "僅對特定的群組啟用", - "Uninstall App" : "解除安裝 App", "Common Name" : "Common Name", "Valid until" : "到期日", "Issued By" : "發行者:", @@ -255,7 +250,11 @@ OC.L10N.register( "Default" : "預設", "log-level out of allowed range" : "log-level 超過允許範圍", "Language changed" : "語言已變更", + "Admins can't remove themself from the admin group" : "管理者帳號無法從管理者群組中移除", + "Unable to add user to group %s" : "無法將使用者加入群組 %s", + "Unable to remove user from group %s" : "無法將使用者移出群組 %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "您確定要新增 \"{domain}' 為信任的網域?", + "Please wait...." : "請稍候…", "iPhone" : "iPhone", "Everything (fatal issues, errors, warnings, info, debug)" : "全部(嚴重問題、錯誤、警告、資訊、除錯訊息)", "Info, warnings, errors and fatal issues" : "嚴重問題、錯誤、警告、資訊", @@ -274,14 +273,10 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "若使用桌面版程式同步檔案,不建議使用 SQLite", "Experimental applications ahead" : "以下是實驗性質的應用程式", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "實驗性質的應用程式並沒有經過安全檢測,可能會不穩定而且正在開發中,安裝他們可能會造成資料遺失或是安全問題", + "Uninstall App" : "解除安裝 App", "Enable experimental apps" : "啟用實驗性質的應用程式", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "嗨,

    通知您一聲,您現在有了 %s 的帳號。

    您的帳號: %s
    開通帳號: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "嗨,\n\n通知您一聲,您現在有了 %s 的帳號。\n\n您的帳號:%s\n開通帳號:%s\n\n", - "Group" : "群組", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "外部儲存", - "Updates" : "更新", - "An error occurred: {message}" : "發生錯誤:{message}" + "Group" : "群組" }, "nplurals=1; plural=0;"); diff --git a/settings/l10n/zh_TW.json b/settings/l10n/zh_TW.json index 58d471b4b93065d8e8b8a5e40b5100fb12ecbbe4..21af65d762bc796a942327c5ad6e1e50db6e6906 100644 --- a/settings/l10n/zh_TW.json +++ b/settings/l10n/zh_TW.json @@ -34,9 +34,6 @@ "Unable to change mail address" : "無法更改 email 地址", "Email saved" : "Email 已儲存", "Couldn't remove app." : "無法移除應用程式", - "Admins can't remove themself from the admin group" : "管理者帳號無法從管理者群組中移除", - "Unable to add user to group %s" : "無法將使用者加入群組 %s", - "Unable to remove user from group %s" : "無法將使用者移出群組 %s", "Couldn't update app." : "無法更新應用程式", "Add trusted domain" : "新增信任的網域", "Migration in progress. Please wait until the migration is finished" : "資料搬移中,請耐心等候直到資料搬移結束", @@ -50,7 +47,6 @@ "The app will be downloaded from the app store" : "將會從應用程式商店下載這個應用程式", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "審查通過的應用程式經由可信任的開發人員所設計,並且經過一連串的安全測試,他們在開放的程式庫中維護這些應用程式,而且確保這些應用程式能穩定運作", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "這個新應用程式並沒有經過安全檢測,可能會是不穩定的,如果您要安裝的話,風險自行負責。", - "Please wait...." : "請稍候…", "Error while disabling app" : "停用應用程式錯誤", "Disable" : "停用", "Enable" : "啟用", @@ -193,7 +189,6 @@ "This app has an update available." : "此應用程式有可用的更新", "This app cannot be installed because the following dependencies are not fulfilled:" : "這個應用程式無法被安裝,因為欠缺下列相依套件:", "Enable only for specific groups" : "僅對特定的群組啟用", - "Uninstall App" : "解除安裝 App", "Common Name" : "Common Name", "Valid until" : "到期日", "Issued By" : "發行者:", @@ -253,7 +248,11 @@ "Default" : "預設", "log-level out of allowed range" : "log-level 超過允許範圍", "Language changed" : "語言已變更", + "Admins can't remove themself from the admin group" : "管理者帳號無法從管理者群組中移除", + "Unable to add user to group %s" : "無法將使用者加入群組 %s", + "Unable to remove user from group %s" : "無法將使用者移出群組 %s", "Are you really sure you want add \"{domain}\" as trusted domain?" : "您確定要新增 \"{domain}' 為信任的網域?", + "Please wait...." : "請稍候…", "iPhone" : "iPhone", "Everything (fatal issues, errors, warnings, info, debug)" : "全部(嚴重問題、錯誤、警告、資訊、除錯訊息)", "Info, warnings, errors and fatal issues" : "嚴重問題、錯誤、警告、資訊", @@ -272,14 +271,10 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "若使用桌面版程式同步檔案,不建議使用 SQLite", "Experimental applications ahead" : "以下是實驗性質的應用程式", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "實驗性質的應用程式並沒有經過安全檢測,可能會不穩定而且正在開發中,安裝他們可能會造成資料遺失或是安全問題", + "Uninstall App" : "解除安裝 App", "Enable experimental apps" : "啟用實驗性質的應用程式", "Hey there,

    just letting you know that you now have an %s account.

    Your username: %s
    Access it: %s

    " : "嗨,

    通知您一聲,您現在有了 %s 的帳號。

    您的帳號: %s
    開通帳號: %s

    ", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "嗨,\n\n通知您一聲,您現在有了 %s 的帳號。\n\n您的帳號:%s\n開通帳號:%s\n\n", - "Group" : "群組", - "APCu" : "APCu", - "Redis" : "Redis", - "External Storage" : "外部儲存", - "Updates" : "更新", - "An error occurred: {message}" : "發生錯誤:{message}" + "Group" : "群組" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/settings/personal.php b/settings/personal.php index 27c1a25653d7f1c6066fbda377fe208f5638c0f5..a79e9764a6be19ad8a6adc40e735e46830532165 100644 --- a/settings/personal.php +++ b/settings/personal.php @@ -88,7 +88,7 @@ foreach($languageCodes as $lang) { if($l->getLanguageCode() === $lang && substr($potentialName, 0, 1) !== '_') {//first check if the language name is in the translation file $ln = array('code' => $lang, 'name' => $potentialName); } elseif ($lang === 'en') { - $ln = ['code' => $lang, 'name' => 'English']; + $ln = ['code' => $lang, 'name' => 'English (US)']; }else{//fallback to language code $ln=array('code'=>$lang, 'name'=>$lang); } @@ -196,7 +196,7 @@ $tmpl->assign('groups', $groups2); // add hardcoded forms from the template $formsAndMore = []; -$formsAndMore[]= ['anchor' => 'avatar', 'section-name' => $l->t('Personal info')]; +$formsAndMore[]= ['anchor' => 'personal-settings', 'section-name' => $l->t('Personal info')]; $formsAndMore[]= ['anchor' => 'sessions', 'section-name' => $l->t('Sessions')]; $formsAndMore[]= ['anchor' => 'apppasswords', 'section-name' => $l->t('App passwords')]; $formsAndMore[]= ['anchor' => 'clientsbox', 'section-name' => $l->t('Sync clients')]; diff --git a/settings/templates/admin/frame.php b/settings/templates/admin/frame.php index 761d76c443477ec2876e8904d1ff47b0bf2fa987..2b234f4cd9b764e6bfd099e7a32100bd45a3838b 100644 --- a/settings/templates/admin/frame.php +++ b/settings/templates/admin/frame.php @@ -30,14 +30,28 @@ script('files', 'jquery.fileupload');
      - getURLGenerator()->linkToRoute('settings.AdminSettings.index', ['section' => $form['anchor']]); + $class = 'nav-icon-' . $form['anchor']; $sectionName = $form['section-name']; $active = $form['active'] ? ' class="active"' : ''; - print_unescaped(sprintf("%s", $active, \OCP\Util::sanitizeHTML($anchor), \OCP\Util::sanitizeHTML($sectionName))); + ?> +
    • > + + + + + + + + +
    • + + } + ?>
    diff --git a/settings/templates/apps.php b/settings/templates/apps.php index a5a98ea506f69c99476621e0b9a2f5493f1b4378..80689237e60c981a5a35c168b16a96dd65c67281 100644 --- a/settings/templates/apps.php +++ b/settings/templates/apps.php @@ -3,7 +3,9 @@ style('settings', 'settings'); vendor_script( 'core', [ - 'handlebars/handlebars' + 'handlebars/handlebars', + 'marked/marked.min', + 'DOMPurify/dist/purify.min', ] ); script( @@ -24,7 +26,7 @@ script(
  • - t('Developer documentation'));?> ↗ + t('Developer documentation'));?> ↗
  • @@ -59,7 +61,7 @@ script(
    - +
    diff --git a/settings/templates/personal.php b/settings/templates/personal.php index a14982b9b741e03b048409460ab4c7fd5eb0596d..65ce3751b9809fe629f8b495fbac69d000fca6c2 100644 --- a/settings/templates/personal.php +++ b/settings/templates/personal.php @@ -9,12 +9,14 @@ ?>
    -
      +
        %s", \OCP\Util::sanitizeHTML($anchor), \OCP\Util::sanitizeHTML($sectionName))); + print_unescaped(sprintf("
      • %s
      • ", \OCP\Util::sanitizeHTML($anchor), + \OCP\Util::sanitizeHTML($class), \OCP\Util::sanitizeHTML($sectionName))); } }?>
      @@ -184,12 +186,14 @@ if($_['passwordChangeSupported']) { - - - +
      + + + +

      diff --git a/settings/tests/js/appsSpec.js b/settings/tests/js/appsSpec.js index aa785a6768e9d0c1139f060a422076b6bf36edb7..4b917b425c14a75a0d25b9ce39d2c0018ef3fe69 100644 --- a/settings/tests/js/appsSpec.js +++ b/settings/tests/js/appsSpec.js @@ -185,23 +185,27 @@ describe('OC.Settings.Apps tests', function() { { id: 'foo', name: 'Foo app', + description: 'Hello', level: 0, author: 'foo' }, { id: 'alpha', name: 'Alpha app', + description: 'Hello', level: 300, author: ['alpha', 'beta'] }, { id: 'nolevel', name: 'No level', + description: 'Hello', author: 'bar' }, { id: 'zork', name: 'Some famous adventure game', + description: 'Hello', level: 200, author: 'baz' @@ -209,6 +213,7 @@ describe('OC.Settings.Apps tests', function() { { id: 'delta', name: 'Mathematical symbol', + description: 'Hello', level: 200, author: 'foobar' } @@ -223,29 +228,34 @@ describe('OC.Settings.Apps tests', function() { 'foo': { id: 'foo', name: 'Foo app', + description: 'Hello', level: 0, author: 'foo' }, 'alpha': { id: 'alpha', name: 'Alpha app', + description: 'Hello', level: 300, author: ['alpha', 'beta'] }, 'nolevel': { id: 'nolevel', name: 'No level', + description: 'Hello', author: 'bar' }, 'zork': { id: 'zork', name: 'Some famous adventure game', + description: 'Hello', level: 200, author: 'baz', }, 'delta': { id: 'delta', name: 'Mathematical symbol', + description: 'Hello', level: 200, author: 'foobar' } diff --git a/tests/Core/Command/Config/ListConfigsTest.php b/tests/Core/Command/Config/ListConfigsTest.php index 0f170cee840e4956ca437a2791ff7380e841bc5c..861c1f59d5ea01fd4b10cbc9ad4f462bc4521c96 100644 --- a/tests/Core/Command/Config/ListConfigsTest.php +++ b/tests/Core/Command/Config/ListConfigsTest.php @@ -285,10 +285,16 @@ class ListConfigsTest extends TestCase { $this->systemConfig->expects($this->any()) ->method('getValue') ->willReturnMap($systemConfigMap); + $this->appConfig->expects($this->any()) + ->method('getValues') + ->willReturnMap($appConfig); } else { $this->systemConfig->expects($this->any()) ->method('getFilteredValue') ->willReturnMap($systemConfigMap); + $this->appConfig->expects($this->any()) + ->method('getFilteredValues') + ->willReturnMap($appConfig); } $this->appConfig->expects($this->any()) diff --git a/tests/Core/Command/Group/AddUserTest.php b/tests/Core/Command/Group/AddUserTest.php new file mode 100644 index 0000000000000000000000000000000000000000..af860e244d6611ee74c6cf17430b2f7225e02e08 --- /dev/null +++ b/tests/Core/Command/Group/AddUserTest.php @@ -0,0 +1,119 @@ + + * + * @author Roeland Jago Douma + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ +namespace Test\Core\Command\Group; + +use OC\Core\Command\Group\AddUser; +use OCP\IGroup; +use OCP\IGroupManager; +use OCP\IUser; +use OCP\IUserManager; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Test\TestCase; + +class AddUserTest extends TestCase { + + /** @var IGroupManager|\PHPUnit_Framework_MockObject_MockObject */ + private $groupManager; + + /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */ + private $userManager; + + /** @var AddUser */ + private $command; + + /** @var InputInterface|\PHPUnit_Framework_MockObject_MockObject */ + private $input; + + /** @var OutputInterface|\PHPUnit_Framework_MockObject_MockObject */ + private $output; + + public function setUp() { + parent::setUp(); + + $this->groupManager = $this->createMock(IGroupManager::class); + $this->userManager = $this->createMock(IUserManager::class); + $this->command = new AddUser($this->userManager, $this->groupManager); + + $this->input = $this->createMock(InputInterface::class); + $this->input->method('getArgument') + ->willReturnCallback(function($arg) { + if ($arg === 'group') { + return 'myGroup'; + } else if ($arg === 'user') { + return 'myUser'; + } + throw new \Exception(); + }); + $this->output = $this->createMock(OutputInterface::class); + } + + public function testNoGroup() { + $this->groupManager->method('get') + ->with('myGroup') + ->willReturn(null); + + $this->output->expects($this->once()) + ->method('writeln') + ->with('group not found'); + + $this->invokePrivate($this->command, 'execute', [$this->input, $this->output]); + } + + public function testNoUser() { + $group = $this->createMock(IGroup::class); + $this->groupManager->method('get') + ->with('myGroup') + ->willReturn($group); + + $this->userManager->method('get') + ->with('myUser') + ->willReturn(null); + + $this->output->expects($this->once()) + ->method('writeln') + ->with('user not found'); + + $this->invokePrivate($this->command, 'execute', [$this->input, $this->output]); + } + + public function testAdd() { + $group = $this->createMock(IGroup::class); + $this->groupManager->method('get') + ->with('myGroup') + ->willReturn($group); + + $user = $this->createMock(IUser::class); + $this->userManager->method('get') + ->with('myUser') + ->willReturn($user); + + $group->expects($this->once()) + ->method('addUser') + ->with($user); + + $this->invokePrivate($this->command, 'execute', [$this->input, $this->output]); + } + + +} diff --git a/tests/Core/Command/Group/ListCommandTest.php b/tests/Core/Command/Group/ListCommandTest.php new file mode 100644 index 0000000000000000000000000000000000000000..ac872e74ac85c248c9816dca0d669d2540fc841a --- /dev/null +++ b/tests/Core/Command/Group/ListCommandTest.php @@ -0,0 +1,127 @@ + + * + * @author Roeland Jago Douma + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ +namespace Test\Core\Command\Group; + +use OC\Core\Command\Group\ListCommand; +use OCP\IGroup; +use OCP\IGroupManager; +use OCP\IUser; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Test\TestCase; + +class ListCommandTest extends TestCase { + + /** @var IGroupManager|\PHPUnit_Framework_MockObject_MockObject */ + private $groupManager; + + /** @var ListCommand|\PHPUnit_Framework_MockObject_MockObject */ + private $command; + + /** @var InputInterface|\PHPUnit_Framework_MockObject_MockObject */ + private $input; + + /** @var OutputInterface|\PHPUnit_Framework_MockObject_MockObject */ + private $output; + + public function setUp() { + parent::setUp(); + + $this->groupManager = $this->createMock(IGroupManager::class); + $this->command = $this->getMockBuilder(ListCommand::class) + ->setConstructorArgs([$this->groupManager]) + ->setMethods(['writeArrayInOutputFormat']) + ->getMock(); + + $this->input = $this->createMock(InputInterface::class); + $this->input->method('getOption') + ->willReturnCallback(function($arg) { + if ($arg === 'limit') { + return '100'; + } else if ($arg === 'offset') { + return '42'; + } + throw new \Exception(); + }); + + + $this->output = $this->createMock(OutputInterface::class); + } + + public function testExecute() { + $group1 = $this->createMock(IGroup::class); + $group1->method('getGID')->willReturn('group1'); + $group2 = $this->createMock(IGroup::class); + $group2->method('getGID')->willReturn('group2'); + $group3 = $this->createMock(IGroup::class); + $group3->method('getGID')->willReturn('group3'); + + $user = $this->createMock(IUser::class); + + $this->groupManager->method('search') + ->with( + '', + 100, + 42 + )->willReturn([$group1, $group2, $group3]); + + $group1->method('getUsers') + ->willReturn([ + 'user1' => $user, + 'user2' => $user, + ]); + + $group2->method('getUsers') + ->willReturn([ + ]); + + $group3->method('getUsers') + ->willReturn([ + 'user1' => $user, + 'user3' => $user, + ]); + + $this->command->expects($this->once()) + ->method('writeArrayInOutputFormat') + ->with( + $this->equalTo($this->input), + $this->equalTo($this->output), + [ + 'group1' => [ + 'user1', + 'user2', + ], + 'group2' => [ + ], + 'group3' => [ + 'user1', + 'user3', + ] + ] + ); + + $this->invokePrivate($this->command, 'execute', [$this->input, $this->output]); + } + + +} diff --git a/tests/Core/Command/Group/RemoveUserTest.php b/tests/Core/Command/Group/RemoveUserTest.php new file mode 100644 index 0000000000000000000000000000000000000000..ec7b0f2d714044c5cfd27259b7755af605bf8b8c --- /dev/null +++ b/tests/Core/Command/Group/RemoveUserTest.php @@ -0,0 +1,119 @@ + + * + * @author Roeland Jago Douma + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ +namespace Test\Core\Command\Group; + +use OC\Core\Command\Group\RemoveUser; +use OCP\IGroup; +use OCP\IGroupManager; +use OCP\IUser; +use OCP\IUserManager; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Test\TestCase; + +class RemoveUserTest extends TestCase { + + /** @var IGroupManager|\PHPUnit_Framework_MockObject_MockObject */ + private $groupManager; + + /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */ + private $userManager; + + /** @var RemoveUser */ + private $command; + + /** @var InputInterface|\PHPUnit_Framework_MockObject_MockObject */ + private $input; + + /** @var OutputInterface|\PHPUnit_Framework_MockObject_MockObject */ + private $output; + + public function setUp() { + parent::setUp(); + + $this->groupManager = $this->createMock(IGroupManager::class); + $this->userManager = $this->createMock(IUserManager::class); + $this->command = new RemoveUser($this->userManager, $this->groupManager); + + $this->input = $this->createMock(InputInterface::class); + $this->input->method('getArgument') + ->willReturnCallback(function($arg) { + if ($arg === 'group') { + return 'myGroup'; + } else if ($arg === 'user') { + return 'myUser'; + } + throw new \Exception(); + }); + $this->output = $this->createMock(OutputInterface::class); + } + + public function testNoGroup() { + $this->groupManager->method('get') + ->with('myGroup') + ->willReturn(null); + + $this->output->expects($this->once()) + ->method('writeln') + ->with('group not found'); + + $this->invokePrivate($this->command, 'execute', [$this->input, $this->output]); + } + + public function testNoUser() { + $group = $this->createMock(IGroup::class); + $this->groupManager->method('get') + ->with('myGroup') + ->willReturn($group); + + $this->userManager->method('get') + ->with('myUser') + ->willReturn(null); + + $this->output->expects($this->once()) + ->method('writeln') + ->with('user not found'); + + $this->invokePrivate($this->command, 'execute', [$this->input, $this->output]); + } + + public function testAdd() { + $group = $this->createMock(IGroup::class); + $this->groupManager->method('get') + ->with('myGroup') + ->willReturn($group); + + $user = $this->createMock(IUser::class); + $this->userManager->method('get') + ->with('myUser') + ->willReturn($user); + + $group->expects($this->once()) + ->method('removeUser') + ->with($user); + + $this->invokePrivate($this->command, 'execute', [$this->input, $this->output]); + } + + +} diff --git a/tests/Core/Command/TwoFactorAuth/DisableTest.php b/tests/Core/Command/TwoFactorAuth/DisableTest.php new file mode 100644 index 0000000000000000000000000000000000000000..1a0bbc6c3d38354ac345621475524af812100891 --- /dev/null +++ b/tests/Core/Command/TwoFactorAuth/DisableTest.php @@ -0,0 +1,99 @@ + + * + * @author Roeland Jago Douma + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ +namespace Test\Core\Command\TwoFactorAuth; + +use OC\Authentication\TwoFactorAuth\Manager; +use OC\Core\Command\TwoFactorAuth\Disable; +use OCP\IUser; +use OCP\IUserManager; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Test\TestCase; + +class DisableTest extends TestCase { + + /** @var Manager|\PHPUnit_Framework_MockObject_MockObject */ + private $manager; + + /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */ + private $userManager; + + /** @var Disable */ + private $command; + + public function setUp() { + parent::setUp(); + + $this->manager = $this->createMock(Manager::class); + $this->userManager = $this->createMock(IUserManager::class); + + $this->command = new Disable($this->manager, $this->userManager); + } + + public function testDisableSuccess() { + $user = $this->createMock(IUser::class); + + $input = $this->createMock(InputInterface::class); + $output = $this->createMock(OutputInterface::class); + + $input->method('getArgument') + ->with($this->equalTo('uid')) + ->willReturn('user'); + + $this->userManager->method('get') + ->with('user') + ->willReturn($user); + + $this->manager->expects($this->once()) + ->method('disableTwoFactorAuthentication') + ->with($this->equalTo($user)); + + $output->expects($this->once()) + ->method('writeln') + ->with('Two-factor authentication disabled for user user'); + + $this->invokePrivate($this->command, 'execute', [$input, $output]); + } + + public function testEnableFail() { + $input = $this->createMock(InputInterface::class); + $output = $this->createMock(OutputInterface::class); + + $input->method('getArgument') + ->with($this->equalTo('uid')) + ->willReturn('user'); + + $this->userManager->method('get') + ->with('user') + ->willReturn(null); + + $this->manager->expects($this->never()) + ->method($this->anything()); + + $output->expects($this->once()) + ->method('writeln') + ->with('Invalid UID'); + + $this->invokePrivate($this->command, 'execute', [$input, $output]); + } +} diff --git a/tests/Core/Command/TwoFactorAuth/EnableTest.php b/tests/Core/Command/TwoFactorAuth/EnableTest.php new file mode 100644 index 0000000000000000000000000000000000000000..ebca40df9a5977a54ecccc6227390ad7698fc58a --- /dev/null +++ b/tests/Core/Command/TwoFactorAuth/EnableTest.php @@ -0,0 +1,99 @@ + + * + * @author Roeland Jago Douma + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ +namespace Test\Core\Command\TwoFactorAuth; + +use OC\Authentication\TwoFactorAuth\Manager; +use OC\Core\Command\TwoFactorAuth\Enable; +use OCP\IUser; +use OCP\IUserManager; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Test\TestCase; + +class EnableTest extends TestCase { + + /** @var Manager|\PHPUnit_Framework_MockObject_MockObject */ + private $manager; + + /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */ + private $userManager; + + /** @var Enable */ + private $command; + + public function setUp() { + parent::setUp(); + + $this->manager = $this->createMock(Manager::class); + $this->userManager = $this->createMock(IUserManager::class); + + $this->command = new Enable($this->manager, $this->userManager); + } + + public function testEnableSuccess() { + $user = $this->createMock(IUser::class); + + $input = $this->createMock(InputInterface::class); + $output = $this->createMock(OutputInterface::class); + + $input->method('getArgument') + ->with($this->equalTo('uid')) + ->willReturn('user'); + + $this->userManager->method('get') + ->with('user') + ->willReturn($user); + + $this->manager->expects($this->once()) + ->method('enableTwoFactorAuthentication') + ->with($this->equalTo($user)); + + $output->expects($this->once()) + ->method('writeln') + ->with('Two-factor authentication enabled for user user'); + + $this->invokePrivate($this->command, 'execute', [$input, $output]); + } + + public function testEnableFail() { + $input = $this->createMock(InputInterface::class); + $output = $this->createMock(OutputInterface::class); + + $input->method('getArgument') + ->with($this->equalTo('uid')) + ->willReturn('user'); + + $this->userManager->method('get') + ->with('user') + ->willReturn(null); + + $this->manager->expects($this->never()) + ->method($this->anything()); + + $output->expects($this->once()) + ->method('writeln') + ->with('Invalid UID'); + + $this->invokePrivate($this->command, 'execute', [$input, $output]); + } +} diff --git a/tests/Core/Command/User/DisableTest.php b/tests/Core/Command/User/DisableTest.php new file mode 100644 index 0000000000000000000000000000000000000000..758020acc71a4a3f13a62d08b5eb15ead3542707 --- /dev/null +++ b/tests/Core/Command/User/DisableTest.php @@ -0,0 +1,94 @@ + + * + * @author Roeland Jago Douma + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ +namespace Tests\Core\Command\User; + + +use OC\Core\Command\User\Disable; +use OCP\IUser; +use OCP\IUserManager; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Test\TestCase; + +class DisableTest extends TestCase { + /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */ + protected $userManager; + /** @var InputInterface|\PHPUnit_Framework_MockObject_MockObject */ + protected $consoleInput; + /** @var OutputInterface|\PHPUnit_Framework_MockObject_MockObject */ + protected $consoleOutput; + + /** @var Disable */ + protected $command; + + protected function setUp() { + parent::setUp(); + + $this->userManager = $this->createMock(IUserManager::class); + $this->consoleInput = $this->createMock(InputInterface::class); + $this->consoleOutput = $this->createMock(OutputInterface::class); + + $this->command = new Disable($this->userManager); + } + + public function testValidUser() { + $user = $this->createMock(IUser::class); + $user->expects($this->once()) + ->method('setEnabled') + ->with(false); + + $this->userManager + ->method('get') + ->with('user') + ->willReturn($user); + + $this->consoleInput + ->method('getArgument') + ->with('uid') + ->willReturn('user'); + + $this->consoleOutput->expects($this->once()) + ->method('writeln') + ->with($this->stringContains('The specified user is disabled')); + + self::invokePrivate($this->command, 'execute', [$this->consoleInput, $this->consoleOutput]); + } + + public function testInvalidUser() { + $this->userManager->expects($this->once()) + ->method('get') + ->with('user') + ->willReturn(null); + + $this->consoleInput + ->method('getArgument') + ->with('uid') + ->willReturn('user'); + + $this->consoleOutput->expects($this->once()) + ->method('writeln') + ->with($this->stringContains('User does not exist')); + + self::invokePrivate($this->command, 'execute', [$this->consoleInput, $this->consoleOutput]); + } +} diff --git a/tests/Core/Command/User/EnableTest.php b/tests/Core/Command/User/EnableTest.php new file mode 100644 index 0000000000000000000000000000000000000000..60b415ae79db0f315cc97e577757a4bc3b640ad3 --- /dev/null +++ b/tests/Core/Command/User/EnableTest.php @@ -0,0 +1,94 @@ + + * + * @author Roeland Jago Douma + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ +namespace Tests\Core\Command\User; + + +use OC\Core\Command\User\Enable; +use OCP\IUser; +use OCP\IUserManager; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Test\TestCase; + +class EnableTest extends TestCase { + /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */ + protected $userManager; + /** @var InputInterface|\PHPUnit_Framework_MockObject_MockObject */ + protected $consoleInput; + /** @var OutputInterface|\PHPUnit_Framework_MockObject_MockObject */ + protected $consoleOutput; + + /** @var Disable */ + protected $command; + + protected function setUp() { + parent::setUp(); + + $this->userManager = $this->createMock(IUserManager::class); + $this->consoleInput = $this->createMock(InputInterface::class); + $this->consoleOutput = $this->createMock(OutputInterface::class); + + $this->command = new Enable($this->userManager); + } + + public function testValidUser() { + $user = $this->createMock(IUser::class); + $user->expects($this->once()) + ->method('setEnabled') + ->with(true); + + $this->userManager + ->method('get') + ->with('user') + ->willReturn($user); + + $this->consoleInput + ->method('getArgument') + ->with('uid') + ->willReturn('user'); + + $this->consoleOutput->expects($this->once()) + ->method('writeln') + ->with($this->stringContains('The specified user is enabled')); + + self::invokePrivate($this->command, 'execute', [$this->consoleInput, $this->consoleOutput]); + } + + public function testInvalidUser() { + $this->userManager->expects($this->once()) + ->method('get') + ->with('user') + ->willReturn(null); + + $this->consoleInput + ->method('getArgument') + ->with('uid') + ->willReturn('user'); + + $this->consoleOutput->expects($this->once()) + ->method('writeln') + ->with($this->stringContains('User does not exist')); + + self::invokePrivate($this->command, 'execute', [$this->consoleInput, $this->consoleOutput]); + } +} diff --git a/tests/Core/Controller/CssControllerTest.php b/tests/Core/Controller/CssControllerTest.php new file mode 100644 index 0000000000000000000000000000000000000000..60fef9dddade58ed218232d3a475ce5f0589a719 --- /dev/null +++ b/tests/Core/Controller/CssControllerTest.php @@ -0,0 +1,111 @@ + + * + * @author Roeland Jago Douma + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ +namespace Tests\Core\Controller; + +use OC\Core\Controller\CssController; +use OC\HintException; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\FileDisplayResponse; +use OCP\AppFramework\Http\NotFoundResponse; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\Files\IAppData; +use OCP\Files\NotFoundException; +use OCP\Files\SimpleFS\ISimpleFile; +use OCP\Files\SimpleFS\ISimpleFolder; +use OCP\IRequest; +use Test\TestCase; + +class CssControllerTest extends TestCase { + + /** @var IAppData|\PHPUnit_Framework_MockObject_MockObject */ + private $appData; + + /** @var CssController */ + private $controller; + + public function setUp() { + parent::setUp(); + + $this->appData = $this->createMock(IAppData::class); + + $timeFactory = $this->createMock(ITimeFactory::class); + $timeFactory->method('getTime') + ->willReturn(1337); + + $this->controller = new CssController( + 'core', + $this->createMock(IRequest::class), + $this->appData, + $timeFactory + ); + } + + public function testNoCssFolderForApp() { + $this->appData->method('getFolder') + ->with('myapp') + ->willThrowException(new NotFoundException()); + + $result = $this->controller->getCss('file.css', 'myapp'); + + $this->assertInstanceOf(NotFoundResponse::class, $result); + } + + + public function testNoCssFile() { + $folder = $this->createMock(ISimpleFolder::class); + $this->appData->method('getFolder') + ->with('myapp') + ->willReturn($folder); + + $folder->method('getFile') + ->willThrowException(new NotFoundException()); + + $result = $this->controller->getCss('file.css', 'myapp'); + + $this->assertInstanceOf(NotFoundResponse::class, $result); + } + + public function testGetFile() { + $folder = $this->createMock(ISimpleFolder::class); + $file = $this->createMock(ISimpleFile::class); + $this->appData->method('getFolder') + ->with('myapp') + ->willReturn($folder); + + $folder->method('getFile') + ->with('file.css') + ->willReturn($file); + + $expected = new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => 'text/css']); + $expected->cacheFor(86400); + $expires = new \DateTime(); + $expires->setTimestamp(1337); + $expires->add(new \DateInterval('PT24H')); + $expected->addHeader('Expires', $expires->format(\DateTime::RFC1123)); + $expected->addHeader('Pragma', 'cache'); + + $result = $this->controller->getCss('file.css', 'myapp'); + $this->assertEquals($expected, $result); + } + +} diff --git a/tests/Core/Controller/LoginControllerTest.php b/tests/Core/Controller/LoginControllerTest.php index 600179a1dc5f3208bebf298a94d9f461136727f4..a1a4452abf8288be2f2dce3280463679993f242a 100644 --- a/tests/Core/Controller/LoginControllerTest.php +++ b/tests/Core/Controller/LoginControllerTest.php @@ -179,7 +179,6 @@ class LoginControllerTest extends TestCase { 'user_autofocus' => true, 'canResetPassword' => true, 'alt_login' => [], - 'rememberLoginAllowed' => \OC_Util::rememberLoginAllowed(), 'rememberLoginState' => 0, 'resetPasswordLink' => null, ], @@ -238,7 +237,6 @@ class LoginControllerTest extends TestCase { 'user_autofocus' => false, 'canResetPassword' => $expectedResult, 'alt_login' => [], - 'rememberLoginAllowed' => \OC_Util::rememberLoginAllowed(), 'rememberLoginState' => 0, 'resetPasswordLink' => false, ], @@ -277,7 +275,6 @@ class LoginControllerTest extends TestCase { 'user_autofocus' => false, 'canResetPassword' => false, 'alt_login' => [], - 'rememberLoginAllowed' => \OC_Util::rememberLoginAllowed(), 'rememberLoginState' => 0, 'resetPasswordLink' => false, ], diff --git a/tests/Core/Controller/LostControllerTest.php b/tests/Core/Controller/LostControllerTest.php index 605298b66cf6831dc9fba133918a252f41ca6631..0f9dcaead35e7b3f370763b9fa41a15c592a1180 100644 --- a/tests/Core/Controller/LostControllerTest.php +++ b/tests/Core/Controller/LostControllerTest.php @@ -23,6 +23,7 @@ namespace Tests\Core\Controller; use OC\Core\Controller\LostController; use OC\Mail\Message; +use OCA\Encryption\Exceptions\PrivateKeyMissingException; use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Utility\ITimeFactory; use OCP\Encryption\IManager; diff --git a/tests/Core/Controller/OCSControllerTest.php b/tests/Core/Controller/OCSControllerTest.php index 6c47521786f74c0694c7ab4a8847d8ca63408af8..7241df9317cd544c202a5b968913312a56c71c9e 100644 --- a/tests/Core/Controller/OCSControllerTest.php +++ b/tests/Core/Controller/OCSControllerTest.php @@ -116,24 +116,6 @@ class OCSControllerTest extends TestCase { $this->assertEquals($expected, $this->controller->getCapabilities()); } - public function testGetCurrentUser() { - $user = $this->createMock(IUser::class); - $user->method('getUID')->willReturn('uid'); - $user->method('getDisplayName')->willReturn('displayName'); - $user->method('getEMailAddress')->willReturn('e@mail.com'); - - - $this->userSession->method('getUser') - ->willReturn($user); - - $expected = new DataResponse([ - 'id' => 'uid', - 'display-name' => 'displayName', - 'email' => 'e@mail.com', - ]); - $this->assertEquals($expected, $this->controller->getCurrentUser()); - } - public function testPersonCheckValid() { $this->request->method('getRemoteAddress') ->willReturn('1.2.3.4'); diff --git a/tests/Core/Controller/TwoFactorChallengeControllerTest.php b/tests/Core/Controller/TwoFactorChallengeControllerTest.php index 8a1cfb9edf1baa47cd0b02193590537f6c3c2bb4..bef343f90434b3468fbf93fc8639c42167963605 100644 --- a/tests/Core/Controller/TwoFactorChallengeControllerTest.php +++ b/tests/Core/Controller/TwoFactorChallengeControllerTest.php @@ -22,32 +22,52 @@ namespace Test\Core\Controller; +use OC\Authentication\TwoFactorAuth\Manager; use OC\Core\Controller\TwoFactorChallengeController; +use OC_Util; +use OCP\AppFramework\Http\RedirectResponse; +use OCP\AppFramework\Http\TemplateResponse; +use OCP\Authentication\TwoFactorAuth\IProvider; +use OCP\Authentication\TwoFactorAuth\TwoFactorException; +use OCP\IRequest; +use OCP\ISession; +use OCP\IURLGenerator; +use OCP\IUser; +use OCP\IUserSession; +use OCP\Template; +use PHPUnit_Framework_MockObject_MockObject; use Test\TestCase; class TwoFactorChallengeControllerTest extends TestCase { + /** @var IRequest|PHPUnit_Framework_MockObject_MockObject */ private $request; + + /** @var Manager|PHPUnit_Framework_MockObject_MockObject */ private $twoFactorManager; + + /** @var IUserSession|PHPUnit_Framework_MockObject_MockObject */ private $userSession; + + /** @var ISession|PHPUnit_Framework_MockObject_MockObject */ private $session; + + /** @var IURLGenerator|PHPUnit_Framework_MockObject_MockObject */ private $urlGenerator; - /** @var TwoFactorChallengeController|\PHPUnit_Framework_MockObject_MockObject */ + /** @var TwoFactorChallengeController|PHPUnit_Framework_MockObject_MockObject */ private $controller; protected function setUp() { parent::setUp(); - $this->request = $this->getMockBuilder('\OCP\IRequest')->getMock(); - $this->twoFactorManager = $this->getMockBuilder('\OC\Authentication\TwoFactorAuth\Manager') - ->disableOriginalConstructor() - ->getMock(); - $this->userSession = $this->getMockBuilder('\OCP\IUserSession')->getMock(); - $this->session = $this->getMockBuilder('\OCP\ISession')->getMock(); - $this->urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator')->getMock(); + $this->request = $this->createMock(IRequest::class); + $this->twoFactorManager = $this->createMock(Manager::class); + $this->userSession = $this->createMock(IUserSession::class); + $this->session = $this->createMock(ISession::class); + $this->urlGenerator = $this->createMock(IURLGenerator::class); - $this->controller = $this->getMockBuilder('OC\Core\Controller\TwoFactorChallengeController') + $this->controller = $this->getMockBuilder(TwoFactorChallengeController::class) ->setConstructorArgs([ 'core', $this->request, @@ -64,7 +84,7 @@ class TwoFactorChallengeControllerTest extends TestCase { } public function testSelectChallenge() { - $user = $this->getMockBuilder('\OCP\IUser')->getMock(); + $user = $this->getMockBuilder(IUser::class)->getMock(); $providers = [ 'prov1', 'prov2', @@ -82,27 +102,21 @@ class TwoFactorChallengeControllerTest extends TestCase { ->with($user) ->will($this->returnValue('backup')); - $expected = new \OCP\AppFramework\Http\TemplateResponse('core', 'twofactorselectchallenge', [ + $expected = new TemplateResponse('core', 'twofactorselectchallenge', [ 'providers' => $providers, 'backupProvider' => 'backup', 'redirect_url' => '/some/url', 'logout_attribute' => 'logoutAttribute', - ], 'guest'); + ], 'guest'); $this->assertEquals($expected, $this->controller->selectChallenge('/some/url')); } public function testShowChallenge() { - $user = $this->getMockBuilder('\OCP\IUser')->getMock(); - $provider = $this->getMockBuilder('\OCP\Authentication\TwoFactorAuth\IProvider') - ->disableOriginalConstructor() - ->getMock(); - $backupProvider = $this->getMockBuilder('\OCP\Authentication\TwoFactorAuth\IProvider') - ->disableOriginalConstructor() - ->getMock(); - $tmpl = $this->getMockBuilder('\OCP\Template') - ->disableOriginalConstructor() - ->getMock(); + $user = $this->createMock(IUser::class); + $provider = $this->createMock(IProvider::class); + $backupProvider = $this->createMock(IProvider::class); + $tmpl = $this->createMock(Template::class); $this->userSession->expects($this->once()) ->method('getUser') @@ -126,9 +140,9 @@ class TwoFactorChallengeControllerTest extends TestCase { ->method('exists') ->with('two_factor_auth_error') ->will($this->returnValue(true)); - $this->session->expects($this->once()) + $this->session->expects($this->exactly(2)) ->method('remove') - ->with('two_factor_auth_error'); + ->with($this->logicalOr($this->equalTo('two_factor_auth_error'), $this->equalTo('two_factor_auth_error_message'))); $provider->expects($this->once()) ->method('getTemplate') ->with($user) @@ -137,19 +151,21 @@ class TwoFactorChallengeControllerTest extends TestCase { ->method('fetchPage') ->will($this->returnValue('')); - $expected = new \OCP\AppFramework\Http\TemplateResponse('core', 'twofactorshowchallenge', [ + $expected = new TemplateResponse('core', 'twofactorshowchallenge', [ 'error' => true, 'provider' => $provider, 'backupProvider' => $backupProvider, 'logout_attribute' => 'logoutAttribute', 'template' => '', + 'redirect_url' => '/re/dir/ect/url', + 'error_message' => null, ], 'guest'); $this->assertEquals($expected, $this->controller->showChallenge('myprovider', '/re/dir/ect/url')); } public function testShowInvalidChallenge() { - $user = $this->getMockBuilder('\OCP\IUser')->getMock(); + $user = $this->createMock(IUser::class); $this->userSession->expects($this->once()) ->method('getUser') @@ -163,16 +179,14 @@ class TwoFactorChallengeControllerTest extends TestCase { ->with('core.TwoFactorChallenge.selectChallenge') ->will($this->returnValue('select/challenge/url')); - $expected = new \OCP\AppFramework\Http\RedirectResponse('select/challenge/url'); + $expected = new RedirectResponse('select/challenge/url'); $this->assertEquals($expected, $this->controller->showChallenge('myprovider', 'redirect/url')); } public function testSolveChallenge() { - $user = $this->getMockBuilder('\OCP\IUser')->getMock(); - $provider = $this->getMockBuilder('\OCP\Authentication\TwoFactorAuth\IProvider') - ->disableOriginalConstructor() - ->getMock(); + $user = $this->createMock(IUser::class); + $provider = $this->createMock(IProvider::class); $this->userSession->expects($this->once()) ->method('getUser') @@ -187,12 +201,37 @@ class TwoFactorChallengeControllerTest extends TestCase { ->with('myprovider', $user, 'token') ->will($this->returnValue(true)); - $expected = new \OCP\AppFramework\Http\RedirectResponse(\OC_Util::getDefaultPageUrl()); + $expected = new RedirectResponse(OC_Util::getDefaultPageUrl()); $this->assertEquals($expected, $this->controller->solveChallenge('myprovider', 'token')); } + public function testSolveValidChallengeAndRedirect() { + $user = $this->createMock(IUser::class); + $provider = $this->createMock(IProvider::class); + + $this->userSession->expects($this->once()) + ->method('getUser') + ->will($this->returnValue($user)); + $this->twoFactorManager->expects($this->once()) + ->method('getProvider') + ->with($user, 'myprovider') + ->will($this->returnValue($provider)); + + $this->twoFactorManager->expects($this->once()) + ->method('verifyChallenge') + ->with('myprovider', $user, 'token') + ->willReturn(true); + $this->urlGenerator->expects($this->once()) + ->method('getAbsoluteURL') + ->with('redirect url') + ->willReturn('redirect/url'); + + $expected = new RedirectResponse('redirect/url'); + $this->assertEquals($expected, $this->controller->solveChallenge('myprovider', 'token', 'redirect%20url')); + } + public function testSolveChallengeInvalidProvider() { - $user = $this->getMockBuilder('\OCP\IUser')->getMock(); + $user = $this->getMockBuilder(IUser::class)->getMock(); $this->userSession->expects($this->once()) ->method('getUser') @@ -206,16 +245,14 @@ class TwoFactorChallengeControllerTest extends TestCase { ->with('core.TwoFactorChallenge.selectChallenge') ->will($this->returnValue('select/challenge/url')); - $expected = new \OCP\AppFramework\Http\RedirectResponse('select/challenge/url'); + $expected = new RedirectResponse('select/challenge/url'); $this->assertEquals($expected, $this->controller->solveChallenge('myprovider', 'token')); } public function testSolveInvalidChallenge() { - $user = $this->getMockBuilder('\OCP\IUser')->getMock(); - $provider = $this->getMockBuilder('\OCP\Authentication\TwoFactorAuth\IProvider') - ->disableOriginalConstructor() - ->getMock(); + $user = $this->createMock(IUser::class); + $provider = $this->createMock(IProvider::class); $this->userSession->expects($this->once()) ->method('getUser') @@ -243,7 +280,45 @@ class TwoFactorChallengeControllerTest extends TestCase { ->method('getId') ->will($this->returnValue('myprovider')); - $expected = new \OCP\AppFramework\Http\RedirectResponse('files/index/url'); + $expected = new RedirectResponse('files/index/url'); + $this->assertEquals($expected, $this->controller->solveChallenge('myprovider', 'token', '/url')); + } + + public function testSolveChallengeTwoFactorException() { + $user = $this->createMock(IUser::class); + $provider = $this->createMock(IProvider::class); + $exception = new TwoFactorException("2FA failed"); + + $this->userSession->expects($this->once()) + ->method('getUser') + ->will($this->returnValue($user)); + $this->twoFactorManager->expects($this->once()) + ->method('getProvider') + ->with($user, 'myprovider') + ->will($this->returnValue($provider)); + + $this->twoFactorManager->expects($this->once()) + ->method('verifyChallenge') + ->with('myprovider', $user, 'token') + ->will($this->throwException($exception)); + $this->session->expects($this->at(0)) + ->method('set') + ->with('two_factor_auth_error_message', "2FA failed"); + $this->session->expects($this->at(1)) + ->method('set') + ->with('two_factor_auth_error', true); + $this->urlGenerator->expects($this->once()) + ->method('linkToRoute') + ->with('core.TwoFactorChallenge.showChallenge', [ + 'challengeProviderId' => 'myprovider', + 'redirect_url' => '/url', + ]) + ->will($this->returnValue('files/index/url')); + $provider->expects($this->once()) + ->method('getId') + ->will($this->returnValue('myprovider')); + + $expected = new RedirectResponse('files/index/url'); $this->assertEquals($expected, $this->controller->solveChallenge('myprovider', 'token', '/url')); } diff --git a/tests/Core/Controller/UserControllerTest.php b/tests/Core/Controller/UserControllerTest.php new file mode 100644 index 0000000000000000000000000000000000000000..d15bbf7f87182e16a646f7190d92c9d20f56da8c --- /dev/null +++ b/tests/Core/Controller/UserControllerTest.php @@ -0,0 +1,76 @@ + + * + * @author Roeland Jago Douma + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ +namespace Test\Core\Controller; + +use OC\Core\Controller\UserController; +use OCP\AppFramework\Http\JSONResponse; +use OCP\IRequest; +use OCP\IUser; +use OCP\IUserManager; +use Test\TestCase; + +class UserControllerTest extends TestCase { + + /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */ + private $userManager; + + /** @var UserController */ + private $controller; + + public function setUp() { + parent::setUp(); + + $this->userManager = $this->createMock(IUserManager::class); + $this->controller = new UserController( + 'core', + $this->createMock(IRequest::class), + $this->userManager + ); + } + + public function testGetDisplayNames() { + $user = $this->createMock(IUser::class); + $user->method('getDisplayName') + ->willReturn('FooDisplay Name'); + + $this->userManager + ->method('get') + ->will($this->returnCallback(function ($uid) use ($user) { + if ($uid === 'foo') { + return $user; + } + return null; + })); + + $expected = new JSONResponse([ + 'users' => [ + 'foo' => 'FooDisplay Name', + 'bar' => 'bar', + ], + 'status' => 'success' + ]); + + $result = $this->controller->getDisplayNames(['foo', 'bar']); + $this->assertEquals($expected, $result); + } +} diff --git a/tests/Settings/Controller/UsersControllerTest.php b/tests/Settings/Controller/UsersControllerTest.php index b85667740f7c4908e23a7d04a13f8c8a796b01f6..36ca09175241b4825f2080e644bfbbd3bed4af7e 100644 --- a/tests/Settings/Controller/UsersControllerTest.php +++ b/tests/Settings/Controller/UsersControllerTest.php @@ -19,6 +19,7 @@ use OCP\AppFramework\Http\DataResponse; use OCP\IAvatar; use OCP\IAvatarManager; use OCP\IConfig; +use OCP\IGroup; use OCP\IGroupManager; use OCP\IL10N; use OCP\ILogger; @@ -852,95 +853,6 @@ class UsersControllerTest extends \Test\TestCase { $this->assertEquals($expectedResponse, $response); } - public function testCreateSuccessfulWithoutGroupSubAdmin() { - $controller = $this->getController(false); - $user = $this->getMockBuilder('\OC\User\User') - ->disableOriginalConstructor()->getMock(); - $this->userSession - ->expects($this->once()) - ->method('getUser') - ->will($this->returnValue($user)); - - $newUser = $this->getMockBuilder('\OC\User\User') - ->disableOriginalConstructor()->getMock(); - $newUser - ->method('getUID') - ->will($this->returnValue('foo')); - $newUser - ->method('getHome') - ->will($this->returnValue('/home/user')); - $newUser - ->method('getHome') - ->will($this->returnValue('/home/user')); - $newUser - ->expects($this->once()) - ->method('getBackendClassName') - ->will($this->returnValue('bar')); - $user = $this->getMockBuilder('\OC\User\User') - ->disableOriginalConstructor()->getMock(); - $subGroup1 = $this->getMockBuilder('\OCP\IGroup') - ->disableOriginalConstructor()->getMock(); - $subGroup1 - ->expects($this->once()) - ->method('addUser') - ->with($newUser); - $subGroup2 = $this->getMockBuilder('\OCP\IGroup') - ->disableOriginalConstructor()->getMock(); - $subGroup2 - ->expects($this->once()) - ->method('addUser') - ->with($newUser); - - $this->userManager - ->expects($this->once()) - ->method('createUser') - ->will($this->returnValue($newUser)); - $this->groupManager - ->expects($this->exactly(2)) - ->method('get') - ->will($this->onConsecutiveCalls($subGroup1, $subGroup2)); - $this->groupManager - ->expects($this->once()) - ->method('getUserGroupIds') - ->with($user) - ->will($this->onConsecutiveCalls(['SubGroup1', 'SubGroup2'])); - - $subadmin = $this->getMockBuilder('\OC\SubAdmin') - ->disableOriginalConstructor() - ->getMock(); - $subadmin - ->expects($this->at(0)) - ->method('getSubAdminsGroups') - ->will($this->returnValue([$subGroup1, $subGroup2])); - $subadmin - ->expects($this->at(1)) - ->method('getSubAdminsGroups') - ->will($this->returnValue([])); - $this->groupManager - ->expects($this->any()) - ->method('getSubAdmin') - ->will($this->returnValue($subadmin)); - - $expectedResponse = new DataResponse( - array( - 'name' => 'foo', - 'groups' => ['SubGroup1', 'SubGroup2'], - 'storageLocation' => '/home/user', - 'backend' => 'bar', - 'lastLogin' => 0, - 'displayname' => null, - 'quota' => null, - 'subadmin' => [], - 'email' => null, - 'isRestoreDisabled' => false, - 'isAvatarAvailable' => true, - ), - Http::STATUS_CREATED - ); - $response = $controller->create('foo', 'password'); - $this->assertEquals($expectedResponse, $response); - } - public function testCreateSuccessfulWithGroupAdmin() { $controller = $this->getController(true); @@ -1026,16 +938,12 @@ class UsersControllerTest extends \Test\TestCase { public function testCreateSuccessfulWithGroupSubAdmin() { $controller = $this->getController(false); - $user = $this->getMockBuilder('\OC\User\User') - ->disableOriginalConstructor()->getMock(); + $user = $this->createMock(IUser::class); $this->userSession ->expects($this->once()) ->method('getUser') ->will($this->returnValue($user)); - $user = $this->getMockBuilder('\OC\User\User') - ->disableOriginalConstructor()->getMock(); - $newUser = $this->getMockBuilder('\OC\User\User') - ->disableOriginalConstructor()->getMock(); + $newUser = $this->createMock(IUser::class); $newUser ->method('getHome') ->will($this->returnValue('/home/user')); @@ -1049,8 +957,7 @@ class UsersControllerTest extends \Test\TestCase { ->expects($this->once()) ->method('getBackendClassName') ->will($this->returnValue('bar')); - $subGroup1 = $this->getMockBuilder('\OCP\IGroup') - ->disableOriginalConstructor()->getMock(); + $subGroup1 = $this->createMock(IGroup::class); $subGroup1 ->expects($this->any()) ->method('getGID') @@ -1063,16 +970,6 @@ class UsersControllerTest extends \Test\TestCase { ->expects($this->once()) ->method('createUser') ->will($this->returnValue($newUser)); - $this->groupManager - ->expects($this->at(0)) - ->method('get') - ->with('SubGroup1') - ->will($this->returnValue($subGroup1)); - $this->groupManager - ->expects($this->at(4)) - ->method('get') - ->with('SubGroup1') - ->will($this->returnValue($subGroup1)); $this->groupManager ->expects($this->once()) ->method('getUserGroupIds') @@ -1084,21 +981,28 @@ class UsersControllerTest extends \Test\TestCase { ->with($newUser) ->will($this->onConsecutiveCalls(['SubGroup1'])); - $subadmin = $this->getMockBuilder('\OC\SubAdmin') - ->disableOriginalConstructor() - ->getMock(); - $subadmin->expects($this->at(1)) + $subadmin = $this->createMock(\OC\SubAdmin::class); + $subadmin->expects($this->atLeastOnce()) ->method('getSubAdminsGroups') ->with($user) - ->will($this->returnValue([$subGroup1])); - $subadmin->expects($this->at(2)) - ->method('getSubAdminsGroups') - ->with($newUser) - ->will($this->returnValue([])); + ->willReturnMap([ + [$user, [$subGroup1]], + [$newUser, []], + ]); + $subadmin->expects($this->atLeastOnce()) + ->method('isSubAdminofGroup') + ->willReturnMap([ + [$user, $subGroup1, true], + ]); $this->groupManager ->expects($this->any()) ->method('getSubAdmin') ->will($this->returnValue($subadmin)); + $this->groupManager->expects($this->atLeastOnce()) + ->method('get') + ->willReturnMap([ + ['SubGroup1', $subGroup1], + ]); $expectedResponse = new DataResponse( array( @@ -1137,16 +1041,36 @@ class UsersControllerTest extends \Test\TestCase { $this->assertEquals($expectedResponse, $response); } + public function testCreateUnsuccessfulSubAdminNoGroup() { + $controller = $this->getController(false); + $user = $this->createMock(IUser::class); + $user->expects($this->any()) + ->method('getUID') + ->will($this->returnValue('username')); + $this->userSession->expects($this->once()) + ->method('getUser') + ->will($this->returnValue($user)); + + $this->userManager->expects($this->never()) + ->method('createUser'); + + $expectedResponse = new DataResponse( + [ + 'message' => 'No valid group selected' + ], + Http::STATUS_FORBIDDEN + ); + $response = $controller->create('foo', 'password', []); + $this->assertEquals($expectedResponse, $response); + } + public function testCreateUnsuccessfulSubAdmin() { $controller = $this->getController(false); - $user = $this->getMockBuilder('\OC\User\User') - ->disableOriginalConstructor()->getMock(); - $user - ->expects($this->any()) + $user = $this->createMock(IUser::class); + $user->expects($this->any()) ->method('getUID') ->will($this->returnValue('username')); - $this->userSession - ->expects($this->once()) + $this->userSession->expects($this->once()) ->method('getUser') ->will($this->returnValue($user)); @@ -1154,29 +1078,24 @@ class UsersControllerTest extends \Test\TestCase { ->method('createUser') ->will($this->throwException(new \Exception())); - $subgroup1 = $this->getMockBuilder('\OCP\IGroup') - ->disableOriginalConstructor() - ->getMock(); - $subgroup1->expects($this->once()) - ->method('getGID') - ->will($this->returnValue('SubGroup1')); - $subgroup2 = $this->getMockBuilder('\OCP\IGroup') - ->disableOriginalConstructor() - ->getMock(); - $subgroup2->expects($this->once()) - ->method('getGID') - ->will($this->returnValue('SubGroup2')); - $subadmin = $this->getMockBuilder('\OC\SubAdmin') - ->disableOriginalConstructor() - ->getMock(); - $subadmin->expects($this->once()) - ->method('getSubAdminsGroups') - ->with($user) - ->will($this->returnValue([$subgroup1, $subgroup2])); - $this->groupManager - ->expects($this->any()) + $subgroup1 = $this->createMock(IGroup::class); + $subgroup2 = $this->createMock(IGroup::class); + $subadmin = $this->createMock(\OC\SubAdmin::class); + $subadmin->expects($this->atLeastOnce()) + ->method('isSubAdminofGroup') + ->willReturnMap([ + [$user, $subgroup1, true], + [$user, $subgroup2, true], + ]); + $this->groupManager->expects($this->any()) ->method('getSubAdmin') - ->will($this->returnValue($subadmin)); + ->willReturn($subadmin); + $this->groupManager->expects($this->atLeastOnce()) + ->method('get') + ->willReturnMap([ + ['SubGroup1', $subgroup1], + ['SubGroup2', $subgroup2], + ]); $expectedResponse = new DataResponse( [ @@ -1184,7 +1103,7 @@ class UsersControllerTest extends \Test\TestCase { ], Http::STATUS_FORBIDDEN ); - $response = $controller->create('foo', 'password', array()); + $response = $controller->create('foo', 'password', array('SubGroup1', 'SubGroup2')); $this->assertEquals($expectedResponse, $response); } diff --git a/tests/data/app/expected-info.json b/tests/data/app/expected-info.json index 646f22bea8598b848998ae9c1bb16f29be6eb874..0666b902f2cf29ce971691847deb42e846dde50c 100644 --- a/tests/data/app/expected-info.json +++ b/tests/data/app/expected-info.json @@ -13,7 +13,6 @@ "user": "user-encryption", "admin": "admin-encryption" }, - "rememberlogin": "false", "types": ["filesystem"], "ocsid": "166047", "dependencies": { diff --git a/tests/data/app/invalid-info.xml b/tests/data/app/invalid-info.xml index 3947f5420c2fffa811a1da160c96ebee9a41be10..0ddb13b89c015f15861b69d2d9b49b6cb806d142 100644 --- a/tests/data/app/invalid-info.xml +++ b/tests/data/app/invalid-info.xml @@ -14,7 +14,6 @@ user-encryption admin-encryption - false diff --git a/tests/data/app/valid-info.xml b/tests/data/app/valid-info.xml index 4b22d55d7bca5e58b81a4404892a15aeb223c8fc..4788d046c13768619adec99bbae2491e9785ca5f 100644 --- a/tests/data/app/valid-info.xml +++ b/tests/data/app/valid-info.xml @@ -14,7 +14,6 @@ user-encryption admin-encryption - false diff --git a/tests/karma.config.js b/tests/karma.config.js index f20672f4a55d3d912880d37a7199226b572a2e7e..e9aa38dd66fa88c2ceead3044993601c77c3bc4e 100644 --- a/tests/karma.config.js +++ b/tests/karma.config.js @@ -110,7 +110,9 @@ module.exports = function(config) { name: 'settings', srcFiles: [ 'settings/js/apps.js', - 'settings/js/users/deleteHandler.js' + 'settings/js/users/deleteHandler.js', + 'core/vendor/marked/marked.min.js', + 'core/vendor/DOMPurify/dist/purify.min.js' ], testFiles: [ 'settings/tests/js/appsSpec.js', @@ -220,9 +222,14 @@ module.exports = function(config) { // serve images to avoid warnings files.push({pattern: 'core/img/**/*', watched: false, included: false, served: true}); + files.push({pattern: 'core/css/images/*', watched: false, included: false, served: true}); // include core CSS files.push({pattern: 'core/css/*.css', watched: true, included: true, served: true}); + files.push({pattern: 'tests/css/*.css', watched: true, included: true, served: true}); + + // Allow fonts + files.push({pattern: 'core/fonts/*', watched: false, included: false, served: true}); config.set({ @@ -242,9 +249,11 @@ module.exports = function(config) { proxies: { // prevent warnings for images - '/context.html//core/img/': 'http://localhost:9876/base/core/img/', - '/context.html//core/css/': 'http://localhost:9876/base/core/css/', - '/context.html//core/fonts/': 'http://localhost:9876/base/core/fonts/' + '/base/tests/img/': 'http://localhost:9876/base/core/img/', + '/base/tests/css/': 'http://localhost:9876/base/core/css/', + '/base/core/css/images/': 'http://localhost:9876/base/core/css/images/', + '/actions/': 'http://localhost:9876/base/core/img/actions/', + '/base/core/fonts/': 'http://localhost:9876/base/core/fonts/' }, // test results reporter to use @@ -265,7 +274,7 @@ module.exports = function(config) { reporters: [ { type: 'html' }, { type: 'cobertura' }, - { type: 'lcovonly' }, + { type: 'lcovonly' } ] }, diff --git a/tests/lib/App/AppStore/Fetcher/AppFetcherTest.php b/tests/lib/App/AppStore/Fetcher/AppFetcherTest.php index aa0d50cac977e8e9765e3d1a60e0f423e5e16341..9d09898bb95c9b15c039153f28531ad2eb5766bf 100644 --- a/tests/lib/App/AppStore/Fetcher/AppFetcherTest.php +++ b/tests/lib/App/AppStore/Fetcher/AppFetcherTest.php @@ -58,6 +58,12 @@ EOD; $this->timeFactory = $this->createMock(ITimeFactory::class); $this->config = $this->createMock(IConfig::class); + $this->config + ->expects($this->atLeastOnce()) + ->method('getSystemValue') + ->with('version') + ->willReturn('11.0.0.2'); + $this->fetcher = new AppFetcher( $this->appData, $this->clientService, @@ -99,15 +105,13 @@ EOD; ->expects($this->once()) ->method('getBody') ->willReturn(self::$responseJson); + $response->method('getHeader') + ->with($this->equalTo('ETag')) + ->willReturn('"myETag"'); $this->timeFactory ->expects($this->once()) ->method('getTime') ->willReturn(1234); - $this->config - ->expects($this->once()) - ->method('getSystemValue') - ->with('version') - ->willReturn('11.0.0.2'); $expected = array ( 'data' => @@ -1882,6 +1886,8 @@ EJL3BaQAQaASSsvFrcozYxrQG4VzEg== ), ), 'timestamp' => 1234, + 'ncversion' => '11.0.0.2', + 'ETag' => '"myETag"', ); $dataToPut = $expected; diff --git a/tests/lib/App/AppStore/Fetcher/CategoryFetcherTest.php b/tests/lib/App/AppStore/Fetcher/CategoryFetcherTest.php index db4354119a0d958c4657ecb7f8b103d986c1fc45..9955715bca421348b2a9f70b0faa817a34b9b1c3 100644 --- a/tests/lib/App/AppStore/Fetcher/CategoryFetcherTest.php +++ b/tests/lib/App/AppStore/Fetcher/CategoryFetcherTest.php @@ -32,7 +32,8 @@ class CategoryFetcherTest extends FetcherBase { $this->fetcher = new CategoryFetcher( $this->appData, $this->clientService, - $this->timeFactory + $this->timeFactory, + $this->config ); } } diff --git a/tests/lib/App/AppStore/Fetcher/FetcherBase.php b/tests/lib/App/AppStore/Fetcher/FetcherBase.php index 840655d78d5ff15df4550672f6360ddd2508d800..73fcbbaab6f55220c1736f9bb0d3bafbfa42ab65 100644 --- a/tests/lib/App/AppStore/Fetcher/FetcherBase.php +++ b/tests/lib/App/AppStore/Fetcher/FetcherBase.php @@ -55,9 +55,16 @@ abstract class FetcherBase extends TestCase { $this->clientService = $this->createMock(IClientService::class); $this->timeFactory = $this->createMock(ITimeFactory::class); $this->config = $this->createMock(IConfig::class); + + $this->config + ->method('getSystemValue') + ->with( + $this->equalTo('version'), + $this->anything() + )->willReturn('11.0.0.2'); } - public function testGetWithAlreadyExistingFileAndUpToDateTimestamp() { + public function testGetWithAlreadyExistingFileAndUpToDateTimestampAndVersion() { $folder = $this->createMock(ISimpleFolder::class); $file = $this->createMock(ISimpleFile::class); $this->appData @@ -73,7 +80,7 @@ abstract class FetcherBase extends TestCase { $file ->expects($this->once()) ->method('getContent') - ->willReturn('{"timestamp":1200,"data":[{"id":"MyApp"}]}'); + ->willReturn('{"timestamp":1200,"data":[{"id":"MyApp"}],"ncversion":"11.0.0.2"}'); $this->timeFactory ->expects($this->once()) ->method('getTime') @@ -87,7 +94,7 @@ abstract class FetcherBase extends TestCase { $this->assertSame($expected, $this->fetcher->get()); } - public function testGetWithNotExistingFileAndUpToDateTimestamp() { + public function testGetWithNotExistingFileAndUpToDateTimestampAndVersion() { $folder = $this->createMock(ISimpleFolder::class); $file = $this->createMock(ISimpleFile::class); $this->appData @@ -120,7 +127,10 @@ abstract class FetcherBase extends TestCase { ->expects($this->once()) ->method('getBody') ->willReturn('[{"id":"MyNewApp", "foo": "foo"}, {"id":"bar"}]'); - $fileData = '{"data":[{"id":"MyNewApp","foo":"foo"},{"id":"bar"}],"timestamp":1502}'; + $response->method('getHeader') + ->with($this->equalTo('ETag')) + ->willReturn('"myETag"'); + $fileData = '{"data":[{"id":"MyNewApp","foo":"foo"},{"id":"bar"}],"timestamp":1502,"ncversion":"11.0.0.2","ETag":"\"myETag\""}'; $file ->expects($this->at(0)) ->method('putContent') @@ -162,7 +172,7 @@ abstract class FetcherBase extends TestCase { $file ->expects($this->at(0)) ->method('getContent') - ->willReturn('{"timestamp":1200,"data":{"MyApp":{"id":"MyApp"}}}'); + ->willReturn('{"timestamp":1200,"data":{"MyApp":{"id":"MyApp"}},"ncversion":"11.0.0.2"}'); $this->timeFactory ->expects($this->at(0)) ->method('getTime') @@ -182,7 +192,10 @@ abstract class FetcherBase extends TestCase { ->expects($this->once()) ->method('getBody') ->willReturn('[{"id":"MyNewApp", "foo": "foo"}, {"id":"bar"}]'); - $fileData = '{"data":[{"id":"MyNewApp","foo":"foo"},{"id":"bar"}],"timestamp":1502}'; + $response->method('getHeader') + ->with($this->equalTo('ETag')) + ->willReturn('"myETag"'); + $fileData = '{"data":[{"id":"MyNewApp","foo":"foo"},{"id":"bar"}],"timestamp":1502,"ncversion":"11.0.0.2","ETag":"\"myETag\""}'; $file ->expects($this->at(1)) ->method('putContent') @@ -208,6 +221,127 @@ abstract class FetcherBase extends TestCase { $this->assertSame($expected, $this->fetcher->get()); } + public function testGetWithAlreadyExistingFileAndNoVersion() { + $folder = $this->createMock(ISimpleFolder::class); + $file = $this->createMock(ISimpleFile::class); + $this->appData + ->expects($this->once()) + ->method('getFolder') + ->with('/') + ->willReturn($folder); + $folder + ->expects($this->once()) + ->method('getFile') + ->with($this->fileName) + ->willReturn($file); + $file + ->expects($this->at(0)) + ->method('getContent') + ->willReturn('{"timestamp":1200,"data":{"MyApp":{"id":"MyApp"}}'); + $this->timeFactory + ->expects($this->at(0)) + ->method('getTime') + ->willReturn(1201); + $client = $this->createMock(IClient::class); + $this->clientService + ->expects($this->once()) + ->method('newClient') + ->willReturn($client); + $response = $this->createMock(IResponse::class); + $client + ->expects($this->once()) + ->method('get') + ->with($this->endpoint) + ->willReturn($response); + $response + ->expects($this->once()) + ->method('getBody') + ->willReturn('[{"id":"MyNewApp", "foo": "foo"}, {"id":"bar"}]'); + $response->method('getHeader') + ->with($this->equalTo('ETag')) + ->willReturn('"myETag"'); + $fileData = '{"data":[{"id":"MyNewApp","foo":"foo"},{"id":"bar"}],"timestamp":1201,"ncversion":"11.0.0.2","ETag":"\"myETag\""}'; + $file + ->expects($this->at(1)) + ->method('putContent') + ->with($fileData); + $file + ->expects($this->at(2)) + ->method('getContent') + ->willReturn($fileData); + + $expected = [ + [ + 'id' => 'MyNewApp', + 'foo' => 'foo', + ], + [ + 'id' => 'bar', + ], + ]; + $this->assertSame($expected, $this->fetcher->get()); + } + + public function testGetWithAlreadyExistingFileAndOutdatedVersion() { + $folder = $this->createMock(ISimpleFolder::class); + $file = $this->createMock(ISimpleFile::class); + $this->appData + ->expects($this->once()) + ->method('getFolder') + ->with('/') + ->willReturn($folder); + $folder + ->expects($this->once()) + ->method('getFile') + ->with($this->fileName) + ->willReturn($file); + $file + ->expects($this->at(0)) + ->method('getContent') + ->willReturn('{"timestamp":1200,"data":{"MyApp":{"id":"MyApp"}},"ncversion":"11.0.0.1"'); + $this->timeFactory + ->method('getTime') + ->willReturn(1201); + $client = $this->createMock(IClient::class); + $this->clientService + ->expects($this->once()) + ->method('newClient') + ->willReturn($client); + $response = $this->createMock(IResponse::class); + $client + ->expects($this->once()) + ->method('get') + ->with($this->endpoint) + ->willReturn($response); + $response + ->expects($this->once()) + ->method('getBody') + ->willReturn('[{"id":"MyNewApp", "foo": "foo"}, {"id":"bar"}]'); + $response->method('getHeader') + ->with($this->equalTo('ETag')) + ->willReturn('"myETag"'); + $fileData = '{"data":[{"id":"MyNewApp","foo":"foo"},{"id":"bar"}],"timestamp":1201,"ncversion":"11.0.0.2","ETag":"\"myETag\""}'; + $file + ->expects($this->at(1)) + ->method('putContent') + ->with($fileData); + $file + ->expects($this->at(2)) + ->method('getContent') + ->willReturn($fileData); + + $expected = [ + [ + 'id' => 'MyNewApp', + 'foo' => 'foo', + ], + [ + 'id' => 'bar', + ], + ]; + $this->assertSame($expected, $this->fetcher->get()); + } + public function testGetWithExceptionInClient() { $folder = $this->createMock(ISimpleFolder::class); $file = $this->createMock(ISimpleFile::class); @@ -242,4 +376,147 @@ abstract class FetcherBase extends TestCase { $this->assertSame([], $this->fetcher->get()); } + + public function testGetMatchingETag() { + $folder = $this->createMock(ISimpleFolder::class); + $file = $this->createMock(ISimpleFile::class); + $this->appData + ->expects($this->once()) + ->method('getFolder') + ->with('/') + ->willReturn($folder); + $folder + ->expects($this->once()) + ->method('getFile') + ->with($this->fileName) + ->willReturn($file); + $origData = '{"data":[{"id":"MyNewApp","foo":"foo"},{"id":"bar"}],"timestamp":1200,"ncversion":"11.0.0.2","ETag":"\"myETag\""}'; + $file + ->expects($this->at(0)) + ->method('getContent') + ->willReturn($origData); + $this->timeFactory + ->expects($this->at(0)) + ->method('getTime') + ->willReturn(1501); + $this->timeFactory + ->expects($this->at(1)) + ->method('getTime') + ->willReturn(1502); + $client = $this->createMock(IClient::class); + $this->clientService + ->expects($this->once()) + ->method('newClient') + ->willReturn($client); + $response = $this->createMock(IResponse::class); + $client + ->expects($this->once()) + ->method('get') + ->with( + $this->equalTo($this->endpoint), + $this->equalTo([ + 'headers' => [ + 'If-None-Match' => '"myETag"' + ] + ]) + )->willReturn($response); + $response->method('getStatusCode') + ->willReturn(304); + + $newData = '{"data":[{"id":"MyNewApp","foo":"foo"},{"id":"bar"}],"timestamp":1502,"ncversion":"11.0.0.2","ETag":"\"myETag\""}'; + $file + ->expects($this->at(1)) + ->method('putContent') + ->with($newData); + $file + ->expects($this->at(2)) + ->method('getContent') + ->willReturn($newData); + + $expected = [ + [ + 'id' => 'MyNewApp', + 'foo' => 'foo', + ], + [ + 'id' => 'bar', + ], + ]; + + $this->assertSame($expected, $this->fetcher->get()); + } + + public function testGetNoMatchingETag() { + $folder = $this->createMock(ISimpleFolder::class); + $file = $this->createMock(ISimpleFile::class); + $this->appData + ->expects($this->once()) + ->method('getFolder') + ->with('/') + ->willReturn($folder); + $folder + ->expects($this->at(0)) + ->method('getFile') + ->with($this->fileName) + ->willReturn($file); + $file + ->expects($this->at(0)) + ->method('getContent') + ->willReturn('{"data":[{"id":"MyOldApp","abc":"def"}],"timestamp":1200,"ncversion":"11.0.0.2","ETag":"\"myETag\""}'); + $client = $this->createMock(IClient::class); + $this->clientService + ->expects($this->once()) + ->method('newClient') + ->willReturn($client); + $response = $this->createMock(IResponse::class); + $client + ->expects($this->once()) + ->method('get') + ->with( + $this->equalTo($this->endpoint), + $this->equalTo([ + 'headers' => [ + 'If-None-Match' => '"myETag"', + ] + ]) + ) + ->willReturn($response); + $response->method('getStatusCode') + ->willReturn(200); + $response + ->expects($this->once()) + ->method('getBody') + ->willReturn('[{"id":"MyNewApp","foo":"foo"},{"id":"bar"}]'); + $response->method('getHeader') + ->with($this->equalTo('ETag')) + ->willReturn('"newETag"'); + $fileData = '{"data":[{"id":"MyNewApp","foo":"foo"},{"id":"bar"}],"timestamp":1502,"ncversion":"11.0.0.2","ETag":"\"newETag\""}'; + $file + ->expects($this->at(1)) + ->method('putContent') + ->with($fileData); + $file + ->expects($this->at(2)) + ->method('getContent') + ->willReturn($fileData); + $this->timeFactory + ->expects($this->at(0)) + ->method('getTime') + ->willReturn(1501); + $this->timeFactory + ->expects($this->at(1)) + ->method('getTime') + ->willReturn(1502); + + $expected = [ + [ + 'id' => 'MyNewApp', + 'foo' => 'foo', + ], + [ + 'id' => 'bar', + ], + ]; + $this->assertSame($expected, $this->fetcher->get()); + } } diff --git a/tests/lib/AppConfigTest.php b/tests/lib/AppConfigTest.php index c4da7507752322dee20e57118d049d82eb24e519..fed929352d3003d74116dfa88837d755959d219e 100644 --- a/tests/lib/AppConfigTest.php +++ b/tests/lib/AppConfigTest.php @@ -8,6 +8,7 @@ */ namespace Test; +use OCP\IConfig; /** * Class AppConfigTest @@ -305,6 +306,28 @@ class AppConfigTest extends TestCase { $this->assertEquals($expected, $values); } + public function testGetFilteredValues() { + /** @var \OC\AppConfig|\PHPUnit_Framework_MockObject_MockObject $config */ + $config = $this->getMockBuilder(\OC\AppConfig::class) + ->setConstructorArgs([\OC::$server->getDatabaseConnection()]) + ->setMethods(['getValues']) + ->getMock(); + + $config->expects($this->once()) + ->method('getValues') + ->with('user_ldap', false) + ->willReturn([ + 'ldap_agent_password' => 'secret', + 'ldap_dn' => 'dn', + ]); + + $values = $config->getFilteredValues('user_ldap'); + $this->assertEquals([ + 'ldap_agent_password' => IConfig::SENSITIVE_VALUE, + 'ldap_dn' => 'dn', + ], $values); + } + public function testSettingConfigParallel() { $appConfig1 = new \OC\AppConfig(\OC::$server->getDatabaseConnection()); $appConfig2 = new \OC\AppConfig(\OC::$server->getDatabaseConnection()); diff --git a/tests/lib/AppFramework/Controller/ControllerTest.php b/tests/lib/AppFramework/Controller/ControllerTest.php index 63cc2873575644279bfbc11087c8ed46beb823e0..640853ccda9c7f363736e7e52c7a49149865b8e9 100644 --- a/tests/lib/AppFramework/Controller/ControllerTest.php +++ b/tests/lib/AppFramework/Controller/ControllerTest.php @@ -182,7 +182,7 @@ class ControllerTest extends \Test\TestCase { public function testFormatDataResponseJSON() { $expectedHeaders = [ 'test' => 'something', - 'Cache-Control' => 'no-cache, must-revalidate', + 'Cache-Control' => 'no-cache, no-store, must-revalidate', 'Content-Type' => 'application/json; charset=utf-8', 'Content-Security-Policy' => "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'", ]; diff --git a/tests/lib/AppFramework/Http/DataResponseTest.php b/tests/lib/AppFramework/Http/DataResponseTest.php index cde553cdf5f6bae2d9f291956e7e6936fd850008..159efded97a96503b735ea2b7bd40d9627e15910 100644 --- a/tests/lib/AppFramework/Http/DataResponseTest.php +++ b/tests/lib/AppFramework/Http/DataResponseTest.php @@ -67,7 +67,7 @@ class DataResponseTest extends \Test\TestCase { $response = new DataResponse($data, $code, $headers); $expectedHeaders = [ - 'Cache-Control' => 'no-cache, must-revalidate', + 'Cache-Control' => 'no-cache, no-store, must-revalidate', 'Content-Security-Policy' => "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'", ]; $expectedHeaders = array_merge($expectedHeaders, $headers); diff --git a/tests/lib/AppFramework/Http/ResponseTest.php b/tests/lib/AppFramework/Http/ResponseTest.php index 0c582f8f6eafb5c1491e8f14bbc244718fa1fd17..3ed946dc6ca2bb6fdafea3b3120146326915e313 100644 --- a/tests/lib/AppFramework/Http/ResponseTest.php +++ b/tests/lib/AppFramework/Http/ResponseTest.php @@ -97,7 +97,7 @@ class ResponseTest extends \Test\TestCase { public function testCacheHeadersAreDisabledByDefault(){ $headers = $this->childResponse->getHeaders(); - $this->assertEquals('no-cache, must-revalidate', $headers['Cache-Control']); + $this->assertEquals('no-cache, no-store, must-revalidate', $headers['Cache-Control']); } diff --git a/tests/lib/AppFramework/Middleware/Security/SecurityMiddlewareTest.php b/tests/lib/AppFramework/Middleware/Security/SecurityMiddlewareTest.php index 5a9887510701fec2809d1dde235e9dc23c11b9a0..164ea48de7079f28c854195d4156804c8592b888 100644 --- a/tests/lib/AppFramework/Middleware/Security/SecurityMiddlewareTest.php +++ b/tests/lib/AppFramework/Middleware/Security/SecurityMiddlewareTest.php @@ -34,6 +34,7 @@ use OC\AppFramework\Middleware\Security\Exceptions\SecurityException; use OC\Appframework\Middleware\Security\Exceptions\StrictCookieMissingException; use OC\AppFramework\Middleware\Security\SecurityMiddleware; use OC\AppFramework\Utility\ControllerMethodReflector; +use OC\Security\Bruteforce\Throttler; use OC\Security\CSP\ContentSecurityPolicy; use OC\Security\CSP\ContentSecurityPolicyManager; use OC\Security\CSP\ContentSecurityPolicyNonceManager; @@ -82,6 +83,8 @@ class SecurityMiddlewareTest extends \Test\TestCase { private $csrfTokenManager; /** @var ContentSecurityPolicyNonceManager|\PHPUnit_Framework_MockObject_MockObject */ private $cspNonceManager; + /** @var Throttler|\PHPUnit_Framework_MockObject_MockObject */ + private $bruteForceThrottler; protected function setUp() { parent::setUp(); @@ -96,6 +99,7 @@ class SecurityMiddlewareTest extends \Test\TestCase { $this->contentSecurityPolicyManager = $this->createMock(ContentSecurityPolicyManager::class); $this->csrfTokenManager = $this->createMock(CsrfTokenManager::class); $this->cspNonceManager = $this->createMock(ContentSecurityPolicyNonceManager::class); + $this->bruteForceThrottler = $this->getMockBuilder(Throttler::class)->disableOriginalConstructor()->getMock(); $this->middleware = $this->getMiddleware(true, true); $this->secException = new SecurityException('hey', false); $this->secAjaxException = new SecurityException('hey', true); @@ -119,7 +123,8 @@ class SecurityMiddlewareTest extends \Test\TestCase { $isAdminUser, $this->contentSecurityPolicyManager, $this->csrfTokenManager, - $this->cspNonceManager + $this->cspNonceManager, + $this->bruteForceThrottler ); } @@ -652,4 +657,70 @@ class SecurityMiddlewareTest extends \Test\TestCase { $this->assertEquals($response, $this->middleware->afterController($this->controller, 'test', $response)); } + + /** + * @dataProvider dataTestBeforeControllerBruteForce + */ + public function testBeforeControllerBruteForce($bruteForceProtectionEnabled) { + /** @var ControllerMethodReflector|\PHPUnit_Framework_MockObject_MockObject $reader */ + $reader = $this->getMockBuilder(ControllerMethodReflector::class)->disableOriginalConstructor()->getMock(); + + $middleware = new SecurityMiddleware( + $this->request, + $reader, + $this->navigationManager, + $this->urlGenerator, + $this->logger, + $this->session, + 'files', + false, + false, + $this->contentSecurityPolicyManager, + $this->csrfTokenManager, + $this->cspNonceManager, + $this->bruteForceThrottler + ); + + $reader->expects($this->any())->method('hasAnnotation') + ->willReturnCallback( + function($annotation) use ($bruteForceProtectionEnabled) { + + switch ($annotation) { + case 'BruteForceProtection': + return $bruteForceProtectionEnabled; + case 'PasswordConfirmationRequired': + case 'StrictCookieRequired': + return false; + case 'PublicPage': + case 'NoCSRFRequired': + return true; + } + + return true; + } + ); + + $reader->expects($this->any())->method('getAnnotationParameter')->willReturn('action'); + $this->request->expects($this->any())->method('getRemoteAddress')->willReturn('remoteAddress'); + + if ($bruteForceProtectionEnabled) { + $this->bruteForceThrottler->expects($this->once())->method('sleepDelay') + ->with('remoteAddress', 'action'); + $this->bruteForceThrottler->expects($this->once())->method('registerAttempt') + ->with('action', 'remoteAddress'); + } else { + $this->bruteForceThrottler->expects($this->never())->method('sleepDelay'); + $this->bruteForceThrottler->expects($this->never())->method('registerAttempt'); + } + + $middleware->beforeController($this->controller, 'test'); + + } + + public function dataTestBeforeControllerBruteForce() { + return [ + [true], + [false] + ]; + } } diff --git a/tests/lib/AppFramework/Utility/ControllerMethodReflectorTest.php b/tests/lib/AppFramework/Utility/ControllerMethodReflectorTest.php index 92d767e9987103fc1d25d5b430f5237ec5fa39fb..644245e19678546cf642b6b2f3831b669582ab8a 100644 --- a/tests/lib/AppFramework/Utility/ControllerMethodReflectorTest.php +++ b/tests/lib/AppFramework/Utility/ControllerMethodReflectorTest.php @@ -76,6 +76,19 @@ class ControllerMethodReflectorTest extends \Test\TestCase { } + /** + * @Annotation parameter + */ + public function testGetAnnotationParameter(){ + $reader = new ControllerMethodReflector(); + $reader->reflect( + '\Test\AppFramework\Utility\ControllerMethodReflectorTest', + 'testGetAnnotationParameter' + ); + + $this->assertSame('parameter', $reader->getAnnotationParameter('Annotation')); + } + /** * @Annotation * @param test diff --git a/tests/lib/AppTest.php b/tests/lib/AppTest.php index 575e32dd60c2c46016259e12be0d2a041cd2e95a..a60a03a07f55b343c68e1ecd6c05e34fbe70cef8 100644 --- a/tests/lib/AppTest.php +++ b/tests/lib/AppTest.php @@ -8,6 +8,7 @@ */ namespace Test; + use OC\AppConfig; use OCP\IAppConfig; @@ -24,7 +25,7 @@ class AppTest extends \Test\TestCase { const TEST_GROUP1 = 'group1'; const TEST_GROUP2 = 'group2'; - function appVersionsProvider() { + public function appVersionsProvider() { return array( // exact match array( @@ -338,7 +339,7 @@ class AppTest extends \Test\TestCase { /** * Providers for the app config values */ - function appConfigValuesProvider() { + public function appConfigValuesProvider() { return array( // logged in user1 array( @@ -561,27 +562,30 @@ class AppTest extends \Test\TestCase { /** * Providers for the app data values */ - function appDataProvider() { + public function appDataProvider() { return [ [ ['description' => " \t This is a multiline \n test with \n \t \n \n some new lines "], - ['description' => "This is a multiline test with\n\nsome new lines"] + ['description' => "This is a multiline \n test with \n \t \n \n some new lines"], ], [ ['description' => " \t This is a multiline \n test with \n \t some new lines "], - ['description' => "This is a multiline test with some new lines"] + ['description' => "This is a multiline \n test with \n \t some new lines"], ], [ ['description' => hex2bin('5065726d657420646520732761757468656e7469666965722064616e732070697769676f20646972656374656d656e74206176656320736573206964656e74696669616e7473206f776e636c6f75642073616e73206c65732072657461706572206574206d657420c3a0206a6f757273206365757820636920656e20636173206465206368616e67656d656e74206465206d6f742064652070617373652e0d0a0d')], - ['description' => "Permet de s'authentifier dans piwigo directement avec ses identifiants owncloud sans les retaper et met à jours ceux ci en cas de changement de mot de passe."] + ['description' => "Permet de s'authentifier dans piwigo directement avec ses identifiants owncloud sans les retaper et met à jours ceux ci en cas de changement de mot de passe."], ], [ ['not-a-description' => " \t This is a multiline \n test with \n \t some new lines "], - ['not-a-description' => " \t This is a multiline \n test with \n \t some new lines "] + [ + 'not-a-description' => " \t This is a multiline \n test with \n \t some new lines ", + 'description' => '', + ], ], [ ['description' => [100, 'bla']], - ['description' => ""] + ['description' => ''], ], ]; } diff --git a/tests/lib/Authentication/LoginCredentials/CredentialsTest.php b/tests/lib/Authentication/LoginCredentials/CredentialsTest.php new file mode 100644 index 0000000000000000000000000000000000000000..308ccafb151e070e396b8bf071d30b4243094b03 --- /dev/null +++ b/tests/lib/Authentication/LoginCredentials/CredentialsTest.php @@ -0,0 +1,66 @@ + + * + * @author 2016 Christoph Wurst + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace Test\Authentication\LoginCredentials; + +use OC\Authentication\LoginCredentials\Credentials; +use Test\TestCase; + +class CredentialsTest extends TestCase { + + /** @var string */ + private $uid; + + /** @var string */ + private $user; + + /** @var string */ + private $password; + + /** @var Credentials */ + private $credentials; + + protected function setUp() { + parent::setUp(); + + $this->uid = 'user123'; + $this->user = 'User123'; + $this->password = '123456'; + + $this->credentials = new Credentials($this->uid, $this->user, $this->password); + } + + public function testGetUID() { + $this->assertEquals($this->uid, $this->credentials->getUID()); + } + + public function testGetUserName() { + $this->assertEquals($this->user, $this->credentials->getLoginName()); + } + + public function testGetPassword() { + $this->assertEquals($this->password, $this->credentials->getPassword()); + } + +} diff --git a/tests/lib/Authentication/LoginCredentials/StoreTest.php b/tests/lib/Authentication/LoginCredentials/StoreTest.php new file mode 100644 index 0000000000000000000000000000000000000000..9a719339b438402b4a0415755dd98cbdeac166b8 --- /dev/null +++ b/tests/lib/Authentication/LoginCredentials/StoreTest.php @@ -0,0 +1,182 @@ + + * + * @author 2016 Christoph Wurst + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace Test\Authentication\LoginCredentials; + +use OC\Authentication\Exceptions\InvalidTokenException; +use OC\Authentication\Exceptions\PasswordlessTokenException; +use OC\Authentication\LoginCredentials\Credentials; +use OC\Authentication\LoginCredentials\Store; +use OC\Authentication\Token\IProvider; +use OC\Authentication\Token\IToken; +use OCP\Authentication\Exceptions\CredentialsUnavailableException; +use OCP\ILogger; +use OCP\ISession; +use OCP\Session\Exceptions\SessionNotAvailableException; +use PHPUnit_Framework_MockObject_MockObject; +use Test\TestCase; + +class StoreTest extends TestCase { + + /** @var ISession|PHPUnit_Framework_MockObject_MockObject */ + private $session; + + /** @var IProvider|PHPUnit_Framework_MockObject_MockObject */ + private $tokenProvider; + + /** @var ILogger|PHPUnit_Framework_MockObject_MockObject */ + private $logger; + + /** @var Store */ + private $store; + + protected function setUp() { + parent::setUp(); + + $this->session = $this->createMock(ISession::class); + $this->tokenProvider = $this->createMock(IProvider::class); + $this->logger = $this->createMock(ILogger::class); + + $this->store = new Store($this->session, $this->logger, $this->tokenProvider); + } + + public function testAuthenticate() { + $params = [ + 'run' => true, + 'uid' => 'user123', + 'password' => 123456, + ]; + + $this->session->expects($this->once()) + ->method('set') + ->with($this->equalTo('login_credentials'), $this->equalTo(json_encode($params))); + + $this->store->authenticate($params); + } + + public function testSetSession() { + $session = $this->createMock(ISession::class); + + $this->store->setSession($session); + } + + public function testGetLoginCredentialsNoTokenProvider() { + $this->store = new Store($this->session, $this->logger, null); + + $this->expectException(CredentialsUnavailableException::class); + + $this->store->getLoginCredentials(); + } + + public function testGetLoginCredentials() { + $uid = 'uid'; + $user = 'user123'; + $password = 'passme'; + $token = $this->createMock(IToken::class); + $this->session->expects($this->once()) + ->method('getId') + ->willReturn('sess2233'); + $this->tokenProvider->expects($this->once()) + ->method('getToken') + ->with('sess2233') + ->willReturn($token); + $token->expects($this->once()) + ->method('getUID') + ->willReturn($uid); + $token->expects($this->once()) + ->method('getLoginName') + ->willReturn($user); + $this->tokenProvider->expects($this->once()) + ->method('getPassword') + ->with($token, 'sess2233') + ->willReturn($password); + $expected = new Credentials($uid, $user, $password); + + $creds = $this->store->getLoginCredentials(); + + $this->assertEquals($expected, $creds); + } + + public function testGetLoginCredentialsSessionNotAvailable() { + $this->session->expects($this->once()) + ->method('getId') + ->will($this->throwException(new SessionNotAvailableException())); + $this->expectException(CredentialsUnavailableException::class); + + $this->store->getLoginCredentials(); + } + + public function testGetLoginCredentialsInvalidToken() { + $this->session->expects($this->once()) + ->method('getId') + ->willReturn('sess2233'); + $this->tokenProvider->expects($this->once()) + ->method('getToken') + ->with('sess2233') + ->will($this->throwException(new InvalidTokenException())); + $this->expectException(CredentialsUnavailableException::class); + + $this->store->getLoginCredentials(); + } + + public function testGetLoginCredentialsInvalidTokenLoginCredentials() { + $uid = 'user987'; + $password = '7389374'; + + $this->session->expects($this->once()) + ->method('getId') + ->willReturn('sess2233'); + $this->tokenProvider->expects($this->once()) + ->method('getToken') + ->with('sess2233') + ->will($this->throwException(new InvalidTokenException())); + $this->session->expects($this->once()) + ->method('exists') + ->with($this->equalTo('login_credentials')) + ->willReturn(true); + $this->session->expects($this->once()) + ->method('get') + ->with($this->equalTo('login_credentials')) + ->willReturn('{"run":true,"uid":"user987","password":"7389374"}'); + $expected = new Credentials('user987', 'user987', '7389374'); + + $actual = $this->store->getLoginCredentials(); + + $this->assertEquals($expected, $actual); + } + + public function testGetLoginCredentialsPasswordlessToken() { + $this->session->expects($this->once()) + ->method('getId') + ->willReturn('sess2233'); + $this->tokenProvider->expects($this->once()) + ->method('getToken') + ->with('sess2233') + ->will($this->throwException(new PasswordlessTokenException())); + $this->expectException(CredentialsUnavailableException::class); + + $this->store->getLoginCredentials(); + } + +} diff --git a/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php b/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php index 52f3ca285001c5be123955e4d960bd6d81206b56..1ea17f5d3077a1679048f91ead86a8423130acfc 100644 --- a/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php +++ b/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php @@ -26,8 +26,11 @@ use Exception; use OC; use OC\App\AppManager; use OC\Authentication\TwoFactorAuth\Manager; +use OCP\Activity\IEvent; +use OCP\Activity\IManager; use OCP\Authentication\TwoFactorAuth\IProvider; use OCP\IConfig; +use OCP\ILogger; use OCP\ISession; use OCP\IUser; use Test\TestCase; @@ -49,6 +52,12 @@ class ManagerTest extends TestCase { /** @var IConfig|PHPUnit_Framework_MockObject_MockObject */ private $config; + /** @var IManager|PHPUnit_Framework_MockObject_MockObject */ + private $activityManager; + + /** @var ILogger|PHPUnit_Framework_MockObject_MockObject */ + private $logger; + /** @var IProvider|PHPUnit_Framework_MockObject_MockObject */ private $fakeProvider; @@ -59,14 +68,14 @@ class ManagerTest extends TestCase { parent::setUp(); $this->user = $this->createMock(IUser::class); - $this->appManager = $this->getMockBuilder('\OC\App\AppManager') - ->disableOriginalConstructor() - ->getMock(); + $this->appManager = $this->createMock('\OC\App\AppManager'); $this->session = $this->createMock(ISession::class); $this->config = $this->createMock(IConfig::class); + $this->activityManager = $this->createMock(IManager::class); + $this->logger = $this->createMock(ILogger::class); $this->manager = $this->getMockBuilder('\OC\Authentication\TwoFactorAuth\Manager') - ->setConstructorArgs([$this->appManager, $this->session, $this->config]) + ->setConstructorArgs([$this->appManager, $this->session, $this->config, $this->activityManager, $this->logger]) ->setMethods(['loadTwoFactorApp']) // Do not actually load the apps ->getMock(); @@ -228,6 +237,7 @@ class ManagerTest extends TestCase { $this->prepareProviders(); $challenge = 'passme'; + $event = $this->createMock(IEvent::class); $this->fakeProvider->expects($this->once()) ->method('verifyChallenge') ->with($this->user, $challenge) @@ -242,6 +252,37 @@ class ManagerTest extends TestCase { $this->session->expects($this->at(2)) ->method('remove') ->with('two_factor_remember_login'); + $this->activityManager->expects($this->once()) + ->method('generateEvent') + ->willReturn($event); + $this->user->expects($this->any()) + ->method('getUID') + ->willReturn('jos'); + $event->expects($this->once()) + ->method('setApp') + ->with($this->equalTo('twofactor_generic')) + ->willReturnSelf(); + $event->expects($this->once()) + ->method('setType') + ->with($this->equalTo('twofactor')) + ->willReturnSelf(); + $event->expects($this->once()) + ->method('setAuthor') + ->with($this->equalTo('jos')) + ->willReturnSelf(); + $event->expects($this->once()) + ->method('setAffectedUser') + ->with($this->equalTo('jos')) + ->willReturnSelf(); + $this->fakeProvider->expects($this->once()) + ->method('getDisplayName') + ->willReturn('Fake 2FA'); + $event->expects($this->once()) + ->method('setSubject') + ->with($this->equalTo('twofactor_success'), $this->equalTo([ + 'provider' => 'Fake 2FA', + ])) + ->willReturnSelf(); $this->assertTrue($this->manager->verifyChallenge('email', $this->user, $challenge)); } @@ -263,12 +304,44 @@ class ManagerTest extends TestCase { $this->prepareProviders(); $challenge = 'dontpassme'; + $event = $this->createMock(IEvent::class); $this->fakeProvider->expects($this->once()) ->method('verifyChallenge') ->with($this->user, $challenge) ->will($this->returnValue(false)); $this->session->expects($this->never()) ->method('remove'); + $this->activityManager->expects($this->once()) + ->method('generateEvent') + ->willReturn($event); + $this->user->expects($this->any()) + ->method('getUID') + ->willReturn('jos'); + $event->expects($this->once()) + ->method('setApp') + ->with($this->equalTo('twofactor_generic')) + ->willReturnSelf(); + $event->expects($this->once()) + ->method('setType') + ->with($this->equalTo('twofactor')) + ->willReturnSelf(); + $event->expects($this->once()) + ->method('setAuthor') + ->with($this->equalTo('jos')) + ->willReturnSelf(); + $event->expects($this->once()) + ->method('setAffectedUser') + ->with($this->equalTo('jos')) + ->willReturnSelf(); + $this->fakeProvider->expects($this->once()) + ->method('getDisplayName') + ->willReturn('Fake 2FA'); + $event->expects($this->once()) + ->method('setSubject') + ->with($this->equalTo('twofactor_failed'), $this->equalTo([ + 'provider' => 'Fake 2FA', + ])) + ->willReturnSelf(); $this->assertFalse($this->manager->verifyChallenge('email', $this->user, $challenge)); } diff --git a/tests/lib/Command/Integrity/SignAppTest.php b/tests/lib/Command/Integrity/SignAppTest.php index 71d9946ee889f5a97cc4dcb4357303abb5aed0fa..013290b56e98060279b2299b3cdfba0ca5212524 100644 --- a/tests/lib/Command/Integrity/SignAppTest.php +++ b/tests/lib/Command/Integrity/SignAppTest.php @@ -29,13 +29,13 @@ use Symfony\Component\Console\Output\OutputInterface; use Test\TestCase; class SignAppTest extends TestCase { - /** @var Checker */ + /** @var Checker|\PHPUnit_Framework_MockObject_MockObject */ private $checker; /** @var SignApp */ private $signApp; - /** @var FileAccessHelper */ + /** @var FileAccessHelper|\PHPUnit_Framework_MockObject_MockObject */ private $fileAccessHelper; - /** @var IURLGenerator */ + /** @var IURLGenerator|\PHPUnit_Framework_MockObject_MockObject */ private $urlGenerator; public function setUp() { @@ -75,7 +75,7 @@ class SignAppTest extends TestCase { ->method('writeln') ->with('This command requires the --path, --privateKey and --certificate.'); - $this->invokePrivate($this->signApp, 'execute', [$inputInterface, $outputInterface]); + $this->assertNull(self::invokePrivate($this->signApp, 'execute', [$inputInterface, $outputInterface])); } public function testExecuteWithMissingPrivateKey() { @@ -103,7 +103,7 @@ class SignAppTest extends TestCase { ->method('writeln') ->with('This command requires the --path, --privateKey and --certificate.'); - $this->invokePrivate($this->signApp, 'execute', [$inputInterface, $outputInterface]); + $this->assertNull(self::invokePrivate($this->signApp, 'execute', [$inputInterface, $outputInterface])); } public function testExecuteWithMissingCertificate() { @@ -131,7 +131,7 @@ class SignAppTest extends TestCase { ->method('writeln') ->with('This command requires the --path, --privateKey and --certificate.'); - $this->invokePrivate($this->signApp, 'execute', [$inputInterface, $outputInterface]); + $this->assertNull(self::invokePrivate($this->signApp, 'execute', [$inputInterface, $outputInterface])); } public function testExecuteWithNotExistingPrivateKey() { @@ -165,7 +165,7 @@ class SignAppTest extends TestCase { ->method('writeln') ->with('Private key "privateKey" does not exists.'); - $this->invokePrivate($this->signApp, 'execute', [$inputInterface, $outputInterface]); + $this->assertNull(self::invokePrivate($this->signApp, 'execute', [$inputInterface, $outputInterface])); } public function testExecuteWithNotExistingCertificate() { @@ -204,7 +204,51 @@ class SignAppTest extends TestCase { ->method('writeln') ->with('Certificate "certificate" does not exists.'); - $this->invokePrivate($this->signApp, 'execute', [$inputInterface, $outputInterface]); + $this->assertNull(self::invokePrivate($this->signApp, 'execute', [$inputInterface, $outputInterface])); + } + + public function testExecuteWithException() { + $inputInterface = $this->createMock(InputInterface::class); + $outputInterface = $this->createMock(OutputInterface::class); + + $inputInterface + ->expects($this->at(0)) + ->method('getOption') + ->with('path') + ->will($this->returnValue('AppId')); + $inputInterface + ->expects($this->at(1)) + ->method('getOption') + ->with('privateKey') + ->will($this->returnValue('privateKey')); + $inputInterface + ->expects($this->at(2)) + ->method('getOption') + ->with('certificate') + ->will($this->returnValue('certificate')); + + $this->fileAccessHelper + ->expects($this->at(0)) + ->method('file_get_contents') + ->with('privateKey') + ->will($this->returnValue(\OC::$SERVERROOT . '/tests/data/integritycheck/core.key')); + $this->fileAccessHelper + ->expects($this->at(1)) + ->method('file_get_contents') + ->with('certificate') + ->will($this->returnValue(\OC::$SERVERROOT . '/tests/data/integritycheck/core.crt')); + + $this->checker + ->expects($this->once()) + ->method('writeAppSignature') + ->willThrowException(new \Exception('My error message')); + + $outputInterface + ->expects($this->at(0)) + ->method('writeln') + ->with('Error: My error message'); + + $this->assertSame(1, self::invokePrivate($this->signApp, 'execute', [$inputInterface, $outputInterface])); } public function testExecute() { @@ -247,6 +291,6 @@ class SignAppTest extends TestCase { ->method('writeln') ->with('Successfully signed "AppId"'); - $this->invokePrivate($this->signApp, 'execute', [$inputInterface, $outputInterface]); + $this->assertSame(0, self::invokePrivate($this->signApp, 'execute', [$inputInterface, $outputInterface])); } } diff --git a/tests/lib/Command/Integrity/SignCoreTest.php b/tests/lib/Command/Integrity/SignCoreTest.php index f3c242ae9fb5fd30f76ab04f400cb39fd7ac028a..35e52b951daa3b4ac51b2e53710f44e1e25df070 100644 --- a/tests/lib/Command/Integrity/SignCoreTest.php +++ b/tests/lib/Command/Integrity/SignCoreTest.php @@ -28,12 +28,12 @@ use Symfony\Component\Console\Output\OutputInterface; use Test\TestCase; class SignCoreTest extends TestCase { - /** @var Checker */ + /** @var Checker|\PHPUnit_Framework_MockObject_MockObject */ private $checker; + /** @var FileAccessHelper|\PHPUnit_Framework_MockObject_MockObject */ + private $fileAccessHelper; /** @var SignCore */ private $signCore; - /** @var FileAccessHelper */ - private $fileAccessHelper; public function setUp() { parent::setUp(); @@ -65,7 +65,7 @@ class SignCoreTest extends TestCase { ->method('writeln') ->with('--privateKey, --certificate and --path are required.'); - $this->invokePrivate($this->signCore, 'execute', [$inputInterface, $outputInterface]); + $this->assertNull(self::invokePrivate($this->signCore, 'execute', [$inputInterface, $outputInterface])); } public function testExecuteWithMissingCertificate() { @@ -88,7 +88,7 @@ class SignCoreTest extends TestCase { ->method('writeln') ->with('--privateKey, --certificate and --path are required.'); - $this->invokePrivate($this->signCore, 'execute', [$inputInterface, $outputInterface]); + $this->assertNull(self::invokePrivate($this->signCore, 'execute', [$inputInterface, $outputInterface])); } public function testExecuteWithNotExistingPrivateKey() { @@ -122,7 +122,7 @@ class SignCoreTest extends TestCase { ->method('writeln') ->with('Private key "privateKey" does not exists.'); - $this->invokePrivate($this->signCore, 'execute', [$inputInterface, $outputInterface]); + $this->assertNull(self::invokePrivate($this->signCore, 'execute', [$inputInterface, $outputInterface])); } public function testExecuteWithNotExistingCertificate() { @@ -161,7 +161,51 @@ class SignCoreTest extends TestCase { ->method('writeln') ->with('Certificate "certificate" does not exists.'); - $this->invokePrivate($this->signCore, 'execute', [$inputInterface, $outputInterface]); + $this->assertNull(self::invokePrivate($this->signCore, 'execute', [$inputInterface, $outputInterface])); + } + + public function testExecuteWithException() { + $inputInterface = $this->createMock(InputInterface::class); + $outputInterface = $this->createMock(OutputInterface::class); + + $inputInterface + ->expects($this->at(0)) + ->method('getOption') + ->with('privateKey') + ->will($this->returnValue('privateKey')); + $inputInterface + ->expects($this->at(1)) + ->method('getOption') + ->with('certificate') + ->will($this->returnValue('certificate')); + $inputInterface + ->expects($this->at(2)) + ->method('getOption') + ->with('path') + ->will($this->returnValue('certificate')); + + $this->fileAccessHelper + ->expects($this->at(0)) + ->method('file_get_contents') + ->with('privateKey') + ->will($this->returnValue(\OC::$SERVERROOT . '/tests/data/integritycheck/core.key')); + $this->fileAccessHelper + ->expects($this->at(1)) + ->method('file_get_contents') + ->with('certificate') + ->will($this->returnValue(\OC::$SERVERROOT . '/tests/data/integritycheck/core.crt')); + + $this->checker + ->expects($this->once()) + ->method('writeCoreSignature') + ->willThrowException(new \Exception('My exception message')); + + $outputInterface + ->expects($this->at(0)) + ->method('writeln') + ->with('Error: My exception message'); + + $this->assertEquals(1, self::invokePrivate($this->signCore, 'execute', [$inputInterface, $outputInterface])); } public function testExecute() { @@ -204,6 +248,6 @@ class SignCoreTest extends TestCase { ->method('writeln') ->with('Successfully signed "core"'); - $this->invokePrivate($this->signCore, 'execute', [$inputInterface, $outputInterface]); + $this->assertEquals(0, self::invokePrivate($this->signCore, 'execute', [$inputInterface, $outputInterface])); } } diff --git a/tests/lib/DB/DBSchemaTest.php b/tests/lib/DB/DBSchemaTest.php index ba17546a34a1516bf074ce008a2bc6c5d8da5021..8eb7fcf81b488ea47840a4b7b32a00426770288c 100644 --- a/tests/lib/DB/DBSchemaTest.php +++ b/tests/lib/DB/DBSchemaTest.php @@ -10,6 +10,7 @@ namespace Test\DB; use Doctrine\DBAL\Platforms\SqlitePlatform; use OC_DB; +use OCP\ITempManager; use OCP\Security\ISecureRandom; use Test\TestCase; @@ -19,14 +20,20 @@ use Test\TestCase; * @group DB */ class DBSchemaTest extends TestCase { - protected $schema_file = 'static://test_db_scheme'; - protected $schema_file2 = 'static://test_db_scheme2'; + protected $schema_file; + protected $schema_file2; protected $table1; protected $table2; + /** @var ITempManager */ + protected $tempManager; protected function setUp() { parent::setUp(); + $this->tempManager = \OC::$server->getTempManager(); + $this->schema_file = $this->tempManager->getTemporaryFile(); + $this->schema_file2 = $this->tempManager->getTemporaryFile(); + $dbfile = \OC::$SERVERROOT.'/tests/data/db_structure.xml'; $dbfile2 = \OC::$SERVERROOT.'/tests/data/db_structure2.xml'; @@ -73,7 +80,7 @@ class DBSchemaTest extends TestCase { } public function doTestSchemaDumping() { - $outfile = 'static://db_out.xml'; + $outfile = $this->tempManager->getTemporaryFile(); OC_DB::getDbStructure($outfile); $content = file_get_contents($outfile); $this->assertContains($this->table1, $content); diff --git a/tests/lib/DB/LegacyDBTest.php b/tests/lib/DB/LegacyDBTest.php index f3de570c52d48d121747b64629e687a464efeda9..3cf4022822594dc053bc891a162bab4c4cc4d24f 100644 --- a/tests/lib/DB/LegacyDBTest.php +++ b/tests/lib/DB/LegacyDBTest.php @@ -18,9 +18,14 @@ use OC_DB; class LegacyDBTest extends \Test\TestCase { protected $backupGlobals = FALSE; - protected static $schema_file = 'static://test_db_scheme'; + protected static $schema_file; protected $test_prefix; + public static function setUpBeforeClass() { + self::$schema_file = \OC::$server->getTempManager()->getTemporaryFile(); + } + + /** * @var string */ diff --git a/tests/lib/DB/SchemaDiffTest.php b/tests/lib/DB/SchemaDiffTest.php index b7bb3c2a9cb7b36888d6460dc1ff4d24731f8814..88c9abeb431d9dc35ef9596f080a1dad538ed135 100644 --- a/tests/lib/DB/SchemaDiffTest.php +++ b/tests/lib/DB/SchemaDiffTest.php @@ -47,9 +47,13 @@ class SchemaDiffTest extends TestCase { /** @var string */ private $testPrefix; + private $schemaFile; + protected function setUp() { parent::setUp(); + $this->schemaFile = \OC::$server->getTempManager()->getTemporaryFile(); + $this->config = \OC::$server->getConfig(); $this->connection = \OC::$server->getDatabaseConnection(); $this->manager = new MDB2SchemaManager($this->connection); @@ -57,7 +61,7 @@ class SchemaDiffTest extends TestCase { } protected function tearDown() { - $this->manager->removeDBStructure('static://test_db_scheme'); + $this->manager->removeDBStructure($this->schemaFile); parent::tearDown(); } @@ -68,7 +72,7 @@ class SchemaDiffTest extends TestCase { public function testZeroChangeOnSchemaMigrations($xml) { $xml = str_replace( '*dbprefix*', $this->testPrefix, $xml ); - $schemaFile = 'static://test_db_scheme'; + $schemaFile = $this->schemaFile; file_put_contents($schemaFile, $xml); // apply schema diff --git a/tests/lib/Encryption/Keys/StorageTest.php b/tests/lib/Encryption/Keys/StorageTest.php index b5b91f886a3849ca2bf4cc49636cfbb98f9acd7e..4e9719351f30be75fabebbc78a67ee435af0be60 100644 --- a/tests/lib/Encryption/Keys/StorageTest.php +++ b/tests/lib/Encryption/Keys/StorageTest.php @@ -510,4 +510,47 @@ class StorageTest extends TestCase { ]; } + + /** + * @dataProvider dataTestBackupUserKeys + * @param bool $createBackupDir + */ + public function testBackupUserKeys($createBackupDir) { + + $storage = $this->getMockBuilder('OC\Encryption\Keys\Storage') + ->setConstructorArgs([$this->view, $this->util]) + ->setMethods(['getTimestamp']) + ->getMock(); + + $storage->expects($this->any())->method('getTimestamp')->willReturn('1234567'); + + $this->view->expects($this->once())->method('file_exists') + ->with('user1/files_encryption/backup')->willReturn(!$createBackupDir); + + if ($createBackupDir) { + $this->view->expects($this->at(1))->method('mkdir') + ->with('user1/files_encryption/backup'); + $this->view->expects($this->at(2))->method('mkdir') + ->with('user1/files_encryption/backup/test.encryptionModule.1234567'); + } else { + $this->view->expects($this->once())->method('mkdir') + ->with('user1/files_encryption/backup/test.encryptionModule.1234567'); + } + + $this->view->expects($this->once())->method('copy') + ->with( + 'user1/files_encryption/encryptionModule', + 'user1/files_encryption/backup/test.encryptionModule.1234567' + )->willReturn(true); + + $this->assertTrue($storage->backupUserKeys('encryptionModule', 'test', 'user1')); + + } + + public function dataTestBackupUserKeys() { + return [ + [true], [false] + ]; + } + } diff --git a/tests/lib/Files/FilesystemTest.php b/tests/lib/Files/FilesystemTest.php index dd4785ecf090f7a57254ad988a22a391b83e282a..1eb6c4fc54b275ab8375d1e2ccb128bcb53e9163 100644 --- a/tests/lib/Files/FilesystemTest.php +++ b/tests/lib/Files/FilesystemTest.php @@ -414,11 +414,9 @@ class FilesystemTest extends \Test\TestCase { $homeMount = \OC\Files\Filesystem::getStorage('/' . $userId . '/'); $this->assertTrue($homeMount->instanceOfStorage('\OCP\Files\IHomeStorage')); - if (getenv('RUN_OBJECTSTORE_TESTS')) { - $this->assertTrue($homeMount->instanceOfStorage('\OC\Files\ObjectStore\HomeObjectStoreStorage')); + if ($homeMount->instanceOfStorage('\OC\Files\ObjectStore\HomeObjectStoreStorage')) { $this->assertEquals('object::user:' . $userId, $homeMount->getId()); - } else { - $this->assertTrue($homeMount->instanceOfStorage('\OC\Files\Storage\Home')); + } else if ($homeMount->instanceOfStorage('\OC\Files\Storage\Home')) { $this->assertEquals('home::' . $userId, $homeMount->getId()); } @@ -426,37 +424,6 @@ class FilesystemTest extends \Test\TestCase { if ($user !== null) { $user->delete(); } } - /** - * Tests that the home storage is used in legacy mode - * for the user's mount point - */ - public function testLegacyHomeMount() { - if (getenv('RUN_OBJECTSTORE_TESTS')) { - $this->markTestSkipped('legacy storage unrelated to objectstore environments'); - } - $datadir = \OC::$server->getConfig()->getSystemValue("datadirectory", \OC::$SERVERROOT . "/data"); - $userId = $this->getUniqueID('user_'); - - // insert storage into DB by constructing it - // to make initMountsPoint find its existence - $localStorage = new \OC\Files\Storage\Local(array('datadir' => $datadir . '/' . $userId . '/')); - // this will trigger the insert - $cache = $localStorage->getCache(); - - \OC::$server->getUserManager()->createUser($userId, $userId); - \OC\Files\Filesystem::initMountPoints($userId); - - $homeMount = \OC\Files\Filesystem::getStorage('/' . $userId . '/'); - - $this->assertTrue($homeMount->instanceOfStorage('\OC\Files\Storage\Home')); - $this->assertEquals('local::' . $datadir . '/' . $userId . '/', $homeMount->getId()); - - $user = \OC::$server->getUserManager()->get($userId); - if ($user !== null) { $user->delete(); } - // delete storage entry - $cache->clear(); - } - public function dummyHook($arguments) { $path = $arguments['path']; $this->assertEquals($path, \OC\Files\Filesystem::normalizePath($path)); //the path passed to the hook should already be normalized diff --git a/tests/lib/Files/Node/FileTest.php b/tests/lib/Files/Node/FileTest.php index 823e3b502494e11cc76efb205c4bc366cb526b63..a17cc1d1a3ad07db5afdedf757c1ac0a7240383b 100644 --- a/tests/lib/Files/Node/FileTest.php +++ b/tests/lib/Files/Node/FileTest.php @@ -8,161 +8,28 @@ namespace Test\Files\Node; -use OC\Files\FileInfo; -use OCP\Files\NotFoundException; -use OCP\ILogger; -use OCP\IUserManager; - -class FileTest extends \Test\TestCase { - /** @var \OC\User\User */ - private $user; - /** @var \OC\Files\Mount\Manager */ - private $manager; - /** @var \OC\Files\View|\PHPUnit_Framework_MockObject_MockObject */ - private $view; - /** @var \OCP\Files\Config\IUserMountCache|\PHPUnit_Framework_MockObject_MockObject */ - private $userMountCache; - /** @var ILogger|\PHPUnit_Framework_MockObject_MockObject */ - private $logger; - /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */ - private $userManager; - - protected function setUp() { - parent::setUp(); - $config = $this->getMockBuilder('\OCP\IConfig') - ->disableOriginalConstructor() - ->getMock(); - $this->user = new \OC\User\User('', new \Test\Util\User\Dummy, null, $config); - $this->manager = $this->getMockBuilder('\OC\Files\Mount\Manager') - ->disableOriginalConstructor() - ->getMock(); - $this->view = $this->getMockBuilder('\OC\Files\View') - ->disableOriginalConstructor() - ->getMock(); - $this->userMountCache = $this->getMockBuilder('\OCP\Files\Config\IUserMountCache') - ->disableOriginalConstructor() - ->getMock(); - $this->logger = $this->createMock(ILogger::class); - $this->userManager = $this->createMock(IUserManager::class); - } - - protected function getMockStorage() { - $storage = $this->getMockBuilder('\OCP\Files\Storage') - ->getMock(); - $storage->expects($this->any()) - ->method('getId') - ->will($this->returnValue('home::someuser')); - return $storage; +/** + * Class FileTest + * + * @group DB + * + * @package Test\Files\Node + */ +class FileTest extends NodeTest { + protected function createTestNode($root, $view, $path) { + return new \OC\Files\Node\File($root, $view, $path); } - protected function getFileInfo($data) { - return new FileInfo('', $this->getMockStorage(), '', $data, null); + protected function getNodeClass() { + return '\OC\Files\Node\File'; } - public function testDelete() { - /** @var \OC\Files\Node\Root|\PHPUnit_Framework_MockObject_MockObject $root */ - $root = $this->getMockBuilder('\OC\Files\Node\Root') - ->setConstructorArgs([$this->manager, $this->view, $this->user, $this->userMountCache, $this->logger, $this->userManager]) - ->getMock(); - - $root->expects($this->exactly(2)) - ->method('emit') - ->will($this->returnValue(true)); - $root->expects($this->any()) - ->method('getUser') - ->will($this->returnValue($this->user)); - - $this->view->expects($this->once()) - ->method('getFileInfo') - ->with('/bar/foo') - ->will($this->returnValue($this->getFileInfo(array('permissions' => \OCP\Constants::PERMISSION_ALL)))); - - $this->view->expects($this->once()) - ->method('unlink') - ->with('/bar/foo') - ->will($this->returnValue(true)); - - $node = new \OC\Files\Node\File($root, $this->view, '/bar/foo'); - $node->delete(); - } - - public function testDeleteHooks() { - $test = $this; - $hooksRun = 0; - /** - * @param \OC\Files\Node\File $node - */ - $preListener = function ($node) use (&$test, &$hooksRun) { - $test->assertInstanceOf('\OC\Files\Node\File', $node); - $test->assertEquals('foo', $node->getInternalPath()); - $test->assertEquals('/bar/foo', $node->getPath()); - $test->assertEquals(1, $node->getId()); - $hooksRun++; - }; - - /** - * @param \OC\Files\Node\File $node - */ - $postListener = function ($node) use (&$test, &$hooksRun) { - $test->assertInstanceOf('\OC\Files\Node\NonExistingFile', $node); - $test->assertEquals('foo', $node->getInternalPath()); - $test->assertEquals('/bar/foo', $node->getPath()); - $test->assertEquals(1, $node->getId()); - $test->assertEquals('text/plain', $node->getMimeType()); - $hooksRun++; - }; - - $root = new \OC\Files\Node\Root( - $this->manager, - $this->view, - $this->user, - $this->userMountCache, - $this->logger, - $this->userManager - ); - $root->listen('\OC\Files', 'preDelete', $preListener); - $root->listen('\OC\Files', 'postDelete', $postListener); - - $this->view->expects($this->any()) - ->method('getFileInfo') - ->with('/bar/foo') - ->will($this->returnValue($this->getFileInfo(array('permissions' => \OCP\Constants::PERMISSION_ALL, 'fileid' => 1, 'mimetype' => 'text/plain')))); - - $this->view->expects($this->once()) - ->method('unlink') - ->with('/bar/foo') - ->will($this->returnValue(true)); - - $this->view->expects($this->any()) - ->method('resolvePath') - ->with('/bar/foo') - ->will($this->returnValue(array(null, 'foo'))); - - $node = new \OC\Files\Node\File($root, $this->view, '/bar/foo'); - $node->delete(); - $this->assertEquals(2, $hooksRun); + protected function getNonExistingNodeClass() { + return '\OC\Files\Node\NonExistingFile'; } - /** - * @expectedException \OCP\Files\NotPermittedException - */ - public function testDeleteNotPermitted() { - /** @var \OC\Files\Node\Root|\PHPUnit_Framework_MockObject_MockObject $root */ - $root = $this->getMockBuilder('\OC\Files\Node\Root') - ->setConstructorArgs([$this->manager, $this->view, $this->user, $this->userMountCache, $this->logger, $this->userManager]) - ->getMock(); - - $root->expects($this->any()) - ->method('getUser') - ->will($this->returnValue($this->user)); - - $this->view->expects($this->once()) - ->method('getFileInfo') - ->with('/bar/foo') - ->will($this->returnValue($this->getFileInfo(array('permissions' => \OCP\Constants::PERMISSION_READ)))); - - $node = new \OC\Files\Node\File($root, $this->view, '/bar/foo'); - $node->delete(); + protected function getViewDeleteMethod() { + return 'unlink'; } public function testGetContent() { @@ -421,224 +288,5 @@ class FileTest extends \Test\TestCase { $node->fopen('w'); } - public function testCopySameStorage() { - /** @var \OC\Files\Node\Root|\PHPUnit_Framework_MockObject_MockObject $root */ - $root = $this->getMockBuilder('\OC\Files\Node\Root') - ->setConstructorArgs([$this->manager, $this->view, $this->user, $this->userMountCache, $this->logger, $this->userManager]) - ->getMock(); - - $this->view->expects($this->any()) - ->method('copy') - ->with('/bar/foo', '/bar/asd'); - - $this->view->expects($this->any()) - ->method('getFileInfo') - ->will($this->returnValue($this->getFileInfo(array('permissions' => \OCP\Constants::PERMISSION_ALL, 'fileid' => 3)))); - - $node = new \OC\Files\Node\File($root, $this->view, '/bar/foo'); - $parentNode = new \OC\Files\Node\Folder($root, $this->view, '/bar'); - $newNode = new \OC\Files\Node\File($root, $this->view, '/bar/asd'); - - $root->expects($this->exactly(2)) - ->method('get') - ->will($this->returnValueMap(array( - array('/bar/asd', $newNode), - array('/bar', $parentNode) - ))); - - $target = $node->copy('/bar/asd'); - $this->assertInstanceOf('\OC\Files\Node\File', $target); - $this->assertEquals(3, $target->getId()); - } - - /** - * @expectedException \OCP\Files\NotPermittedException - */ - public function testCopyNotPermitted() { - /** @var \OC\Files\Node\Root|\PHPUnit_Framework_MockObject_MockObject $root */ - $root = $this->getMockBuilder('\OC\Files\Node\Root') - ->setConstructorArgs([$this->manager, $this->view, $this->user, $this->userMountCache, $this->logger, $this->userManager]) - ->getMock(); - - /** - * @var \OC\Files\Storage\Storage | \PHPUnit_Framework_MockObject_MockObject $storage - */ - $storage = $this->getMockBuilder('\OC\Files\Storage\Storage') - ->disableOriginalConstructor() - ->getMock(); - - $root->expects($this->never()) - ->method('getMount'); - - $storage->expects($this->never()) - ->method('copy'); - $this->view->expects($this->any()) - ->method('getFileInfo') - ->will($this->returnValue($this->getFileInfo(array('permissions' => \OCP\Constants::PERMISSION_READ, 'fileid' => 3)))); - - $node = new \OC\Files\Node\File($root, $this->view, '/bar/foo'); - $parentNode = new \OC\Files\Node\Folder($root, $this->view, '/bar'); - - $root->expects($this->once()) - ->method('get') - ->will($this->returnValueMap(array( - array('/bar', $parentNode) - ))); - - $node->copy('/bar/asd'); - } - - /** - * @expectedException \OCP\Files\NotFoundException - */ - public function testCopyNoParent() { - /** @var \OC\Files\Node\Root|\PHPUnit_Framework_MockObject_MockObject $root */ - $root = $this->getMockBuilder('\OC\Files\Node\Root') - ->setConstructorArgs([$this->manager, $this->view, $this->user, $this->userMountCache, $this->logger, $this->userManager]) - ->getMock(); - - $this->view->expects($this->never()) - ->method('copy'); - - $node = new \OC\Files\Node\File($root, $this->view, '/bar/foo'); - - $root->expects($this->once()) - ->method('get') - ->with('/bar/asd') - ->will($this->throwException(new NotFoundException())); - - $node->copy('/bar/asd/foo'); - } - - /** - * @expectedException \OCP\Files\NotPermittedException - */ - public function testCopyParentIsFile() { - /** @var \OC\Files\Node\Root|\PHPUnit_Framework_MockObject_MockObject $root */ - $root = $this->getMockBuilder('\OC\Files\Node\Root') - ->setConstructorArgs([$this->manager, $this->view, $this->user, $this->userMountCache, $this->logger, $this->userManager]) - ->getMock(); - - $this->view->expects($this->never()) - ->method('copy'); - - $node = new \OC\Files\Node\File($root, $this->view, '/bar/foo'); - $parentNode = new \OC\Files\Node\File($root, $this->view, '/bar'); - - $root->expects($this->once()) - ->method('get') - ->will($this->returnValueMap(array( - array('/bar', $parentNode) - ))); - - $node->copy('/bar/asd'); - } - - public function testMoveSameStorage() { - /** @var \OC\Files\Node\Root|\PHPUnit_Framework_MockObject_MockObject $root */ - $root = $this->getMockBuilder('\OC\Files\Node\Root') - ->setConstructorArgs([$this->manager, $this->view, $this->user, $this->userMountCache, $this->logger, $this->userManager]) - ->getMock(); - - $this->view->expects($this->any()) - ->method('rename') - ->with('/bar/foo', '/bar/asd'); - - $this->view->expects($this->any()) - ->method('getFileInfo') - ->will($this->returnValue($this->getFileInfo(array('permissions' => \OCP\Constants::PERMISSION_ALL, 'fileid' => 1)))); - - $node = new \OC\Files\Node\File($root, $this->view, '/bar/foo'); - $parentNode = new \OC\Files\Node\Folder($root, $this->view, '/bar'); - - $root->expects($this->any()) - ->method('get') - ->will($this->returnValueMap(array(array('/bar', $parentNode), array('/bar/asd', $node)))); - - $target = $node->move('/bar/asd'); - $this->assertInstanceOf('\OC\Files\Node\File', $target); - $this->assertEquals(1, $target->getId()); - $this->assertEquals('/bar/asd', $node->getPath()); - } - - /** - * @expectedException \OCP\Files\NotPermittedException - */ - public function testMoveNotPermitted() { - /** @var \OC\Files\Node\Root|\PHPUnit_Framework_MockObject_MockObject $root */ - $root = $this->getMockBuilder('\OC\Files\Node\Root') - ->setConstructorArgs([$this->manager, $this->view, $this->user, $this->userMountCache, $this->logger, $this->userManager]) - ->getMock(); - - $this->view->expects($this->any()) - ->method('getFileInfo') - ->will($this->returnValue($this->getFileInfo(array('permissions' => \OCP\Constants::PERMISSION_READ)))); - - $this->view->expects($this->never()) - ->method('rename'); - - $node = new \OC\Files\Node\File($root, $this->view, '/bar/foo'); - $parentNode = new \OC\Files\Node\Folder($root, $this->view, '/bar'); - - $root->expects($this->once()) - ->method('get') - ->with('/bar') - ->will($this->returnValue($parentNode)); - - $node->move('/bar/asd'); - } - - /** - * @expectedException \OCP\Files\NotFoundException - */ - public function testMoveNoParent() { - /** @var \OC\Files\Node\Root|\PHPUnit_Framework_MockObject_MockObject $root */ - $root = $this->getMockBuilder('\OC\Files\Node\Root') - ->setConstructorArgs([$this->manager, $this->view, $this->user, $this->userMountCache, $this->logger, $this->userManager]) - ->getMock(); - - /** - * @var \OC\Files\Storage\Storage | \PHPUnit_Framework_MockObject_MockObject $storage - */ - $storage = $this->getMockBuilder('\OC\Files\Storage\Storage') - ->disableOriginalConstructor() - ->getMock(); - - $storage->expects($this->never()) - ->method('rename'); - - $node = new \OC\Files\Node\File($root, $this->view, '/bar/foo'); - $parentNode = new \OC\Files\Node\Folder($root, $this->view, '/bar'); - - $root->expects($this->once()) - ->method('get') - ->with('/bar') - ->will($this->throwException(new NotFoundException())); - - $node->move('/bar/asd'); - } - - /** - * @expectedException \OCP\Files\NotPermittedException - */ - public function testMoveParentIsFile() { - /** @var \OC\Files\Node\Root|\PHPUnit_Framework_MockObject_MockObject $root */ - $root = $this->getMockBuilder('\OC\Files\Node\Root') - ->setConstructorArgs([$this->manager, $this->view, $this->user, $this->userMountCache, $this->logger, $this->userManager]) - ->getMock(); - - $this->view->expects($this->never()) - ->method('rename'); - - $node = new \OC\Files\Node\File($root, $this->view, '/bar/foo'); - $parentNode = new \OC\Files\Node\File($root, $this->view, '/bar'); - - $root->expects($this->once()) - ->method('get') - ->with('/bar') - ->will($this->returnValue($parentNode)); - - $node->move('/bar/asd'); - } } diff --git a/tests/lib/Files/Node/FolderTest.php b/tests/lib/Files/Node/FolderTest.php index dcfe6a1768cb3a9ea97781f5162a27216731cffc..ec043c7b81e692df61ae8617ea79d0798c60346d 100644 --- a/tests/lib/Files/Node/FolderTest.php +++ b/tests/lib/Files/Node/FolderTest.php @@ -18,13 +18,11 @@ use OC\Files\Node\Node; use OC\Files\Node\Root; use OC\Files\Storage\Temporary; use OC\Files\Storage\Wrapper\Jail; +use OC\Files\View; use OC\User\User; use OCP\Files\Mount\IMountPoint; use OCP\Files\NotFoundException; -use OC\Files\View; use OCP\Files\Storage; -use OCP\ILogger; -use OCP\IUserManager; /** * Class FolderTest @@ -33,152 +31,21 @@ use OCP\IUserManager; * * @package Test\Files\Node */ -class FolderTest extends \Test\TestCase { - /** @var User */ - private $user; - /** @var \OCP\Files\Config\IUserMountCache|\PHPUnit_Framework_MockObject_MockObject */ - private $userMountCache; - /** @var ILogger|\PHPUnit_Framework_MockObject_MockObject */ - private $logger; - /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */ - private $userManager; - - protected function setUp() { - parent::setUp(); - $this->user = new \OC\User\User('', new \Test\Util\User\Dummy); - $this->userMountCache = $this->getMockBuilder('\OCP\Files\Config\IUserMountCache') - ->disableOriginalConstructor() - ->getMock(); - $this->logger = $this->createMock(ILogger::class); - $this->userManager = $this->createMock(IUserManager::class); +class FolderTest extends NodeTest { + protected function createTestNode($root, $view, $path) { + return new \OC\Files\Node\Folder($root, $view, $path); } - protected function getMockStorage() { - $storage = $this->createMock(Storage::class); - $storage->expects($this->any()) - ->method('getId') - ->will($this->returnValue('home::someuser')); - return $storage; + protected function getNodeClass() { + return '\OC\Files\Node\Folder'; } - protected function getFileInfo($data) { - return new FileInfo('', $this->getMockStorage(), '', $data, null); + protected function getNonExistingNodeClass() { + return '\OC\Files\Node\NonExistingFolder'; } - public function testDelete() { - $manager = $this->createMock(Manager::class); - /** - * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view - */ - $view = $this->createMock(View::class); - $root = $this->getMockBuilder(Root::class) - ->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager]) - ->getMock(); - $root->expects($this->any()) - ->method('getUser') - ->will($this->returnValue($this->user)); - $root->expects($this->exactly(2)) - ->method('emit') - ->will($this->returnValue(true)); - - $view->expects($this->any()) - ->method('getFileInfo') - ->will($this->returnValue($this->getFileInfo(array('permissions' => \OCP\Constants::PERMISSION_ALL)))); - - $view->expects($this->once()) - ->method('rmdir') - ->with('/bar/foo') - ->will($this->returnValue(true)); - - $node = new \OC\Files\Node\Folder($root, $view, '/bar/foo'); - $node->delete(); - } - - public function testDeleteHooks() { - $test = $this; - $hooksRun = 0; - /** - * @param \OC\Files\Node\File $node - */ - $preListener = function ($node) use (&$test, &$hooksRun) { - $test->assertInstanceOf('\OC\Files\Node\Folder', $node); - $test->assertEquals('foo', $node->getInternalPath()); - $test->assertEquals('/bar/foo', $node->getPath()); - $hooksRun++; - }; - - /** - * @param \OC\Files\Node\File $node - */ - $postListener = function ($node) use (&$test, &$hooksRun) { - $test->assertInstanceOf('\OC\Files\Node\NonExistingFolder', $node); - $test->assertEquals('foo', $node->getInternalPath()); - $test->assertEquals('/bar/foo', $node->getPath()); - $test->assertEquals(1, $node->getId()); - $hooksRun++; - }; - - /** - * @var \OC\Files\Mount\Manager $manager - */ - $manager = $this->createMock(Manager::class); - /** - * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view - */ - $view = $this->createMock(View::class); - $root = new \OC\Files\Node\Root( - $manager, - $view, - $this->user, - $this->userMountCache, - $this->logger, - $this->userManager - ); - $root->listen('\OC\Files', 'preDelete', $preListener); - $root->listen('\OC\Files', 'postDelete', $postListener); - - $view->expects($this->any()) - ->method('getFileInfo') - ->will($this->returnValue($this->getFileInfo(array('permissions' => \OCP\Constants::PERMISSION_ALL, 'fileid' => 1)))); - - $view->expects($this->once()) - ->method('rmdir') - ->with('/bar/foo') - ->will($this->returnValue(true)); - - $view->expects($this->any()) - ->method('resolvePath') - ->with('/bar/foo') - ->will($this->returnValue(array(null, 'foo'))); - - $node = new \OC\Files\Node\Folder($root, $view, '/bar/foo'); - $node->delete(); - $this->assertEquals(2, $hooksRun); - } - - /** - * @expectedException \OCP\Files\NotPermittedException - */ - public function testDeleteNotPermitted() { - $manager = $this->createMock(Manager::class); - /** - * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view - */ - $view = $this->createMock(View::class); - $root = $this->getMockBuilder(Root::class) - ->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager]) - ->getMock(); - $root->expects($this->any()) - ->method('getUser') - ->will($this->returnValue($this->user)); - - $view->expects($this->once()) - ->method('getFileInfo') - ->with('/bar/foo') - ->will($this->returnValue($this->getFileInfo(array('permissions' => \OCP\Constants::PERMISSION_READ)))); - - $node = new \OC\Files\Node\Folder($root, $view, '/bar/foo'); - $node->delete(); + protected function getViewDeleteMethod() { + return 'rmdir'; } public function testGetDirectoryContent() { diff --git a/tests/lib/Files/Node/NodeTest.php b/tests/lib/Files/Node/NodeTest.php index 1a3a0472e973c5b286b50679a4b905e18d805c9e..5e18caa20142b9930a26199b4ba1493c1d122dc4 100644 --- a/tests/lib/Files/Node/NodeTest.php +++ b/tests/lib/Files/Node/NodeTest.php @@ -9,24 +9,34 @@ namespace Test\Files\Node; use OC\Files\FileInfo; +use OC\Files\View; +use OCP\Files\Config\IUserMountCache; +use OCP\Files\IRootFolder; +use OCP\Files\Node; use OCP\ILogger; use OCP\IUserManager; +use OCP\Files\NotFoundException; -class NodeTest extends \Test\TestCase { +/** + * Class NodeTest + * + * @package Test\Files\Node + */ +abstract class NodeTest extends \Test\TestCase { /** @var \OC\User\User */ - private $user; + protected $user; /** @var \OC\Files\Mount\Manager */ - private $manager; + protected $manager; /** @var \OC\Files\View|\PHPUnit_Framework_MockObject_MockObject */ - private $view; + protected $view; /** @var \OC\Files\Node\Root|\PHPUnit_Framework_MockObject_MockObject */ - private $root; + protected $root; /** @var \OCP\Files\Config\IUserMountCache|\PHPUnit_Framework_MockObject_MockObject */ - private $userMountCache; + protected $userMountCache; /** @var ILogger|\PHPUnit_Framework_MockObject_MockObject */ - private $logger; + protected $logger; /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */ - private $userManager; + protected $userManager; protected function setUp() { parent::setUp(); @@ -54,6 +64,29 @@ class NodeTest extends \Test\TestCase { ->getMock(); } + /** + * @param IRootFolder $root + * @param View $view + * @param string $path + * @return Node + */ + protected abstract function createTestNode($root, $view, $path); + + /** + * @return string + */ + protected abstract function getNodeClass(); + + /** + * @return string + */ + protected abstract function getNonExistingNodeClass(); + + /** + * @return string + */ + protected abstract function getViewDeleteMethod(); + protected function getMockStorage() { $storage = $this->getMockBuilder('\OCP\Files\Storage') ->disableOriginalConstructor() @@ -68,6 +101,104 @@ class NodeTest extends \Test\TestCase { return new FileInfo('', $this->getMockStorage(), '', $data, null); } + public function testDelete() { + $this->root->expects($this->exactly(2)) + ->method('emit') + ->will($this->returnValue(true)); + $this->root->expects($this->any()) + ->method('getUser') + ->will($this->returnValue($this->user)); + + $this->view->expects($this->once()) + ->method('getFileInfo') + ->with('/bar/foo') + ->will($this->returnValue($this->getFileInfo(['permissions' => \OCP\Constants::PERMISSION_ALL]))); + + $this->view->expects($this->once()) + ->method($this->getViewDeleteMethod()) + ->with('/bar/foo') + ->will($this->returnValue(true)); + + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); + $node->delete(); + } + + public function testDeleteHooks() { + $test = $this; + $hooksRun = 0; + /** + * @param \OC\Files\Node\File $node + */ + $preListener = function ($node) use (&$test, &$hooksRun) { + $test->assertInstanceOf($this->getNodeClass(), $node); + $test->assertEquals('foo', $node->getInternalPath()); + $test->assertEquals('/bar/foo', $node->getPath()); + $test->assertEquals(1, $node->getId()); + $hooksRun++; + }; + + /** + * @param \OC\Files\Node\File $node + */ + $postListener = function ($node) use (&$test, &$hooksRun) { + $test->assertInstanceOf($this->getNonExistingNodeClass(), $node); + $test->assertEquals('foo', $node->getInternalPath()); + $test->assertEquals('/bar/foo', $node->getPath()); + $test->assertEquals(1, $node->getId()); + $test->assertEquals('text/plain', $node->getMimeType()); + $hooksRun++; + }; + + $root = new \OC\Files\Node\Root( + $this->manager, + $this->view, + $this->user, + $this->userMountCache, + $this->logger, + $this->userManager + ); + + $root->listen('\OC\Files', 'preDelete', $preListener); + $root->listen('\OC\Files', 'postDelete', $postListener); + + $this->view->expects($this->any()) + ->method('getFileInfo') + ->with('/bar/foo') + ->will($this->returnValue($this->getFileInfo(['permissions' => \OCP\Constants::PERMISSION_ALL, 'fileid' => 1, 'mimetype' => 'text/plain']))); + + $this->view->expects($this->once()) + ->method($this->getViewDeleteMethod()) + ->with('/bar/foo') + ->will($this->returnValue(true)); + + $this->view->expects($this->any()) + ->method('resolvePath') + ->with('/bar/foo') + ->will($this->returnValue([null, 'foo'])); + + $node = $this->createTestNode($root, $this->view, '/bar/foo'); + $node->delete(); + $this->assertEquals(2, $hooksRun); + } + + /** + * @expectedException \OCP\Files\NotPermittedException + */ + public function testDeleteNotPermitted() { + $this->root->expects($this->any()) + ->method('getUser') + ->will($this->returnValue($this->user)); + + $this->view->expects($this->once()) + ->method('getFileInfo') + ->with('/bar/foo') + ->will($this->returnValue($this->getFileInfo(['permissions' => \OCP\Constants::PERMISSION_READ]))); + + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); + $node->delete(); + } + + public function testStat() { $this->root->expects($this->any()) ->method('getUser') @@ -86,7 +217,7 @@ class NodeTest extends \Test\TestCase { ->with('/bar/foo') ->will($this->returnValue($stat)); - $node = new \OC\Files\Node\File($this->root, $this->view, '/bar/foo'); + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); $this->assertEquals($stat, $node->stat()); } @@ -107,7 +238,7 @@ class NodeTest extends \Test\TestCase { ->with('/bar/foo') ->will($this->returnValue($stat)); - $node = new \OC\Files\Node\File($this->root, $this->view, '/bar/foo'); + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); $this->assertEquals(1, $node->getId()); } @@ -129,7 +260,7 @@ class NodeTest extends \Test\TestCase { ->with('/bar/foo') ->will($this->returnValue($stat)); - $node = new \OC\Files\Node\File($this->root, $this->view, '/bar/foo'); + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); $this->assertEquals(100, $node->getSize()); } @@ -150,7 +281,7 @@ class NodeTest extends \Test\TestCase { ->with('/bar/foo') ->will($this->returnValue($stat)); - $node = new \OC\Files\Node\File($this->root, $this->view, '/bar/foo'); + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); $this->assertEquals('qwerty', $node->getEtag()); } @@ -171,7 +302,7 @@ class NodeTest extends \Test\TestCase { ->with('/bar/foo') ->will($this->returnValue($stat)); - $node = new \OC\Files\Node\File($this->root, $this->view, '/bar/foo'); + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); $this->assertEquals(50, $node->getMTime()); } @@ -192,7 +323,7 @@ class NodeTest extends \Test\TestCase { ->will($this->returnValue(array($storage, 'foo'))); - $node = new \OC\Files\Node\File($this->root, $this->view, '/bar/foo'); + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); $this->assertEquals($storage, $node->getStorage()); } @@ -201,7 +332,7 @@ class NodeTest extends \Test\TestCase { ->method('getUser') ->will($this->returnValue($this->user)); - $node = new \OC\Files\Node\File($this->root, $this->view, '/bar/foo'); + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); $this->assertEquals('/bar/foo', $node->getPath()); } @@ -222,7 +353,7 @@ class NodeTest extends \Test\TestCase { ->will($this->returnValue(array($storage, 'foo'))); - $node = new \OC\Files\Node\File($this->root, $this->view, '/bar/foo'); + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); $this->assertEquals('foo', $node->getInternalPath()); } @@ -231,7 +362,7 @@ class NodeTest extends \Test\TestCase { ->method('getUser') ->will($this->returnValue($this->user)); - $node = new \OC\Files\Node\File($this->root, $this->view, '/bar/foo'); + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); $this->assertEquals('foo', $node->getName()); } @@ -250,7 +381,7 @@ class NodeTest extends \Test\TestCase { ->with('/bar/foo') ->will($this->returnValue($this->getFileInfo(array('permissions' => \OCP\Constants::PERMISSION_ALL)))); - $node = new \OC\Files\Node\Node($this->root, $this->view, '/bar/foo'); + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); $node->touch(100); $this->assertEquals(100, $node->getMTime()); } @@ -302,7 +433,7 @@ class NodeTest extends \Test\TestCase { ->with('/bar/foo') ->will($this->returnValue($this->getFileInfo(array('permissions' => \OCP\Constants::PERMISSION_ALL)))); - $node = new \OC\Files\Node\Node($root, $this->view, '/bar/foo'); + $node = $this->createTestNode($root, $this->view, '/bar/foo'); $node->touch(100); $this->assertEquals(2, $hooksRun); } @@ -320,7 +451,7 @@ class NodeTest extends \Test\TestCase { ->with('/bar/foo') ->will($this->returnValue($this->getFileInfo(array('permissions' => \OCP\Constants::PERMISSION_READ)))); - $node = new \OC\Files\Node\Node($this->root, $this->view, '/bar/foo'); + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); $node->touch(100); } @@ -328,7 +459,312 @@ class NodeTest extends \Test\TestCase { * @expectedException \OCP\Files\InvalidPathException */ public function testInvalidPath() { - $node = new \OC\Files\Node\Node($this->root, $this->view, '/../foo'); + $node = $this->createTestNode($this->root, $this->view, '/../foo'); $node->getFileInfo(); } + + public function testCopySameStorage() { + $this->view->expects($this->any()) + ->method('copy') + ->with('/bar/foo', '/bar/asd') + ->will($this->returnValue(true)); + + $this->view->expects($this->any()) + ->method('getFileInfo') + ->will($this->returnValue($this->getFileInfo(['permissions' => \OCP\Constants::PERMISSION_ALL, 'fileid' => 3]))); + + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); + $parentNode = new \OC\Files\Node\Folder($this->root, $this->view, '/bar'); + $newNode = $this->createTestNode($this->root, $this->view, '/bar/asd'); + + $this->root->expects($this->exactly(2)) + ->method('get') + ->will($this->returnValueMap([ + ['/bar/asd', $newNode], + ['/bar', $parentNode] + ])); + + $target = $node->copy('/bar/asd'); + $this->assertInstanceOf($this->getNodeClass(), $target); + $this->assertEquals(3, $target->getId()); + } + + /** + * @expectedException \OCP\Files\NotPermittedException + */ + public function testCopyNotPermitted() { + /** + * @var \OC\Files\Storage\Storage | \PHPUnit_Framework_MockObject_MockObject $storage + */ + $storage = $this->createMock('\OC\Files\Storage\Storage'); + + $this->root->expects($this->never()) + ->method('getMount'); + + $storage->expects($this->never()) + ->method('copy'); + + $this->view->expects($this->any()) + ->method('getFileInfo') + ->will($this->returnValue($this->getFileInfo(['permissions' => \OCP\Constants::PERMISSION_READ, 'fileid' => 3]))); + + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); + $parentNode = new \OC\Files\Node\Folder($this->root, $this->view, '/bar'); + + $this->root->expects($this->once()) + ->method('get') + ->will($this->returnValueMap([ + ['/bar', $parentNode] + ])); + + $node->copy('/bar/asd'); + } + + /** + * @expectedException \OCP\Files\NotFoundException + */ + public function testCopyNoParent() { + $this->view->expects($this->never()) + ->method('copy'); + + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); + + $this->root->expects($this->once()) + ->method('get') + ->with('/bar/asd') + ->will($this->throwException(new NotFoundException())); + + $node->copy('/bar/asd/foo'); + } + + /** + * @expectedException \OCP\Files\NotPermittedException + */ + public function testCopyParentIsFile() { + $this->view->expects($this->never()) + ->method('copy'); + + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); + $parentNode = new \OC\Files\Node\File($this->root, $this->view, '/bar'); + + $this->root->expects($this->once()) + ->method('get') + ->will($this->returnValueMap([ + ['/bar', $parentNode] + ])); + + $node->copy('/bar/asd'); + } + + public function testMoveSameStorage() { + $this->view->expects($this->any()) + ->method('rename') + ->with('/bar/foo', '/bar/asd') + ->will($this->returnValue(true)); + + $this->view->expects($this->any()) + ->method('getFileInfo') + ->will($this->returnValue($this->getFileInfo(['permissions' => \OCP\Constants::PERMISSION_ALL, 'fileid' => 1]))); + + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); + $parentNode = new \OC\Files\Node\Folder($this->root, $this->view, '/bar'); + + $this->root->expects($this->any()) + ->method('get') + ->will($this->returnValueMap([['/bar', $parentNode], ['/bar/asd', $node]])); + + $target = $node->move('/bar/asd'); + $this->assertInstanceOf($this->getNodeClass(), $target); + $this->assertEquals(1, $target->getId()); + $this->assertEquals('/bar/asd', $node->getPath()); + } + + public function moveOrCopyProvider() { + return [ + ['move', 'rename', 'preRename', 'postRename'], + ['copy', 'copy', 'preCopy', 'postCopy'], + ]; + } + + /** + * @dataProvider moveOrCopyProvider + * @param string $operationMethod + * @param string $viewMethod + * @param string $preHookName + * @param string $postHookName + */ + public function testMoveCopyHooks($operationMethod, $viewMethod, $preHookName, $postHookName) { + /** @var IRootFolder|\PHPUnit_Framework_MockObject_MockObject $root */ + $root = $this->getMockBuilder('\OC\Files\Node\Root') + ->setConstructorArgs([$this->manager, $this->view, $this->user, $this->userMountCache, $this->logger, $this->userManager]) + ->setMethods(['get']) + ->getMock(); + + $this->view->expects($this->any()) + ->method($viewMethod) + ->with('/bar/foo', '/bar/asd') + ->will($this->returnValue(true)); + + $this->view->expects($this->any()) + ->method('getFileInfo') + ->will($this->returnValue($this->getFileInfo(['permissions' => \OCP\Constants::PERMISSION_ALL, 'fileid' => 1]))); + + /** + * @var \OC\Files\Node\File|\PHPUnit_Framework_MockObject_MockObject $node + */ + $node = $this->createTestNode($root, $this->view, '/bar/foo'); + $parentNode = new \OC\Files\Node\Folder($root, $this->view, '/bar'); + $targetTestNode = $this->createTestNode($root, $this->view, '/bar/asd'); + + $root->expects($this->any()) + ->method('get') + ->will($this->returnValueMap([['/bar', $parentNode], ['/bar/asd', $targetTestNode]])); + + $hooksRun = 0; + + $preListener = function (Node $sourceNode, Node $targetNode) use (&$hooksRun, $node) { + $this->assertSame($node, $sourceNode); + $this->assertInstanceOf($this->getNodeClass(), $sourceNode); + $this->assertInstanceOf($this->getNonExistingNodeClass(), $targetNode); + $this->assertEquals('/bar/asd', $targetNode->getPath()); + $hooksRun++; + }; + + $postListener = function (Node $sourceNode, Node $targetNode) use (&$hooksRun, $node, $targetTestNode) { + $this->assertSame($node, $sourceNode); + $this->assertNotSame($node, $targetNode); + $this->assertSame($targetTestNode, $targetNode); + $this->assertInstanceOf($this->getNodeClass(), $sourceNode); + $this->assertInstanceOf($this->getNodeClass(), $targetNode); + $hooksRun++; + }; + + $preWriteListener = function (Node $targetNode) use (&$hooksRun) { + $this->assertInstanceOf($this->getNonExistingNodeClass(), $targetNode); + $this->assertEquals('/bar/asd', $targetNode->getPath()); + $hooksRun++; + }; + + $postWriteListener = function (Node $targetNode) use (&$hooksRun, $targetTestNode) { + $this->assertSame($targetTestNode, $targetNode); + $hooksRun++; + }; + + $root->listen('\OC\Files', $preHookName, $preListener); + $root->listen('\OC\Files', 'preWrite', $preWriteListener); + $root->listen('\OC\Files', $postHookName, $postListener); + $root->listen('\OC\Files', 'postWrite', $postWriteListener); + + $node->$operationMethod('/bar/asd'); + + $this->assertEquals(4, $hooksRun); + } + + /** + * @expectedException \OCP\Files\NotPermittedException + */ + public function testMoveNotPermitted() { + $this->view->expects($this->any()) + ->method('getFileInfo') + ->will($this->returnValue($this->getFileInfo(['permissions' => \OCP\Constants::PERMISSION_READ]))); + + $this->view->expects($this->never()) + ->method('rename'); + + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); + $parentNode = new \OC\Files\Node\Folder($this->root, $this->view, '/bar'); + + $this->root->expects($this->once()) + ->method('get') + ->with('/bar') + ->will($this->returnValue($parentNode)); + + $node->move('/bar/asd'); + } + + /** + * @expectedException \OCP\Files\NotFoundException + */ + public function testMoveNoParent() { + /** + * @var \OC\Files\Storage\Storage | \PHPUnit_Framework_MockObject_MockObject $storage + */ + $storage = $this->createMock('\OC\Files\Storage\Storage'); + + $storage->expects($this->never()) + ->method('rename'); + + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); + + $this->root->expects($this->once()) + ->method('get') + ->with('/bar') + ->will($this->throwException(new NotFoundException())); + + $node->move('/bar/asd'); + } + + /** + * @expectedException \OCP\Files\NotPermittedException + */ + public function testMoveParentIsFile() { + $this->view->expects($this->never()) + ->method('rename'); + + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); + $parentNode = new \OC\Files\Node\File($this->root, $this->view, '/bar'); + + $this->root->expects($this->once()) + ->method('get') + ->with('/bar') + ->will($this->returnValue($parentNode)); + + $node->move('/bar/asd'); + } + + /** + * @expectedException \OCP\Files\NotPermittedException + */ + public function testMoveFailed() { + $this->view->expects($this->any()) + ->method('rename') + ->with('/bar/foo', '/bar/asd') + ->will($this->returnValue(false)); + + $this->view->expects($this->any()) + ->method('getFileInfo') + ->will($this->returnValue($this->getFileInfo(['permissions' => \OCP\Constants::PERMISSION_ALL, 'fileid' => 1]))); + + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); + $parentNode = new \OC\Files\Node\Folder($this->root, $this->view, '/bar'); + + $this->root->expects($this->any()) + ->method('get') + ->will($this->returnValueMap([['/bar', $parentNode], ['/bar/asd', $node]])); + + $node->move('/bar/asd'); + } + + /** + * @expectedException \OCP\Files\NotPermittedException + */ + public function testCopyFailed() { + $this->view->expects($this->any()) + ->method('copy') + ->with('/bar/foo', '/bar/asd') + ->will($this->returnValue(false)); + + $this->view->expects($this->any()) + ->method('getFileInfo') + ->will($this->returnValue($this->getFileInfo(['permissions' => \OCP\Constants::PERMISSION_ALL, 'fileid' => 1]))); + + $node = $this->createTestNode($this->root, $this->view, '/bar/foo'); + $parentNode = new \OC\Files\Node\Folder($this->root, $this->view, '/bar'); + + $this->root->expects($this->any()) + ->method('get') + ->will($this->returnValueMap([['/bar', $parentNode], ['/bar/asd', $node]])); + + $node->copy('/bar/asd'); + } } diff --git a/tests/lib/Files/ObjectStore/S3Test.php b/tests/lib/Files/ObjectStore/S3Test.php index 10afb9a7aa8a17cd7923a011cdc015cf52e4678b..b93e9beebdc4061adaa7548aee476171d1a89a72 100644 --- a/tests/lib/Files/ObjectStore/S3Test.php +++ b/tests/lib/Files/ObjectStore/S3Test.php @@ -23,6 +23,9 @@ namespace Test\Files\ObjectStore; use OC\Files\ObjectStore\S3; +/** + * @group PRIMARY-s3 + */ class S3Test extends ObjectStoreTest { /** * @return \OCP\Files\ObjectStore\IObjectStore diff --git a/tests/lib/Files/Storage/HomeTest.php b/tests/lib/Files/Storage/HomeTest.php index d9a1b11849e714a9c29e7818bc7327ebd6a3eff5..e6899ff7d3821f00b8964e404e6f286da3eb083e 100644 --- a/tests/lib/Files/Storage/HomeTest.php +++ b/tests/lib/Files/Storage/HomeTest.php @@ -88,14 +88,6 @@ class HomeTest extends Storage { $this->assertEquals('home::' . $this->userId, $this->instance->getId()); } - /** - * Tests that the legacy home id is in the format local::/path/to/datadir/user1/ - */ - public function testLegacyId() { - $this->instance = new \OC\Files\Storage\Home(array('user' => $this->user, 'legacy' => true)); - $this->assertEquals('local::' . $this->tmpDir . '/', $this->instance->getId()); - } - /** * Tests that getCache() returns an instance of HomeCache */ diff --git a/tests/lib/Files/Stream/QuotaTest.php b/tests/lib/Files/Stream/QuotaTest.php index d084f0c769cacd951da862a932f586c6662f0fb6..24b0e7f9474ff6d89f8a1706fb4277fdf8e791c9 100644 --- a/tests/lib/Files/Stream/QuotaTest.php +++ b/tests/lib/Files/Stream/QuotaTest.php @@ -9,14 +9,11 @@ namespace Test\Files\Stream; class QuotaTest extends \Test\TestCase { - protected function tearDown() { - \OC\Files\Stream\Quota::clear(); - parent::tearDown(); - } /** * @param string $mode * @param integer $limit + * @return resource */ protected function getStream($mode, $limit) { $source = fopen('php://temp', $mode); diff --git a/tests/lib/Files/Stream/StaticStreamTest.php b/tests/lib/Files/Stream/StaticStreamTest.php deleted file mode 100644 index 309291a3a5b270439aba8cc30b1a220b3edcc614..0000000000000000000000000000000000000000 --- a/tests/lib/Files/Stream/StaticStreamTest.php +++ /dev/null @@ -1,70 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -namespace Test\Files\Stream; - -class StaticStreamTest extends \Test\TestCase { - - private $sourceFile; - private $sourceText; - - protected function setUp() { - parent::setUp(); - $this->sourceFile = \OC::$SERVERROOT . '/tests/data/lorem.txt'; - $this->sourceText = file_get_contents($this->sourceFile); - } - - protected function tearDown() { - \OC\Files\Stream\StaticStream::clear(); - parent::tearDown(); - } - - public function testContent() { - file_put_contents('static://foo', $this->sourceText); - $this->assertEquals($this->sourceText, file_get_contents('static://foo')); - } - - public function testMultipleFiles() { - file_put_contents('static://foo', $this->sourceText); - file_put_contents('static://bar', strrev($this->sourceText)); - $this->assertEquals($this->sourceText, file_get_contents('static://foo')); - $this->assertEquals(strrev($this->sourceText), file_get_contents('static://bar')); - } - - public function testOverwrite() { - file_put_contents('static://foo', $this->sourceText); - file_put_contents('static://foo', 'qwerty'); - $this->assertEquals('qwerty', file_get_contents('static://foo')); - } - - public function testIsFile() { - $this->assertFalse(is_file('static://foo')); - file_put_contents('static://foo', $this->sourceText); - $this->assertTrue(is_file('static://foo')); - } - - public function testIsDir() { - $this->assertFalse(is_dir('static://foo')); - file_put_contents('static://foo', $this->sourceText); - $this->assertFalse(is_dir('static://foo')); - } - - public function testFileType() { - file_put_contents('static://foo', $this->sourceText); - $this->assertEquals('file', filetype('static://foo')); - } - - public function testUnlink() { - $this->assertFalse(file_exists('static://foo')); - file_put_contents('static://foo', $this->sourceText); - $this->assertTrue(file_exists('static://foo')); - unlink('static://foo'); - clearstatcache(); - $this->assertFalse(file_exists('static://foo')); - } -} diff --git a/tests/lib/Files/Type/DetectionTest.php b/tests/lib/Files/Type/DetectionTest.php index 87e0f94e3e275debce87cc1b2e2faa77f620c8be..5c1f48a806e03e15dff6768cf3460664862a4245 100644 --- a/tests/lib/Files/Type/DetectionTest.php +++ b/tests/lib/Files/Type/DetectionTest.php @@ -74,9 +74,13 @@ class DetectionTest extends \Test\TestCase { $this->assertEquals('text/plain', $this->detection->detectPath('foo.txt')); $this->assertEquals('image/png', $this->detection->detectPath('foo.png')); $this->assertEquals('image/png', $this->detection->detectPath('foo.bar.png')); + $this->assertEquals('image/png', $this->detection->detectPath('.hidden.png')); + $this->assertEquals('image/png', $this->detection->detectPath('.hidden.foo.png')); $this->assertEquals('image/png', $this->detection->detectPath('.hidden/foo.png')); + $this->assertEquals('image/png', $this->detection->detectPath('.hidden/.hidden.png')); $this->assertEquals('image/png', $this->detection->detectPath('test.jpg/foo.png')); $this->assertEquals('application/octet-stream', $this->detection->detectPath('.png')); + $this->assertEquals('application/octet-stream', $this->detection->detectPath('..hidden')); $this->assertEquals('application/octet-stream', $this->detection->detectPath('foo')); $this->assertEquals('application/octet-stream', $this->detection->detectPath('')); } diff --git a/tests/lib/Files/Utils/ScannerTest.php b/tests/lib/Files/Utils/ScannerTest.php index 7895331d6158655aff895a3dd8e93987c8ac9c88..1379bc2e906c2af509b7c072fc13899760688233 100644 --- a/tests/lib/Files/Utils/ScannerTest.php +++ b/tests/lib/Files/Utils/ScannerTest.php @@ -11,6 +11,7 @@ namespace Test\Files\Utils; use OC\Files\Filesystem; use OC\Files\Mount\MountPoint; use OC\Files\Storage\Temporary; +use OCA\Files_Sharing\SharedStorage; use OCP\Files\Config\IMountProvider; use OCP\Files\Storage\IStorageFactory; use OCP\IUser; @@ -188,4 +189,24 @@ class ScannerTest extends \Test\TestCase { $this->assertNotEquals($oldRoot->getEtag(), $newRoot->getEtag()); } + + public function testSkipLocalShares() { + $sharedStorage = $this->createMock(SharedStorage::class); + $sharedMount = new MountPoint($sharedStorage, '/share'); + Filesystem::getMountManager()->addMount($sharedMount); + + $sharedStorage->expects($this->any()) + ->method('instanceOfStorage') + ->will($this->returnValueMap([ + [SharedStorage::class, true], + ])); + $sharedStorage->expects($this->never()) + ->method('getScanner'); + + $scanner = new TestScanner('', \OC::$server->getDatabaseConnection(), \OC::$server->getLogger()); + $scanner->addMount($sharedMount); + $scanner->scan(''); + + $scanner->backgroundScan(''); + } } diff --git a/tests/lib/Group/ManagerTest.php b/tests/lib/Group/ManagerTest.php index ece99eb569db5ce0be7697fefbc04fa777734d1b..1a7ced5f1baa72694dc503926cad9eb4433a0b7f 100644 --- a/tests/lib/Group/ManagerTest.php +++ b/tests/lib/Group/ManagerTest.php @@ -1,52 +1,91 @@ - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. + * @author Robin Appelman + * @author Vincent Petry + * + * @copyright Copyright (c) 2016, ownCloud GmbH. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see + * */ - namespace Test\Group; use OC\User\Manager; -use OC\User\User; +use OCP\IUser; +use OCP\GroupInterface; class ManagerTest extends \Test\TestCase { - /** @var Manager */ - private $userManager; + /** @var Manager|\PHPUnit_Framework_MockObject_MockObject $userManager */ + protected $userManager; - public function setUp() { + protected function setUp() { parent::setUp(); - $this->userManager = $this->getMockBuilder('\OC\User\Manager') - ->disableOriginalConstructor() - ->getMock(); + $this->userManager = $this->createMock(Manager::class); } - /** - * @param string $uid - * @param \OC\User\Backend $backend - * @return User - */ - private function newUser($uid, $backend) { - $config = $this->getMockBuilder('\OCP\IConfig') - ->disableOriginalConstructor() - ->getMock(); - $urlgenerator = $this->getMockBuilder('\OCP\IURLGenerator') - ->disableOriginalConstructor() - ->getMock(); + private function getTestUser($userId) { + $mockUser = $this->createMock(IUser::class); + $mockUser->expects($this->any()) + ->method('getUID') + ->will($this->returnValue($userId)); + $mockUser->expects($this->any()) + ->method('getDisplayName') + ->will($this->returnValue($userId)); + return $mockUser; + } - return new User($uid, $backend, null, $config, $urlgenerator); + private function getTestBackend($implementedActions = null) { + if (is_null($implementedActions)) { + $implementedActions = + GroupInterface::ADD_TO_GROUP | + GroupInterface::REMOVE_FROM_GOUP | + GroupInterface::COUNT_USERS | + GroupInterface::CREATE_GROUP | + GroupInterface::DELETE_GROUP; + } + // need to declare it this way due to optional methods + // thanks to the implementsActions logic + $backend = $this->getMockBuilder(\OCP\GroupInterface::class) + ->disableOriginalConstructor() + ->setMethods([ + 'getGroupDetails', + 'implementsActions', + 'getUserGroups', + 'inGroup', + 'getGroups', + 'groupExists', + 'usersInGroup', + 'createGroup', + 'addToGroup', + 'removeFromGroup', + ]) + ->getMock(); + $backend->expects($this->any()) + ->method('implementsActions') + ->will($this->returnCallback(function($actions) use ($implementedActions) { + return (bool)($actions & $implementedActions); + })); + return $backend; } - + public function testGet() { /** * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend */ - $backend = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend = $this->getTestBackend(); $backend->expects($this->any()) ->method('groupExists') ->with('group1') @@ -70,9 +109,7 @@ class ManagerTest extends \Test\TestCase { /** * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend */ - $backend = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend = $this->getTestBackend(); $backend->expects($this->once()) ->method('groupExists') ->with('group1') @@ -100,9 +137,7 @@ class ManagerTest extends \Test\TestCase { /** * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend1 */ - $backend1 = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend1 = $this->getTestBackend(); $backend1->expects($this->any()) ->method('groupExists') ->with('group1') @@ -111,9 +146,7 @@ class ManagerTest extends \Test\TestCase { /** * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend2 */ - $backend2 = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend2 = $this->getTestBackend(); $backend2->expects($this->any()) ->method('groupExists') ->with('group1') @@ -133,18 +166,13 @@ class ManagerTest extends \Test\TestCase { * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend */ $backendGroupCreated = false; - $backend = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend = $this->getTestBackend(); $backend->expects($this->any()) ->method('groupExists') ->with('group1') ->will($this->returnCallback(function () use (&$backendGroupCreated) { return $backendGroupCreated; })); - $backend->expects($this->once()) - ->method('implementsActions') - ->will($this->returnValue(true)); $backend->expects($this->once()) ->method('createGroup') ->will($this->returnCallback(function () use (&$backendGroupCreated) { @@ -162,9 +190,7 @@ class ManagerTest extends \Test\TestCase { /** * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend */ - $backend = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend = $this->getTestBackend(); $backend->expects($this->any()) ->method('groupExists') ->with('group1') @@ -183,9 +209,7 @@ class ManagerTest extends \Test\TestCase { /** * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend */ - $backend = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend = $this->getTestBackend(); $backend->expects($this->once()) ->method('getGroups') ->with('1') @@ -208,9 +232,7 @@ class ManagerTest extends \Test\TestCase { /** * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend1 */ - $backend1 = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend1 = $this->getTestBackend(); $backend1->expects($this->once()) ->method('getGroups') ->with('1') @@ -222,9 +244,7 @@ class ManagerTest extends \Test\TestCase { /** * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend2 */ - $backend2 = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend2 = $this->getTestBackend(); $backend2->expects($this->once()) ->method('getGroups') ->with('1') @@ -249,9 +269,7 @@ class ManagerTest extends \Test\TestCase { /** * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend1 */ - $backend1 = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend1 = $this->getTestBackend(); $backend1->expects($this->once()) ->method('getGroups') ->with('1', 2, 1) @@ -263,9 +281,7 @@ class ManagerTest extends \Test\TestCase { /** * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend2 */ - $backend2 = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend2 = $this->getTestBackend(); $backend2->expects($this->once()) ->method('getGroups') ->with('1', 2, 1) @@ -290,9 +306,7 @@ class ManagerTest extends \Test\TestCase { /** * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend */ - $backend = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend = $this->getTestBackend(); $backend->expects($this->once()) ->method('getUserGroups') ->with('user1') @@ -302,13 +316,10 @@ class ManagerTest extends \Test\TestCase { ->with('group1') ->will($this->returnValue(true)); - $userBackend = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); $manager = new \OC\Group\Manager($this->userManager); $manager->addBackend($backend); - $groups = $manager->getUserGroups($this->newUser('user1', $userBackend)); + $groups = $manager->getUserGroups($this->getTestUser('user1')); $this->assertEquals(1, count($groups)); $group1 = reset($groups); $this->assertEquals('group1', $group1->getGID()); @@ -344,9 +355,7 @@ class ManagerTest extends \Test\TestCase { /** * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend */ - $backend = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend = $this->getTestBackend(); $backend->expects($this->once()) ->method('getUserGroups') ->with('user1') @@ -365,9 +374,7 @@ class ManagerTest extends \Test\TestCase { /** * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend */ - $backend = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend = $this->getTestBackend(); $backend->expects($this->once()) ->method('getUserGroups') ->with('user1') @@ -386,9 +393,7 @@ class ManagerTest extends \Test\TestCase { /** * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend */ - $backend = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend = $this->getTestBackend(); $backend->expects($this->once()) ->method('getUserGroups') ->with('user1') @@ -407,9 +412,7 @@ class ManagerTest extends \Test\TestCase { /** * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend1 */ - $backend1 = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend1 = $this->getTestBackend(); $backend1->expects($this->once()) ->method('getUserGroups') ->with('user1') @@ -421,9 +424,7 @@ class ManagerTest extends \Test\TestCase { /** * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend2 */ - $backend2 = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend2 = $this->getTestBackend(); $backend2->expects($this->once()) ->method('getUserGroups') ->with('user1') @@ -432,14 +433,11 @@ class ManagerTest extends \Test\TestCase { ->method('groupExists') ->will($this->returnValue(true)); - $userBackend = $this->getMockBuilder('\OC\User\Backend') - ->disableOriginalConstructor() - ->getMock(); $manager = new \OC\Group\Manager($this->userManager); $manager->addBackend($backend1); $manager->addBackend($backend2); - $groups = $manager->getUserGroups($this->newUser('user1', $userBackend)); + $groups = $manager->getUserGroups($this->getTestUser('user1')); $this->assertEquals(2, count($groups)); $group1 = reset($groups); $group2 = next($groups); @@ -447,30 +445,28 @@ class ManagerTest extends \Test\TestCase { $this->assertEquals('group2', $group2->getGID()); } - public function testDisplayNamesInGroupWithOneUserBackend() { + public function testDisplayNamesInGroupWithOneUserBackend() { /** - * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend1 + * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend */ - $backend = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend = $this->getTestBackend(); $backend->expects($this->exactly(1)) ->method('groupExists') ->with('testgroup') ->will($this->returnValue(true)); - $backend->expects($this->any()) - ->method('InGroup') + $backend->expects($this->any()) + ->method('inGroup') ->will($this->returnCallback(function($uid, $gid) { - switch($uid) { - case 'user1' : return false; - case 'user2' : return true; - case 'user3' : return false; - case 'user33': return true; - default: - return null; - } - })); + switch($uid) { + case 'user1' : return false; + case 'user2' : return true; + case 'user3' : return false; + case 'user33': return true; + default: + return null; + } + })); $userBackend = $this->getMockBuilder('\OC\User\Backend') ->disableOriginalConstructor() @@ -480,21 +476,21 @@ class ManagerTest extends \Test\TestCase { ->method('searchDisplayName') ->with('user3') ->will($this->returnCallback(function($search, $limit, $offset) use ($userBackend) { - switch($offset) { - case 0 : return array('user3' => $this->newUser('user3', $userBackend), - 'user33' => $this->newUser('user33', $userBackend)); - case 2 : return array(); - } - })); - + switch($offset) { + case 0 : return ['user3' => $this->getTestUser('user3'), + 'user33' => $this->getTestUser('user33')]; + case 2 : return []; + } + return null; + })); $this->userManager->expects($this->any()) ->method('get') ->will($this->returnCallback(function($uid) use ($userBackend) { switch($uid) { - case 'user1' : return $this->newUser('user1', $userBackend); - case 'user2' : return $this->newUser('user2', $userBackend); - case 'user3' : return $this->newUser('user3', $userBackend); - case 'user33': return $this->newUser('user33', $userBackend); + case 'user1' : return $this->getTestUser('user1'); + case 'user2' : return $this->getTestUser('user2'); + case 'user3' : return $this->getTestUser('user3'); + case 'user33': return $this->getTestUser('user33'); default: return null; } @@ -511,31 +507,29 @@ class ManagerTest extends \Test\TestCase { $this->assertTrue(isset($users['user33'])); } - public function testDisplayNamesInGroupWithOneUserBackendWithLimitSpecified() { + public function testDisplayNamesInGroupWithOneUserBackendWithLimitSpecified() { /** - * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend1 + * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend */ - $backend = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend = $this->getTestBackend(); $backend->expects($this->exactly(1)) ->method('groupExists') ->with('testgroup') ->will($this->returnValue(true)); - $backend->expects($this->any()) - ->method('InGroup') + $backend->expects($this->any()) + ->method('inGroup') ->will($this->returnCallback(function($uid, $gid) { - switch($uid) { - case 'user1' : return false; - case 'user2' : return true; - case 'user3' : return false; - case 'user33': return true; - case 'user333': return true; - default: - return null; - } - })); + switch($uid) { + case 'user1' : return false; + case 'user2' : return true; + case 'user3' : return false; + case 'user33': return true; + case 'user333': return true; + default: + return null; + } + })); $userBackend = $this->getMockBuilder('\OC\User\Backend') ->disableOriginalConstructor() @@ -545,22 +539,22 @@ class ManagerTest extends \Test\TestCase { ->method('searchDisplayName') ->with('user3') ->will($this->returnCallback(function($search, $limit, $offset) use ($userBackend) { - switch($offset) { - case 0 : return array('user3' => $this->newUser('user3', $userBackend), - 'user33' => $this->newUser('user33', $userBackend)); - case 2 : return array('user333' => $this->newUser('user333', $userBackend)); - } - })); - + switch($offset) { + case 0 : return ['user3' => $this->getTestUser('user3'), + 'user33' => $this->getTestUser('user33')]; + case 2 : return ['user333' => $this->getTestUser('user333')]; + } + return null; + })); $this->userManager->expects($this->any()) ->method('get') ->will($this->returnCallback(function($uid) use ($userBackend) { switch($uid) { - case 'user1' : return $this->newUser('user1', $userBackend); - case 'user2' : return $this->newUser('user2', $userBackend); - case 'user3' : return $this->newUser('user3', $userBackend); - case 'user33': return $this->newUser('user33', $userBackend); - case 'user333': return $this->newUser('user333', $userBackend); + case 'user1' : return $this->getTestUser('user1'); + case 'user2' : return $this->getTestUser('user2'); + case 'user3' : return $this->getTestUser('user3'); + case 'user33': return $this->getTestUser('user33'); + case 'user333': return $this->getTestUser('user333'); default: return null; } @@ -580,29 +574,27 @@ class ManagerTest extends \Test\TestCase { public function testDisplayNamesInGroupWithOneUserBackendWithLimitAndOffsetSpecified() { /** - * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend1 + * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend */ - $backend = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend = $this->getTestBackend(); $backend->expects($this->exactly(1)) ->method('groupExists') ->with('testgroup') ->will($this->returnValue(true)); - $backend->expects($this->any()) + $backend->expects($this->any()) ->method('inGroup') ->will($this->returnCallback(function($uid) { - switch($uid) { - case 'user1' : return false; - case 'user2' : return true; - case 'user3' : return false; - case 'user33': return true; - case 'user333': return true; - default: - return null; - } - })); + switch($uid) { + case 'user1' : return false; + case 'user2' : return true; + case 'user3' : return false; + case 'user33': return true; + case 'user333': return true; + default: + return null; + } + })); $userBackend = $this->getMockBuilder('\OC\User\Backend') ->disableOriginalConstructor() @@ -612,25 +604,25 @@ class ManagerTest extends \Test\TestCase { ->method('searchDisplayName') ->with('user3') ->will($this->returnCallback(function($search, $limit, $offset) use ($userBackend) { - switch($offset) { - case 0 : - return array( - 'user3' => $this->newUser('user3', $userBackend), - 'user33' => $this->newUser('user33', $userBackend), - 'user333' => $this->newUser('user333', $userBackend) - ); - } - })); - + switch($offset) { + case 0 : + return [ + 'user3' => $this->getTestUser('user3'), + 'user33' => $this->getTestUser('user33'), + 'user333' => $this->getTestUser('user333') + ]; + } + return null; + })); $this->userManager->expects($this->any()) ->method('get') ->will($this->returnCallback(function($uid) use ($userBackend) { switch($uid) { - case 'user1' : return $this->newUser('user1', $userBackend); - case 'user2' : return $this->newUser('user2', $userBackend); - case 'user3' : return $this->newUser('user3', $userBackend); - case 'user33': return $this->newUser('user33', $userBackend); - case 'user333': return $this->newUser('user333', $userBackend); + case 'user1' : return $this->getTestUser('user1'); + case 'user2' : return $this->getTestUser('user2'); + case 'user3' : return $this->getTestUser('user3'); + case 'user33': return $this->getTestUser('user33'); + case 'user333': return $this->getTestUser('user333'); default: return null; } @@ -650,17 +642,15 @@ class ManagerTest extends \Test\TestCase { public function testDisplayNamesInGroupWithOneUserBackendAndSearchEmpty() { /** - * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend1 + * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend */ - $backend = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend = $this->getTestBackend(); $backend->expects($this->exactly(1)) ->method('groupExists') ->with('testgroup') ->will($this->returnValue(true)); - $backend->expects($this->once()) + $backend->expects($this->once()) ->method('usersInGroup') ->with('testgroup', '', -1, 0) ->will($this->returnValue(array('user2', 'user33'))); @@ -673,10 +663,10 @@ class ManagerTest extends \Test\TestCase { ->method('get') ->will($this->returnCallback(function($uid) use ($userBackend) { switch($uid) { - case 'user1' : return $this->newUser('user1', $userBackend); - case 'user2' : return $this->newUser('user2', $userBackend); - case 'user3' : return $this->newUser('user3', $userBackend); - case 'user33': return $this->newUser('user33', $userBackend); + case 'user1' : return $this->getTestUser('user1'); + case 'user2' : return $this->getTestUser('user2'); + case 'user3' : return $this->getTestUser('user3'); + case 'user33': return $this->getTestUser('user33'); default: return null; } @@ -695,11 +685,9 @@ class ManagerTest extends \Test\TestCase { public function testDisplayNamesInGroupWithOneUserBackendAndSearchEmptyAndLimitSpecified() { /** - * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend1 + * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend */ - $backend = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend = $this->getTestBackend(); $backend->expects($this->exactly(1)) ->method('groupExists') ->with('testgroup') @@ -718,10 +706,10 @@ class ManagerTest extends \Test\TestCase { ->method('get') ->will($this->returnCallback(function($uid) use ($userBackend) { switch($uid) { - case 'user1' : return $this->newUser('user1', $userBackend); - case 'user2' : return $this->newUser('user2', $userBackend); - case 'user3' : return $this->newUser('user3', $userBackend); - case 'user33': return $this->newUser('user33', $userBackend); + case 'user1' : return $this->getTestUser('user1'); + case 'user2' : return $this->getTestUser('user2'); + case 'user3' : return $this->getTestUser('user3'); + case 'user33': return $this->getTestUser('user33'); default: return null; } @@ -738,13 +726,11 @@ class ManagerTest extends \Test\TestCase { $this->assertFalse(isset($users['user33'])); } - public function testDisplayNamesInGroupWithOneUserBackendAndSearchEmptyAndLimitAndOffsetSpecified() { + public function testDisplayNamesInGroupWithOneUserBackendAndSearchEmptyAndLimitAndOffsetSpecified() { /** - * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend1 + * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend */ - $backend = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend = $this->getTestBackend(); $backend->expects($this->exactly(1)) ->method('groupExists') ->with('testgroup') @@ -763,10 +749,10 @@ class ManagerTest extends \Test\TestCase { ->method('get') ->will($this->returnCallback(function($uid) use ($userBackend) { switch($uid) { - case 'user1' : return $this->newUser('user1', $userBackend); - case 'user2' : return $this->newUser('user2', $userBackend); - case 'user3' : return $this->newUser('user3', $userBackend); - case 'user33': return $this->newUser('user33', $userBackend); + case 'user1' : return $this->getTestUser('user1'); + case 'user2' : return $this->getTestUser('user2'); + case 'user3' : return $this->getTestUser('user3'); + case 'user33': return $this->getTestUser('user33'); default: return null; } @@ -787,10 +773,8 @@ class ManagerTest extends \Test\TestCase { /** * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend */ - $backend = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); - $expectedGroups = array(); + $backend = $this->getTestBackend(); + $expectedGroups = []; $backend->expects($this->any()) ->method('getUserGroups') ->with('user1') @@ -801,22 +785,19 @@ class ManagerTest extends \Test\TestCase { ->method('groupExists') ->with('group1') ->will($this->returnValue(true)); - $backend->expects($this->once()) - ->method('implementsActions') - ->will($this->returnValue(true)); $manager = new \OC\Group\Manager($this->userManager); $manager->addBackend($backend); // prime cache - $user1 = $this->newUser('user1', null); + $user1 = $this->getTestUser('user1'); $groups = $manager->getUserGroups($user1); $this->assertEquals(array(), $groups); // add user $group = $manager->get('group1'); $group->addUser($user1); - $expectedGroups = array('group1'); + $expectedGroups = ['group1']; // check result $groups = $manager->getUserGroups($user1); @@ -829,10 +810,8 @@ class ManagerTest extends \Test\TestCase { /** * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend */ - $backend = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); - $expectedGroups = array('group1'); + $backend = $this->getTestBackend(); + $expectedGroups = ['group1']; $backend->expects($this->any()) ->method('getUserGroups') ->with('user1') @@ -843,9 +822,6 @@ class ManagerTest extends \Test\TestCase { ->method('groupExists') ->with('group1') ->will($this->returnValue(true)); - $backend->expects($this->once()) - ->method('implementsActions') - ->will($this->returnValue(true)); $backend->expects($this->once()) ->method('inGroup') ->will($this->returnValue(true)); @@ -857,7 +833,7 @@ class ManagerTest extends \Test\TestCase { $manager->addBackend($backend); // prime cache - $user1 = $this->newUser('user1', null); + $user1 = $this->getTestUser('user1'); $groups = $manager->getUserGroups($user1); $this->assertEquals(1, count($groups)); $group1 = reset($groups); @@ -877,9 +853,7 @@ class ManagerTest extends \Test\TestCase { /** * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend */ - $backend = $this->getMockBuilder('\OC\Group\Database') - ->disableOriginalConstructor() - ->getMock(); + $backend = $this->getTestBackend(); $backend->expects($this->any()) ->method('getUserGroups') ->with('user1') @@ -892,4 +866,39 @@ class ManagerTest extends \Test\TestCase { $this->assertEquals([], $groups); } + public function testGroupDisplayName() { + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \OC\Group\Backend $backend + */ + $backend = $this->getTestBackend( + GroupInterface::ADD_TO_GROUP | + GroupInterface::REMOVE_FROM_GOUP | + GroupInterface::COUNT_USERS | + GroupInterface::CREATE_GROUP | + GroupInterface::DELETE_GROUP | + GroupInterface::GROUP_DETAILS + ); + $backend->expects($this->any()) + ->method('getGroupDetails') + ->will($this->returnValueMap([ + ['group1', ['gid' => 'group1', 'displayName' => 'Group One']], + ['group2', ['gid' => 'group2']], + ])); + + $manager = new \OC\Group\Manager($this->userManager); + $manager->addBackend($backend); + + // group with display name + $group = $manager->get('group1'); + $this->assertNotNull($group); + $this->assertEquals('group1', $group->getGID()); + $this->assertEquals('Group One', $group->getDisplayName()); + + // group without display name + $group = $manager->get('group2'); + $this->assertNotNull($group); + $this->assertEquals('group2', $group->getGID()); + $this->assertEquals('group2', $group->getDisplayName()); + } + } diff --git a/tests/lib/Http/Client/ClientTest.php b/tests/lib/Http/Client/ClientTest.php index 4369eab3a54a43dd2332ebf9573b2f707d04ca72..1b0a51b73959cab13d1fd106ba00196bcb49ec40 100644 --- a/tests/lib/Http/Client/ClientTest.php +++ b/tests/lib/Http/Client/ClientTest.php @@ -10,6 +10,7 @@ namespace Test\Http\Client; use GuzzleHttp\Message\Response; use OC\Http\Client\Client; +use OC\Security\CertificateManager; use OCP\ICertificateManager; use OCP\IConfig; @@ -17,11 +18,13 @@ use OCP\IConfig; * Class ClientTest */ class ClientTest extends \Test\TestCase { - /** @var \GuzzleHttp\Client */ + /** @var \GuzzleHttp\Client|\PHPUnit_Framework_MockObject_MockObject */ private $guzzleClient; + /** @var CertificateManager|\PHPUnit_Framework_MockObject_MockObject */ + private $certificateManager; /** @var Client */ private $client; - /** @var IConfig */ + /** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */ private $config; public function setUp() { @@ -30,10 +33,10 @@ class ClientTest extends \Test\TestCase { $this->guzzleClient = $this->getMockBuilder('\GuzzleHttp\Client') ->disableOriginalConstructor() ->getMock(); - $certificateManager = $this->createMock(ICertificateManager::class); + $this->certificateManager = $this->createMock(ICertificateManager::class); $this->client = new Client( $this->config, - $certificateManager, + $this->certificateManager, $this->guzzleClient ); } @@ -109,4 +112,64 @@ class ClientTest extends \Test\TestCase { ->willReturn(new Response(1337)); $this->assertEquals(1337, $this->client->options('http://localhost/', [])->getStatusCode()); } + + public function testHead() { + $this->guzzleClient->method('head') + ->willReturn(new Response(1337)); + $this->assertEquals(1337, $this->client->head('http://localhost/', [])->getStatusCode()); + } + + public function testSetDefaultOptionsWithNotInstalled() { + $this->config + ->expects($this->at(0)) + ->method('getSystemValue') + ->with('installed', false) + ->willReturn(false); + $this->certificateManager + ->expects($this->once()) + ->method('listCertificates') + ->willReturn([]); + $this->guzzleClient + ->expects($this->at(0)) + ->method('setDefaultOption') + ->with('verify', \OC::$SERVERROOT . '/resources/config/ca-bundle.crt'); + $this->guzzleClient + ->expects($this->at(1)) + ->method('setDefaultOption') + ->with('headers/User-Agent', 'Nextcloud Server Crawler'); + + self::invokePrivate($this->client, 'setDefaultOptions'); + } + + public function testSetDefaultOptionsWithProxy() { + $this->config + ->expects($this->at(0)) + ->method('getSystemValue') + ->with('proxy', null) + ->willReturn('foo'); + $this->config + ->expects($this->at(1)) + ->method('getSystemValue') + ->with('proxyuserpwd', null) + ->willReturn(null); + $this->certificateManager + ->expects($this->once()) + ->method('getAbsoluteBundlePath') + ->with(null) + ->willReturn('/my/path.crt'); + $this->guzzleClient + ->expects($this->at(0)) + ->method('setDefaultOption') + ->with('verify', '/my/path.crt'); + $this->guzzleClient + ->expects($this->at(1)) + ->method('setDefaultOption') + ->with('headers/User-Agent', 'Nextcloud Server Crawler'); + $this->guzzleClient + ->expects($this->at(2)) + ->method('setDefaultOption') + ->with('proxy', 'foo'); + + self::invokePrivate($this->client, 'setDefaultOptions'); + } } diff --git a/tests/lib/Http/Client/ResponseTest.php b/tests/lib/Http/Client/ResponseTest.php index 685f34a0bafd3d738ca4a29f897f4cf059546e22..2e5a47b7f4a1b9a284e042a3f8b21ef39cebb3f6 100644 --- a/tests/lib/Http/Client/ResponseTest.php +++ b/tests/lib/Http/Client/ResponseTest.php @@ -8,7 +8,7 @@ namespace Test\Http\Client; -use Guzzle\Stream\Stream; +use GuzzleHttp\Stream\Stream; use GuzzleHttp\Message\Response as GuzzleResponse; use OC\Http\Client\Response; @@ -27,12 +27,33 @@ class ResponseTest extends \Test\TestCase { $this->response = new Response($this->guzzleResponse); } + public function testGetBody() { + $this->guzzleResponse->setBody(Stream::factory('MyResponse')); + $this->assertSame('MyResponse', $this->response->getBody()); + } + public function testGetStatusCode() { - $this->assertEquals(1337, $this->response->getStatusCode()); + $this->assertSame(1337, $this->response->getStatusCode()); } public function testGetHeader() { $this->guzzleResponse->setHeader('bar', 'foo'); - $this->assertEquals('foo', $this->response->getHeader('bar')); + $this->assertSame('foo', $this->response->getHeader('bar')); + } + + public function testGetHeaders() { + $this->guzzleResponse->setHeader('bar', 'foo'); + $this->guzzleResponse->setHeader('x-awesome', 'yes'); + + $expected = [ + 'bar' => [ + 0 => 'foo', + ], + 'x-awesome' => [ + 0 => 'yes', + ], + ]; + $this->assertSame($expected, $this->response->getHeaders()); + $this->assertSame('yes', $this->response->getHeader('x-awesome')); } } diff --git a/tests/lib/IntegrityCheck/CheckerTest.php b/tests/lib/IntegrityCheck/CheckerTest.php index 0e6bd52a5df2bec0a0a2b67011c53c35ab1efe1c..049017cb5e88eb9e197efd32bbd7e4a9c295e1e7 100644 --- a/tests/lib/IntegrityCheck/CheckerTest.php +++ b/tests/lib/IntegrityCheck/CheckerTest.php @@ -34,19 +34,19 @@ use OCP\ICacheFactory; use OCP\App\IAppManager; class CheckerTest extends TestCase { - /** @var EnvironmentHelper */ + /** @var EnvironmentHelper|\PHPUnit_Framework_MockObject_MockObject */ private $environmentHelper; - /** @var AppLocator */ + /** @var AppLocator|\PHPUnit_Framework_MockObject_MockObject */ private $appLocator; /** @var Checker */ private $checker; - /** @var FileAccessHelper */ + /** @var FileAccessHelper|\PHPUnit_Framework_MockObject_MockObject */ private $fileAccessHelper; - /** @var IConfig */ + /** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */ private $config; - /** @var ICacheFactory */ + /** @var ICacheFactory|\PHPUnit_Framework_MockObject_MockObject */ private $cacheFactory; - /** @var IAppManager */ + /** @var IAppManager|\PHPUnit_Framework_MockObject_MockObject */ private $appManager; public function setUp() { @@ -77,9 +77,20 @@ class CheckerTest extends TestCase { /** * @expectedException \Exception - * @expectedExceptionMessage Directory does not exist. + * @expectedExceptionMessage Exception message */ public function testWriteAppSignatureOfNotExistingApp() { + $this->fileAccessHelper + ->expects($this->at(0)) + ->method('assertDirectoryExists') + ->with('NotExistingApp/appinfo') + ->willThrowException(new \Exception('Exception message')); + $this->fileAccessHelper + ->expects($this->at(1)) + ->method('is_writable') + ->with('NotExistingApp/appinfo') + ->willReturn(true); + $keyBundle = file_get_contents(__DIR__ .'/../../data/integritycheck/SomeApp.crt'); $rsaPrivateKey = file_get_contents(__DIR__ .'/../../data/integritycheck/SomeApp.key'); $rsa = new RSA(); @@ -89,6 +100,25 @@ class CheckerTest extends TestCase { $this->checker->writeAppSignature('NotExistingApp', $x509, $rsa); } + /** + * @expectedException \Exception + * @expectedExceptionMessageRegExp /[a-zA-Z\/_-]+ is not writable/ + */ + public function testWriteAppSignatureWrongPermissions() { + $this->fileAccessHelper + ->expects($this->once()) + ->method('file_put_contents') + ->will($this->throwException(new \Exception('Exception message'))); + + $keyBundle = file_get_contents(__DIR__ .'/../../data/integritycheck/SomeApp.crt'); + $rsaPrivateKey = file_get_contents(__DIR__ .'/../../data/integritycheck/SomeApp.key'); + $rsa = new RSA(); + $rsa->loadKey($rsaPrivateKey); + $x509 = new X509(); + $x509->loadX509($keyBundle); + $this->checker->writeAppSignature(\OC::$SERVERROOT . '/tests/data/integritycheck/app/', $x509, $rsa); + } + public function testWriteAppSignature() { $expectedSignatureFileData = '{ "hashes": { @@ -443,6 +473,54 @@ class CheckerTest extends TestCase { $this->assertSame([], $this->checker->verifyAppSignature('SomeApp')); } + /** + * @expectedException \Exception + * @expectedExceptionMessage Exception message + */ + public function testWriteCoreSignatureWithException() { + $this->fileAccessHelper + ->expects($this->at(0)) + ->method('assertDirectoryExists') + ->will($this->throwException(new \Exception('Exception message'))); + $this->fileAccessHelper + ->expects($this->at(1)) + ->method('is_writable') + ->with(__DIR__ . '/core') + ->willReturn(true); + + $keyBundle = file_get_contents(__DIR__ .'/../../data/integritycheck/SomeApp.crt'); + $rsaPrivateKey = file_get_contents(__DIR__ .'/../../data/integritycheck/SomeApp.key'); + $rsa = new RSA(); + $rsa->loadKey($rsaPrivateKey); + $x509 = new X509(); + $x509->loadX509($keyBundle); + $this->checker->writeCoreSignature($x509, $rsa, __DIR__); + } + + /** + * @expectedException \Exception + * @expectedExceptionMessageRegExp /[a-zA-Z\/_-]+ is not writable/ + */ + public function testWriteCoreSignatureWrongPermissions() { + $this->fileAccessHelper + ->expects($this->at(0)) + ->method('assertDirectoryExists') + ->will($this->throwException(new \Exception('Exception message'))); + $this->fileAccessHelper + ->expects($this->at(1)) + ->method('is_writable') + ->with(__DIR__ . '/core') + ->willReturn(false); + + $keyBundle = file_get_contents(__DIR__ .'/../../data/integritycheck/SomeApp.crt'); + $rsaPrivateKey = file_get_contents(__DIR__ .'/../../data/integritycheck/SomeApp.key'); + $rsa = new RSA(); + $rsa->loadKey($rsaPrivateKey); + $x509 = new X509(); + $x509->loadX509($keyBundle); + $this->checker->writeCoreSignature($x509, $rsa, __DIR__); + } + public function testWriteCoreSignature() { $expectedSignatureFileData = '{ "hashes": { @@ -948,7 +1026,7 @@ class CheckerTest extends TestCase { ->method('verifyCoreSignature'); $this->appLocator ->expects($this->at(0)) - ->Method('getAllApps') + ->method('getAllApps') ->will($this->returnValue([ 'files', 'calendar', @@ -1074,7 +1152,6 @@ class CheckerTest extends TestCase { ->with('integrity.check.disabled', false) ->will($this->returnValue(true)); - $result = $this->invokePrivate($this->checker, 'isCodeCheckEnforced'); - $this->assertSame(false, $result); + $this->assertFalse(self::invokePrivate($this->checker, 'isCodeCheckEnforced')); } } diff --git a/tests/lib/IntegrityCheck/Helpers/FileAccessHelperTest.php b/tests/lib/IntegrityCheck/Helpers/FileAccessHelperTest.php index 740b14e61c4632182904c47fe6b412bd453417c1..de4aeec78ccdc2d82580c5bec97875cd17571d67 100644 --- a/tests/lib/IntegrityCheck/Helpers/FileAccessHelperTest.php +++ b/tests/lib/IntegrityCheck/Helpers/FileAccessHelperTest.php @@ -40,4 +40,29 @@ class FileAccessHelperTest extends TestCase { $this->fileAccessHelper->file_put_contents($filePath, $data); $this->assertSame($data, $this->fileAccessHelper->file_get_contents($filePath)); } + + /** + * @expectedException \Exception + * @expectedExceptionMessage Failed to write into /anabsolutelynotexistingfolder/on/the/system.txt + */ + public function testFile_put_contentsWithException() { + $this->fileAccessHelper->file_put_contents('/anabsolutelynotexistingfolder/on/the/system.txt', 'MyFiles'); + } + + public function testIs_writable() { + $this->assertFalse($this->fileAccessHelper->is_writable('/anabsolutelynotexistingfolder/on/the/system.txt')); + $this->assertTrue($this->fileAccessHelper->is_writable(\OC::$server->getTempManager()->getTemporaryFile('MyFile'))); + } + + /** + * @expectedException \Exception + * @expectedExceptionMessage Directory /anabsolutelynotexistingfolder/on/the/system does not exist. + */ + public function testAssertDirectoryExistsWithException() { + $this->fileAccessHelper->assertDirectoryExists('/anabsolutelynotexistingfolder/on/the/system'); + } + + public function testAssertDirectoryExists() { + $this->fileAccessHelper->assertDirectoryExists(\OC::$server->getTempManager()->getTemporaryFolder('/testfolder/')); + } } diff --git a/tests/lib/LoggerTest.php b/tests/lib/LoggerTest.php index abb9deebd556962ab8487a32e2882ff1726ed60e..da9cedc9f56d808562db67b1fbf844e711b8e00d 100644 --- a/tests/lib/LoggerTest.php +++ b/tests/lib/LoggerTest.php @@ -138,4 +138,22 @@ class LoggerTest extends TestCase { } } + public function dataGetLogClass() { + return [ + ['file', \OC\Log\File::class], + ['errorlog', \OC\Log\Errorlog::class], + ['syslog', \OC\Log\Syslog::class], + + ['owncloud', \OC\Log\File::class], + ['nextcloud', \OC\Log\File::class], + ['foobar', \OC\Log\File::class], + ]; + } + + /** + * @dataProvider dataGetLogClass + */ + public function testGetLogClass($type, $class) { + $this->assertEquals($class, Log::getLogClass($type)); + } } diff --git a/tests/lib/Mail/MailerTest.php b/tests/lib/Mail/MailerTest.php index c63ceb5982ae608ef6f25ad79a5d5d7a1dc7da61..7a7ce0392e9cb2ba2fff4c7ce84d55ac64bff598 100644 --- a/tests/lib/Mail/MailerTest.php +++ b/tests/lib/Mail/MailerTest.php @@ -44,7 +44,7 @@ class MailerTest extends TestCase { $this->config ->expects($this->once()) ->method('getSystemValue') - ->with('mail_smtpmode', 'sendmail') + ->with('mail_smtpmode', 'php') ->will($this->returnValue('sendmail')); $this->assertEquals(\Swift_SendmailTransport::newInstance('/usr/sbin/sendmail -bs'), self::invokePrivate($this->mailer, 'getSendMailInstance')); @@ -54,7 +54,7 @@ class MailerTest extends TestCase { $this->config ->expects($this->once()) ->method('getSystemValue') - ->with('mail_smtpmode', 'sendmail') + ->with('mail_smtpmode', 'php') ->will($this->returnValue('qmail')); $this->assertEquals(\Swift_SendmailTransport::newInstance('/var/qmail/bin/sendmail -bs'), self::invokePrivate($this->mailer, 'getSendMailInstance')); diff --git a/tests/lib/Memcache/APCTest.php b/tests/lib/Memcache/APCTest.php deleted file mode 100644 index 4bd7e62b94a2effe9b4259bef4b27d977ca67cf7..0000000000000000000000000000000000000000 --- a/tests/lib/Memcache/APCTest.php +++ /dev/null @@ -1,26 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -namespace Test\Memcache; - -class APCTest extends Cache { - protected function setUp() { - parent::setUp(); - - if(!\OC\Memcache\APC::isAvailable()) { - $this->markTestSkipped('The apc extension is not available.'); - return; - } - if(\OC\Memcache\APCu::isAvailable()) { - $this->markTestSkipped('The apc extension is emulated by ACPu.'); - return; - } - $this->instance=new \OC\Memcache\APC($this->getUniqueID()); - } -} diff --git a/tests/lib/Memcache/APCuTest.php b/tests/lib/Memcache/APCuTest.php index 73fd5a12880c95f8291c67350a8867701933e465..41de75a8ea8f55abcb16c9272515cc7659c53795 100644 --- a/tests/lib/Memcache/APCuTest.php +++ b/tests/lib/Memcache/APCuTest.php @@ -19,4 +19,16 @@ class APCuTest extends Cache { } $this->instance=new \OC\Memcache\APCu($this->getUniqueID()); } + + public function testCasIntChanged() { + $this->instance->set('foo', 1); + $this->assertTrue($this->instance->cas('foo', 1, 2)); + $this->assertEquals(2, $this->instance->get('foo')); + } + + public function testCasIntNotChanged() { + $this->instance->set('foo', 1); + $this->assertFalse($this->instance->cas('foo', 2, 3)); + $this->assertEquals(1, $this->instance->get('foo')); + } } diff --git a/tests/lib/NavigationManagerTest.php b/tests/lib/NavigationManagerTest.php index 96708786e3941f75914d3babb502da90351a925f..64fec802eca7e744b15380c056d5bed55a6a1411 100644 --- a/tests/lib/NavigationManagerTest.php +++ b/tests/lib/NavigationManagerTest.php @@ -12,7 +12,15 @@ namespace Test; +use OC\App\AppManager; use OC\NavigationManager; +use OCP\App\IAppManager; +use OCP\IGroupManager; +use OCP\IL10N; +use OCP\IURLGenerator; +use OCP\IUser; +use OCP\IUserSession; +use OCP\L10N\IFactory; class NavigationManagerTest extends TestCase { /** @var \OC\NavigationManager */ @@ -157,4 +165,62 @@ class NavigationManagerTest extends TestCase { $this->assertEmpty($this->navigationManager->getAll(), 'Expected no navigation entry exists after clear()'); $this->assertEquals(0, $testAddClosureNumberOfCalls, 'Expected that the closure is not called by getAll()'); } + + /** + * @dataProvider providesNavigationConfig + */ + public function testWithAppManager($expected, $config, $isAdmin = false) { + + $appManager = $this->createMock(AppManager::class); + $urlGenerator = $this->createMock(IURLGenerator::class); + $l10nFac = $this->createMock(IFactory::class); + $userSession = $this->createMock(IUserSession::class); + $groupManager = $this->createMock(IGroupManager::class); + $l = $this->createMock(IL10N::class); + $l->expects($this->any())->method('t')->willReturnCallback(function($text, $parameters = []) { + return vsprintf($text, $parameters); + }); + + $appManager->expects($this->once())->method('getInstalledApps')->willReturn(['test']); + $appManager->expects($this->once())->method('getAppInfo')->with('test')->willReturn($config); + $l10nFac->expects($this->exactly(count($expected)))->method('get')->with('test')->willReturn($l); + $urlGenerator->expects($this->any())->method('imagePath')->willReturnCallback(function($appName, $file) { + return "/apps/$appName/img/$file"; + }); + $urlGenerator->expects($this->exactly(count($expected)))->method('linkToRoute')->willReturnCallback(function($route) { + return "/apps/test/"; + }); + $user = $this->createMock(IUser::class); + $user->expects($this->any())->method('getUID')->willReturn('user001'); + $userSession->expects($this->any())->method('getUser')->willReturn($user); + $groupManager->expects($this->any())->method('isAdmin')->willReturn($isAdmin); + + $navigationManager = new NavigationManager($appManager, $urlGenerator, $l10nFac, $userSession, $groupManager); + + $entries = $navigationManager->getAll(); + $this->assertEquals($expected, $entries); + } + + public function providesNavigationConfig() { + return [ + 'minimalistic' => [[[ + 'id' => 'test', + 'order' => 100, + 'href' => '/apps/test/', + 'icon' => '/apps/test/img/app.svg', + 'name' => 'Test', + 'active' => false + ]], ['navigation' => ['route' => 'test.page.index', 'name' => 'Test']]], + 'no admin' => [[[ + 'id' => 'test', + 'order' => 100, + 'href' => '/apps/test/', + 'icon' => '/apps/test/img/app.svg', + 'name' => 'Test', + 'active' => false + ]], ['navigation' => ['@attributes' => ['role' => 'admin'], 'route' => 'test.page.index', 'name' => 'Test']], true], + 'no name' => [[], ['navigation' => ['@attributes' => ['role' => 'admin'], 'route' => 'test.page.index']], true], + 'admin' => [[], ['navigation' => ['@attributes' => ['role' => 'admin'], 'route' => 'test.page.index', 'name' => 'Test']]] + ]; + } } diff --git a/tests/lib/PreviewTest.php b/tests/lib/PreviewTest.php deleted file mode 100644 index 2d6f53e2ce8ca966827dfdec5926b3ac1c139be5..0000000000000000000000000000000000000000 --- a/tests/lib/PreviewTest.php +++ /dev/null @@ -1,963 +0,0 @@ - - * @author Olivier Paroz - * - * @copyright Copyright (c) 2015, ownCloud, Inc. - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see - * - */ - -namespace Test; - -use OC\Files\FileInfo; -use OC\Files\Filesystem; -use OC\Files\Storage\Temporary; -use OC\Files\View; -use OC\Preview; -use Test\Traits\MountProviderTrait; -use Test\Traits\UserTrait; - -/** - * Class PreviewTest - * - * @group DB - * - * @package Test - */ -class PreviewTest extends TestCase { - use UserTrait; - use MountProviderTrait; - - const TEST_PREVIEW_USER1 = "test-preview-user1"; - - /** @var View */ - private $rootView; - /** - * Note that using 756 with an image with a ratio of 1.6 brings interesting rounding issues - * - * @var int maximum width allowed for a preview - * */ - private $configMaxWidth = 756; - /** @var int maximum height allowed for a preview */ - private $configMaxHeight = 756; - private $keepAspect; - private $scalingUp; - - private $samples = []; - private $sampleFileId; - private $sampleFilename; - private $sampleWidth; - private $sampleHeight; - private $maxScaleFactor; - /** @var int width of the max preview */ - private $maxPreviewWidth; - /** @var int height of the max preview */ - private $maxPreviewHeight; - /** @var int height of the max preview, which is the same as the one of the original image */ - private $maxPreviewRatio; - private $cachedBigger = []; - - /** - * Make sure your configuration file doesn't contain any additional providers - */ - protected function setUp() { - parent::setUp(); - - $this->createUser(self::TEST_PREVIEW_USER1, self::TEST_PREVIEW_USER1); - $this->loginAsUser(self::TEST_PREVIEW_USER1); - - $storage = new Temporary([]); - Filesystem::mount($storage, [], '/' . self::TEST_PREVIEW_USER1 . '/'); - - $this->rootView = new View(''); - $this->rootView->mkdir('/' . self::TEST_PREVIEW_USER1); - $this->rootView->mkdir('/' . self::TEST_PREVIEW_USER1 . '/files'); - - // We simulate the max dimension set in the config - \OC::$server->getConfig() - ->setSystemValue('preview_max_x', $this->configMaxWidth); - \OC::$server->getConfig() - ->setSystemValue('preview_max_y', $this->configMaxHeight); - // Used to test upscaling - $this->maxScaleFactor = 2; - \OC::$server->getConfig() - ->setSystemValue('preview_max_scale_factor', $this->maxScaleFactor); - - // We need to enable the providers we're going to use in the tests - $providers = [ - 'OC\\Preview\\JPEG', - 'OC\\Preview\\PNG', - 'OC\\Preview\\GIF', - 'OC\\Preview\\TXT', - 'OC\\Preview\\Postscript' - ]; - \OC::$server->getConfig() - ->setSystemValue('enabledPreviewProviders', $providers); - - // Sample is 1680x1050 JPEG - $this->prepareSample('testimage.jpg', 1680, 1050); - // Sample is 2400x1707 EPS - $this->prepareSample('testimage.eps', 2400, 1707); - // Sample is 1200x450 PNG - $this->prepareSample('testimage-wide.png', 1200, 450); - // Sample is 64x64 GIF - $this->prepareSample('testimage.gif', 64, 64); - } - - protected function tearDown() { - $this->logout(); - - parent::tearDown(); - } - - /** - * Tests if a preview can be deleted - */ - public function testIsPreviewDeleted() { - - $sampleFile = '/' . self::TEST_PREVIEW_USER1 . '/files/test.txt'; - - $this->rootView->file_put_contents($sampleFile, 'dummy file data'); - - $x = 50; - $y = 50; - - $preview = new Preview(self::TEST_PREVIEW_USER1, 'files/', 'test.txt', $x, $y); - $preview->getPreview(); - - $fileInfo = $this->rootView->getFileInfo($sampleFile); - /** @var int $fileId */ - $fileId = $fileInfo['fileid']; - $thumbCacheFile = $this->buildCachePath($fileId, $x, $y, true); - - $this->assertSame( - true, $this->rootView->file_exists($thumbCacheFile), "$thumbCacheFile \n" - ); - - $preview->deletePreview(); - - $this->assertSame(false, $this->rootView->file_exists($thumbCacheFile)); - } - - /** - * Tests if all previews can be deleted - * - * We test this first to make sure we'll be able to cleanup after each preview generating test - */ - public function testAreAllPreviewsDeleted() { - - $sampleFile = '/' . self::TEST_PREVIEW_USER1 . '/files/test.txt'; - - $this->rootView->file_put_contents($sampleFile, 'dummy file data'); - - $x = 50; - $y = 50; - - $preview = new Preview(self::TEST_PREVIEW_USER1, 'files/', 'test.txt', $x, $y); - $preview->getPreview(); - - $fileInfo = $this->rootView->getFileInfo($sampleFile); - /** @var int $fileId */ - $fileId = $fileInfo['fileid']; - - $thumbCacheFolder = '/' . self::TEST_PREVIEW_USER1 . '/' . Preview::THUMBNAILS_FOLDER . - '/' . $fileId . '/'; - - $this->assertSame(true, $this->rootView->is_dir($thumbCacheFolder), "$thumbCacheFolder \n"); - - $preview->deleteAllPreviews(); - - $this->assertSame(false, $this->rootView->is_dir($thumbCacheFolder)); - } - - public function txtBlacklist() { - $txt = 'random text file'; - - return [ - ['txt', $txt, false], - ]; - } - - /** - * @dataProvider txtBlacklist - * - * @param $extension - * @param $data - * @param $expectedResult - */ - public function testIsTransparent($extension, $data, $expectedResult) { - - $x = 32; - $y = 32; - - $sample = '/' . self::TEST_PREVIEW_USER1 . '/files/test.' . $extension; - $this->rootView->file_put_contents($sample, $data); - $preview = new Preview( - self::TEST_PREVIEW_USER1, 'files/', 'test.' . $extension, $x, - $y - ); - $image = $preview->getPreview(); - $resource = $image->resource(); - - //http://stackoverflow.com/questions/5702953/imagecolorat-and-transparency - $colorIndex = imagecolorat($resource, 1, 1); - $colorInfo = imagecolorsforindex($resource, $colorIndex); - $this->assertSame( - $expectedResult, - $colorInfo['alpha'] === 127, - 'Failed asserting that only previews for text files are transparent.' - ); - } - - /** - * Tests if unsupported previews return an empty object - */ - public function testUnsupportedPreviewsReturnEmptyObject() { - $width = 400; - $height = 200; - - // Previews for odt files are not enabled - $imgData = file_get_contents(\OC::$SERVERROOT . '/tests/data/testimage.odt'); - $imgPath = '/' . self::TEST_PREVIEW_USER1 . '/files/testimage.odt'; - $this->rootView->file_put_contents($imgPath, $imgData); - - $preview = - new Preview(self::TEST_PREVIEW_USER1, 'files/', 'testimage.odt', $width, $height); - $preview->getPreview(); - $image = $preview->getPreview(); - - $this->assertSame(false, $image->valid()); - } - - /** - * We generate the data to use as it makes it easier to adjust in case we need to test - * something different - * - * @return array - */ - public static function dimensionsDataProvider() { - $data = []; - $samples = [ - [200, 800], - [200, 800], - [50, 400], - [4, 60], - ]; - $keepAspect = false; - $scalingUp = false; - - for ($a = 0; $a < sizeof($samples); $a++) { - for ($b = 0; $b < 2; $b++) { - for ($c = 0; $c < 2; $c++) { - for ($d = 0; $d < 4; $d++) { - $coordinates = [ - [ - -rand($samples[$a][0], $samples[$a][1]), - -rand($samples[$a][0], $samples[$a][1]) - ], - [ - rand($samples[$a][0], $samples[$a][1]), - rand($samples[$a][0], $samples[$a][1]) - ], - [ - -rand($samples[$a][0], $samples[$a][1]), - rand($samples[$a][0], $samples[$a][1]) - ], - [ - rand($samples[$a][0], $samples[$a][1]), - -rand($samples[$a][0], $samples[$a][1]) - ] - ]; - $row = [$a]; - $row[] = $coordinates[$d][0]; - $row[] = $coordinates[$d][1]; - $row[] = $keepAspect; - $row[] = $scalingUp; - $data[] = $row; - } - $scalingUp = !$scalingUp; - } - $keepAspect = !$keepAspect; - } - } - - return $data; - } - - /** - * Tests if a preview of max dimensions gets created - * - * @requires extension imagick - * @dataProvider dimensionsDataProvider - * - * @param int $sampleId - * @param int $widthAdjustment - * @param int $heightAdjustment - * @param bool $keepAspect - * @param bool $scalingUp - */ - public function testCreateMaxAndNormalPreviewsAtFirstRequest( - $sampleId, $widthAdjustment, $heightAdjustment, $keepAspect = false, $scalingUp = false - ) { - // Get the right sample for the experiment - $this->getSample($sampleId); - $sampleWidth = $this->sampleWidth; - $sampleHeight = $this->sampleHeight; - $sampleFileId = $this->sampleFileId; - - // Adjust the requested size so that we trigger various test cases - $previewWidth = $sampleWidth + $widthAdjustment; - $previewHeight = $sampleHeight + $heightAdjustment; - $this->keepAspect = $keepAspect; - $this->scalingUp = $scalingUp; - - // Generates the max preview - $preview = $this->createPreview($previewWidth, $previewHeight); - - // There should be no cached thumbnails - $thumbnailFolder = '/' . self::TEST_PREVIEW_USER1 . '/' . Preview::THUMBNAILS_FOLDER . - '/' . $sampleFileId; - $this->assertSame(false, $this->rootView->is_dir($thumbnailFolder)); - - $image = $preview->getPreview(); - $this->assertNotSame(false, $image); - - $maxThumbCacheFile = $this->buildCachePath( - $sampleFileId, $this->maxPreviewWidth, $this->maxPreviewHeight, true, '-max' - ); - - $this->assertSame( - true, $this->rootView->file_exists($maxThumbCacheFile), "$maxThumbCacheFile \n" - ); - - // We check the dimensions of the file we've just stored - $maxPreview = imagecreatefromstring($this->rootView->file_get_contents($maxThumbCacheFile)); - - $this->assertEquals($this->maxPreviewWidth, imagesx($maxPreview)); - $this->assertEquals($this->maxPreviewHeight, imagesy($maxPreview)); - - // A thumbnail of the asked dimensions should also have been created (within the constraints of the max preview) - list($limitedPreviewWidth, $limitedPreviewHeight) = - $this->simulatePreviewDimensions($previewWidth, $previewHeight); - - $actualWidth = $image->width(); - $actualHeight = $image->height(); - - $this->assertEquals( - (int)$limitedPreviewWidth, $image->width(), "$actualWidth x $actualHeight \n" - ); - $this->assertEquals((int)$limitedPreviewHeight, $image->height()); - - // And it should be cached - $this->checkCache($sampleFileId, $limitedPreviewWidth, $limitedPreviewHeight); - - $preview->deleteAllPreviews(); - } - - /** - * Tests if the second preview will be based off the cached max preview - * - * @requires extension imagick - * @dataProvider dimensionsDataProvider - * - * @param int $sampleId - * @param int $widthAdjustment - * @param int $heightAdjustment - * @param bool $keepAspect - * @param bool $scalingUp - */ - public function testSecondPreviewsGetCachedMax( - $sampleId, $widthAdjustment, $heightAdjustment, $keepAspect = false, $scalingUp = false - ) { - //$this->markTestSkipped('Not testing this at this time'); - - $this->getSample($sampleId); - $sampleWidth = $this->sampleWidth; - $sampleHeight = $this->sampleHeight; - $sampleFileId = $this->sampleFileId; - - //Creates the Max preview which will be used in the rest of the test - $this->createMaxPreview(); - - // Adjust the requested size so that we trigger various test cases - $previewWidth = $sampleWidth + $widthAdjustment; - $previewHeight = $sampleHeight + $heightAdjustment; - $this->keepAspect = $keepAspect; - $this->scalingUp = $scalingUp; - - $preview = $this->createPreview($previewWidth, $previewHeight); - - // A cache query should return the thumbnail of max dimension - $isCached = $preview->isCached($sampleFileId); - $cachedMaxPreview = $this->buildCachePath( - $sampleFileId, $this->maxPreviewWidth, $this->maxPreviewHeight, false, '-max' - ); - $this->assertSame($cachedMaxPreview, $isCached); - } - - /** - * Make sure that the max preview can never be deleted - * - * For this test to work, the preview we generate first has to be the size of max preview - */ - public function testMaxPreviewCannotBeDeleted() { - //$this->markTestSkipped('Not testing this at this time'); - - $this->keepAspect = true; - $this->getSample(0); - $fileId = $this->sampleFileId; - - //Creates the Max preview which we will try to delete - $preview = $this->createMaxPreview(); - - // We try to deleted the preview - $preview->deletePreview(); - $this->assertNotSame(false, $preview->isCached($fileId)); - - $preview->deleteAllPreviews(); - } - - public static function aspectDataProvider() { - $data = []; - $samples = 4; - $keepAspect = false; - $scalingUp = false; - for ($a = 0; $a < $samples; $a++) { - for ($b = 0; $b < 2; $b++) { - for ($c = 0; $c < 2; $c++) { - $row = [$a]; - $row[] = $keepAspect; - $row[] = $scalingUp; - $data[] = $row; - $scalingUp = !$scalingUp; - } - $keepAspect = !$keepAspect; - } - } - - return $data; - } - - /** - * We ask for a preview larger than what is set in the configuration, - * so we should be getting either the max preview or a preview the size - * of the dimensions set in the config - * - * @requires extension imagick - * @dataProvider aspectDataProvider - * - * @param int $sampleId - * @param bool $keepAspect - * @param bool $scalingUp - */ - public function testDoNotCreatePreviewsLargerThanConfigMax( - $sampleId, $keepAspect = false, $scalingUp = false - ) { - //$this->markTestSkipped('Not testing this at this time'); - - $this->getSample($sampleId); - - //Creates the Max preview which will be used in the rest of the test - $this->createMaxPreview(); - - // Now we will create the real preview - $previewWidth = 4000; - $previewHeight = 4000; - $this->keepAspect = $keepAspect; - $this->scalingUp = $scalingUp; - - // Tries to create the very large preview - $preview = $this->createPreview($previewWidth, $previewHeight); - - $image = $preview->getPreview(); - $this->assertNotSame(false, $image); - - list($expectedWidth, $expectedHeight) = - $this->simulatePreviewDimensions($previewWidth, $previewHeight); - $this->assertEquals($expectedWidth, $image->width()); - $this->assertEquals($expectedHeight, $image->height()); - - // A preview of the asked size should not have been created since it's larger that our max dimensions - $postfix = $this->getThumbnailPostfix($previewWidth, $previewHeight); - $thumbCacheFile = $this->buildCachePath( - $this->sampleFileId, $previewWidth, $previewHeight, false, $postfix - ); - $this->assertSame( - false, $this->rootView->file_exists($thumbCacheFile), "$thumbCacheFile \n" - ); - - $preview->deleteAllPreviews(); - } - - /** - * Makes sure we're getting the proper cached thumbnail - * - * When we start by generating a preview which keeps the aspect ratio - * 200-125-with-aspect - * 300-300 ✓ - * - * When we start by generating a preview of exact dimensions - * 200-200 ✓ - * 300-188-with-aspect - * - * @requires extension imagick - * @dataProvider aspectDataProvider - * - * @param int $sampleId - * @param bool $keepAspect - * @param bool $scalingUp - */ - public function testIsBiggerWithAspectRatioCached( - $sampleId, $keepAspect = false, $scalingUp = false - ) { - //$this->markTestSkipped('Not testing this at this time'); - - $previewWidth = 400; - $previewHeight = 400; - $this->getSample($sampleId); - $fileId = $this->sampleFileId; - $this->keepAspect = $keepAspect; - $this->scalingUp = $scalingUp; - - // Caching the max preview in our preview array for the test - $this->cachedBigger[] = $this->buildCachePath( - $fileId, $this->maxPreviewWidth, $this->maxPreviewHeight, false, '-max' - ); - - $this->getSmallerThanMaxPreview($fileId, $previewWidth, $previewHeight); - // We switch the aspect ratio, to generate a thumbnail we should not be picked up - $this->keepAspect = !$keepAspect; - $this->getSmallerThanMaxPreview($fileId, $previewWidth + 100, $previewHeight + 100); - - // Small thumbnails are always cropped - $this->keepAspect = false; - // Smaller previews should be based on the previous, larger preview, with the correct aspect ratio - $this->createThumbnailFromBiggerCachedPreview($fileId, 32, 32); - - // 2nd cache query should indicate that we have a cached copy of the exact dimension - $this->getCachedSmallThumbnail($fileId, 32, 32); - - // We create a preview in order to be able to delete the cache - $preview = $this->createPreview(rand(), rand()); - $preview->deleteAllPreviews(); - $this->cachedBigger = []; - } - - /** - * Initialises the preview - * - * @param int $width - * @param int $height - * - * @return Preview - */ - private function createPreview($width, $height) { - $preview = new Preview( - self::TEST_PREVIEW_USER1, 'files/', $this->sampleFilename, $width, - $height - ); - - $this->assertSame(true, $preview->isFileValid()); - - $preview->setKeepAspect($this->keepAspect); - $preview->setScalingup($this->scalingUp); - - return $preview; - } - - /** - * Creates the Max preview which will be used in the rest of the test - * - * @return Preview - */ - private function createMaxPreview() { - $this->keepAspect = true; - $preview = $this->createPreview($this->maxPreviewWidth, $this->maxPreviewHeight); - $preview->getPreview(); - - return $preview; - } - - /** - * Makes sure the preview which was just created has been saved to disk - * - * @param int $fileId - * @param int $previewWidth - * @param int $previewHeight - */ - private function checkCache($fileId, $previewWidth, $previewHeight) { - $postfix = $this->getThumbnailPostfix($previewWidth, $previewHeight); - - $thumbCacheFile = $this->buildCachePath( - $fileId, $previewWidth, $previewHeight, true, $postfix - ); - - $this->assertSame( - true, $this->rootView->file_exists($thumbCacheFile), "$thumbCacheFile \n" - ); - } - - /** - * Computes special filename postfixes - * - * @param int $width - * @param int $height - * - * @return string - */ - private function getThumbnailPostfix($width, $height) { - // Need to take care of special postfix added to the dimensions - $postfix = ''; - $isMaxPreview = ($width === $this->maxPreviewWidth - && $height === $this->maxPreviewHeight) ? true : false; - if ($isMaxPreview) { - $postfix = '-max'; - } - if ($this->keepAspect && !$isMaxPreview) { - $postfix = '-with-aspect'; - } - - return $postfix; - } - - private function getSmallerThanMaxPreview($fileId, $previewWidth, $previewHeight) { - $preview = $this->createPreview($previewWidth, $previewHeight); - - $image = $preview->getPreview(); - $this->assertNotSame(false, $image); - - // A thumbnail of the asked dimensions should also have been created (within the constraints of the max preview) - list($limitedPreviewWidth, $limitedPreviewHeight) = - $this->simulatePreviewDimensions($previewWidth, $previewHeight); - - $this->assertEquals($limitedPreviewWidth, $image->width()); - $this->assertEquals($limitedPreviewHeight, $image->height()); - - // And it should be cached - $this->checkCache($fileId, $limitedPreviewWidth, $limitedPreviewHeight); - - $this->cachedBigger[] = $preview->isCached($fileId); - } - - private function createThumbnailFromBiggerCachedPreview($fileId, $width, $height) { - $preview = $this->createPreview($width, $height); - - // A cache query should return a thumbnail of slightly larger dimensions - // and with the proper aspect ratio - $isCached = $preview->isCached($fileId); - $expectedCachedBigger = $this->getExpectedCachedBigger(); - - $this->assertSame($expectedCachedBigger, $isCached); - - $image = $preview->getPreview(); - $this->assertNotSame(false, $image); - } - - /** - * Picks the bigger cached preview with the correct aspect ratio or the max preview if it's - * smaller than that - * - * For non-upscaled images, we pick the only picture without aspect ratio - * - * @return string - */ - private function getExpectedCachedBigger() { - $foundPreview = null; - $foundWidth = null; - $foundHeight = null; - $maxPreview = null; - $maxWidth = null; - $maxHeight = null; - - foreach ($this->cachedBigger as $cached) { - $size = explode('-', basename($cached)); - $width = (int)$size[0]; - $height = (int)$size[1]; - - if (strpos($cached, 'max')) { - $maxWidth = $width; - $maxHeight = $height; - $maxPreview = $cached; - continue; - } - - // We pick the larger preview with no aspect ratio - if (!strpos($cached, 'aspect') && !strpos($cached, 'max')) { - $foundPreview = $cached; - $foundWidth = $width; - $foundHeight = $height; - } - } - if ($foundWidth > $maxWidth && $foundHeight > $maxHeight) { - $foundPreview = $maxPreview; - } - - return $foundPreview; - } - - /** - * A small thumbnail of exact dimensions should be in the cache - * - * @param int $fileId - * @param int $width - * @param int $height - */ - private function getCachedSmallThumbnail($fileId, $width, $height) { - $preview = $this->createPreview($width, $height); - - $isCached = $preview->isCached($fileId); - $thumbCacheFile = $this->buildCachePath($fileId, $width, $height); - - $this->assertSame($thumbCacheFile, $isCached, "$thumbCacheFile \n"); - } - - /** - * Builds the complete path to a cached thumbnail starting from the user folder - * - * @param int $fileId - * @param int $width - * @param int $height - * @param bool $user - * @param string $postfix - * - * @return string - */ - private function buildCachePath($fileId, $width, $height, $user = false, $postfix = '') { - $userPath = ''; - if ($user) { - $userPath = '/' . self::TEST_PREVIEW_USER1 . '/'; - } - - return $userPath . Preview::THUMBNAILS_FOLDER . '/' . $fileId - . '/' . $width . '-' . $height . $postfix . '.png'; - } - - /** - * Stores the sample in the filesystem and stores it in the $samples array - * - * @param string $fileName - * @param int $sampleWidth - * @param int $sampleHeight - */ - private function prepareSample($fileName, $sampleWidth, $sampleHeight) { - $imgData = file_get_contents(\OC::$SERVERROOT . '/tests/data/' . $fileName); - $imgPath = '/' . self::TEST_PREVIEW_USER1 . '/files/' . $fileName; - $this->rootView->file_put_contents($imgPath, $imgData); - $fileInfo = $this->rootView->getFileInfo($imgPath); - - list($maxPreviewWidth, $maxPreviewHeight) = - $this->setMaxPreview($sampleWidth, $sampleHeight); - - $this->samples[] = - [ - 'sampleFileId' => $fileInfo['fileid'], - 'sampleFileName' => $fileName, - 'sampleWidth' => $sampleWidth, - 'sampleHeight' => $sampleHeight, - 'maxPreviewWidth' => $maxPreviewWidth, - 'maxPreviewHeight' => $maxPreviewHeight - ]; - } - - /** - * Sets the variables used to define the boundaries which need to be respected when using a - * specific sample - * - * @param $sampleId - */ - private function getSample($sampleId) { - // Corrects a rounding difference when using the EPS (Imagick converted) sample - $filename = $this->samples[$sampleId]['sampleFileName']; - $splitFileName = pathinfo($filename); - $extension = $splitFileName['extension']; - $correction = ($extension === 'eps' && PHP_MAJOR_VERSION < 7) ? 1 : 0; - $maxPreviewHeight = $this->samples[$sampleId]['maxPreviewHeight']; - $maxPreviewHeight = $maxPreviewHeight - $correction; - - $this->sampleFileId = $this->samples[$sampleId]['sampleFileId']; - $this->sampleFilename = $this->samples[$sampleId]['sampleFileName']; - $this->sampleWidth = $this->samples[$sampleId]['sampleWidth']; - $this->sampleHeight = $this->samples[$sampleId]['sampleHeight']; - $this->maxPreviewWidth = $this->samples[$sampleId]['maxPreviewWidth']; - $this->maxPreviewHeight = $maxPreviewHeight; - $ratio = $this->maxPreviewWidth / $this->maxPreviewHeight; - $this->maxPreviewRatio = $ratio; - } - - /** - * Defines the size of the max preview - * - * @fixme the Imagick previews don't have the exact same size on disk as they're calculated here - * - * @param int $sampleWidth - * @param int $sampleHeight - * - * @return array - */ - private function setMaxPreview($sampleWidth, $sampleHeight) { - // Max previews are never scaled up - $this->scalingUp = false; - // Max previews always keep the aspect ratio - $this->keepAspect = true; - // We set this variable in order to be able to calculate the max preview with the proper aspect ratio - $this->maxPreviewRatio = $sampleWidth / $sampleHeight; - $maxPreviewWidth = min($sampleWidth, $this->configMaxWidth); - $maxPreviewHeight = min($sampleHeight, $this->configMaxHeight); - list($maxPreviewWidth, $maxPreviewHeight) = - $this->applyAspectRatio($maxPreviewWidth, $maxPreviewHeight); - - return [$maxPreviewWidth, $maxPreviewHeight]; - } - - /** - * Calculates the expected dimensions of the preview to be able to assess if we've got the - * right result - * - * @param int $askedWidth - * @param int $askedHeight - * - * @return array - */ - private function simulatePreviewDimensions($askedWidth, $askedHeight) { - $askedWidth = min($askedWidth, $this->configMaxWidth); - $askedHeight = min($askedHeight, $this->configMaxHeight); - - if ($this->keepAspect) { - // Defines the box in which the preview has to fit - $scaleFactor = $this->scalingUp ? $this->maxScaleFactor : 1; - $newPreviewWidth = min($askedWidth, $this->maxPreviewWidth * $scaleFactor); - $newPreviewHeight = min($askedHeight, $this->maxPreviewHeight * $scaleFactor); - list($newPreviewWidth, $newPreviewHeight) = - $this->applyAspectRatio($newPreviewWidth, $newPreviewHeight); - } else { - list($newPreviewWidth, $newPreviewHeight) = - $this->fixSize($askedWidth, $askedHeight); - } - - return [(int)$newPreviewWidth, (int)$newPreviewHeight]; - } - - /** - * Resizes the boundaries to match the aspect ratio - * - * @param int $askedWidth - * @param int $askedHeight - * - * @return \int[] - */ - private function applyAspectRatio($askedWidth, $askedHeight) { - $originalRatio = $this->maxPreviewRatio; - if ($askedWidth / $originalRatio < $askedHeight) { - $askedHeight = round($askedWidth / $originalRatio); - } else { - $askedWidth = round($askedHeight * $originalRatio); - } - - return [(int)$askedWidth, (int)$askedHeight]; - } - - /** - * Clips or stretches the dimensions so that they fit in the boundaries - * - * @param int $askedWidth - * @param int $askedHeight - * - * @return array - */ - private function fixSize($askedWidth, $askedHeight) { - if ($this->scalingUp) { - $askedWidth = min($this->configMaxWidth, $askedWidth); - $askedHeight = min($this->configMaxHeight, $askedHeight); - } - - return [(int)$askedWidth, (int)$askedHeight]; - } - - public function testKeepAspectRatio() { - $originalWidth = 1680; - $originalHeight = 1050; - $originalAspectRation = $originalWidth / $originalHeight; - - $preview = new Preview( - self::TEST_PREVIEW_USER1, 'files/', 'testimage.jpg', - 150, - 150 - ); - $preview->setKeepAspect(true); - $image = $preview->getPreview(); - - $aspectRatio = $image->width() / $image->height(); - $this->assertEquals(round($originalAspectRation, 2), round($aspectRatio, 2)); - - $this->assertLessThanOrEqual(150, $image->width()); - $this->assertLessThanOrEqual(150, $image->height()); - } - - public function testKeepAspectRatioCover() { - $originalWidth = 1680; - $originalHeight = 1050; - $originalAspectRation = $originalWidth / $originalHeight; - - $preview = new Preview( - self::TEST_PREVIEW_USER1, 'files/', 'testimage.jpg', - 150, - 150 - ); - $preview->setKeepAspect(true); - $preview->setMode(Preview::MODE_COVER); - $image = $preview->getPreview(); - - $aspectRatio = $image->width() / $image->height(); - $this->assertEquals(round($originalAspectRation, 2), round($aspectRatio, 2)); - - $this->assertGreaterThanOrEqual(150, $image->width()); - $this->assertGreaterThanOrEqual(150, $image->height()); - } - - public function testSetFileWithInfo() { - $info = new FileInfo('/foo', null, '/foo', ['mimetype' => 'foo/bar'], null); - $preview = new Preview(); - $preview->setFile('/foo', $info); - $this->assertEquals($info, $this->invokePrivate($preview, 'getFileInfo')); - } - - public function testIsCached() { - $sourceFile = __DIR__ . '/../data/testimage.png'; - $userId = $this->getUniqueID(); - $this->createUser($userId, 'pass'); - - $storage = new Temporary(); - $storage->mkdir('files'); - $this->registerMount($userId, $storage, '/' . $userId); - - \OC_Util::tearDownFS(); - \OC_Util::setupFS($userId); - $preview = new Preview($userId, 'files'); - $view = new View('/' . $userId . '/files'); - $view->file_put_contents('test.png', file_get_contents($sourceFile)); - $info = $view->getFileInfo('test.png'); - $preview->setFile('test.png', $info); - - $preview->setMaxX(64); - $preview->setMaxY(64); - - $this->assertFalse($preview->isCached($info->getId())); - - $preview->getPreview(); - - $this->assertEquals('thumbnails/' . $info->getId() . '/64-64.png', $preview->isCached($info->getId())); - } -} diff --git a/tests/lib/Repair/AvatarPermissionsTest.php b/tests/lib/Repair/AvatarPermissionsTest.php deleted file mode 100644 index e3f582dc512530df3cd06eb800df5bbc76d81fe5..0000000000000000000000000000000000000000 --- a/tests/lib/Repair/AvatarPermissionsTest.php +++ /dev/null @@ -1,189 +0,0 @@ - - * - * @copyright Copyright (c) 2016, ownCloud, Inc. - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see - * - */ -namespace Test\Repair; - -/** - * Test for fixing the userRoot and avatar permissions - * - * @group DB - * - * @see \OC\Repair\AvatarPermissionsTest - */ -class AvatarPermissionsTest extends \Test\TestCase { - - /** @var \OC\Repair\AvatarPermissions */ - protected $repair; - - /** @var \OCP\IDBConnection */ - protected $connection; - - protected function setUp() { - parent::setUp(); - - $this->connection = \OC::$server->getDatabaseConnection(); - $this->repair = new \OC\Repair\AvatarPermissions($this->connection); - $this->cleanUpTables(); - } - - protected function tearDown() { - $this->cleanUpTables(); - - parent::tearDown(); - } - - protected function cleanUpTables() { - $qb = $this->connection->getQueryBuilder(); - $qb->delete('filecache')->execute(); - $qb->delete('storages')->execute(); - } - - public function dataFixUserRootPermissions() { - return [ - ['home::user', '', 0, 23], - ['home::user', 'foo', 0, 0], - ['home::user', 'avatar.jpg', 0, 0], - ['ABC::user', '', 0, 0], - ['ABC::user', 'foo', 0, 0], - ]; - } - - /** - * @dataProvider dataFixUserRootPermissions - * - * @param string $storageId - * @param string $path - * @param int $permissionsBefore - * @param int $permissionsAfter - */ - public function testFixUserRootPermissions($storageId, $path, $permissionsBefore, $permissionsAfter) { - $userStorage = $this->addStorage($storageId); - $userHome = $this->addFileCacheEntry($userStorage, $path, $permissionsBefore); - - $this->invokePrivate($this->repair, 'fixUserRootPermissions', []); - - $this->verifyPermissions($userHome, $permissionsAfter); - } - - public function dataFixAvatarPermissions() { - return [ - ['home::user', '', 0, 0], - ['home::user', 'avatar.jpg', 0, 27], - ['home::user', 'avatar.png', 0, 27], - ['home::user', 'avatar.32.png', 0, 27], - ['home::user', 'mine.txt', 0, 0], - ['ABC::user', '', 0, 0], - ['ABC::user', 'avatar.jpg', 0, 0], - ['ABC::user', 'avatar.png', 0, 0], - ['ABC::user', 'avatar.32.png', 0, 0], - ['ABC::user', 'mine.txt', 0, 0], - ]; - } - - /** - * @dataProvider dataFixAvatarPermissions - * - * @param string $storageId - * @param string $path - * @param int $permissionsBefore - * @param int $permissionsAfter - */ - public function testFixAvatarPermissions($storageId, $path, $permissionsBefore, $permissionsAfter) { - $userStorage = $this->addStorage($storageId); - $userHome = $this->addFileCacheEntry($userStorage, $path, $permissionsBefore); - - $this->invokePrivate($this->repair, 'fixAvatarPermissions', []); - - $this->verifyPermissions($userHome, $permissionsAfter); - } - - /** - * Add a new storage - * - * @param string $id - * @return int The numeric id - */ - protected function addStorage($id) { - $qb = $this->connection->getQueryBuilder(); - - $qb->insert('storages') - ->values([ - 'id' => $qb->createNamedParameter($id) - ]); - - $qb->execute(); - - return $qb->getLastInsertId(); - } - - /** - * Add a filecache entry - * - * @param int $storage - * @param string $path - * @param int $permissions - * - * @return int The fileid - */ - protected function addFileCacheEntry($storage, $path, $permissions) { - $qb = $this->connection->getQueryBuilder(); - - $qb->insert('filecache') - ->values([ - 'path' => $qb->createNamedParameter($path), - 'path_hash' => $qb->createNamedParameter(md5($path)), - 'parent' => $qb->createNamedParameter(42), - 'mimetype' => $qb->createNamedParameter(23), - 'mimepart' => $qb->createNamedParameter(32), - 'size' => $qb->createNamedParameter(16), - 'mtime' => $qb->createNamedParameter(1), - 'storage_mtime' => $qb->createNamedParameter(2), - 'encrypted' => $qb->createNamedParameter(0), - 'unencrypted_size' => $qb->createNamedParameter(0), - 'storage' => $qb->createNamedParameter($storage), - 'permissions' => $qb->createNamedParameter($permissions), - ]); - - $qb->execute(); - - return $qb->getLastInsertId(); - } - - /** - * @param int $fileId - * @param int $permissions - */ - protected function verifyPermissions($fileId, $permissions) { - $qb = $this->connection->getQueryBuilder(); - - $qb->select('permissions') - ->from('filecache') - ->where($qb->expr()->eq('fileid', $qb->createNamedParameter($fileId))); - - $cursor = $qb->execute(); - - $data = $cursor->fetch(); - $cursor->closeCursor(); - - $this->assertSame($permissions, (int)$data['permissions']); - } - - -} diff --git a/tests/lib/Repair/NC11/FixMountStoragesTest.php b/tests/lib/Repair/NC11/FixMountStoragesTest.php new file mode 100644 index 0000000000000000000000000000000000000000..12e091050388c6045a7440b740041c7e202c29bc --- /dev/null +++ b/tests/lib/Repair/NC11/FixMountStoragesTest.php @@ -0,0 +1,132 @@ + + * + * @author Joas Schilling + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ +namespace Test\Repair\NC11; + +use OC\Repair\NC11\FixMountStorages; +use OCP\DB\QueryBuilder\IQueryBuilder; +use OCP\IDBConnection; +use OCP\Migration\IOutput; +use Test\TestCase; + +/** + * Class FixMountStoragesTest + * + * @package Test\Repair\NC11 + * @group DB + */ +class FixMountStoragesTest extends TestCase { + + /** @var IDBConnection */ + private $db; + + /** @var FixMountStorages */ + private $repair; + + public function setUp() { + parent::setUp(); + + $this->db = \OC::$server->getDatabaseConnection(); + + $this->repair = new FixMountStorages( + $this->db + ); + } + + public function testGetName() { + $this->assertSame('Fix potential broken mount points', $this->repair->getName()); + } + + public function testRun() { + // Valid mount + $file1 = $this->createFile(42); + $mount1 = $this->createMount($file1, 42); + $this->assertStorage($mount1, 42); + + // Broken mount + $file2 = $this->createFile(23); + $mount2 = $this->createMount($file2, 1337); + $this->assertStorage($mount2, 1337); + + /** @var IOutput|\PHPUnit_Framework_MockObject_MockObject $output */ + $output = $this->createMock(IOutput::class); + $output->expects($this->at(0)) + ->method('info') + ->with('1 mounts updated'); + + $this->repair->run($output); + $this->assertStorage($mount1, 42); + $this->assertStorage($mount2, 23); + + $output->expects($this->at(0)) + ->method('info') + ->with('No mounts updated'); + + $this->repair->run($output); + $this->assertStorage($mount1, 42); + $this->assertStorage($mount2, 23); + } + + + protected function createFile($storage) { + $query = $this->db->getQueryBuilder(); + + $query->insert('filecache') + ->values([ + 'storage' => $query->createNamedParameter($storage, IQueryBuilder::PARAM_INT), + 'path_hash' => $query->createNamedParameter(static::getUniqueID(), IQueryBuilder::PARAM_STR), + 'encrypted' => $query->createNamedParameter(0, IQueryBuilder::PARAM_INT), + 'size' => $query->createNamedParameter(0, IQueryBuilder::PARAM_INT), + 'unencrypted_size' => $query->createNamedParameter(0, IQueryBuilder::PARAM_INT), + ]); + $query->execute(); + + return $query->getLastInsertId(); + } + + protected function createMount($fileId, $storage) { + $query = $this->db->getQueryBuilder(); + + $query->insert('mounts') + ->values([ + 'storage_id' => $query->createNamedParameter($storage, IQueryBuilder::PARAM_INT), + 'root_id' => $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT), + 'user_id' => $query->createNamedParameter(static::getUniqueID(), IQueryBuilder::PARAM_STR), + 'mount_point' => $query->createNamedParameter(static::getUniqueID(), IQueryBuilder::PARAM_STR), + ]); + $query->execute(); + + return $query->getLastInsertId(); + } + + protected function assertStorage($mount, $storage) { + $query = $this->db->getQueryBuilder(); + $query->select('storage_id') + ->from('mounts') + ->where($query->expr()->eq('id', $query->createNamedParameter($mount, IQueryBuilder::PARAM_INT))); + $result = $query->execute(); + $row = $result->fetch(); + $result->closeCursor(); + + $this->assertEquals($storage, $row['storage_id']); + } +} diff --git a/tests/lib/Repair/RepairInvalidSharesTest.php b/tests/lib/Repair/RepairInvalidSharesTest.php index 1ac42e53bf6ab71b2e46c47583619535284df0e3..83dbed7d20210a3f31cc477703413c40e7b78bdc 100644 --- a/tests/lib/Repair/RepairInvalidSharesTest.php +++ b/tests/lib/Repair/RepairInvalidSharesTest.php @@ -278,6 +278,73 @@ class RepairInvalidSharesTest extends TestCase { $result->closeCursor(); } + public function fileSharePermissionsProvider() { + return [ + // unchanged for folder + [ + 'folder', + 31, + 31, + ], + // unchanged for read-write + share + [ + 'file', + \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE, + \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE, + ], + // fixed for all perms + [ + 'file', + \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE | \OCP\Constants::PERMISSION_SHARE, + \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE, + ], + ]; + } + + /** + * Test adjusting file share permissions + * + * @dataProvider fileSharePermissionsProvider + */ + public function testFileSharePermissions($itemType, $testPerms, $expectedPerms) { + $qb = $this->connection->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->expr()->literal(Constants::SHARE_TYPE_LINK), + 'uid_owner' => $qb->expr()->literal('user1'), + 'item_type' => $qb->expr()->literal($itemType), + 'item_source' => $qb->expr()->literal(123), + 'item_target' => $qb->expr()->literal('/123'), + 'file_source' => $qb->expr()->literal(123), + 'file_target' => $qb->expr()->literal('/test'), + 'permissions' => $qb->expr()->literal($testPerms), + 'stime' => $qb->expr()->literal(time()), + ]) + ->execute(); + + $shareId = $this->getLastShareId(); + + /** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */ + $outputMock = $this->getMockBuilder('\OCP\Migration\IOutput') + ->disableOriginalConstructor() + ->getMock(); + + $this->repair->run($outputMock); + + $results = $this->connection->getQueryBuilder() + ->select('*') + ->from('share') + ->orderBy('permissions', 'ASC') + ->execute() + ->fetchAll(); + + $this->assertCount(1, $results); + + $updatedShare = $results[0]; + + $this->assertEquals($expectedPerms, $updatedShare['permissions']); + } + /** * @return int */ diff --git a/tests/lib/Repair/RepairLegacyStoragesTest.php b/tests/lib/Repair/RepairLegacyStoragesTest.php deleted file mode 100644 index 8d8366dde0692d639187f41d8adf58d1c643eb1e..0000000000000000000000000000000000000000 --- a/tests/lib/Repair/RepairLegacyStoragesTest.php +++ /dev/null @@ -1,321 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -namespace Test\Repair; - -use OC\Files\Cache\Cache; -use OC\Files\Cache\Storage; -use OCP\Migration\IOutput; -use PHPUnit_Framework_MockObject_MockObject; -use Test\TestCase; - -/** - * Tests for the converting of legacy storages to home storages. - * - * @group DB - * - * @see \OC\Repair\RepairLegacyStorages - */ -class RepairLegacyStoragesTest extends TestCase { - /** @var \OCP\IDBConnection */ - private $connection; - /** @var \OCP\IConfig */ - private $config; - private $user; - /** @var \OC\Repair\RepairLegacyStorages */ - private $repair; - - private $dataDir; - private $oldDataDir; - - private $legacyStorageId; - private $newStorageId; - - /** @var IOutput | PHPUnit_Framework_MockObject_MockObject */ - private $outputMock; - - protected function setUp() { - parent::setUp(); - - $this->config = \OC::$server->getConfig(); - $this->connection = \OC::$server->getDatabaseConnection(); - $this->oldDataDir = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data/'); - - $this->repair = new \OC\Repair\RepairLegacyStorages($this->config, $this->connection); - - $this->outputMock = $this->getMockBuilder('\OCP\Migration\IOutput') - ->disableOriginalConstructor() - ->getMock(); - } - - protected function tearDown() { - $user = \OC::$server->getUserManager()->get($this->user); - if ($user) { - $user->delete(); - } - - $sql = 'DELETE FROM `*PREFIX*storages`'; - $this->connection->executeQuery($sql); - $sql = 'DELETE FROM `*PREFIX*filecache`'; - $this->connection->executeQuery($sql); - $this->config->setSystemValue('datadirectory', $this->oldDataDir); - $this->config->setAppValue('core', 'repairlegacystoragesdone', 'no'); - - parent::tearDown(); - } - - /** - * @param string $dataDir - * @param string $userId - * @throws \Exception - */ - function prepareSettings($dataDir, $userId) { - // hard-coded string as we want a predictable fixed length - // no data will be written there - $this->dataDir = $dataDir; - $this->config->setSystemValue('datadirectory', $this->dataDir); - - $this->user = $userId; - $this->legacyStorageId = 'local::' . $this->dataDir . $this->user . '/'; - $this->newStorageId = 'home::' . $this->user; - \OC::$server->getUserManager()->createUser($this->user, $this->user); - } - - /** - * Create a storage entry - * - * @param string $storageId - * @return int - */ - private function createStorage($storageId) { - $sql = 'INSERT INTO `*PREFIX*storages` (`id`)' - . ' VALUES (?)'; - - $storageId = Storage::adjustStorageId($storageId); - $numRows = $this->connection->executeUpdate($sql, array($storageId)); - $this->assertSame(1, $numRows); - - return (int)\OC::$server->getDatabaseConnection()->lastInsertId('*PREFIX*storages'); - } - - /** - * Create dummy data in the filecache for the given storage numeric id - * - * @param string $storageId storage id - */ - private function createData($storageId) { - $cache = new Cache($storageId); - $cache->put( - 'dummyfile.txt', - array('size' => 5, 'mtime' => 12, 'mimetype' => 'text/plain') - ); - } - - /** - * Test that existing home storages are left alone when valid. - * - * @dataProvider settingsProvider - * - * @param string $dataDir - * @param string $userId - */ - public function testNoopWithExistingHomeStorage($dataDir, $userId) { - $this->prepareSettings($dataDir, $userId); - $newStorageNumId = $this->createStorage($this->newStorageId); - - $this->repair->run($this->outputMock); - - $this->assertNull(Storage::getNumericStorageId($this->legacyStorageId)); - $this->assertSame($newStorageNumId, Storage::getNumericStorageId($this->newStorageId)); - } - - /** - * Test that legacy storages are converted to home storages when - * the latter does not exist. - * - * @dataProvider settingsProvider - * - * @param string $dataDir - * @param string $userId - */ - public function testConvertLegacyToHomeStorage($dataDir, $userId) { - $this->prepareSettings($dataDir, $userId); - $legacyStorageNumId = $this->createStorage($this->legacyStorageId); - - $this->repair->run($this->outputMock); - - $this->assertNull(Storage::getNumericStorageId($this->legacyStorageId)); - $this->assertSame($legacyStorageNumId, Storage::getNumericStorageId($this->newStorageId)); - } - - /** - * Test that legacy storages are converted to home storages - * when home storage already exists but has no data. - * - * @dataProvider settingsProvider - * - * @param string $dataDir - * @param string $userId - */ - public function testConvertLegacyToExistingEmptyHomeStorage($dataDir, $userId) { - $this->prepareSettings($dataDir, $userId); - $legacyStorageNumId = $this->createStorage($this->legacyStorageId); - $this->createStorage($this->newStorageId); - - $this->createData($this->legacyStorageId); - - $this->repair->run($this->outputMock); - - $this->assertNull(Storage::getNumericStorageId($this->legacyStorageId)); - $this->assertSame($legacyStorageNumId, Storage::getNumericStorageId($this->newStorageId)); - } - - /** - * Test that legacy storages are converted to home storages - * when home storage already exists and the legacy storage - * has no data. - * - * @dataProvider settingsProvider - * - * @param string $dataDir - * @param string $userId - */ - public function testConvertEmptyLegacyToHomeStorage($dataDir, $userId) { - $this->prepareSettings($dataDir, $userId); - $this->createStorage($this->legacyStorageId); - $newStorageNumId = $this->createStorage($this->newStorageId); - - $this->createData($this->newStorageId); - - $this->repair->run($this->outputMock); - - $this->assertNull(Storage::getNumericStorageId($this->legacyStorageId)); - $this->assertSame($newStorageNumId, Storage::getNumericStorageId($this->newStorageId)); - } - - /** - * Test that nothing is done when both conflicting legacy - * and home storage have data. - * - * @dataProvider settingsProvider - * - * @param string $dataDir - * @param string $userId - */ - public function testConflictNoop($dataDir, $userId) { - $this->prepareSettings($dataDir, $userId); - $legacyStorageNumId = $this->createStorage($this->legacyStorageId); - $newStorageNumId = $this->createStorage($this->newStorageId); - - $this->createData($this->legacyStorageId); - $this->createData($this->newStorageId); - - $this->outputMock->expects($this->exactly(2))->method('warning'); - $this->repair->run($this->outputMock); - - // storages left alone - $this->assertSame($legacyStorageNumId, Storage::getNumericStorageId($this->legacyStorageId)); - $this->assertSame($newStorageNumId, Storage::getNumericStorageId($this->newStorageId)); - - // do not set the done flag - $this->assertNotEquals('yes', $this->config->getAppValue('core', 'repairlegacystoragesdone')); - } - - /** - * Test that the data dir local entry is left alone - * - * @dataProvider settingsProvider - * - * @param string $dataDir - * @param string $userId - */ - public function testDataDirEntryNoop($dataDir, $userId) { - $this->prepareSettings($dataDir, $userId); - $storageId = 'local::' . $this->dataDir; - $numId = $this->createStorage($storageId); - - $this->repair->run($this->outputMock); - - $this->assertSame($numId, Storage::getNumericStorageId($storageId)); - } - - /** - * Test that external local storages are left alone - * - * @dataProvider settingsProvider - * - * @param string $dataDir - * @param string $userId - */ - public function testLocalExtStorageNoop($dataDir, $userId) { - $this->prepareSettings($dataDir, $userId); - $storageId = 'local::/tmp/somedir/' . $this->user; - $numId = $this->createStorage($storageId); - - $this->repair->run($this->outputMock); - - $this->assertSame($numId, Storage::getNumericStorageId($storageId)); - } - - /** - * Test that other external storages are left alone - * - * @dataProvider settingsProvider - * - * @param string $dataDir - * @param string $userId - */ - public function testExtStorageNoop($dataDir, $userId) { - $this->prepareSettings($dataDir, $userId); - $storageId = 'smb::user@password/tmp/somedir/' . $this->user; - $numId = $this->createStorage($storageId); - - $this->repair->run($this->outputMock); - - $this->assertSame($numId, Storage::getNumericStorageId($storageId)); - } - - /** - * Provides data dir and user name - */ - function settingsProvider() { - return array( - // regular data dir - array( - '/tmp/oc-autotest/datadir/', - $this->getUniqueID('user_'), - ), - // long datadir / short user - array( - '/tmp/oc-autotest/datadir01234567890123456789012345678901234567890123456789END/', - $this->getUniqueID('user_'), - ), - // short datadir / long user - array( - '/tmp/oc-autotest/datadir/', - 'u123456789012345678901234567890123456789012345678901234567890END', // 64 chars - ), - ); - } - - /** - * Only run the repair once - */ - public function testOnlyRunOnce() { - $this->outputMock->expects($this->exactly(1))->method('info'); - - $this->prepareSettings('/tmp/oc-autotest/datadir', $this->getUniqueID('user_')); - $this->assertNotEquals('yes', $this->config->getAppValue('core', 'repairlegacystoragesdone')); - $this->repair->run($this->outputMock); - $this->assertEquals('yes', $this->config->getAppValue('core', 'repairlegacystoragesdone')); - - $this->outputMock->expects($this->never())->method('info'); - $this->repair->run($this->outputMock); - $this->assertEquals('yes', $this->config->getAppValue('core', 'repairlegacystoragesdone')); - } -} diff --git a/tests/lib/Security/CertificateManagerTest.php b/tests/lib/Security/CertificateManagerTest.php index 92a063d47c70510bdb1ebe4b4484c87431718069..408e65c67660539fc19cdc3bdbc095a8bf090ea5 100644 --- a/tests/lib/Security/CertificateManagerTest.php +++ b/tests/lib/Security/CertificateManagerTest.php @@ -8,8 +8,10 @@ namespace Test\Security; +use OC\Files\Storage\Temporary; use \OC\Security\CertificateManager; use OCP\IConfig; +use OCP\ILogger; /** * Class CertificateManagerTest @@ -43,7 +45,7 @@ class CertificateManagerTest extends \Test\TestCase { $config->expects($this->any())->method('getSystemValue') ->with('installed', false)->willReturn(true); - $this->certificateManager = new CertificateManager($this->username, new \OC\Files\View(), $config); + $this->certificateManager = new CertificateManager($this->username, new \OC\Files\View(), $config, $this->createMock(ILogger::class)); } protected function tearDown() { @@ -143,7 +145,7 @@ class CertificateManagerTest extends \Test\TestCase { /** @var CertificateManager | \PHPUnit_Framework_MockObject_MockObject $certificateManager */ $certificateManager = $this->getMockBuilder('OC\Security\CertificateManager') - ->setConstructorArgs([$uid, $view, $config]) + ->setConstructorArgs([$uid, $view, $config, $this->createMock(ILogger::class)]) ->setMethods(['getFilemtimeOfCaBundle', 'getCertificateBundle']) ->getMock(); @@ -210,5 +212,4 @@ class CertificateManagerTest extends \Test\TestCase { [null, 10, 5, 8, false, true], ]; } - } diff --git a/tests/lib/ServerTest.php b/tests/lib/ServerTest.php index 02fccee628e02674433d6b31f6dc7b51fca617ec..9c375dd654ec5f09694e67c4d098ef588bbe12a0 100644 --- a/tests/lib/ServerTest.php +++ b/tests/lib/ServerTest.php @@ -79,8 +79,6 @@ class ServerTest extends \Test\TestCase { ['DateTimeFormatter', '\OCP\IDateTimeFormatter'], ['DateTimeZone', '\OC\DateTimeZone'], ['DateTimeZone', '\OCP\IDateTimeZone'], - ['Db', '\OC\AppFramework\Db\Db'], - ['Db', '\OCP\IDb'], ['EncryptionFileHelper', '\OC\Encryption\File'], ['EncryptionFileHelper', '\OCP\Encryption\IFile'], diff --git a/tests/lib/Settings/ManagerTest.php b/tests/lib/Settings/ManagerTest.php index 150609499adfd130f4e62b259602cd251c455026..70401abb65254066395fdb6a082d4d6900ac7baf 100644 --- a/tests/lib/Settings/ManagerTest.php +++ b/tests/lib/Settings/ManagerTest.php @@ -25,44 +25,52 @@ namespace Tests\Settings; use OC\Settings\Admin\Sharing; use OC\Settings\Manager; +use OC\Settings\Mapper; use OC\Settings\Section; use OCP\Encryption\IManager; use OCP\IConfig; use OCP\IDBConnection; use OCP\IL10N; use OCP\ILogger; +use OCP\IURLGenerator; use OCP\IUserManager; use OCP\Lock\ILockingProvider; use Test\TestCase; class ManagerTest extends TestCase { - /** @var Manager */ + /** @var Manager|\PHPUnit_Framework_MockObject_MockObject */ private $manager; - /** @var ILogger */ + /** @var ILogger|\PHPUnit_Framework_MockObject_MockObject */ private $logger; - /** @var IDBConnection */ + /** @var IDBConnection|\PHPUnit_Framework_MockObject_MockObject */ private $dbConnection; - /** @var IL10N */ + /** @var IL10N|\PHPUnit_Framework_MockObject_MockObject */ private $l10n; - /** @var IConfig */ + /** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */ private $config; - /** @var IManager */ + /** @var IManager|\PHPUnit_Framework_MockObject_MockObject */ private $encryptionManager; - /** @var IUserManager */ + /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */ private $userManager; - /** @var ILockingProvider */ + /** @var ILockingProvider|\PHPUnit_Framework_MockObject_MockObject */ private $lockingProvider; + /** @var Mapper|\PHPUnit_Framework_MockObject_MockObject */ + private $mapper; + /** @var IURLGenerator|\PHPUnit_Framework_MockObject_MockObject */ + private $url; public function setUp() { parent::setUp(); - $this->logger = $this->getMockBuilder('\OCP\ILogger')->getMock(); - $this->dbConnection = $this->getMockBuilder('\OCP\IDBConnection')->getMock(); - $this->l10n = $this->getMockBuilder('\OCP\IL10N')->getMock(); - $this->config = $this->getMockBuilder('\OCP\IConfig')->getMock(); - $this->encryptionManager = $this->getMockBuilder('\OCP\Encryption\IManager')->getMock(); - $this->userManager = $this->getMockBuilder('\OCP\IUserManager')->getMock(); - $this->lockingProvider = $this->getMockBuilder('\OCP\Lock\ILockingProvider')->getMock(); + $this->logger = $this->createMock(ILogger::class); + $this->dbConnection = $this->createMock(IDBConnection::class); + $this->l10n = $this->createMock(IL10N::class); + $this->config = $this->createMock(IConfig::class); + $this->encryptionManager = $this->createMock(IManager::class); + $this->userManager = $this->createMock(IUserManager::class); + $this->lockingProvider = $this->createMock(ILockingProvider::class); + $this->mapper = $this->createMock(Mapper::class); + $this->url = $this->createMock(IURLGenerator::class); $this->manager = new Manager( $this->logger, @@ -71,63 +79,50 @@ class ManagerTest extends TestCase { $this->config, $this->encryptionManager, $this->userManager, - $this->lockingProvider + $this->lockingProvider, + $this->mapper, + $this->url ); } - public function testSetupSettings() { - $qb = $this->getMockBuilder('\OCP\DB\QueryBuilder\IQueryBuilder')->getMock(); - $qb - ->expects($this->once()) - ->method('select') - ->with('class') - ->willReturn($qb); - $this->dbConnection - ->expects($this->at(0)) - ->method('getQueryBuilder') - ->willReturn($qb); - $qb - ->expects($this->once()) - ->method('from') - ->with('admin_settings') - ->willReturn($qb); - $expressionBuilder = $this->getMockBuilder('\OCP\DB\QueryBuilder\IExpressionBuilder')->getMock(); - $qb - ->expects($this->once()) - ->method('expr') - ->willReturn($expressionBuilder); - $param = $this->getMockBuilder('\OCP\DB\QueryBuilder\IParameter')->getMock(); - $qb - ->expects($this->once()) - ->method('createNamedParameter') - ->with('OCA\Files\Settings\Admin') - ->willReturn($param); - $expressionBuilder - ->expects($this->once()) - ->method('eq') - ->with('class', $param) - ->willReturn('myString'); - $qb - ->expects($this->once()) - ->method('where') - ->with('myString') - ->willReturn($qb); - $stmt = $this->getMockBuilder('\Doctrine\DBAL\Driver\Statement')->getMock(); - $qb - ->expects($this->once()) - ->method('execute') - ->willReturn($stmt); - - $qb1 = $this->getMockBuilder('\OCP\DB\QueryBuilder\IQueryBuilder')->getMock(); - $qb1 - ->expects($this->once()) - ->method('insert') - ->with('admin_settings') - ->willReturn($qb1); - $this->dbConnection - ->expects($this->at(1)) - ->method('getQueryBuilder') - ->willReturn($qb1); + public function testSetupSettingsUpdate() { + $this->mapper->expects($this->any()) + ->method('has') + ->with('admin_settings', 'OCA\Files\Settings\Admin') + ->will($this->returnValue(true)); + + $this->mapper->expects($this->once()) + ->method('update') + ->with('admin_settings', + 'class', + 'OCA\Files\Settings\Admin', [ + 'section' => 'additional', + 'priority' => 5 + ]); + $this->mapper->expects($this->never()) + ->method('add'); + + $this->manager->setupSettings([ + 'admin' => 'OCA\Files\Settings\Admin', + ]); + } + + public function testSetupSettingsAdd() { + $this->mapper->expects($this->any()) + ->method('has') + ->with('admin_settings', 'OCA\Files\Settings\Admin') + ->will($this->returnValue(false)); + + $this->mapper->expects($this->once()) + ->method('add') + ->with('admin_settings', [ + 'class' => 'OCA\Files\Settings\Admin', + 'section' => 'additional', + 'priority' => 5 + ]); + + $this->mapper->expects($this->never()) + ->method('update'); $this->manager->setupSettings([ 'admin' => 'OCA\Files\Settings\Admin', @@ -135,95 +130,71 @@ class ManagerTest extends TestCase { } public function testGetAdminSections() { - $qb = $this->getMockBuilder('\OCP\DB\QueryBuilder\IQueryBuilder')->getMock(); - $expr = $this->getMockBuilder('OCP\DB\QueryBuilder\IExpressionBuilder')->getMock(); - $qb - ->expects($this->once()) - ->method('selectDistinct') - ->with('s.class') - ->willReturn($qb); - $qb - ->expects($this->once()) - ->method('addSelect') - ->with('s.priority') - ->willReturn($qb); - $qb - ->expects($this->exactly(2)) - ->method('from') - ->willReturn($qb); - $qb - ->expects($this->once()) - ->method('expr') - ->willReturn($expr); - $qb - ->expects($this->once()) - ->method('where') - ->willReturn($qb); - $stmt = $this->getMockBuilder('\Doctrine\DBAL\Driver\Statement')->getMock(); - $qb - ->expects($this->once()) - ->method('execute') - ->willReturn($stmt); - $this->dbConnection - ->expects($this->once()) - ->method('getQueryBuilder') - ->willReturn($qb); $this->l10n ->expects($this->any()) ->method('t') ->will($this->returnArgument(0)); + $this->mapper->expects($this->once()) + ->method('getAdminSectionsFromDB') + ->will($this->returnValue([ + ['class' => \OCA\WorkflowEngine\Settings\Section::class, 'priority' => 90] + ])); + + $this->url->expects($this->exactly(5)) + ->method('imagePath') + ->willReturnMap([ + ['settings', 'admin.svg', '1'], + ['core', 'actions/share.svg', '2'], + ['core', 'actions/password.svg', '3'], + ['core', 'actions/settings-dark.svg', '4'], + ['settings', 'help.svg', '5'], + ]); + + $this->assertEquals([ + 0 => [new Section('server', 'Server settings', 0, '1')], + 5 => [new Section('sharing', 'Sharing', 0, '2')], + 45 => [new Section('encryption', 'Encryption', 0, '3')], + 90 => [\OC::$server->query(\OCA\WorkflowEngine\Settings\Section::class)], + 98 => [new Section('additional', 'Additional settings', 0, '4')], + 99 => [new Section('tips-tricks', 'Tips & tricks', 0, '5')], + ], $this->manager->getAdminSections()); + } + + public function testGetAdminSectionsEmptySection() { + $this->l10n + ->expects($this->any()) + ->method('t') + ->will($this->returnArgument(0)); + + $this->mapper->expects($this->once()) + ->method('getAdminSectionsFromDB') + ->will($this->returnValue([ + ])); + + $this->url->expects($this->exactly(5)) + ->method('imagePath') + ->willReturnMap([ + ['settings', 'admin.svg', '1'], + ['core', 'actions/share.svg', '2'], + ['core', 'actions/password.svg', '3'], + ['core', 'actions/settings-dark.svg', '4'], + ['settings', 'help.svg', '5'], + ]); + $this->assertEquals([ - 0 => [new Section('server', 'Server settings', 0)], - 5 => [new Section('sharing', 'Sharing', 0)], - 45 => [new Section('encryption', 'Encryption', 0)], - 98 => [new Section('additional', 'Additional settings', 0)], - 99 => [new Section('tips-tricks', 'Tips & tricks', 0)], + 0 => [new Section('server', 'Server settings', 0, '1')], + 5 => [new Section('sharing', 'Sharing', 0, '2')], + 45 => [new Section('encryption', 'Encryption', 0, '3')], + 98 => [new Section('additional', 'Additional settings', 0, '4')], + 99 => [new Section('tips-tricks', 'Tips & tricks', 0, '5')], ], $this->manager->getAdminSections()); } public function testGetAdminSettings() { - $qb = $this->getMockBuilder('\OCP\DB\QueryBuilder\IQueryBuilder')->getMock(); - $qb - ->expects($this->once()) - ->method('select') - ->with(['class', 'priority']) - ->willReturn($qb); - $qb - ->expects($this->once()) - ->method('from') - ->with('admin_settings') - ->willReturn($qb); - $expressionBuilder = $this->getMockBuilder('\OCP\DB\QueryBuilder\IExpressionBuilder')->getMock(); - $qb - ->expects($this->once()) - ->method('expr') - ->willReturn($expressionBuilder); - $param = $this->getMockBuilder('\OCP\DB\QueryBuilder\IParameter')->getMock(); - $qb - ->expects($this->once()) - ->method('createParameter') - ->with('section') - ->willReturn($param); - $expressionBuilder - ->expects($this->once()) - ->method('eq') - ->with('section', $param) - ->willReturn('myString'); - $qb - ->expects($this->once()) - ->method('where') - ->with('myString') - ->willReturn($qb); - $stmt = $this->getMockBuilder('\Doctrine\DBAL\Driver\Statement')->getMock(); - $qb - ->expects($this->once()) - ->method('execute') - ->willReturn($stmt); - $this->dbConnection - ->expects($this->exactly(2)) - ->method('getQueryBuilder') - ->willReturn($qb); + $this->mapper->expects($this->any()) + ->method('getAdminSettingsFromDB') + ->will($this->returnValue([])); $this->assertEquals([ 0 => [new Sharing($this->config)], diff --git a/tests/lib/Settings/MapperTest.php b/tests/lib/Settings/MapperTest.php new file mode 100644 index 0000000000000000000000000000000000000000..6a648acd5f7a89c975f13b21d2904eebc04d7c50 --- /dev/null +++ b/tests/lib/Settings/MapperTest.php @@ -0,0 +1,139 @@ + + * + * @author Robin Appelman + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace Tests\Settings; + +use OC\DB\QueryBuilder\Literal; +use OC\Settings\Mapper; +use Test\TestCase; + +/** + * @group DB + */ +class MapperTest extends TestCase { + const SECTION_PREFIX = 'test_section_'; + + /** @var Mapper */ + private $mapper; + + public function setUp() { + parent::setUp(); + $this->mapper = new Mapper(\OC::$server->getDatabaseConnection()); + } + + public function tearDown() { + parent::tearDown(); + + $db = \OC::$server->getDatabaseConnection(); + $builder = $db->getQueryBuilder(); + + $builder->delete(Mapper::TABLE_ADMIN_SECTIONS) + ->where($builder->expr()->like('id', new Literal(self::SECTION_PREFIX . '%'))); + + $builder->delete(Mapper::TABLE_ADMIN_SETTINGS) + ->where($builder->expr()->like('section', new Literal(self::SECTION_PREFIX . '%'))); + } + + public function testManipulateSettings() { + $this->assertEquals(false, $this->mapper->has(Mapper::TABLE_ADMIN_SETTINGS, '\OC\Dummy')); + $this->assertNotContains('\OC\Dummy', $this->mapper->getClasses(Mapper::TABLE_ADMIN_SETTINGS)); + + $this->mapper->add(Mapper::TABLE_ADMIN_SETTINGS, [ + 'class' => '\OC\Dummy', + 'section' => self::SECTION_PREFIX . '1', + 'priority' => 5 + ]); + + $this->assertEquals(true, $this->mapper->has(Mapper::TABLE_ADMIN_SETTINGS, '\OC\Dummy')); + + $this->assertContains('\OC\Dummy', $this->mapper->getClasses(Mapper::TABLE_ADMIN_SETTINGS)); + + $rows = $this->mapper->getAdminSettingsFromDB(self::SECTION_PREFIX . '1'); + $this->assertEquals([ + ['class' => '\OC\Dummy', 'priority' => 5] + ], $rows); + + $this->mapper->update(Mapper::TABLE_ADMIN_SETTINGS, 'class', '\OC\Dummy', [ + 'section' => self::SECTION_PREFIX . '1', 'priority' => 15 + ]); + + $rows = $this->mapper->getAdminSettingsFromDB(self::SECTION_PREFIX . '1'); + $this->assertEquals([ + ['class' => '\OC\Dummy', 'priority' => 15] + ], $rows); + + $this->mapper->update(Mapper::TABLE_ADMIN_SETTINGS, 'class', '\OC\Dummy', [ + 'section' => self::SECTION_PREFIX . '2', 'priority' => 15 + ]); + + $this->assertEquals([], $this->mapper->getAdminSettingsFromDB(self::SECTION_PREFIX . '1')); + $rows = $this->mapper->getAdminSettingsFromDB(self::SECTION_PREFIX . '2'); + $this->assertEquals([ + ['class' => '\OC\Dummy', 'priority' => 15] + ], $rows); + + $this->mapper->remove(Mapper::TABLE_ADMIN_SETTINGS, '\OC\Dummy'); + + $this->assertEquals(false, $this->mapper->has(Mapper::TABLE_ADMIN_SETTINGS, '\OC\Dummy')); + } + + public function testGetAdminSections() { + $this->assertFalse($this->mapper->has(Mapper::TABLE_ADMIN_SECTIONS, '\OC\Dummy')); + + $this->mapper->add(Mapper::TABLE_ADMIN_SECTIONS, [ + 'id' => self::SECTION_PREFIX . '1', + 'class' => '\OC\Dummy', + 'priority' => 1, + ]); + + $this->assertTrue($this->mapper->has(Mapper::TABLE_ADMIN_SECTIONS, '\OC\Dummy')); + + // until we add a setting for the section it's not returned + $this->assertNotContains([ + 'class' => '\OC\Dummy', + 'priority' => 1, + ], $this->mapper->getAdminSectionsFromDB()); + + $this->mapper->add(Mapper::TABLE_ADMIN_SETTINGS, [ + 'class' => '\OC\Dummy', + 'section' => self::SECTION_PREFIX . '1', + 'priority' => 5 + ]); + + $this->assertContains([ + 'class' => '\OC\Dummy', + 'priority' => 1, + ], $this->mapper->getAdminSectionsFromDB()); + + $this->mapper->remove(Mapper::TABLE_ADMIN_SETTINGS, '\OC\Dummy'); + + $this->assertNotContains([ + 'class' => '\OC\Dummy', + 'priority' => 1, + ], $this->mapper->getAdminSectionsFromDB()); + + $this->mapper->remove(Mapper::TABLE_ADMIN_SECTIONS, '\OC\Dummy'); + + $this->assertFalse($this->mapper->has(Mapper::TABLE_ADMIN_SECTIONS, '\OC\Dummy')); + } +} diff --git a/tests/lib/SetupTest.php b/tests/lib/SetupTest.php index a8389eaaf563652c68c264ca8c0017eb2d31d30f..acbce938a25d43f452ab8f93bee3eec7f642cb48 100644 --- a/tests/lib/SetupTest.php +++ b/tests/lib/SetupTest.php @@ -53,10 +53,6 @@ class SetupTest extends \Test\TestCase { ->will($this->returnValue( array('sqlite', 'mysql', 'oci') )); - $this->setupClass - ->expects($this->once()) - ->method('class_exists') - ->will($this->returnValue(true)); $this->setupClass ->expects($this->once()) ->method('is_callable') @@ -64,7 +60,7 @@ class SetupTest extends \Test\TestCase { $this->setupClass ->expects($this->any()) ->method('getAvailableDbDriversForPdo') - ->will($this->returnValue([])); + ->will($this->returnValue(['sqlite'])); $result = $this->setupClass->getSupportedDatabases(); $expectedResult = array( 'sqlite' => 'SQLite' @@ -80,10 +76,6 @@ class SetupTest extends \Test\TestCase { ->will($this->returnValue( array('sqlite', 'mysql', 'oci', 'pgsql') )); - $this->setupClass - ->expects($this->any()) - ->method('class_exists') - ->will($this->returnValue(false)); $this->setupClass ->expects($this->any()) ->method('is_callable') @@ -104,10 +96,6 @@ class SetupTest extends \Test\TestCase { ->will($this->returnValue( array('sqlite', 'mysql', 'pgsql', 'oci') )); - $this->setupClass - ->expects($this->any()) - ->method('class_exists') - ->will($this->returnValue(true)); $this->setupClass ->expects($this->any()) ->method('is_callable') @@ -115,7 +103,7 @@ class SetupTest extends \Test\TestCase { $this->setupClass ->expects($this->any()) ->method('getAvailableDbDriversForPdo') - ->will($this->returnValue(['mysql', 'pgsql'])); + ->will($this->returnValue(['sqlite', 'mysql', 'pgsql'])); $result = $this->setupClass->getSupportedDatabases(); $expectedResult = array( 'sqlite' => 'SQLite', diff --git a/tests/lib/Share20/ManagerTest.php b/tests/lib/Share20/ManagerTest.php index bd85e3c73aa922a462ea6aed1cb9a211498c1115..7b01a8f9e70a36dcb90d51bbe49ed80a2d187f91 100644 --- a/tests/lib/Share20/ManagerTest.php +++ b/tests/lib/Share20/ManagerTest.php @@ -61,25 +61,25 @@ class ManagerTest extends \Test\TestCase { /** @var Manager */ protected $manager; - /** @var ILogger */ + /** @var ILogger|\PHPUnit_Framework_MockObject_MockObject */ protected $logger; - /** @var IConfig */ + /** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */ protected $config; - /** @var ISecureRandom */ + /** @var ISecureRandom|\PHPUnit_Framework_MockObject_MockObject */ protected $secureRandom; - /** @var IHasher */ + /** @var IHasher|\PHPUnit_Framework_MockObject_MockObject */ protected $hasher; - /** @var IShareProvider | \PHPUnit_Framework_MockObject_MockObject */ + /** @var IShareProvider|\PHPUnit_Framework_MockObject_MockObject */ protected $defaultProvider; - /** @var IMountManager */ + /** @var IMountManager|\PHPUnit_Framework_MockObject_MockObject */ protected $mountManager; - /** @var IGroupManager */ + /** @var IGroupManager|\PHPUnit_Framework_MockObject_MockObject */ protected $groupManager; - /** @var IL10N */ + /** @var IL10N|\PHPUnit_Framework_MockObject_MockObject */ protected $l; /** @var DummyFactory */ protected $factory; - /** @var IUserManager */ + /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */ protected $userManager; /** @var IRootFolder | \PHPUnit_Framework_MockObject_MockObject */ protected $rootFolder; @@ -488,7 +488,7 @@ class ManagerTest extends \Test\TestCase { ->method('delete') ->withConsecutive($child1, $child2, $child3); - $result = $this->invokePrivate($manager, 'deleteChildren', [$share]); + $result = self::invokePrivate($manager, 'deleteChildren', [$share]); $this->assertSame($shares, $result); } @@ -532,7 +532,7 @@ class ManagerTest extends \Test\TestCase { } /** - * @expectedException InvalidArgumentException + * @expectedException \InvalidArgumentException * @expectedExceptionMessage Passwords are enforced for link shares */ public function testVerifyPasswordNullButEnforced() { @@ -540,7 +540,7 @@ class ManagerTest extends \Test\TestCase { ['core', 'shareapi_enforce_links_password', 'no', 'yes'], ])); - $this->invokePrivate($this->manager, 'verifyPassword', [null]); + self::invokePrivate($this->manager, 'verifyPassword', [null]); } public function testVerifyPasswordNull() { @@ -548,7 +548,7 @@ class ManagerTest extends \Test\TestCase { ['core', 'shareapi_enforce_links_password', 'no', 'no'], ])); - $result = $this->invokePrivate($this->manager, 'verifyPassword', [null]); + $result = self::invokePrivate($this->manager, 'verifyPassword', [null]); $this->assertNull($result); } @@ -564,12 +564,12 @@ class ManagerTest extends \Test\TestCase { } ); - $result = $this->invokePrivate($this->manager, 'verifyPassword', ['password']); + $result = self::invokePrivate($this->manager, 'verifyPassword', ['password']); $this->assertNull($result); } /** - * @expectedException Exception + * @expectedException \Exception * @expectedExceptionMessage password not accepted */ public function testVerifyPasswordHookFails() { @@ -585,7 +585,7 @@ class ManagerTest extends \Test\TestCase { } ); - $this->invokePrivate($this->manager, 'verifyPassword', ['password']); + self::invokePrivate($this->manager, 'verifyPassword', ['password']); } public function createShare($id, $type, $path, $sharedWith, $sharedBy, $shareOwner, @@ -699,6 +699,7 @@ class ManagerTest extends \Test\TestCase { * * @param $share * @param $exceptionMessage + * @param $exception */ public function testGeneralChecks($share, $exceptionMessage, $exception) { $thrown = null; @@ -718,7 +719,7 @@ class ManagerTest extends \Test\TestCase { try { - $this->invokePrivate($this->manager, 'generalCreateChecks', [$share]); + self::invokePrivate($this->manager, 'generalCreateChecks', [$share]); $thrown = false; } catch (\OCP\Share\Exceptions\GenericShareException $e) { $this->assertEquals($exceptionMessage, $e->getHint()); @@ -754,7 +755,7 @@ class ManagerTest extends \Test\TestCase { ->setSharedBy('user1') ->setNode($userFolder); - $this->invokePrivate($this->manager, 'generalCreateChecks', [$share]); + self::invokePrivate($this->manager, 'generalCreateChecks', [$share]); } /** @@ -770,11 +771,11 @@ class ManagerTest extends \Test\TestCase { $share = $this->manager->newShare(); $share->setExpirationDate($past); - $this->invokePrivate($this->manager, 'validateExpirationDate', [$share]); + self::invokePrivate($this->manager, 'validateExpirationDate', [$share]); } /** - * @expectedException InvalidArgumentException + * @expectedException \InvalidArgumentException * @expectedExceptionMessage Expiration date is enforced */ public function testvalidateExpirationDateEnforceButNotSet() { @@ -787,7 +788,7 @@ class ManagerTest extends \Test\TestCase { ['core', 'shareapi_enforce_expire_date', 'no', 'yes'], ])); - $this->invokePrivate($this->manager, 'validateExpirationDate', [$share]); + self::invokePrivate($this->manager, 'validateExpirationDate', [$share]); } public function testvalidateExpirationDateEnforceButNotEnabledAndNotSet() { @@ -799,7 +800,7 @@ class ManagerTest extends \Test\TestCase { ['core', 'shareapi_enforce_expire_date', 'no', 'yes'], ])); - $this->invokePrivate($this->manager, 'validateExpirationDate', [$share]); + self::invokePrivate($this->manager, 'validateExpirationDate', [$share]); $this->assertNull($share->getExpirationDate()); } @@ -818,7 +819,7 @@ class ManagerTest extends \Test\TestCase { $expected->setTime(0,0,0); $expected->add(new \DateInterval('P3D')); - $this->invokePrivate($this->manager, 'validateExpirationDate', [$share]); + self::invokePrivate($this->manager, 'validateExpirationDate', [$share]); $this->assertNotNull($share->getExpirationDate()); $this->assertEquals($expected, $share->getExpirationDate()); @@ -839,7 +840,7 @@ class ManagerTest extends \Test\TestCase { ])); try { - $this->invokePrivate($this->manager, 'validateExpirationDate', [$share]); + self::invokePrivate($this->manager, 'validateExpirationDate', [$share]); } catch (\OCP\Share\Exceptions\GenericShareException $e) { $this->assertEquals('Cannot set expiration date more than 3 days in the future', $e->getMessage()); $this->assertEquals('Cannot set expiration date more than 3 days in the future', $e->getHint()); @@ -871,7 +872,7 @@ class ManagerTest extends \Test\TestCase { return $data['expirationDate'] == $future; })); - $this->invokePrivate($this->manager, 'validateExpirationDate', [$share]); + self::invokePrivate($this->manager, 'validateExpirationDate', [$share]); $this->assertEquals($expected, $share->getExpirationDate()); } @@ -892,7 +893,7 @@ class ManagerTest extends \Test\TestCase { return $data['expirationDate'] == $expected && $data['passwordSet'] === false; })); - $this->invokePrivate($this->manager, 'validateExpirationDate', [$share]); + self::invokePrivate($this->manager, 'validateExpirationDate', [$share]); $this->assertEquals($expected, $share->getExpirationDate()); } @@ -907,7 +908,7 @@ class ManagerTest extends \Test\TestCase { $share = $this->manager->newShare(); $share->setPassword('password'); - $this->invokePrivate($this->manager, 'validateExpirationDate', [$share]); + self::invokePrivate($this->manager, 'validateExpirationDate', [$share]); $this->assertNull($share->getExpirationDate()); } @@ -934,7 +935,7 @@ class ManagerTest extends \Test\TestCase { return $data['expirationDate'] == $expected; })); - $this->invokePrivate($this->manager, 'validateExpirationDate', [$share]); + self::invokePrivate($this->manager, 'validateExpirationDate', [$share]); $this->assertEquals($expected, $share->getExpirationDate()); } @@ -955,7 +956,7 @@ class ManagerTest extends \Test\TestCase { $share = $this->manager->newShare(); $share->setExpirationDate($nextWeek); - $this->invokePrivate($this->manager, 'validateExpirationDate', [$share]); + self::invokePrivate($this->manager, 'validateExpirationDate', [$share]); $save->sub(new \DateInterval('P2D')); $this->assertEquals($save, $share->getExpirationDate()); @@ -980,7 +981,7 @@ class ManagerTest extends \Test\TestCase { $data['message'] = 'Invalid date!'; })); - $this->invokePrivate($this->manager, 'validateExpirationDate', [$share]); + self::invokePrivate($this->manager, 'validateExpirationDate', [$share]); } public function testValidateExpirationDateExistingShareNoDefault() { @@ -994,7 +995,7 @@ class ManagerTest extends \Test\TestCase { ['core', 'shareapi_expire_after_n_days', '7', '6'], ])); - $this->invokePrivate($this->manager, 'validateExpirationDate', [$share]); + self::invokePrivate($this->manager, 'validateExpirationDate', [$share]); $this->assertEquals(null, $share->getExpirationDate()); } @@ -1030,7 +1031,7 @@ class ManagerTest extends \Test\TestCase { ['core', 'shareapi_only_share_with_group_members', 'no', 'yes'], ])); - $this->invokePrivate($this->manager, 'userCreateChecks', [$share]); + self::invokePrivate($this->manager, 'userCreateChecks', [$share]); } public function testUserCreateChecksShareWithGroupMembersOnlySharedGroup() { @@ -1068,7 +1069,7 @@ class ManagerTest extends \Test\TestCase { ->with($path) ->willReturn([]); - $this->invokePrivate($this->manager, 'userCreateChecks', [$share]); + self::invokePrivate($this->manager, 'userCreateChecks', [$share]); } /** @@ -1093,7 +1094,7 @@ class ManagerTest extends \Test\TestCase { ->with($path) ->willReturn([$share2]); - $this->invokePrivate($this->manager, 'userCreateChecks', [$share]); + self::invokePrivate($this->manager, 'userCreateChecks', [$share]); } /** @@ -1135,7 +1136,7 @@ class ManagerTest extends \Test\TestCase { ->with($path) ->willReturn([$share2]); - $this->invokePrivate($this->manager, 'userCreateChecks', [$share]); + self::invokePrivate($this->manager, 'userCreateChecks', [$share]); } public function testUserCreateChecksIdenticalPathNotSharedWithUser() { @@ -1170,7 +1171,7 @@ class ManagerTest extends \Test\TestCase { ->with($path) ->willReturn([$share2]); - $this->invokePrivate($this->manager, 'userCreateChecks', [$share]); + self::invokePrivate($this->manager, 'userCreateChecks', [$share]); } /** @@ -1186,7 +1187,7 @@ class ManagerTest extends \Test\TestCase { ['core', 'shareapi_allow_group_sharing', 'yes', 'no'], ])); - $this->invokePrivate($this->manager, 'groupCreateChecks', [$share]); + self::invokePrivate($this->manager, 'groupCreateChecks', [$share]); } /** @@ -1212,7 +1213,7 @@ class ManagerTest extends \Test\TestCase { ['core', 'shareapi_allow_group_sharing', 'yes', 'yes'], ])); - $this->invokePrivate($this->manager, 'groupCreateChecks', [$share]); + self::invokePrivate($this->manager, 'groupCreateChecks', [$share]); } public function testGroupCreateChecksShareWithGroupMembersOnlyInGroup() { @@ -1241,7 +1242,7 @@ class ManagerTest extends \Test\TestCase { ['core', 'shareapi_allow_group_sharing', 'yes', 'yes'], ])); - $this->invokePrivate($this->manager, 'groupCreateChecks', [$share]); + self::invokePrivate($this->manager, 'groupCreateChecks', [$share]); } /** @@ -1272,7 +1273,7 @@ class ManagerTest extends \Test\TestCase { ['core', 'shareapi_allow_group_sharing', 'yes', 'yes'], ])); - $this->invokePrivate($this->manager, 'groupCreateChecks', [$share]); + self::invokePrivate($this->manager, 'groupCreateChecks', [$share]); } public function testGroupCreateChecksPathAlreadySharedWithDifferentGroup() { @@ -1296,7 +1297,7 @@ class ManagerTest extends \Test\TestCase { ['core', 'shareapi_allow_group_sharing', 'yes', 'yes'], ])); - $this->invokePrivate($this->manager, 'groupCreateChecks', [$share]); + self::invokePrivate($this->manager, 'groupCreateChecks', [$share]); } /** @@ -1312,7 +1313,7 @@ class ManagerTest extends \Test\TestCase { ['core', 'shareapi_allow_links', 'yes', 'no'], ])); - $this->invokePrivate($this->manager, 'linkCreateChecks', [$share]); + self::invokePrivate($this->manager, 'linkCreateChecks', [$share]); } /** @@ -1330,7 +1331,7 @@ class ManagerTest extends \Test\TestCase { ['core', 'shareapi_allow_links', 'yes', 'yes'], ])); - $this->invokePrivate($this->manager, 'linkCreateChecks', [$share]); + self::invokePrivate($this->manager, 'linkCreateChecks', [$share]); } /** @@ -1349,7 +1350,7 @@ class ManagerTest extends \Test\TestCase { ['core', 'shareapi_allow_public_upload', 'yes', 'no'] ])); - $this->invokePrivate($this->manager, 'linkCreateChecks', [$share]); + self::invokePrivate($this->manager, 'linkCreateChecks', [$share]); } public function testLinkCreateChecksPublicUpload() { @@ -1364,7 +1365,7 @@ class ManagerTest extends \Test\TestCase { ['core', 'shareapi_allow_public_upload', 'yes', 'yes'] ])); - $this->invokePrivate($this->manager, 'linkCreateChecks', [$share]); + self::invokePrivate($this->manager, 'linkCreateChecks', [$share]); } public function testLinkCreateChecksReadOnly() { @@ -1379,7 +1380,7 @@ class ManagerTest extends \Test\TestCase { ['core', 'shareapi_allow_public_upload', 'yes', 'no'] ])); - $this->invokePrivate($this->manager, 'linkCreateChecks', [$share]); + self::invokePrivate($this->manager, 'linkCreateChecks', [$share]); } /** @@ -1397,7 +1398,7 @@ class ManagerTest extends \Test\TestCase { $this->mountManager->method('findIn')->with('path')->willReturn([$mount]); - $this->invokePrivate($this->manager, 'pathCreateChecks', [$path]); + self::invokePrivate($this->manager, 'pathCreateChecks', [$path]); } public function testPathCreateChecksContainsNoSharedMount() { @@ -1411,13 +1412,13 @@ class ManagerTest extends \Test\TestCase { $this->mountManager->method('findIn')->with('path')->willReturn([$mount]); - $this->invokePrivate($this->manager, 'pathCreateChecks', [$path]); + self::invokePrivate($this->manager, 'pathCreateChecks', [$path]); } public function testPathCreateChecksContainsNoFolder() { $path = $this->createMock(File::class); - $this->invokePrivate($this->manager, 'pathCreateChecks', [$path]); + self::invokePrivate($this->manager, 'pathCreateChecks', [$path]); } public function dataIsSharingDisabledForUser() { @@ -1528,7 +1529,7 @@ class ManagerTest extends \Test\TestCase { $exception = false; try { - $res = $this->invokePrivate($manager, 'canShare', [$share]); + $res = self::invokePrivate($manager, 'canShare', [$share]); } catch (\Exception $e) { $exception = true; } @@ -1767,6 +1768,116 @@ class ManagerTest extends \Test\TestCase { $this->assertEquals('hashed', $share->getPassword()); } + public function testCreateShareMail() { + $manager = $this->createManagerMock() + ->setMethods([ + 'canShare', + 'generalCreateChecks', + 'linkCreateChecks', + 'pathCreateChecks', + 'validateExpirationDate', + 'verifyPassword', + 'setLinkParent', + ]) + ->getMock(); + + $shareOwner = $this->createMock(IUser::class); + $shareOwner->method('getUID')->willReturn('shareOwner'); + + $storage = $this->createMock(Storage::class); + $path = $this->createMock(File::class); + $path->method('getOwner')->willReturn($shareOwner); + $path->method('getName')->willReturn('target'); + $path->method('getId')->willReturn(1); + $path->method('getStorage')->willReturn($storage); + + $share = $this->manager->newShare(); + $share->setShareType(\OCP\Share::SHARE_TYPE_EMAIL) + ->setNode($path) + ->setSharedBy('sharedBy') + ->setPermissions(\OCP\Constants::PERMISSION_ALL); + + $manager->expects($this->once()) + ->method('canShare') + ->with($share) + ->willReturn(true); + $manager->expects($this->once()) + ->method('generalCreateChecks') + ->with($share);; + $manager->expects($this->never()) + ->method('linkCreateChecks'); + $manager->expects($this->once()) + ->method('pathCreateChecks') + ->with($path); + $manager->expects($this->never()) + ->method('validateExpirationDate'); + $manager->expects($this->never()) + ->method('verifyPassword'); + $manager->expects($this->never()) + ->method('setLinkParent'); + + $this->secureRandom->method('getMediumStrengthGenerator') + ->will($this->returnSelf()); + $this->secureRandom->method('generate') + ->willReturn('token'); + + $this->defaultProvider + ->expects($this->once()) + ->method('create') + ->with($share) + ->will($this->returnCallback(function(Share $share) { + return $share->setId(42); + })); + + $hookListner = $this->getMockBuilder('Dummy')->setMethods(['pre', 'post'])->getMock(); + \OCP\Util::connectHook('OCP\Share', 'pre_shared', $hookListner, 'pre'); + \OCP\Util::connectHook('OCP\Share', 'post_shared', $hookListner, 'post'); + + $hookListnerExpectsPre = [ + 'itemType' => 'file', + 'itemSource' => 1, + 'shareType' => \OCP\Share::SHARE_TYPE_EMAIL, + 'uidOwner' => 'sharedBy', + 'permissions' => 31, + 'fileSource' => 1, + 'expiration' => null, + 'token' => 'token', + 'run' => true, + 'error' => '', + 'itemTarget' => '/target', + 'shareWith' => null, + ]; + + $hookListnerExpectsPost = [ + 'itemType' => 'file', + 'itemSource' => 1, + 'shareType' => \OCP\Share::SHARE_TYPE_EMAIL, + 'uidOwner' => 'sharedBy', + 'permissions' => 31, + 'fileSource' => 1, + 'expiration' => null, + 'token' => 'token', + 'id' => 42, + 'itemTarget' => '/target', + 'fileTarget' => '/target', + 'shareWith' => null, + ]; + + $hookListner->expects($this->once()) + ->method('pre') + ->with($this->equalTo($hookListnerExpectsPre)); + $hookListner->expects($this->once()) + ->method('post') + ->with($this->equalTo($hookListnerExpectsPost)); + + /** @var IShare $share */ + $share = $manager->createShare($share); + + $this->assertSame('shareOwner', $share->getShareOwner()); + $this->assertEquals('/target', $share->getTarget()); + $this->assertEquals('token', $share->getToken()); + } + /** * @expectedException Exception * @expectedExceptionMessage I won't let you share @@ -2008,6 +2119,12 @@ class ManagerTest extends \Test\TestCase { } public function testGetShareByToken() { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('core', 'shareapi_allow_links', 'yes') + ->willReturn('yes'); + $factory = $this->createMock(IProviderFactory::class); $manager = new Manager( @@ -2041,6 +2158,12 @@ class ManagerTest extends \Test\TestCase { } public function testGetShareByTokenWithException() { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('core', 'shareapi_allow_links', 'yes') + ->willReturn('yes'); + $factory = $this->createMock(IProviderFactory::class); $manager = new Manager( @@ -2085,6 +2208,12 @@ class ManagerTest extends \Test\TestCase { * @expectedException \OCP\Share\Exceptions\ShareNotFound */ public function testGetShareByTokenExpired() { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('core', 'shareapi_allow_links', 'yes') + ->willReturn('yes'); + $manager = $this->createManagerMock() ->setMethods(['deleteShare']) ->getMock(); @@ -2107,6 +2236,12 @@ class ManagerTest extends \Test\TestCase { } public function testGetShareByTokenNotExpired() { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('core', 'shareapi_allow_links', 'yes') + ->willReturn('yes'); + $date = new \DateTime(); $date->setTime(0,0,0); $date->add(new \DateInterval('P2D')); @@ -2123,12 +2258,33 @@ class ManagerTest extends \Test\TestCase { $this->assertSame($share, $res); } - public function testGetShareByTokenPublicSharingDisabled() { + /** + * @expectedException \OCP\Share\Exceptions\ShareNotFound + */ + public function testGetShareByTokenWithPublicLinksDisabled() { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('core', 'shareapi_allow_links', 'yes') + ->willReturn('no'); + $this->manager->getShareByToken('validToken'); + } + + public function testGetShareByTokenPublicUploadDisabled() { + $this->config + ->expects($this->at(0)) + ->method('getAppValue') + ->with('core', 'shareapi_allow_links', 'yes') + ->willReturn('yes'); + $share = $this->manager->newShare(); $share->setShareType(\OCP\Share::SHARE_TYPE_LINK) ->setPermissions(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE); - $this->config->method('getAppValue')->will($this->returnValueMap([ + $this->config + ->expects($this->at(1)) + ->method('getAppValue') + ->will($this->returnValueMap([ ['core', 'shareapi_allow_public_upload', 'yes', 'no'], ])); diff --git a/tests/lib/StreamWrappersTest.php b/tests/lib/StreamWrappersTest.php deleted file mode 100644 index eb35fd54454fb885a76307298d9502959ad011dd..0000000000000000000000000000000000000000 --- a/tests/lib/StreamWrappersTest.php +++ /dev/null @@ -1,80 +0,0 @@ -. - * - */ - -namespace Test; - -/** - * Class StreamWrappersTest - * - * @group DB - */ -class StreamWrappersTest extends \Test\TestCase { - - private static $trashBinStatus; - - public static function setUpBeforeClass() { - self::$trashBinStatus = \OC_App::isEnabled('files_trashbin'); - \OC_App::disable('files_trashbin'); - } - - public static function tearDownAfterClass() { - if (self::$trashBinStatus) { - (new \OC_App())->enable('files_trashbin'); - } - } - - public function testFakeDir() { - $items = array('foo', 'bar'); - \OC\Files\Stream\Dir::register('test', $items); - $dh = opendir('fakedir://test'); - $result = array(); - while ($file = readdir($dh)) { - $result[] = $file; - $this->assertContains($file, $items); - } - $this->assertEquals(count($items), count($result)); - } - - public function testCloseStream() { - //ensure all basic stream stuff works - $sourceFile = \OC::$SERVERROOT . '/tests/data/lorem.txt'; - $tmpFile = \OC::$server->getTempManager()->getTemporaryFile('.txt'); - $file = 'close://' . $tmpFile; - $this->assertTrue(file_exists($file)); - file_put_contents($file, file_get_contents($sourceFile)); - $this->assertEquals(file_get_contents($sourceFile), file_get_contents($file)); - unlink($file); - clearstatcache(); - $this->assertFalse(file_exists($file)); - - //test callback - $tmpFile = \OC::$server->getTempManager()->getTemporaryFile('.txt'); - $file = 'close://' . $tmpFile; - $actual = false; - $callback = function($path) use (&$actual) { $actual = $path; }; - \OC\Files\Stream\Close::registerCallback($tmpFile, $callback); - $fh = fopen($file, 'w'); - fwrite($fh, 'asd'); - fclose($fh); - $this->assertSame($tmpFile, $actual); - } -} diff --git a/tests/lib/Template/ResourceLocatorTest.php b/tests/lib/Template/ResourceLocatorTest.php index 17326f6c691f06d76e6c8067c6d8c98d06bfbebb..580dfd60d0ecc38765f07152d5d0c08ad0ee1bd0 100644 --- a/tests/lib/Template/ResourceLocatorTest.php +++ b/tests/lib/Template/ResourceLocatorTest.php @@ -69,7 +69,7 @@ class ResourceLocatorTest extends \Test\TestCase { ->with('foo') ->will($this->throwException(new ResourceNotFoundException('foo', 'map'))); $this->logger->expects($this->exactly(2)) - ->method('error') + ->method('debug') ->with($this->stringContains('map/foo')); /** @var \OC\Template\ResourceLocator $locator */ $locator->find(array('foo')); diff --git a/tests/lib/TestCase.php b/tests/lib/TestCase.php index f115c11938af525ba127169279d62414960a2390..afed2817910468875cf9fc256f0a5afcbe802c9d 100644 --- a/tests/lib/TestCase.php +++ b/tests/lib/TestCase.php @@ -184,7 +184,9 @@ abstract class TestCase extends TestCasePhpUnitCompatibility { // fail hard if xml errors have not been cleaned up $errors = libxml_get_errors(); libxml_clear_errors(); - $this->assertEquals([], $errors); + if (!empty($errors)) { + self::assertEquals([], $errors, "There have been xml parsing errors"); + } \OC\Files\Cache\Storage::getGlobalCache()->clearCache(); diff --git a/tests/lib/User/SessionTest.php b/tests/lib/User/SessionTest.php index 27cb92d673222b369d43a11a656e1baaeabeb6f9..51560d78a6aed5cbbd3084230fc2dd2635accfd3 100644 --- a/tests/lib/User/SessionTest.php +++ b/tests/lib/User/SessionTest.php @@ -528,7 +528,7 @@ class SessionTest extends \Test\TestCase { ->getMock(); $userSession = $this->getMockBuilder(Session::class) //override, otherwise tests will fail because of setcookie() - ->setMethods(['setMagicInCookie']) + ->setMethods(['setMagicInCookie', 'setLoginName']) ->setConstructorArgs([$manager, $session, $this->timeFactory, $this->tokenProvider, $this->config, $this->random]) ->getMock(); @@ -566,6 +566,15 @@ class SessionTest extends \Test\TestCase { ->with($oldSessionId, $sessionId) ->will($this->returnValue(true)); + $tokenObject = $this->createMock(IToken::class); + $tokenObject->expects($this->once()) + ->method('getLoginName') + ->willReturn('foobar'); + $this->tokenProvider->expects($this->once()) + ->method('getToken') + ->with($sessionId) + ->willReturn($tokenObject); + $user->expects($this->any()) ->method('getUID') ->will($this->returnValue('foo')); @@ -576,6 +585,9 @@ class SessionTest extends \Test\TestCase { $session->expects($this->once()) ->method('set') ->with('user_id', 'foo'); + $userSession->expects($this->once()) + ->method('setLoginName') + ->willReturn('foobar'); $granted = $userSession->loginWithCookie('foo', $token, $oldSessionId); diff --git a/tests/lib/User/UserTest.php b/tests/lib/User/UserTest.php index 5eee5d60d04ec672405a410752ebcd83c4aeeaa9..edb8ac4224e1d0e0de05db8a6599a55d4757a1fc 100644 --- a/tests/lib/User/UserTest.php +++ b/tests/lib/User/UserTest.php @@ -10,11 +10,13 @@ namespace Test\User; use OC\Hooks\PublicEmitter; -use OC\User\Database; +use OC\User\User; use OCP\Comments\ICommentsManager; use OCP\IConfig; +use OCP\IUser; use OCP\Notification\IManager as INotificationManager; use OCP\Notification\INotification; +use Test\TestCase; /** * Class UserTest @@ -23,7 +25,7 @@ use OCP\Notification\INotification; * * @package Test\User */ -class UserTest extends \Test\TestCase { +class UserTest extends TestCase { public function testDisplayName() { /** * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend @@ -39,7 +41,7 @@ class UserTest extends \Test\TestCase { ->with($this->equalTo(\OC\User\Backend::GET_DISPLAYNAME)) ->will($this->returnValue(true)); - $user = new \OC\User\User('foo', $backend); + $user = new User('foo', $backend); $this->assertEquals('Foo', $user->getDisplayName()); } @@ -61,7 +63,7 @@ class UserTest extends \Test\TestCase { ->with($this->equalTo(\OC\User\Backend::GET_DISPLAYNAME)) ->will($this->returnValue(true)); - $user = new \OC\User\User('foo', $backend); + $user = new User('foo', $backend); $this->assertEquals('foo', $user->getDisplayName()); } @@ -78,13 +80,13 @@ class UserTest extends \Test\TestCase { ->with($this->equalTo(\OC\User\Backend::GET_DISPLAYNAME)) ->will($this->returnValue(false)); - $user = new \OC\User\User('foo', $backend); + $user = new User('foo', $backend); $this->assertEquals('foo', $user->getDisplayName()); } public function testSetPassword() { /** - * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ $backend = $this->createMock(\Test\Util\User\Dummy::class); $backend->expects($this->once()) @@ -101,13 +103,13 @@ class UserTest extends \Test\TestCase { } })); - $user = new \OC\User\User('foo', $backend); + $user = new User('foo', $backend); $this->assertTrue($user->setPassword('bar','')); } public function testSetPasswordNotSupported() { /** - * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ $backend = $this->createMock(\Test\Util\User\Dummy::class); $backend->expects($this->never()) @@ -117,13 +119,13 @@ class UserTest extends \Test\TestCase { ->method('implementsActions') ->will($this->returnValue(false)); - $user = new \OC\User\User('foo', $backend); + $user = new User('foo', $backend); $this->assertFalse($user->setPassword('bar','')); } public function testChangeAvatarSupportedYes() { /** - * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ $backend = $this->createMock(AvatarUserDummy::class); $backend->expects($this->once()) @@ -141,13 +143,13 @@ class UserTest extends \Test\TestCase { } })); - $user = new \OC\User\User('foo', $backend); + $user = new User('foo', $backend); $this->assertTrue($user->canChangeAvatar()); } public function testChangeAvatarSupportedNo() { /** - * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ $backend = $this->createMock(AvatarUserDummy::class); $backend->expects($this->once()) @@ -165,13 +167,13 @@ class UserTest extends \Test\TestCase { } })); - $user = new \OC\User\User('foo', $backend); + $user = new User('foo', $backend); $this->assertFalse($user->canChangeAvatar()); } public function testChangeAvatarNotSupported() { /** - * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ $backend = $this->createMock(AvatarUserDummy::class); $backend->expects($this->never()) @@ -181,26 +183,58 @@ class UserTest extends \Test\TestCase { ->method('implementsActions') ->willReturn(false); - $user = new \OC\User\User('foo', $backend); + $user = new User('foo', $backend); $this->assertTrue($user->canChangeAvatar()); } public function testDelete() { /** - * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ $backend = $this->createMock(\Test\Util\User\Dummy::class); $backend->expects($this->once()) ->method('deleteUser') ->with($this->equalTo('foo')); - $user = new \OC\User\User('foo', $backend); + $user = new User('foo', $backend); + $this->assertTrue($user->delete()); + } + + public function testDeleteWithDifferentHome() { + /** + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->createMock(Dummy::class); + + $backend->expects($this->at(0)) + ->method('implementsActions') + ->will($this->returnCallback(function ($actions) { + if ($actions === Backend::GET_HOME) { + return true; + } else { + return false; + } + })); + + // important: getHome MUST be called before deleteUser because + // once the user is deleted, getHome implementations might not + // return anything + $backend->expects($this->at(1)) + ->method('getHome') + ->with($this->equalTo('foo')) + ->will($this->returnValue('/home/foo')); + + $backend->expects($this->at(2)) + ->method('deleteUser') + ->with($this->equalTo('foo')); + + $user = new User('foo', $backend); $this->assertTrue($user->delete()); } public function testGetHome() { /** - * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ $backend = $this->createMock(\Test\Util\User\Dummy::class); $backend->expects($this->once()) @@ -218,20 +252,20 @@ class UserTest extends \Test\TestCase { } })); - $user = new \OC\User\User('foo', $backend); + $user = new User('foo', $backend); $this->assertEquals('/home/foo', $user->getHome()); } public function testGetBackendClassName() { - $user = new \OC\User\User('foo', new \Test\Util\User\Dummy()); + $user = new User('foo', new \Test\Util\User\Dummy()); $this->assertEquals('Dummy', $user->getBackendClassName()); - $user = new \OC\User\User('foo', new \OC\User\Database()); + $user = new User('foo', new \OC\User\Database()); $this->assertEquals('Database', $user->getBackendClassName()); } public function testGetHomeNotSupported() { /** - * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ $backend = $this->createMock(\Test\Util\User\Dummy::class); $backend->expects($this->never()) @@ -252,13 +286,13 @@ class UserTest extends \Test\TestCase { ->with($this->equalTo('datadirectory')) ->will($this->returnValue('arbitrary/path')); - $user = new \OC\User\User('foo', $backend, null, $allConfig); + $user = new User('foo', $backend, null, $allConfig); $this->assertEquals('arbitrary/path/foo', $user->getHome()); } public function testCanChangePassword() { /** - * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ $backend = $this->createMock(\Test\Util\User\Dummy::class); @@ -272,13 +306,13 @@ class UserTest extends \Test\TestCase { } })); - $user = new \OC\User\User('foo', $backend); + $user = new User('foo', $backend); $this->assertTrue($user->canChangePassword()); } public function testCanChangePasswordNotSupported() { /** - * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ $backend = $this->createMock(\Test\Util\User\Dummy::class); @@ -286,13 +320,13 @@ class UserTest extends \Test\TestCase { ->method('implementsActions') ->will($this->returnValue(false)); - $user = new \OC\User\User('foo', $backend); + $user = new User('foo', $backend); $this->assertFalse($user->canChangePassword()); } public function testCanChangeDisplayName() { /** - * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ $backend = $this->createMock(\Test\Util\User\Dummy::class); @@ -306,13 +340,13 @@ class UserTest extends \Test\TestCase { } })); - $user = new \OC\User\User('foo', $backend); + $user = new User('foo', $backend); $this->assertTrue($user->canChangeDisplayName()); } public function testCanChangeDisplayNameNotSupported() { /** - * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ $backend = $this->createMock(\Test\Util\User\Dummy::class); @@ -320,15 +354,15 @@ class UserTest extends \Test\TestCase { ->method('implementsActions') ->will($this->returnValue(false)); - $user = new \OC\User\User('foo', $backend); + $user = new User('foo', $backend); $this->assertFalse($user->canChangeDisplayName()); } public function testSetDisplayNameSupported() { /** - * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->createMock(Database::class); + $backend = $this->createMock(\OC\User\Database::class); $backend->expects($this->any()) ->method('implementsActions') @@ -345,7 +379,7 @@ class UserTest extends \Test\TestCase { ->with('foo','Foo') ->willReturn(true); - $user = new \OC\User\User('foo', $backend); + $user = new User('foo', $backend); $this->assertTrue($user->setDisplayName('Foo')); $this->assertEquals('Foo',$user->getDisplayName()); } @@ -355,9 +389,9 @@ class UserTest extends \Test\TestCase { */ public function testSetDisplayNameEmpty() { /** - * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->createMock(Database::class); + $backend = $this->createMock(\OC\User\Database::class); $backend->expects($this->any()) ->method('implementsActions') @@ -369,16 +403,16 @@ class UserTest extends \Test\TestCase { } })); - $user = new \OC\User\User('foo', $backend); + $user = new User('foo', $backend); $this->assertFalse($user->setDisplayName(' ')); $this->assertEquals('foo',$user->getDisplayName()); } public function testSetDisplayNameNotSupported() { /** - * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->createMock(Database::class); + $backend = $this->createMock(\OC\User\Database::class); $backend->expects($this->any()) ->method('implementsActions') @@ -387,7 +421,7 @@ class UserTest extends \Test\TestCase { $backend->expects($this->never()) ->method('setDisplayName'); - $user = new \OC\User\User('foo', $backend); + $user = new User('foo', $backend); $this->assertFalse($user->setDisplayName('Foo')); $this->assertEquals('foo',$user->getDisplayName()); } @@ -397,14 +431,14 @@ class UserTest extends \Test\TestCase { $test = $this; /** - * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ $backend = $this->createMock(\Test\Util\User\Dummy::class); $backend->expects($this->once()) ->method('setPassword'); /** - * @param \OC\User\User $user + * @param User $user * @param string $password */ $hook = function ($user, $password) use ($test, &$hooksCalled) { @@ -427,7 +461,7 @@ class UserTest extends \Test\TestCase { } })); - $user = new \OC\User\User('foo', $backend, $emitter); + $user = new User('foo', $backend, $emitter); $user->setPassword('bar',''); $this->assertEquals(2, $hooksCalled); @@ -450,17 +484,17 @@ class UserTest extends \Test\TestCase { $test = $this; /** - * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ $backend = $this->createMock(\Test\Util\User\Dummy::class); $backend->expects($this->once()) ->method('deleteUser') ->willReturn($result); $emitter = new PublicEmitter(); - $user = new \OC\User\User('foo', $backend, $emitter); + $user = new User('foo', $backend, $emitter); /** - * @param \OC\User\User $user + * @param User $user */ $hook = function ($user) use ($test, &$hooksCalled) { $hooksCalled++; @@ -527,7 +561,7 @@ class UserTest extends \Test\TestCase { public function testGetCloudId() { /** - * @var \OC\User\Backend | \PHPUnit_Framework_MockObject_MockObject $backend + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ $backend = $this->createMock(\Test\Util\User\Dummy::class); $urlGenerator = $this->getMockBuilder('\OC\URLGenerator') @@ -538,7 +572,160 @@ class UserTest extends \Test\TestCase { ->method('getAbsoluteURL') ->withAnyParameters() ->willReturn('http://localhost:8888/owncloud'); - $user = new \OC\User\User('foo', $backend, null, null, $urlGenerator); - $this->assertEquals("foo@localhost:8888/owncloud", $user->getCloudId()); + $user = new User('foo', $backend, null, null, $urlGenerator); + $this->assertEquals('foo@localhost:8888/owncloud', $user->getCloudId()); + } + + public function testSetEMailAddressEmpty() { + /** + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->createMock(\Test\Util\User\Dummy::class); + + $test = $this; + $hooksCalled = 0; + + /** + * @param IUser $user + * @param string $feature + * @param string $value + */ + $hook = function (IUser $user, $feature, $value) use ($test, &$hooksCalled) { + $hooksCalled++; + $test->assertEquals('eMailAddress', $feature); + $test->assertEquals('', $value); + }; + + $emitter = new PublicEmitter(); + $emitter->listen('\OC\User', 'changeUser', $hook); + + $config = $this->createMock(IConfig::class); + $config->expects($this->once()) + ->method('deleteUserValue') + ->with( + 'foo', + 'settings', + 'email' + ); + + $user = new User('foo', $backend, $emitter, $config); + $user->setEMailAddress(''); + } + + public function testSetEMailAddress() { + /** + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->createMock(\Test\Util\User\Dummy::class); + + $test = $this; + $hooksCalled = 0; + + /** + * @param IUser $user + * @param string $feature + * @param string $value + */ + $hook = function (IUser $user, $feature, $value) use ($test, &$hooksCalled) { + $hooksCalled++; + $test->assertEquals('eMailAddress', $feature); + $test->assertEquals('foo@bar.com', $value); + }; + + $emitter = new PublicEmitter(); + $emitter->listen('\OC\User', 'changeUser', $hook); + + $config = $this->createMock(IConfig::class); + $config->expects($this->once()) + ->method('setUserValue') + ->with( + 'foo', + 'settings', + 'email', + 'foo@bar.com' + ); + + $user = new User('foo', $backend, $emitter, $config); + $user->setEMailAddress('foo@bar.com'); + } + + public function testGetLastLogin() { + /** + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->createMock(\Test\Util\User\Dummy::class); + + $config = $this->createMock(IConfig::class); + $config->method('getUserValue') + ->will($this->returnCallback(function ($uid, $app, $key, $default) { + if ($uid === 'foo' && $app === 'login' && $key === 'lastLogin') { + return 42; + } else { + return $default; + } + })); + + $user = new User('foo', $backend, null, $config); + $this->assertSame(42, $user->getLastLogin()); + } + + public function testSetEnabled() { + /** + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->createMock(\Test\Util\User\Dummy::class); + + $config = $this->createMock(IConfig::class); + $config->expects($this->once()) + ->method('setUserValue') + ->with( + $this->equalTo('foo'), + $this->equalTo('core'), + $this->equalTo('enabled'), + 'true' + ); + + $user = new User('foo', $backend, null, $config); + $user->setEnabled(true); + } + + public function testSetDisabled() { + /** + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->createMock(\Test\Util\User\Dummy::class); + + $config = $this->createMock(IConfig::class); + $config->expects($this->once()) + ->method('setUserValue') + ->with( + $this->equalTo('foo'), + $this->equalTo('core'), + $this->equalTo('enabled'), + 'false' + ); + + $user = new User('foo', $backend, null, $config); + $user->setEnabled(false); + } + + public function testGetEMailAddress() { + /** + * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->createMock(\Test\Util\User\Dummy::class); + + $config = $this->createMock(IConfig::class); + $config->method('getUserValue') + ->will($this->returnCallback(function ($uid, $app, $key, $default) { + if ($uid === 'foo' && $app === 'settings' && $key === 'email') { + return 'foo@bar.com'; + } else { + return $default; + } + })); + + $user = new User('foo', $backend, null, $config); + $this->assertSame('foo@bar.com', $user->getEMailAddress()); } } diff --git a/tests/lib/UserTest.php b/tests/lib/UserTest.php index 7a033c2921e9e0dcb3d932ce6c005bf7d342306b..2a477522dea72451af24bdca423469484dc10fbe 100644 --- a/tests/lib/UserTest.php +++ b/tests/lib/UserTest.php @@ -25,7 +25,7 @@ class UserTest extends TestCase { protected function setUp(){ parent::setUp(); - $this->backend = $this->getMock('\Test\Util\User\Dummy'); + $this->backend = $this->createMock(\Test\Util\User\Dummy::class); $manager = \OC::$server->getUserManager(); $manager->registerBackend($this->backend); } diff --git a/tests/preseed-config.php b/tests/preseed-config.php index e2c5a55fa58fb633f592539c878451a80cbbeeb4..53579406472d44e000a2acf2b58f678f4bb8093e 100644 --- a/tests/preseed-config.php +++ b/tests/preseed-config.php @@ -21,3 +21,20 @@ if (is_dir(OC::$SERVERROOT.'/apps2')) { if (substr(strtolower(PHP_OS), 0, 3) === 'win') { $CONFIG['openssl'] = ['config' => OC::$SERVERROOT . '/tests/data/openssl.cnf']; } + +if (getenv('OBJECT_STORE') === 's3') { + $CONFIG['objectstore'] = [ + 'class' => 'OC\\Files\\ObjectStore\\S3', + 'arguments' => array( + 'bucket' => 'nextcloud', + 'autocreate' => true, + 'key' => 'dummy', + 'secret' => 'dummy', + 'hostname' => 'localhost', + 'port' => 4569, + 'use_ssl' => false, + // required for some non amazon s3 implementations + 'use_path_style' => true + ) + ]; +} diff --git a/themes/example/defaults.php b/themes/example/defaults.php index 25ec350ed1b0b02e105287b6e855f80b4fc50655..1a2389d0bc26e0af3e0f8fc5e4eff29cf42eaaff 100644 --- a/themes/example/defaults.php +++ b/themes/example/defaults.php @@ -41,7 +41,7 @@ class OC_Theme { * @return string URL */ public function getiOSClientUrl() { - return 'https://itunes.apple.com/us/app/owncloud/id543672169?mt=8'; + return 'https://itunes.apple.com/us/app/nextcloud/id1125420102?mt=8'; } /** @@ -49,7 +49,7 @@ class OC_Theme { * @return string AppId */ public function getiTunesAppId() { - return '543672169'; + return '1125420102'; } /** @@ -65,7 +65,7 @@ class OC_Theme { * @return string URL */ public function getDocBaseUrl() { - return 'https://docs.nextcloud.org'; + return 'https://docs.nextcloud.com'; } /** diff --git a/version.php b/version.php index 10eac196be79810ab39d47ee5f46e254f0054286..90f4e65055aa7b4dab2858605dae653d05c83185 100644 --- a/version.php +++ b/version.php @@ -26,12 +26,12 @@ // between betas, final and RCs. This is _not_ the public version number. Reset minor/patchlevel // when updating major/minor version number. -$OC_Version = array(11, 0, 0, 6); +$OC_Version = array(12, 0, 0, 12); // The human readable string -$OC_VersionString = '11.0 RC1'; +$OC_VersionString = '12.0 alpha'; -$OC_VersionCanBeUpgradedFrom = array(9, 1); +$OC_VersionCanBeUpgradedFrom = array(11); // default Nextcloud channel $OC_Channel = 'git';