Merge branch 'develop' into builder-ui

Conflicts:
	modules/backend/widgets/table/assets/js/build-min.js
	modules/backend/widgets/table/assets/js/table.js
This commit is contained in:
alekseybobkov 2015-10-15 17:32:19 -07:00
commit a5b217ff0b
189 changed files with 5135 additions and 1446 deletions

View File

@ -1,3 +1,22 @@
* **Build 304** (2015-10-09)
- Added new `where` and `whereComponent` methods for querying CMS template properties.
* **Build 300** (2015-10-03)
- **Happy 2nd Birthday October!**
- Page settings now support infinite array nesting with October flavored INI syntax via `Ini::parse` and `Ini::render`.
- Added new helper `Twig::parse` for parsing Twig (see Services > Parser docs).
* **Build 298** (2015-09-24)
- Added the ability to use a wildcard URL parameter in CMS pages (see CMS > Pages docs).
* **Build 297** (2015-09-19)
- Introduced new `Revisionable` trait for storing model history (see Database > Traits docs).
- Added `timetense` list column type (see Backend > Lists docs), along with `|time_since` and `|time_tense` Twig filters.
- Fixed a bug in deferred binding that allowed repeat bindings and ignored add/delete pairs.
* **Build 293** (2015-09-07)
- Corrected a flaw in the Behavior/Extension logic that previously made protected methods and properties accessible as if they were public.
* **Build 292** (2015-08-28)
- Added a new controller method `fireViewEvent()` for extending views and partials (see Plugins > Events docs).
- Fixes a bug where the database falls asleep during an update.

View File

@ -15,7 +15,7 @@ The best place to learn October is by [reading the documentation](http://october
### Installing October
Instructions on how to install October can be found at the [installation guide](http://octobercms.com/docs/help/install).
Instructions on how to install October can be found at the [installation guide](http://octobercms.com/docs/setup/installation).
### Development Team

View File

@ -111,6 +111,14 @@ class ServiceProvider extends ModuleServiceProvider
'label' => 'system::lang.permissions.manage_other_administrators',
'tab' => 'system::lang.permissions.name'
],
'backend.manage_preferences' => [
'label' => 'system::lang.permissions.manage_preferences',
'tab' => 'system::lang.permissions.name'
],
'backend.manage_editor' => [
'label' => 'system::lang.permissions.manage_editor',
'tab' => 'system::lang.permissions.name'
],
'backend.manage_branding' => [
'label' => 'system::lang.permissions.manage_branding',
'tab' => 'system::lang.permissions.name'
@ -208,6 +216,7 @@ class ServiceProvider extends ModuleServiceProvider
'category' => SettingsManager::CATEGORY_MYSETTINGS,
'icon' => 'icon-laptop',
'class' => 'Backend\Models\BackendPreferences',
'permissions' => ['backend.manage_preferences'],
'order' => 510,
'context' => 'mysettings'
],
@ -217,6 +226,7 @@ class ServiceProvider extends ModuleServiceProvider
'category' => SettingsManager::CATEGORY_MYSETTINGS,
'icon' => 'icon-code',
'url' => Backend::URL('backend/editorpreferences'),
'permissions' => ['backend.manage_editor'],
'order' => 520,
'context' => 'mysettings'
],

View File

@ -85,7 +85,6 @@
.pulseWarningIns{-webkit-animation:pulseWarningIns 0.75s infinite alternate;animation:pulseWarningIns 0.75s infinite alternate}
.sweet-overlay{background-color:rgba(0,0,0,0.4);position:fixed;left:0;right:0;top:0;bottom:0;display:none;z-index:8050}
.sweet-alert{background-color:#f9f9f9;width:478px;padding:17px;border-radius:5px;text-align:center;position:fixed;left:50%;top:50%;margin-left:-256px;margin-top:-200px;overflow:hidden;display:none;z-index:9050}
.sweet-alert h4{margin:30px 0;word-wrap:break-word}
@media all and (max-width:767px){.sweet-alert{width:auto;margin-left:0;margin-right:0;left:15px;right:15px}
}
.sweet-alert .icon{width:80px;height:80px;border:4px solid gray;border-radius:50%;margin:20px auto;position:relative;box-sizing:content-box}
@ -117,7 +116,7 @@
.sweet-alert .btn-warning:focus{border-color:#eea236;outline:0}
.sweet-alert button::-moz-focus-inner{border:0}
.sweet-alert{text-align:right}
.sweet-alert h4{word-break:word-break;word-wrap:break-word;max-height:350px;overflow-y:auto;margin:10px 0 17px 0;color:#2b3e50;text-align:left;font-size:15px;line-height:23px}
.sweet-alert h2{word-break:word-break;word-wrap:break-word;max-height:350px;overflow-y:auto;margin:10px 0 17px 0;color:#2b3e50;text-align:left;font-size:15px;line-height:23px}
.sweet-alert p{margin:0}
.sweet-alert p.text-muted{margin-bottom:20px;color:#555555}
.control-simplelist{font-size:13px}
@ -395,7 +394,7 @@
.control-treeview ol > li.drop-target.has-subitems > div:before{background-position:0px -102px}
}
.sidenav-tree{width:280px;background:#34495e}
.sidenav-tree .control-toolbar{height:auto;padding:20px 0 20px 20px}
.sidenav-tree .control-toolbar{padding:20px 0 20px 20px}
.sidenav-tree .control-toolbar input.form-control{border:none}
.sidenav-tree ul{padding:0;margin:0;list-style:none}
.sidenav-tree div.scrollbar-thumb{background:#2b3e50 !important}
@ -629,7 +628,7 @@ body.slim-container .layout.layout-container,body.slim-container .layout .layout
.layout.responsive-sidebar > .layout-cell:last-child .layout-absolute{position:static}
}
body.mainmenu-open{overflow:hidden}
nav#layout-mainmenu.navbar{background-color:#111111;height:auto;padding:0 0 0 20px;line-height:0;white-space:nowrap}
nav#layout-mainmenu.navbar{background-color:#111111;padding:0 0 0 20px;line-height:0;white-space:nowrap}
nav#layout-mainmenu.navbar a{text-decoration:none}
nav#layout-mainmenu.navbar a:focus{background:transparent}
nav#layout-mainmenu.navbar ul{margin:0;padding:0;list-style:none;float:left;font-weight:600;white-space:nowrap;overflow:hidden}
@ -666,6 +665,8 @@ nav#layout-mainmenu.navbar ul li a,nav#layout-mainmenu .menu-toggle,.mainmenu-co
nav#layout-mainmenu.navbar ul li a:hover,nav#layout-mainmenu .menu-toggle:hover,.mainmenu-collapsed li a:hover{background-color:transparent !important}
nav#layout-mainmenu.navbar ul li a:active,nav#layout-mainmenu .menu-toggle:active,.mainmenu-collapsed li a:active,nav#layout-mainmenu.navbar ul li a:focus,nav#layout-mainmenu .menu-toggle:focus,.mainmenu-collapsed li a:focus{text-decoration:none;color:#555555}
nav#layout-mainmenu.navbar ul li a i,nav#layout-mainmenu .menu-toggle i,.mainmenu-collapsed li a i{line-height:1;font-size:35px;vertical-align:middle;margin-right:10px}
nav#layout-mainmenu.navbar ul li a i{font-size:28px}
nav#layout-mainmenu.navbar ul li.active a i{font-size:35px}
.mainmenu-collapsed li a i{width:40px;text-align:left;display:inline-block}
nav#layout-mainmenu.navbar ul li:hover a:active,.mainmenu-collapsed li:hover a:active,nav#layout-mainmenu.navbar ul li:hover a:focus,.mainmenu-collapsed li:hover a:focus{color:#ffffff !important}
.touch .mainmenu-collapsed li a:hover{color:#555555}

View File

@ -415,15 +415,15 @@ ratio=py/ih;if(ratio===0){return 1;}else{return ratio;}};drawImageIOSFix=functio
(e.type==="load"?win:doc)[rem](pre+e.type,init,false);if(!done&&(done=true)){return fn.call(win,e.type||e);}};poll=function(){var e;try{root.doScroll("left");}catch(_error){e=_error;setTimeout(poll,50);return;}
return init("poll");};if(doc.readyState!=="complete"){if(doc.createEventObject&&root.doScroll){try{top=!win.frameElement;}catch(_error){}
if(top){poll();}}
doc[add](pre+"DOMContentLoaded",init,false);doc[add](pre+"readystatechange",init,false);return win[add](pre+"load",init,false);}};Dropzone._autoDiscoverFunction=function(){if(Dropzone.autoDiscover){return Dropzone.discover();}};contentLoaded(window,Dropzone._autoDiscoverFunction);}).call(this);(function(window,document){var modalClass='.sweet-alert',overlayClass='.sweet-overlay',alertTypes=['error','warning','info','success'],defaultParams={title:'',text:'',type:null,allowOutsideClick:false,showCancelButton:false,closeOnConfirm:true,closeOnCancel:true,confirmButtonText:'OK',confirmButtonClass:'btn-primary',cancelButtonText:'Cancel',cancelButtonClass:'btn-default',imageUrl:null,imageSize:null,timer:null};var getModal=function(){return document.querySelector(modalClass);},getOverlay=function(){return document.querySelector(overlayClass);},hasClass=function(elem,className){return new RegExp(' '+className+' ').test(' '+elem.className+' ');},addClass=function(elem,className){if(!hasClass(elem,className)){elem.className+=' '+className;}},removeClass=function(elem,className){var newClass=' '+elem.className.replace(/[\t\r\n]/g,' ')+' ';if(hasClass(elem,className)){while(newClass.indexOf(' '+className+' ')>=0){newClass=newClass.replace(' '+className+' ',' ');}
doc[add](pre+"DOMContentLoaded",init,false);doc[add](pre+"readystatechange",init,false);return win[add](pre+"load",init,false);}};Dropzone._autoDiscoverFunction=function(){if(Dropzone.autoDiscover){return Dropzone.discover();}};contentLoaded(window,Dropzone._autoDiscoverFunction);}).call(this);(function(window,document){var modalClass='.sweet-alert',overlayClass='.sweet-overlay',alertTypes=['error','warning','info','success'],defaultParams={title:'',text:'',type:null,allowOutsideClick:false,showCancelButton:false,showConfirmButton:true,closeOnConfirm:true,closeOnCancel:true,confirmButtonText:'OK',confirmButtonClass:'btn-primary',cancelButtonText:'Cancel',cancelButtonClass:'btn-default',containerClass:'',titleClass:'',textClass:'',imageUrl:null,imageSize:null,timer:null};var getModal=function(){return document.querySelector(modalClass);},getOverlay=function(){return document.querySelector(overlayClass);},hasClass=function(elem,className){return new RegExp(' '+className+' ').test(' '+elem.className+' ');},addClass=function(elem,className){if(className&&!hasClass(elem,className)){elem.className+=' '+className;}},removeClass=function(elem,className){var newClass=' '+elem.className.replace(/[\t\r\n]/g,' ')+' ';if(hasClass(elem,className)){while(newClass.indexOf(' '+className+' ')>=0){newClass=newClass.replace(' '+className+' ',' ');}
elem.className=newClass.replace(/^\s+|\s+$/g,'');}},escapeHtml=function(str){var div=document.createElement('div');div.appendChild(document.createTextNode(str));return div.innerHTML;},_show=function(elem){elem.style.opacity='';elem.style.display='block';},show=function(elems){if(elems&&!elems.length){return _show(elems);}
for(var i=0;i<elems.length;++i){_show(elems[i]);}},_hide=function(elem){elem.style.opacity='';elem.style.display='none';},hide=function(elems){if(elems&&!elems.length){return _hide(elems);}
for(var i=0;i<elems.length;++i){_hide(elems[i]);}},isDescendant=function(parent,child){var node=child.parentNode;while(node!==null){if(node===parent){return true;}
node=node.parentNode;}
return false;},getTopMargin=function(elem){elem.style.left='-9999px';elem.style.display='block';var height=elem.clientHeight;var padding=parseInt(getComputedStyle(elem).getPropertyValue('padding'),10);elem.style.left='';elem.style.display='none';return('-'+parseInt(height/2+padding)+'px');},fadeIn=function(elem,interval){if(+elem.style.opacity<1){interval=interval||16;elem.style.opacity=0;elem.style.display='block';var last=+new Date();var tick=function(){elem.style.opacity=+elem.style.opacity+(new Date()-last)/100;last=+new Date();if(+elem.style.opacity<1){setTimeout(tick,interval);}};tick();}},fadeOut=function(elem,interval){interval=interval||16;elem.style.opacity=1;var last=+new Date();var tick=function(){elem.style.opacity=+elem.style.opacity-(new Date()-last)/100;last=+new Date();if(+elem.style.opacity>0){setTimeout(tick,interval);}else{elem.style.display='none';}};tick();},fireClick=function(node){if(MouseEvent){var mevt=new MouseEvent('click',{view:window,bubbles:false,cancelable:true});node.dispatchEvent(mevt);}else if(document.createEvent){var evt=document.createEvent('MouseEvents');evt.initEvent('click',false,false);node.dispatchEvent(evt);}else if(document.createEventObject){node.fireEvent('onclick');}else if(typeof node.onclick==='function'){node.onclick();}},stopEventPropagation=function(e){if(typeof e.stopPropagation==='function'){e.stopPropagation();e.preventDefault();}else if(window.event&&window.event.hasOwnProperty('cancelBubble')){window.event.cancelBubble=true;}};var previousActiveElement,previousDocumentClick,previousWindowKeyDown,lastFocusedButton;window.sweetAlertInitialize=function(){var sweetHTML='<div class="sweet-overlay" tabIndex="-1"></div><div class="sweet-alert" tabIndex="-1"><div class="icon error"><span class="x-mark"><span class="line left"></span><span class="line right"></span></span></div><div class="icon warning"> <span class="body"></span> <span class="dot"></span> </div> <div class="icon info"></div> <div class="icon success"> <span class="line tip"></span> <span class="line long"></span> <div class="placeholder"></div> <div class="fix"></div> </div> <div class="icon custom"></div> <h4>Title</h4><p class="text-muted">Text</p><p><button class="cancel btn" tabIndex="2">Cancel</button> <button class="confirm btn" tabIndex="1">OK</button></p></div>',sweetWrap=document.createElement('div');sweetWrap.innerHTML=sweetHTML;document.body.appendChild(sweetWrap);}
return false;},getTopMargin=function(elem){elem.style.left='-9999px';elem.style.display='block';var height=elem.clientHeight;var padding=parseInt(getComputedStyle(elem).getPropertyValue('padding'),10);elem.style.left='';elem.style.display='none';return('-'+parseInt(height/2+padding)+'px');},fadeIn=function(elem,interval){if(+elem.style.opacity<1){interval=interval||16;elem.style.opacity=0;elem.style.display='block';var last=+new Date();var tick=function(){elem.style.opacity=+elem.style.opacity+(new Date()-last)/100;last=+new Date();if(+elem.style.opacity<1){setTimeout(tick,interval);}};tick();}},fadeOut=function(elem,interval){interval=interval||16;elem.style.opacity=1;var last=+new Date();var tick=function(){elem.style.opacity=+elem.style.opacity-(new Date()-last)/100;last=+new Date();if(+elem.style.opacity>0){setTimeout(tick,interval);}else{elem.style.display='none';}};tick();},fireClick=function(node){if(MouseEvent){var mevt=new MouseEvent('click',{view:window,bubbles:false,cancelable:true});node.dispatchEvent(mevt);}else if(document.createEvent){var evt=document.createEvent('MouseEvents');evt.initEvent('click',false,false);node.dispatchEvent(evt);}else if(document.createEventObject){node.fireEvent('onclick');}else if(typeof node.onclick==='function'){node.onclick();}},stopEventPropagation=function(e){if(typeof e.stopPropagation==='function'){e.stopPropagation();e.preventDefault();}else if(window.event&&window.event.hasOwnProperty('cancelBubble')){window.event.cancelBubble=true;}};var previousActiveElement,previousDocumentClick,previousWindowKeyDown,lastFocusedButton;window.sweetAlertInitialize=function(){var sweetHTML='<div class="sweet-overlay" tabIndex="-1"></div><div class="sweet-alert" tabIndex="-1"><div class="icon error"><span class="x-mark"><span class="line left"></span><span class="line right"></span></span></div><div class="icon warning"> <span class="body"></span> <span class="dot"></span> </div> <div class="icon info"></div> <div class="icon success"> <span class="line tip"></span> <span class="line long"></span> <div class="placeholder"></div> <div class="fix"></div> </div> <div class="icon custom"></div> <h2>Title</h2><p class="lead text-muted">Text</p><p><button class="cancel btn" tabIndex="2">Cancel</button> <button class="confirm btn" tabIndex="1">OK</button></p></div>',sweetWrap=document.createElement('div');sweetWrap.innerHTML=sweetHTML;document.body.appendChild(sweetWrap);}
window.sweetAlert=window.swal=function(){if(arguments[0]===undefined){window.console.error('sweetAlert expects at least 1 attribute!');return false;}
var params=extend({},defaultParams);switch(typeof arguments[0]){case'string':params.title=arguments[0];params.text=arguments[1]||'';params.type=arguments[2]||'';break;case'object':if(arguments[0].title===undefined){window.console.error('Missing "title" argument!');return false;}
params.title=arguments[0].title;params.text=arguments[0].text||defaultParams.text;params.type=arguments[0].type||defaultParams.type;params.allowOutsideClick=arguments[0].allowOutsideClick||defaultParams.allowOutsideClick;params.showCancelButton=arguments[0].showCancelButton!==undefined?arguments[0].showCancelButton:defaultParams.showCancelButton;params.closeOnConfirm=arguments[0].closeOnConfirm!==undefined?arguments[0].closeOnConfirm:defaultParams.closeOnConfirm;params.closeOnCancel=arguments[0].closeOnCancel!==undefined?arguments[0].closeOnCancel:defaultParams.closeOnCancel;params.timer=arguments[0].timer||defaultParams.timer;params.confirmButtonText=(defaultParams.showCancelButton)?'Confirm':defaultParams.confirmButtonText;params.confirmButtonText=arguments[0].confirmButtonText||defaultParams.confirmButtonText;params.confirmButtonClass=arguments[0].confirmButtonClass||defaultParams.confirmButtonClass;params.cancelButtonText=arguments[0].cancelButtonText||defaultParams.cancelButtonText;params.cancelButtonClass=arguments[0].cancelButtonClass||defaultParams.cancelButtonClass;params.imageUrl=arguments[0].imageUrl||defaultParams.imageUrl;params.imageSize=arguments[0].imageSize||defaultParams.imageSize;params.doneFunction=arguments[1]||null;break;default:window.console.error('Unexpected type of argument! Expected "string" or "object", got '+typeof arguments[0]);return false;}
params.title=arguments[0].title;params.text=arguments[0].text||defaultParams.text;params.type=arguments[0].type||defaultParams.type;params.allowOutsideClick=arguments[0].allowOutsideClick||defaultParams.allowOutsideClick;params.showCancelButton=arguments[0].showCancelButton!==undefined?arguments[0].showCancelButton:defaultParams.showCancelButton;params.showConfirmButton=arguments[0].showConfirmButton!==undefined?arguments[0].showConfirmButton:defaultParams.showConfirmButton;params.closeOnConfirm=arguments[0].closeOnConfirm!==undefined?arguments[0].closeOnConfirm:defaultParams.closeOnConfirm;params.closeOnCancel=arguments[0].closeOnCancel!==undefined?arguments[0].closeOnCancel:defaultParams.closeOnCancel;params.timer=arguments[0].timer||defaultParams.timer;params.confirmButtonText=(defaultParams.showCancelButton)?'Confirm':defaultParams.confirmButtonText;params.confirmButtonText=arguments[0].confirmButtonText||defaultParams.confirmButtonText;params.confirmButtonClass=arguments[0].confirmButtonClass||(arguments[0].type?'btn-'+arguments[0].type:null)||defaultParams.confirmButtonClass;params.cancelButtonText=arguments[0].cancelButtonText||defaultParams.cancelButtonText;params.cancelButtonClass=arguments[0].cancelButtonClass||defaultParams.cancelButtonClass;params.containerClass=arguments[0].containerClass||defaultParams.containerClass;params.titleClass=arguments[0].titleClass||defaultParams.titleClass;params.textClass=arguments[0].textClass||defaultParams.textClass;params.imageUrl=arguments[0].imageUrl||defaultParams.imageUrl;params.imageSize=arguments[0].imageSize||defaultParams.imageSize;params.doneFunction=arguments[1]||null;break;default:window.console.error('Unexpected type of argument! Expected "string" or "object", got '+typeof arguments[0]);return false;}
setParameters(params);fixVerticalPosition();openModal();var modal=getModal();var onButtonEvent=function(e){var target=e.target||e.srcElement,targetedConfirm=(target.className.indexOf('confirm')>-1),modalIsVisible=hasClass(modal,'visible'),doneFunctionExists=(params.doneFunction&&modal.getAttribute('data-has-done-function')==='true');switch(e.type){case("click"):if(targetedConfirm&&doneFunctionExists&&modalIsVisible){params.doneFunction(true);if(params.closeOnConfirm){closeModal();}}else if(doneFunctionExists&&modalIsVisible){var functionAsStr=String(params.doneFunction).replace(/\s/g,'');var functionHandlesCancel=functionAsStr.substring(0,9)==="function("&&functionAsStr.substring(9,10)!==")";if(functionHandlesCancel){params.doneFunction(false);}
if(params.closeOnCancel){closeModal();}}else{closeModal();}
break;}};var $buttons=modal.querySelectorAll('button');for(var i=0;i<$buttons.length;i++){$buttons[i].onclick=onButtonEvent;}
@ -437,17 +437,19 @@ if(modalIsVisible){var btnIndex=-1;if($focusElement!==null){for(var i=0;i<$modal
if(btnIndex===-1){$targetElement.focus();}}else{lastFocusedButton=$targetElement;}}}
$okButton.onblur=handleOnBlur;$cancelButton.onblur=handleOnBlur;window.onfocus=function(){window.setTimeout(function(){if(lastFocusedButton!==undefined){lastFocusedButton.focus();lastFocusedButton=undefined;}},0);};};window.swal.setDefaults=function(userParams){if(!userParams){throw new Error('userParams is required');}
if(typeof userParams!=='object'){throw new Error('userParams has to be a object');}
extend(defaultParams,userParams);};function setParameters(params){var modal=getModal();var $title=modal.querySelector('h4'),$text=modal.querySelector('p'),$cancelBtn=modal.querySelector('button.cancel'),$confirmBtn=modal.querySelector('button.confirm');$title.innerHTML=escapeHtml(params.title).split("\n").join("<br>");$text.innerHTML=escapeHtml(params.text||'').split("\n").join("<br>");if(params.text){show($text);}
extend(defaultParams,userParams);};window.swal.close=function(){closeModal();}
function setParameters(params){var modal=getModal();var $title=modal.querySelector('h2'),$text=modal.querySelector('p'),$cancelBtn=modal.querySelector('button.cancel'),$confirmBtn=modal.querySelector('button.confirm');$title.innerHTML=escapeHtml(params.title).split("\n").join("<br>");$text.innerHTML=escapeHtml(params.text||'').split("\n").join("<br>");if(params.text){show($text);}
hide(modal.querySelectorAll('.icon'));if(params.type){var validType=false;for(var i=0;i<alertTypes.length;i++){if(params.type===alertTypes[i]){validType=true;break;}}
if(!validType){window.console.error('Unknown alert type: '+params.type);return false;}
var $icon=modal.querySelector('.icon.'+params.type);show($icon);switch(params.type){case"success":addClass($icon,'animate');addClass($icon.querySelector('.tip'),'animateSuccessTip');addClass($icon.querySelector('.long'),'animateSuccessLong');break;case"error":addClass($icon,'animateErrorIcon');addClass($icon.querySelector('.x-mark'),'animateXMark');break;case"warning":addClass($icon,'pulseWarning');addClass($icon.querySelector('.body'),'pulseWarningIns');addClass($icon.querySelector('.dot'),'pulseWarningIns');break;}}
if(params.imageUrl){var $customIcon=modal.querySelector('.icon.custom');$customIcon.style.backgroundImage='url('+params.imageUrl+')';show($customIcon);var _imgWidth=80,_imgHeight=80;if(params.imageSize){var imgWidth=params.imageSize.split('x')[0];var imgHeight=params.imageSize.split('x')[1];if(!imgWidth||!imgHeight){window.console.error("Parameter imageSize expects value with format WIDTHxHEIGHT, got "+params.imageSize);}else{_imgWidth=imgWidth;_imgHeight=imgHeight;$customIcon.css({'width':imgWidth+'px','height':imgHeight+'px'});}}
$customIcon.setAttribute('style',$customIcon.getAttribute('style')+'width:'+_imgWidth+'px; height:'+_imgHeight+'px');}
modal.setAttribute('data-has-cancel-button',params.showCancelButton);if(params.showCancelButton){$cancelBtn.style.display='inline-block';}else{hide($cancelBtn);}
modal.setAttribute('data-has-confirm-button',params.showConfirmButton);if(params.showConfirmButton){$confirmBtn.style.display='inline-block';}else{hide($confirmBtn);}
if(params.cancelButtonText){$cancelBtn.innerHTML=escapeHtml(params.cancelButtonText);}
if(params.confirmButtonText){$confirmBtn.innerHTML=escapeHtml(params.confirmButtonText);}
$confirmBtn.className='confirm btn'
addClass($confirmBtn,params.confirmButtonClass);addClass($cancelBtn,params.cancelButtonClass);modal.setAttribute('data-allow-ouside-click',params.allowOutsideClick);var hasDoneFunction=(params.doneFunction)?true:false;modal.setAttribute('data-has-done-function',hasDoneFunction);modal.setAttribute('data-timer',params.timer);}
addClass(modal,params.containerClass);addClass($confirmBtn,params.confirmButtonClass);addClass($cancelBtn,params.cancelButtonClass);addClass($title,params.titleClass);addClass($text,params.textClass);modal.setAttribute('data-allow-ouside-click',params.allowOutsideClick);var hasDoneFunction=(params.doneFunction)?true:false;modal.setAttribute('data-has-done-function',hasDoneFunction);modal.setAttribute('data-timer',params.timer);}
function colorLuminance(hex,lum){hex=String(hex).replace(/[^0-9a-f]/gi,'');if(hex.length<6){hex=hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2];}
lum=lum||0;var rgb="#",c,i;for(i=0;i<3;i++){c=parseInt(hex.substr(i*2,2),16);c=Math.round(Math.min(Math.max(0,c+(c*lum)),255)).toString(16);rgb+=("00"+c).substr(c.length);}
return rgb;}
@ -459,7 +461,7 @@ function openModal(){var modal=getModal();fadeIn(getOverlay(),10);show(modal);ad
function closeModal(){var modal=getModal();fadeOut(getOverlay(),5);fadeOut(modal,5);removeClass(modal,'showSweetAlert');addClass(modal,'hideSweetAlert');removeClass(modal,'visible');var $successIcon=modal.querySelector('.icon.success');removeClass($successIcon,'animate');removeClass($successIcon.querySelector('.tip'),'animateSuccessTip');removeClass($successIcon.querySelector('.long'),'animateSuccessLong');var $errorIcon=modal.querySelector('.icon.error');removeClass($errorIcon,'animateErrorIcon');removeClass($errorIcon.querySelector('.x-mark'),'animateXMark');var $warningIcon=modal.querySelector('.icon.warning');removeClass($warningIcon,'pulseWarning');removeClass($warningIcon.querySelector('.body'),'pulseWarningIns');removeClass($warningIcon.querySelector('.dot'),'pulseWarningIns');window.onkeydown=previousWindowKeyDown;document.onclick=previousDocumentClick;if(previousActiveElement){previousActiveElement.focus();}
lastFocusedButton=undefined;}
function fixVerticalPosition(){var modal=getModal();modal.style.marginTop=getTopMargin(getModal());}
(function(){if(document.readyState==="complete"||document.readyState==="interactive"&&document.body){sweetAlertInitialize();}else{if(document.addEventListener){document.addEventListener('DOMContentLoaded',function factorial(){document.removeEventListener('DOMContentLoaded',arguments.callee,false);sweetAlertInitialize();},false);}else if(document.attachEvent){document.attachEvent('onreadystatechange',function(){if(document.readyState==='complete'){document.detachEvent('onreadystatechange',arguments.callee);sweetAlertInitialize();}});}}})();})(window,document);(function($){$.Jcrop=function(obj,opt){var options=$.extend({},$.Jcrop.defaults),docOffset,_ua=navigator.userAgent.toLowerCase(),is_msie=/msie/.test(_ua),ie6mode=/msie [1-6]\./.test(_ua);function px(n){return Math.round(n)+'px';}
(function(){if(document.readyState==="complete"||document.readyState==="interactive"&&document.body){sweetAlertInitialize();}else{if(document.addEventListener){document.addEventListener('DOMContentLoaded',function handler(){document.removeEventListener('DOMContentLoaded',handler,false);sweetAlertInitialize();},false);}else if(document.attachEvent){document.attachEvent('onreadystatechange',function handler(){if(document.readyState==='complete'){document.detachEvent('onreadystatechange',handler);sweetAlertInitialize();}});}}})();})(window,document);(function($){$.Jcrop=function(obj,opt){var options=$.extend({},$.Jcrop.defaults),docOffset,_ua=navigator.userAgent.toLowerCase(),is_msie=/msie/.test(_ua),ie6mode=/msie [1-6]\./.test(_ua);function px(n){return Math.round(n)+'px';}
function cssClass(cl){return options.baseClass+'-'+cl;}
function supportsColorFade(){return $.fx.step.hasOwnProperty('backgroundColor');}
function getPos(obj)

View File

@ -7,7 +7,7 @@
* JavaScript API:
* $('#simplelist').simplelist()
*
* Dependences:
* Dependences:
* - Sortable (jquery-sortable.js)
*/
+function ($) { "use strict";

View File

@ -6,7 +6,7 @@
.sweet-alert {
text-align: right;
h4 {
h2 {
word-break: word-break;
word-wrap: break-word;
max-height: 350px;

View File

@ -3,7 +3,6 @@
background: @color-sidebarnav-bg;
.control-toolbar {
height: auto;
padding: 20px 0 20px 20px;
input.form-control {

View File

@ -8,7 +8,6 @@ body.mainmenu-open {
nav#layout-mainmenu.navbar {
background-color: @color-mainmenu;
height: auto;
padding: 0 0 0 20px;
line-height: 0;
white-space: nowrap;
@ -84,7 +83,9 @@ nav#layout-mainmenu.navbar {
.toolbar-item {
padding-right: 0;
&:before, &:after { margin-top: 0; }
&:before, &:after {
margin-top: 0;
}
&:before { left: -12px; }
&:after { right: -12px; }
@ -174,6 +175,15 @@ nav#layout-mainmenu .menu-toggle,
}
}
nav#layout-mainmenu.navbar ul li {
a {
i { font-size: 28px; }
}
&.active a {
i { font-size: 35px; }
}
}
.mainmenu-collapsed li a i {
width: 40px;
text-align: left;
@ -189,7 +199,9 @@ nav#layout-mainmenu.navbar ul li:hover,
}
}
.touch .mainmenu-collapsed li a:hover {color: @color-mainmenu-inactive;}
.touch .mainmenu-collapsed li a:hover {
color: @color-mainmenu-inactive;
}
nav#layout-mainmenu.navbar ul li,
.mainmenu-collapsed li {
@ -197,7 +209,9 @@ nav#layout-mainmenu.navbar ul li,
color: @color-mainmenu-active !important;
font-weight: 600;
a {color: @color-mainmenu-active !important;}
a {
color: @color-mainmenu-active !important;
}
}
&:hover {

View File

@ -12,12 +12,16 @@
type: null,
allowOutsideClick: false,
showCancelButton: false,
showConfirmButton: true,
closeOnConfirm: true,
closeOnCancel: true,
confirmButtonText: 'OK',
confirmButtonClass: 'btn-primary',
cancelButtonText: 'Cancel',
cancelButtonClass: 'btn-default',
containerClass: '',
titleClass: '',
textClass: '',
imageUrl: null,
imageSize: null,
timer: null
@ -38,7 +42,7 @@
return new RegExp(' ' + className + ' ').test(' ' + elem.className + ' ');
},
addClass = function(elem, className) {
if (!hasClass(elem, className)) {
if (className && !hasClass(elem, className)) {
elem.className += ' ' + className;
}
},
@ -177,7 +181,7 @@
*/
window.sweetAlertInitialize = function() {
var sweetHTML = '<div class="sweet-overlay" tabIndex="-1"></div><div class="sweet-alert" tabIndex="-1"><div class="icon error"><span class="x-mark"><span class="line left"></span><span class="line right"></span></span></div><div class="icon warning"> <span class="body"></span> <span class="dot"></span> </div> <div class="icon info"></div> <div class="icon success"> <span class="line tip"></span> <span class="line long"></span> <div class="placeholder"></div> <div class="fix"></div> </div> <div class="icon custom"></div> <h4>Title</h4><p class="text-muted">Text</p><p><button class="cancel btn" tabIndex="2">Cancel</button> <button class="confirm btn" tabIndex="1">OK</button></p></div>',
var sweetHTML = '<div class="sweet-overlay" tabIndex="-1"></div><div class="sweet-alert" tabIndex="-1"><div class="icon error"><span class="x-mark"><span class="line left"></span><span class="line right"></span></span></div><div class="icon warning"> <span class="body"></span> <span class="dot"></span> </div> <div class="icon info"></div> <div class="icon success"> <span class="line tip"></span> <span class="line long"></span> <div class="placeholder"></div> <div class="fix"></div> </div> <div class="icon custom"></div> <h2>Title</h2><p class="lead text-muted">Text</p><p><button class="cancel btn" tabIndex="2">Cancel</button> <button class="confirm btn" tabIndex="1">OK</button></p></div>',
sweetWrap = document.createElement('div');
sweetWrap.innerHTML = sweetHTML;
@ -227,6 +231,7 @@
params.type = arguments[0].type || defaultParams.type;
params.allowOutsideClick = arguments[0].allowOutsideClick || defaultParams.allowOutsideClick;
params.showCancelButton = arguments[0].showCancelButton !== undefined ? arguments[0].showCancelButton : defaultParams.showCancelButton;
params.showConfirmButton = arguments[0].showConfirmButton !== undefined ? arguments[0].showConfirmButton : defaultParams.showConfirmButton;
params.closeOnConfirm = arguments[0].closeOnConfirm !== undefined ? arguments[0].closeOnConfirm : defaultParams.closeOnConfirm;
params.closeOnCancel = arguments[0].closeOnCancel !== undefined ? arguments[0].closeOnCancel : defaultParams.closeOnCancel;
params.timer = arguments[0].timer || defaultParams.timer;
@ -234,9 +239,12 @@
// Show "Confirm" instead of "OK" if cancel button is visible
params.confirmButtonText = (defaultParams.showCancelButton) ? 'Confirm' : defaultParams.confirmButtonText;
params.confirmButtonText = arguments[0].confirmButtonText || defaultParams.confirmButtonText;
params.confirmButtonClass = arguments[0].confirmButtonClass || defaultParams.confirmButtonClass;
params.confirmButtonClass = arguments[0].confirmButtonClass || (arguments[0].type ? 'btn-' + arguments[0].type : null) || defaultParams.confirmButtonClass;
params.cancelButtonText = arguments[0].cancelButtonText || defaultParams.cancelButtonText;
params.cancelButtonClass = arguments[0].cancelButtonClass || defaultParams.cancelButtonClass;
params.containerClass = arguments[0].containerClass || defaultParams.containerClass;
params.titleClass = arguments[0].titleClass || defaultParams.titleClass;
params.textClass = arguments[0].textClass || defaultParams.textClass;
params.imageUrl = arguments[0].imageUrl || defaultParams.imageUrl;
params.imageSize = arguments[0].imageSize || defaultParams.imageSize;
params.doneFunction = arguments[1] || null;
@ -449,6 +457,13 @@
extend(defaultParams, userParams);
};
/**
* Closes the current modal
*/
window.swal.close = function() {
closeModal();
}
/*
* Set type, text and actions on modal
*/
@ -456,7 +471,7 @@
function setParameters(params) {
var modal = getModal();
var $title = modal.querySelector('h4'),
var $title = modal.querySelector('h2'),
$text = modal.querySelector('p'),
$cancelBtn = modal.querySelector('button.cancel'),
$confirmBtn = modal.querySelector('button.confirm');
@ -543,6 +558,15 @@
} else {
hide($cancelBtn);
}
// Confirm button
modal.setAttribute('data-has-confirm-button', params.showConfirmButton);
if (params.showConfirmButton) {
$confirmBtn.style.display = 'inline-block';
} else {
hide($confirmBtn);
}
// Edit text on cancel and confirm buttons
if (params.cancelButtonText) {
@ -555,12 +579,21 @@
// Reset confirm buttons to default class (Ugly fix)
$confirmBtn.className = 'confirm btn'
// Attach selected class to the sweet alert modal
addClass(modal, params.containerClass);
// Set confirm button to selected class
addClass($confirmBtn, params.confirmButtonClass);
// Set cancel button to selected class
addClass($cancelBtn, params.cancelButtonClass);
// Set title to selected class
addClass($title, params.titleClass);
// Set text to selected class
addClass($text, params.textClass);
// Allow outside click?
modal.setAttribute('data-allow-ouside-click', params.allowOutsideClick);
@ -700,14 +733,14 @@
sweetAlertInitialize();
} else {
if (document.addEventListener) {
document.addEventListener('DOMContentLoaded', function factorial() {
document.removeEventListener('DOMContentLoaded', arguments.callee, false);
document.addEventListener('DOMContentLoaded', function handler() {
document.removeEventListener('DOMContentLoaded', handler, false);
sweetAlertInitialize();
}, false);
} else if (document.attachEvent) {
document.attachEvent('onreadystatechange', function() {
document.attachEvent('onreadystatechange', function handler() {
if (document.readyState === 'complete') {
document.detachEvent('onreadystatechange', arguments.callee);
document.detachEvent('onreadystatechange', handler);
sweetAlertInitialize();
}
});

View File

@ -37,11 +37,6 @@
display: none;
z-index: @zindex-modal + 8000;
h4 {
margin: 30px 0;
word-wrap: break-word;
}
@media all and (max-width: @screen-xs-max) {
width: auto;
margin-left: 0;

View File

@ -693,7 +693,7 @@ class FormController extends ControllerBehavior
if (!is_a($widget->getController(), $calledClass)) {
return;
}
$callback($widget, $widget->model, $widget->getContext());
call_user_func_array($callback, [$widget, $widget->model, $widget->getContext()]);
});
}

View File

@ -5,6 +5,7 @@ use Lang;
use View;
use Response;
use Backend;
use BackendAuth;
use Backend\Classes\ControllerBehavior;
use League\Csv\Reader as CsvReader;
use League\Csv\Writer as CsvWriter;
@ -620,7 +621,7 @@ class ImportExportController extends ControllerBehavior
{
if (
($permissions = $this->getConfig($type.'[permissions]')) &&
(!$this->controller->user->hasAnyAccess((array) $permissions))
(!BackendAuth::getUser()->hasAnyAccess((array) $permissions))
) {
return Response::make(View::make('backend::access_denied'), 403);
}

View File

@ -411,7 +411,7 @@ class ListController extends ControllerBehavior
if (!is_a($widget->getController(), $calledClass)) {
return;
}
$callback($widget, $widget->model);
call_user_func_array($callback, [$widget, $widget->model]);
});
}
}

View File

@ -3,10 +3,11 @@
use Db;
use Lang;
use Event;
use Request;
use Form as FormHelper;
use Backend\Classes\ControllerBehavior;
use ApplicationException;
use October\Rain\Database\Model;
use ApplicationException;
/**
* Relation Controller Behavior
@ -318,6 +319,13 @@ class RelationController extends ControllerBehavior
$this->toolbarWidget->bindToController();
}
/*
* Search widget
*/
if ($this->searchWidget = $this->makeSearchWidget()) {
$this->searchWidget->bindToController();
}
/*
* View widget
*/
@ -484,17 +492,6 @@ class RelationController extends ControllerBehavior
// Widgets
//
protected function makeSearchWidget()
{
$config = $this->makeConfig();
$config->alias = $this->alias . 'ManageSearch';
$config->growable = false;
$config->prompt = 'backend::lang.list.search_prompt';
$widget = $this->makeWidget('Backend\Widgets\Search', $config);
$widget->cssClasses[] = 'recordfinder-search';
return $widget;
}
protected function makeToolbarWidget()
{
$defaultConfig = [];
@ -539,6 +536,29 @@ class RelationController extends ControllerBehavior
return $toolbarWidget;
}
protected function makeSearchWidget()
{
if (!$this->getConfig('manage[showSearch]')) {
return null;
}
$config = $this->makeConfig();
$config->alias = $this->alias . 'ManageSearch';
$config->growable = false;
$config->prompt = 'backend::lang.list.search_prompt';
$widget = $this->makeWidget('Backend\Widgets\Search', $config);
$widget->cssClasses[] = 'recordfinder-search';
/*
* Persist the search term across AJAX requests only
*/
if (!Request::ajax()) {
$widget->setActiveTerm(null);
}
return $widget;
}
protected function makeViewWidget()
{
/*
@ -555,7 +575,8 @@ class RelationController extends ControllerBehavior
$config->recordUrl = $this->getConfig('view[recordUrl]', null);
$defaultOnClick = sprintf(
"$.oc.relationBehavior.clickViewListRecord(':id', '%s', '%s')",
"$.oc.relationBehavior.clickViewListRecord(':%s', '%s', '%s')",
$this->relationModel->getKeyName(),
$this->field,
$this->relationGetSessionKey()
);
@ -613,7 +634,15 @@ class RelationController extends ControllerBehavior
return $widget->onRefresh();
});
$searchWidget->setActiveTerm(null);
/*
* Persist the search term across AJAX requests only
*/
if (Request::ajax()) {
$widget->setSearchTerm($searchWidget->getActiveTerm());
}
else {
$searchWidget->setActiveTerm(null);
}
}
}
}
@ -680,15 +709,18 @@ class RelationController extends ControllerBehavior
/*
* Link the Search Widget to the List Widget
*/
if ($this->getConfig('manage[showSearch]')) {
$this->searchWidget = $this->makeSearchWidget();
$this->searchWidget->bindToController();
if ($this->searchWidget) {
$this->searchWidget->bindEvent('search.submit', function () use ($widget) {
$widget->setSearchTerm($this->searchWidget->getActiveTerm());
return $widget->onRefresh();
});
$this->searchWidget->setActiveTerm(null);
/*
* Persist the search term across AJAX requests only
*/
if (Request::ajax()) {
$widget->setSearchTerm($this->searchWidget->getActiveTerm());
}
}
}
/*
@ -1112,24 +1144,29 @@ class RelationController extends ControllerBehavior
$this->beforeAjax();
/*
* Add the checked IDs to the pivot table
* If the pivot model fails for some reason, abort the sync
*/
$foreignIds = (array) $this->foreignId;
$this->relationObject->sync($foreignIds, false);
Db::transaction(function () {
/*
* Add the checked IDs to the pivot table
*/
$foreignIds = (array) $this->foreignId;
$this->relationObject->sync($foreignIds, false);
/*
* Save data to models
*/
$foreignKeyName = $this->relationModel->getQualifiedKeyName();
$hyrdatedModels = $this->relationObject->whereIn($foreignKeyName, $foreignIds)->get();
$saveData = $this->pivotWidget->getSaveData();
/*
* Save data to models
*/
$foreignKeyName = $this->relationModel->getQualifiedKeyName();
$hyrdatedModels = $this->relationObject->whereIn($foreignKeyName, $foreignIds)->get();
$saveData = $this->pivotWidget->getSaveData();
foreach ($hyrdatedModels as $hydratedModel) {
$modelsToSave = $this->prepareModelsToSave($hydratedModel, $saveData);
foreach ($modelsToSave as $modelToSave) {
$modelToSave->save();
foreach ($hyrdatedModels as $hydratedModel) {
$modelsToSave = $this->prepareModelsToSave($hydratedModel, $saveData);
foreach ($modelsToSave as $modelToSave) {
$modelToSave->save();
}
}
}
});
return ['#'.$this->relationGetId('view') => $this->relationRenderView()];
}

View File

@ -2,6 +2,7 @@
use Lang;
use Backend;
use ApplicationException;
use Backend\Classes\ControllerBehavior;
/**
@ -263,4 +264,4 @@ class ReorderController extends ControllerBehavior
return $contents;
}
}
}

View File

@ -27,7 +27,7 @@ class UserPreferencesModel extends SettingsModel
{
parent::__construct($model);
$this->model->table = 'backend_user_preferences';
$this->model->setTable('backend_user_preferences');
}
/**

View File

@ -38,3 +38,9 @@
</div>
<?= Form::close() ?>
</div>
<script>
setTimeout(
function(){ $('#relationManagePivotPopup input.form-control:first').focus() },
310
)
</script>

View File

@ -2,7 +2,7 @@
<?= Form::ajax('onRelationManagePivotUpdate', [
'data' => ['_relation_field' => $relationField, 'manage_id' => $relationManageId],
'data-stripe-load-indicator' => true
'data-popup-load-indicator' => true
]) ?>
<div class="modal-header">
@ -23,8 +23,7 @@
<?php else: ?>
<button
type="submit"
class="btn btn-primary"
data-dismiss="popup">
class="btn btn-primary">
<?= e(trans('backend::lang.relation.update')) ?>
</button>
<button
@ -42,7 +41,7 @@
<?= Form::ajax('onRelationManagePivotCreate', [
'data' => ['_relation_field' => $relationField, 'foreign_id' => $foreignId],
'data-stripe-load-indicator' => true
'data-popup-load-indicator' => true
]) ?>
<div class="modal-header">
@ -55,8 +54,7 @@
<div class="modal-footer">
<button
type="submit"
class="btn btn-primary"
data-dismiss="popup">
class="btn btn-primary">
<?= e(trans('backend::lang.relation.add')) ?>
</button>
<button

View File

@ -144,7 +144,10 @@ class AuthManager extends RainAuthManager
$tabs = [];
foreach ($this->listPermissions() as $permission) {
$tab = isset($permission->tab) ? $permission->tab : null;
$tab = isset($permission->tab)
? $permission->tab
: 'backend::lang.form.undefined_tab';
if (!array_key_exists($tab, $tabs)) {
$tabs[$tab] = [];
}

View File

@ -553,6 +553,14 @@ class Controller extends Extendable
return false;
}
/**
* Returns the controllers public actions.
*/
public function getPublicActions()
{
return $this->publicActions;
}
/**
* Returns a unique ID for the controller and route. Useful in creating HTML markup.
*/

View File

@ -246,6 +246,15 @@ class NavigationManager
}
}
/**
* Removes a single main menu item
*/
public function removeMainMenuItem($owner, $code)
{
$itemKey = $this->makeItemKey($owner, $code);
unset($this->items[$itemKey]);
}
/**
* Dynamically add an array of side menu items
* @param string $owner
@ -287,6 +296,20 @@ class NavigationManager
$this->items[$itemKey]->sideMenu[$sideCode] = $item;
}
/**
* Removes a single main menu item
*/
public function removeSideMenuItem($owner, $code, $sideCode)
{
$itemKey = $this->makeItemKey($owner, $code);
if (!isset($this->items[$itemKey])) {
return false;
}
$mainItem = $this->items[$itemKey];
unset($mainItem->sideMenu[$sideCode]);
}
/**
* Returns a list of the main menu items.
* @return array

View File

@ -64,7 +64,7 @@ class Auth extends Controller
{
$rules = [
'login' => 'required|min:2|max:32',
'password' => 'required|min:2'
'password' => 'required|min:4'
];
$validation = Validator::make(post(), $rules);
@ -96,7 +96,7 @@ class Auth extends Controller
BackendAuth::logout();
return Backend::redirect('backend');
}
/**
* Request a password reset verification code.
*/
@ -176,7 +176,7 @@ class Auth extends Controller
}
$rules = [
'password' => 'required|min:2'
'password' => 'required|min:4'
];
$validation = Validator::make(post(), $rules);

View File

@ -20,6 +20,8 @@ class EditorPreferences extends Controller
public $formConfig = 'config_form.yaml';
public $requiredPermissions = ['backend.manage_editor'];
/**
* Constructor.
*/

View File

@ -33,7 +33,7 @@ class UserGroups extends Controller
/**
* Add available permission fields to the Group form.
*/
protected function formExtendFields($form)
public function formExtendFields($form)
{
/*
* Add permissions tab

View File

@ -88,12 +88,16 @@ class Users extends Controller
* Add available permission fields to the User form.
* Mark default groups as checked for new Users.
*/
protected function formExtendFields($form)
public function formExtendFields($form)
{
if ($form->getContext() == 'myaccount') {
return;
}
if (!$this->user->isSuperUser()) {
$form->removeField('permissions[superuser]');
}
/*
* Add permissions tab
*/

View File

@ -26,10 +26,10 @@
autocomplete="off"
maxlength="255" />
<!-- Submit Login -->
<button type="submit" class="btn btn-primary login-button">
<?= e(trans('backend::lang.account.login')) ?>
</button>
<!-- Submit Login -->
<button type="submit" class="btn btn-primary login-button">
<?= e(trans('backend::lang.account.login')) ?>
</button>
</div>
<p class="oc-icon-lock pull-right forgot-password">

View File

@ -28,15 +28,17 @@
class="btn btn-primary">
<?= e(trans('backend::lang.form.save')) ?>
</button>
<button
type="button"
data-request="onSave"
data-request-data="close:1"
data-hotkey="ctrl+enter, cmd+enter"
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
class="btn btn-default">
<?= e(trans('backend::lang.form.save_and_close')) ?>
</button>
<?php if ($this->user->hasAccess('backend.manage_users')): ?>
<button
type="button"
data-request="onSave"
data-request-data="close:1"
data-hotkey="ctrl+enter, cmd+enter"
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
class="btn btn-default">
<?= e(trans('backend::lang.form.save_and_close')) ?>
</button>
<?php endif ?>
</div>
</div>

File diff suppressed because one or more lines are too long

View File

@ -389,6 +389,24 @@
// ===============
$(document).render(function () {
$('[data-control="codeeditor"]').codeEditor()
})
});
// FIX EMMET HTML WHEN SYNTAX IS TWIG
// ==================================
+function (exports) {
if (exports.ace && typeof exports.ace.require == 'function') {
var emmetExt = exports.ace.require('ace/ext/emmet')
if (emmetExt && emmetExt.AceEmmetEditor && emmetExt.AceEmmetEditor.prototype.getSyntax) {
var coreGetSyntax = emmetExt.AceEmmetEditor.prototype.getSyntax
emmetExt.AceEmmetEditor.prototype.getSyntax = function () {
var $syntax = $.proxy(coreGetSyntax, this)()
return $syntax == 'twig' ? 'html' : $syntax
};
}
}
}(window)
}(window.jQuery);

View File

@ -16,7 +16,7 @@ var SnippetManager = function() {
(function() {
oop.implement(this, EventEmitter);
this.getTokenizer = function() {
function TabstopToken(str, _, stack) {
str = str.substr(1);
@ -239,7 +239,7 @@ var SnippetManager = function() {
var line = editor.session.getLine(cursor.row);
var tabString = editor.session.getTabString();
var indentString = line.match(/^\s*/)[0];
if (cursor.column < indentString.length)
indentString = indentString.slice(0, cursor.column);
@ -271,7 +271,7 @@ var SnippetManager = function() {
return;
var value = tokens.slice(i + 1, i1);
var isNested = value.some(function(t) {return typeof t === "object"});
var isNested = value.some(function(t) {return typeof t === "object"});
if (isNested && !ts.value) {
ts.value = value;
} else if (value.length && (!ts.value || typeof ts.value !== "string")) {
@ -305,7 +305,7 @@ var SnippetManager = function() {
expanding[id] = null;
continue;
}
var ts = tabstops[id];
var arg = typeof ts.value == "string" ? [ts.value] : copyValue(ts.value);
arg.unshift(i + 1, Math.max(0, i1 - i));
@ -340,16 +340,16 @@ var SnippetManager = function() {
var selectionId = editor.inVirtualSelectionMode && editor.selection.index;
tabstopManager.addTabstops(tabstops, range.start, end, selectionId);
};
this.insertSnippet = function(editor, snippetText) {
var self = this;
if (editor.inVirtualSelectionMode)
return self.insertSnippetForSelection(editor, snippetText);
editor.forEachSelection(function() {
self.insertSnippetForSelection(editor, snippetText);
}, null, {keepOrder: true});
if (editor.tabstopManager)
editor.tabstopManager.tabNext();
};
@ -358,7 +358,7 @@ var SnippetManager = function() {
var scope = editor.session.$mode.$id || "";
scope = scope.split("/").pop();
if (scope === "html" || scope === "php") {
if (scope === "php" && !editor.session.$mode.inlinePhp)
if (scope === "php" && !editor.session.$mode.inlinePhp)
scope = "html";
var c = editor.getCursorPosition();
var state = editor.session.getState(c.row);
@ -374,7 +374,7 @@ var SnippetManager = function() {
scope = "php";
}
}
return scope;
};
@ -398,7 +398,7 @@ var SnippetManager = function() {
editor.tabstopManager.tabNext();
return result;
};
this.expandSnippetForSelection = function(editor, options) {
var cursor = editor.getCursorPosition();
var line = editor.session.getLine(cursor.row);
@ -454,10 +454,10 @@ var SnippetManager = function() {
var snippetMap = this.snippetMap;
var snippetNameMap = this.snippetNameMap;
var self = this;
if (!snippets)
if (!snippets)
snippets = [];
function wrapRegexp(src) {
if (src && !/^\^?\(.*\)\$?$|^\\b$/.test(src))
src = "(?:" + src + ")";
@ -514,7 +514,7 @@ var SnippetManager = function() {
addSnippet(snippets);
else if (Array.isArray(snippets))
snippets.forEach(addSnippet);
this._signal("registerSnippets", {scope: scope});
};
this.unregister = function(snippets, scope) {
@ -731,9 +731,9 @@ var TabstopManager = function(editor) {
ts = this.tabstops[this.index];
if (!ts || !ts.length)
return;
this.selectedTabstop = ts;
if (!this.editor.inVirtualSelectionMode) {
if (!this.editor.inVirtualSelectionMode) {
var sel = this.editor.multiSelect;
sel.toSingleRange(ts.firstNonLinked.clone());
for (var i = ts.length; i--;) {
@ -746,7 +746,7 @@ var TabstopManager = function(editor) {
} else {
this.editor.selection.setRange(ts.firstNonLinked);
}
this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);
};
this.addTabstops = function(tabstops, start, end) {
@ -765,7 +765,7 @@ var TabstopManager = function(editor) {
var ranges = this.ranges;
tabstops.forEach(function(ts, index) {
var dest = this.$openTabstops[index] || ts;
for (var i = ts.length; i--;) {
var p = ts[i];
var range = Range.fromPoints(p.start, p.end || p.start);
@ -792,7 +792,7 @@ var TabstopManager = function(editor) {
}
this.addTabstopMarkers(dest);
}, this);
if (arg.length > 2) {
if (this.tabstops.length)
arg.push(arg.splice(2, 1)[0]);
@ -860,7 +860,7 @@ changeTracker.setPosition = function(row, column) {
};
changeTracker.update = function(pos, delta, $insertRight) {
this.$insertRight = $insertRight;
this.pos = pos;
this.pos = pos;
this.onChange(delta);
};
@ -961,15 +961,15 @@ AceEmmetEditor.prototype = {
if (end == null)
end = start == null ? this.getContent().length : start;
if (start == null)
start = 0;
start = 0;
var editor = this.ace;
var doc = editor.session.doc;
var range = Range.fromPoints(doc.indexToPosition(start), doc.indexToPosition(end));
editor.session.remove(range);
range.end = range.start;
value = this.$updateTabstops(value);
snippetManager.insertSnippet(editor, value);
},
@ -1061,7 +1061,7 @@ AceEmmetEditor.prototype = {
} else if (lastZero) {
value = emmet.require('utils').replaceSubstring(value, '${0}', lastZero);
}
return value;
}
};
@ -1101,23 +1101,23 @@ exports.runEmmetCommand = function(editor) {
if (editorProxy.getSyntax() == "php")
return false;
var actions = emmet.require("actions");
if (this.action == "expand_abbreviation_with_tab") {
if (!editor.selection.isEmpty())
return false;
}
if (this.action == "wrap_with_abbreviation") {
return setTimeout(function() {
actions.run("wrap_with_abbreviation", editorProxy);
}, 0);
}
var pos = editor.selection.lead;
var token = editor.session.getTokenAt(pos.row, pos.column);
if (token && /\btag\b/.test(token.type))
return false;
var result = actions.run(this.action, editorProxy);
} catch(e) {
editor._signal("changeStatus", typeof e == "string" ? e : e.message);
@ -1187,4 +1187,3 @@ exports.setCore = function(e) {
(function() {
ace.require(["ace/ext/emmet"], function() {});
})();

View File

@ -614,11 +614,11 @@ var _ = (function() {
// Retrieve the names of an object's properties.
// Delegates to **ECMAScript 5**'s native `Object.keys`
_.keys = nativeKeys || function(obj) {
if (obj !== Object(obj)) throw new TypeError('Invalid object');
var keys = [];
for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;
return keys;
};
if (obj !== Object(obj)) throw new TypeError('Invalid object');
var keys = [];
for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;
return keys;
};
// Retrieve the values of an object's properties.
_.values = function(obj) {
@ -788,8 +788,8 @@ var _ = (function() {
// Is a given value an array?
// Delegates to ECMA5's native Array.isArray
_.isArray = nativeIsArray || function(obj) {
return toString.call(obj) == '[object Array]';
};
return toString.call(obj) == '[object Array]';
};
// Is a given variable an object?
_.isObject = function(obj) {
@ -975,8 +975,8 @@ var _ = (function() {
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __p='';" +
"var print=function(){__p+=Array.prototype.join.call(arguments, '')};\n" +
source + "return __p;\n";
"var print=function(){__p+=Array.prototype.join.call(arguments, '')};\n" +
source + "return __p;\n";
var render = new Function(settings.variable || 'obj', '_', source);
if (data) return render(data, _);
@ -987,7 +987,7 @@ var _ = (function() {
// Provide the compiled function source as a convenience for build time
// precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' +
source + '}';
source + '}';
return template;
};
@ -1144,7 +1144,7 @@ var emmet = (function(global) {
var moduleLoader = null;
/**
* Generic Emmet module loader (actually, it doesn’t load anything, just
* Generic Emmet module loader (actually, it doesnt load anything, just
* returns module reference). Not using `require` name to avoid conflicts
* with Node.js and RequireJS
*/
@ -1395,7 +1395,7 @@ emmet.define('abbreviationParser', function(require, _) {
},
/**
* Removes current node from parent‘s child list
* Removes current node from parents child list
* @returns {AbbreviationNode} Current node itself
*/
remove: function() {
@ -1407,7 +1407,7 @@ emmet.define('abbreviationParser', function(require, _) {
},
/**
* Replaces current node in parent‘s children list with passed nodes
* Replaces current node in parents children list with passed nodes
* @param {AbbreviationNode} node Replacement node or array of nodes
*/
replace: function() {
@ -1572,7 +1572,7 @@ emmet.define('abbreviationParser', function(require, _) {
},
/**
* Returns index of current node in parent‘s children list
* Returns index of current node in parents children list
* @returns {Number}
*/
index: function() {
@ -1739,7 +1739,7 @@ emmet.define('abbreviationParser', function(require, _) {
/**
* Returns stripped string: a string without first and last character.
* Used for “unquoting” strings
* Used for unquoting strings
* @param {String} str
* @returns {String}
*/
@ -2027,7 +2027,7 @@ emmet.define('abbreviationParser', function(require, _) {
}
/**
* “Un-rolls“ contents of current node: recursively replaces all repeating
* Un-rolls contents of current node: recursively replaces all repeating
* children with their repeated clones
* @param {AbbreviationNode} node
* @returns {AbbreviationNode}
@ -2110,7 +2110,7 @@ emmet.define('abbreviationParser', function(require, _) {
var tree = parseAbbreviation(abbr);
if (options.contextNode) {
// add info about context node –
// add info about context node
// a parent XHTML node in editor inside which abbreviation is
// expanded
tree._name = options.contextNode.name;
@ -2244,7 +2244,7 @@ emmet.exec(function(require, _) {
if (_.isString(r)) {
child.data('resource', elements.create('snippet', r));
} else if (elements.is(r, 'reference')) {
// it’s a reference to another abbreviation:
// its a reference to another abbreviation:
// parse it and insert instead of current child
/** @type AbbreviationNode */
var subtree = parser.parse(r.data, {
@ -2264,7 +2264,7 @@ emmet.exec(function(require, _) {
});
}
// move child‘s children into the deepest child of new subtree
// move childs children into the deepest child of new subtree
var deepestChild = subtree.deepestChild();
if (deepestChild) {
_.each(child.children, function(c) {
@ -2301,7 +2301,7 @@ emmet.exec(function(require, _) {
});/**
* Pasted content abbreviation processor. A pasted content is a content that
* should be inserted into implicitly repeated abbreviation nodes.
* This processor powers “Wrap With Abbreviation” action
* This processor powers Wrap With Abbreviation action
* @param {Function} require
* @param {Underscore} _
*/
@ -2357,7 +2357,7 @@ emmet.exec(function(require, _) {
}
/**
* Check if parsed node contains output placeholder – a target where
* Check if parsed node contains output placeholder a target where
* pasted content should be inserted
* @param {AbbreviationNode} node
* @returns {Boolean}
@ -4226,7 +4226,7 @@ emmet.define('handlerList', function(require, _) {
* Adds function handler
* @param {Function} fn Handler
* @param {Object} options Handler options. Possible values are:<br><br>
* <b>order</b> : (<code>Number</code>) – order in handler list. Handlers
* <b>order</b> : (<code>Number</code>) order in handler list. Handlers
* with higher order value will be executed earlier.
*/
add: function(fn, options) {
@ -4527,8 +4527,8 @@ emmet.define('stringStream', function(require, _) {
},
/**
* Act like a multi-character <code>eat</code>—if <code>consume</code> is true or
* not given—or a look-ahead that doesn't update the stream position—if
* Act like a multi-character <code>eat</code>if <code>consume</code> is true or
* not givenor a look-ahead that doesn't update the stream positionif
* it is false. <code>pattern</code> can be either a string or a
* regular expression starting with ^. When it is a string,
* <code>caseInsensitive</code> can be set to true to make the match
@ -4883,7 +4883,6 @@ emmet.define('resources', function(require, _) {
sectionKey = section['extends'];
} while (sectionKey && !_.include(memo, sectionKey));
cache[cacheKey] = _.extend.apply(_, stack.reverse());
}
@ -4900,15 +4899,15 @@ emmet.define('actions', function(require, _, zc) {
var actions = {};
/**
* “Humanizes” action name, makes it more readable for people
* Humanizes action name, makes it more readable for people
* @param {String} name Action name (like 'expand_abbreviation')
* @return Humanized name (like 'Expand Abbreviation')
*/
function humanizeActionName(name) {
return require('utils').trim(name.charAt(0).toUpperCase()
+ name.substring(1).replace(/_[a-z]/g, function(str) {
return ' ' + str.charAt(1).toUpperCase();
}));
+ name.substring(1).replace(/_[a-z]/g, function(str) {
return ' ' + str.charAt(1).toUpperCase();
}));
}
return {
@ -4917,9 +4916,9 @@ emmet.define('actions', function(require, _, zc) {
* @param {String} name Action name
* @param {Function} fn Action function
* @param {Object} options Custom action options:<br>
* <b>label</b> : (<code>String</code>) – Human-readable action name.
* <b>label</b> : (<code>String</code>) Human-readable action name.
* May contain '/' symbols as submenu separators<br>
* <b>hidden</b> : (<code>Boolean</code>) – Indicates whether action
* <b>hidden</b> : (<code>Boolean</code>) Indicates whether action
* should be displayed in menu (<code>getMenu()</code> method)
*
* @memberOf actions
@ -5575,7 +5574,7 @@ emmet.define('actionUtils', function(require, _) {
},
/**
* Common syntax detection method for editors that doesn’t provide any
* Common syntax detection method for editors that doesnt provide any
* info about current syntax scope.
* @param {IEmmetEditor} editor Current editor
* @param {String} hint Any syntax hint that editor can provide
@ -5882,7 +5881,7 @@ emmet.define('base64', function(require, _) {
});/**
* HTML matcher: takes string and searches for HTML tag pairs for given position
*
* Unlike “classic” matchers, it parses content from the specified
* Unlike classic matchers, it parses content from the specified
* position, not from the start, so it may work even outside HTML documents
* (for example, inside strings of programming languages like JavaScript, Python
* etc.)
@ -6234,23 +6233,23 @@ emmet.define('tabStops', function(require, _) {
* @param {String} text Text to process
* @param {Object} options List of processor options:<br>
*
* <b>replaceCarets</b> : <code>Boolean</code> — replace all default
* <b>replaceCarets</b> : <code>Boolean</code> replace all default
* caret placeholders (like <i>{%::emmet-caret::%}</i>) with <i>${0:caret}</i><br>
*
* <b>escape</b> : <code>Function</code> — function that handle escaped
* <b>escape</b> : <code>Function</code> function that handle escaped
* characters (mostly '$'). By default, it returns the character itself
* to be displayed as is in output, but sometimes you will use
* <code>extract</code> method as intermediate solution for further
* processing and want to keep character escaped. Thus, you should override
* <code>escape</code> method to return escaped symbol (e.g. '\\$')<br>
*
* <b>tabstop</b> : <code>Function</code> – a tabstop handler. Receives
* a single argument – an object describing token: its position, number
* <b>tabstop</b> : <code>Function</code> a tabstop handler. Receives
* a single argument an object describing token: its position, number
* group, placeholder and token itself. Should return a replacement
* string that will appear in final output
*
* <b>variable</b> : <code>Function</code> – variable handler. Receives
* a single argument – an object describing token: its position, name
* <b>variable</b> : <code>Function</code> variable handler. Receives
* a single argument an object describing token: its position, name
* and original token itself. Should return a replacement
* string that will appear in final output
*
@ -6439,7 +6438,7 @@ emmet.define('tabStops', function(require, _) {
var placeholderMemo = {};
var res = require('resources');
return function(str, varName) {
// do not mark `child` variable as placeholder – it‘s a reserved
// do not mark `child` variable as placeholder its a reserved
// variable name
if (varName == 'child')
return str;
@ -6938,13 +6937,13 @@ emmet.define('elements', function(require, _) {
return result;
});/**
* Abstract implementation of edit tree interface.
* Edit tree is a named container of editable “name-value” child elements,
* Edit tree is a named container of editable name-value child elements,
* parsed from <code>source</code>. This container provides convenient methods
* for editing/adding/removing child elements. All these update actions are
* instantly reflected in the <code>source</code> code with respect of formatting.
* <br><br>
* For example, developer can create an edit tree from CSS rule and add or
* remove properties from it–all changes will be immediately reflected in the
* remove properties from itall changes will be immediately reflected in the
* original source.
* <br><br>
* All classes defined in this module should be extended the same way as in
@ -7114,7 +7113,7 @@ emmet.define('editTree', function(require, _, core) {
return element.value(value);
if (!_.isUndefined(value)) {
// no such element — create it
// no such element create it
return this.add(name, value, pos);
}
},
@ -7479,7 +7478,7 @@ emmet.define('cssEditTree', function(require, _) {
if (token.type == '}' || token.type == ';') {
// found value end
trimWhitespaceTokens(tokens, WHITESPACE_REMOVE_FROM_START
| (token.type == '}' ? WHITESPACE_REMOVE_FROM_END : 0));
| (token.type == '}' ? WHITESPACE_REMOVE_FROM_END : 0));
if (tokens.length) {
start = tokens[0].start;
@ -7634,7 +7633,7 @@ emmet.define('cssEditTree', function(require, _) {
// characters between rules may lead to undesired behavior,
// especially when current rule is duplicated or used as a donor
// to create new rule.
// To solve this issue, we‘ll take only last newline indentation
// To solve this issue, well take only last newline indentation
var lines = utils.splitByLines(p.styleBefore);
if (lines.length > 1) {
p.styleBefore = '\n' + _.last(lines);
@ -7982,7 +7981,7 @@ emmet.define('xmlEditTree', function(require, _) {
var attribute = new XMLEditElement(this,
editTree.createToken(start + styles.styleBefore.length, name),
editTree.createToken(start + styles.styleBefore.length + name.length
+ styles.styleSeparator.length, value)
+ styles.styleSeparator.length, value)
);
_.extend(attribute, styles);
@ -8350,7 +8349,7 @@ emmet.define('wrapWithAbbreviation', function(require, _) {
});/**
* Toggles HTML and CSS comments depending on current caret context. Unlike
* the same action in most editors, this action toggles comment on currently
* matched item—HTML tag or CSS selector—when nothing is selected.
* matched itemHTML tag or CSS selectorwhen nothing is selected.
*
* @param {Function} require
* @param {Underscore} _
@ -8424,7 +8423,7 @@ emmet.exec(function(require, _) {
return _.find(rule.list(), function(item) {
if (item.range().end === relPos) {
// at the end of property, but outside of it
// if there’s a space character at current position,
// if theres a space character at current position,
// use current property
return reSafeChar.test(rule.source.charAt(relPos));
}
@ -8514,9 +8513,9 @@ emmet.exec(function(require, _) {
// should add comment
// make sure that there's no comment inside selection
newContent = commentStart + ' ' +
range.substring(content)
.replace(new RegExp(utils.escapeForRegexp(commentStart) + '\\s*|\\s*' + utils.escapeForRegexp(commentEnd), 'g'), '') +
' ' + commentEnd;
range.substring(content)
.replace(new RegExp(utils.escapeForRegexp(commentStart) + '\\s*|\\s*' + utils.escapeForRegexp(commentEnd), 'g'), '') +
' ' + commentEnd;
// adjust caret position
caretPos += commentStart.length + 1;
@ -8569,7 +8568,7 @@ emmet.exec(function(require, _) {
/**
* Search for new caret insertion point
* @param {IEmmetEditor} editor Editor instance
* @param {Number} inc Search increment: -1 — search left, 1 — search right
* @param {Number} inc Search increment: -1 search left, 1 search right
* @param {Number} offset Initial offset relative to current caret position
* @return {Number} Returns -1 if insertion point wasn't found
*/
@ -8949,9 +8948,9 @@ emmet.exec(function(require, _) {
// locate parts of complex values.
// some examples:
// – 1px solid red: 3 parts
// – arial, sans-serif: enumeration, 2 parts
// – url(image.png): function value part
// 1px solid red: 3 parts
// arial, sans-serif: enumeration, 2 parts
// url(image.png): function value part
var value = property.value();
_.each(property.valueParts(), function(r) {
// add absolute range
@ -9277,8 +9276,8 @@ emmet.exec(function(require, _) {
});
/**
* Splits or joins tag, e.g. transforms it into a short notation and vice versa:<br>
* &lt;div&gt;&lt;/div&gt; → &lt;div /&gt; : join<br>
* &lt;div /&gt; → &lt;div&gt;&lt;/div&gt; : split
* &lt;div&gt;&lt;/div&gt; &lt;div /&gt; : join<br>
* &lt;div /&gt; &lt;div&gt;&lt;/div&gt; : split
* @param {Function} require
* @param {Underscore} _
* @memberOf __splitJoinTagAction
@ -9435,7 +9434,7 @@ emmet.define('reflectCSSValue', function(require, _) {
* Returns value that should be reflected for <code>refName</code> CSS property
* from <code>curName</code> property. This function is used for special cases,
* when the same result must be achieved with different properties for different
* browsers. For example: opаcity:0.5; → filter:alpha(opacity=50);<br><br>
* browsers. For example: opаcity:0.5; filter:alpha(opacity=50);<br><br>
*
* This function does value conversion between different CSS properties
*
@ -9629,10 +9628,10 @@ emmet.exec(function(require, _) {
prefs.define('css.closeBraceIndentation', '\n',
'Indentation before closing brace of CSS rule. Some users prefere '
+ 'indented closing brace of CSS rule for better readability. '
+ 'This preference’s value will be automatically inserted before '
+ 'This preferences value will be automatically inserted before '
+ 'closing brace when user adds newline in newly created CSS rule '
+ '(e.g. when “Insert formatted linebreak” action will be performed '
+ 'in CSS file). If you’re such user, you may want to write put a value '
+ '(e.g. when “Insert formatted linebreak” action will be performed '
+ 'in CSS file). If youre such user, you may want to write put a value '
+ 'like <code>\\n\\t</code> in this preference.');
/**
@ -9872,7 +9871,7 @@ emmet.exec(function(require, _) {
}
b64 = 'data:' + (actionUtils.mimeTypes[String(file.getExt(realImgPath))] || defaultMimeType) +
';base64,' + b64;
';base64,' + b64;
editor.replaceContent('$0' + b64, pos, pos + imgPath.length);
});
@ -10002,7 +10001,7 @@ emmet.exec(function(require, _) {
}
require('actions').add('update_image_size', function(editor) {
// this action will definitely won’t work in SASS dialect,
// this action will definitely wont work in SASS dialect,
// but may work in SCSS or LESS
if (_.include(['css', 'less', 'scss'], String(editor.getSyntax()))) {
updateImageSizeCSS(editor);
@ -10134,23 +10133,23 @@ emmet.define('cssResolver', function(require, _) {
'Automatically generate vendor-prefixed copies of expanded CSS '
+ 'property. By default, Emmet will generate vendor-prefixed '
+ 'properties only when you put dash before abbreviation '
+ '(e.g. <code>-bxsh</code>). With this option enabled, you don’t '
+ '(e.g. <code>-bxsh</code>). With this option enabled, you dont '
+ 'need dashes before abbreviations: Emmet will produce '
+ 'vendor-prefixed properties for you.');
var descTemplate = _.template('A comma-separated list of CSS properties that may have '
+ '<code><%= vendor %></code> vendor prefix. This list is used to generate '
+ 'a list of prefixed properties when expanding <code>-property</code> '
+ 'abbreviations. Empty list means that all possible CSS values may '
+ 'have <code><%= vendor %></code> prefix.');
+ '<code><%= vendor %></code> vendor prefix. This list is used to generate '
+ 'a list of prefixed properties when expanding <code>-property</code> '
+ 'abbreviations. Empty list means that all possible CSS values may '
+ 'have <code><%= vendor %></code> prefix.');
var descAddonTemplate = _.template('A comma-separated list of <em>additional</em> CSS properties '
+ 'for <code>css.<%= vendor %>Preperties</code> preference. '
+ 'You should use this list if you want to add or remove a few CSS '
+ 'properties to original set. To add a new property, simply write its name, '
+ 'to remove it, precede property with hyphen.<br>'
+ 'For example, to add <em>foo</em> property and remove <em>border-radius</em> one, '
+ 'the preference value will look like this: <code>foo, -border-radius</code>.');
+ 'for <code>css.<%= vendor %>Preperties</code> preference. '
+ 'You should use this list if you want to add or remove a few CSS '
+ 'properties to original set. To add a new property, simply write its name, '
+ 'to remove it, precede property with hyphen.<br>'
+ 'For example, to add <em>foo</em> property and remove <em>border-radius</em> one, '
+ 'the preference value will look like this: <code>foo, -border-radius</code>.');
// properties list is created from cssFeatures.html file
var props = {
@ -10166,7 +10165,7 @@ emmet.define('cssResolver', function(require, _) {
});
prefs.define('css.unitlessProperties', 'z-index, line-height, opacity, font-weight, zoom',
'The list of properties whose values ​​must not contain units.');
'The list of properties whose values must not contain units.');
prefs.define('css.intUnit', 'px', 'Default unit for integer values');
prefs.define('css.floatUnit', 'em', 'Default unit for float values');
@ -10391,8 +10390,8 @@ emmet.define('cssResolver', function(require, _) {
function formatProperty(property, syntax) {
var ix = property.indexOf(':');
property = property.substring(0, ix).replace(/\s+$/, '')
+ getSyntaxPreference('valueSeparator', syntax)
+ require('utils').trim(property.substring(ix + 1));
+ getSyntaxPreference('valueSeparator', syntax)
+ require('utils').trim(property.substring(ix + 1));
return property.replace(/\s*;\s*$/, getSyntaxPreference('propertyEnd', syntax));
}
@ -10776,7 +10775,7 @@ emmet.define('cssResolver', function(require, _) {
}
if (!snippet && prefs.get('css.fuzzySearch')) {
// let’s try fuzzy search
// lets try fuzzy search
snippet = resources.fuzzyFindSnippet(syntax, abbrData.property, parseFloat(prefs.get('css.fuzzySearchMinScore')));
}
@ -10794,8 +10793,8 @@ emmet.define('cssResolver', function(require, _) {
var result = [];
if (!value && abbrData.values) {
value = _.map(abbrData.values, function(val) {
return this.normalizeValue(val, snippetObj.name);
}, this).join(' ') + ';';
return this.normalizeValue(val, snippetObj.name);
}, this).join(' ') + ';';
}
snippetObj.value = value || snippetObj.value;
@ -11085,7 +11084,7 @@ emmet.define('cssGradient', function(require, _) {
direction = textualDirection(direction);
if(reDeg.test(direction))
throw "The direction is an angle that can’t be converted.";
throw "The direction is an angle that cant be converted.";
var v = function(pos) {
return ~direction.indexOf(pos) ? '100%' : '0';
@ -11330,7 +11329,7 @@ emmet.define('cssGradient', function(require, _) {
cssProp = cssRule.itemFromPosition(pos, true);
if (!cssProp) {
// in case user just started writing CSS property
// and didn't include semicolon–try another approach
// and didn't include semicolontry another approach
cssProp = _.find(cssRule.list(), function(elem) {
return elem.range(true).end == pos;
});
@ -11672,7 +11671,7 @@ emmet.define('tagName', function(require, _) {
},
/**
* Adds new parent–child mapping
* Adds new parentchild mapping
* @param {String} parent
* @param {String} child
*/
@ -11735,11 +11734,11 @@ emmet.define('tagName', function(require, _) {
*/
emmet.exec(function(require, _) {
var prefs = require('preferences');
prefs.define('bem.elementSeparator', '__', 'Class name’s element separator.');
prefs.define('bem.modifierSeparator', '_', 'Class name’s modifier separator.');
prefs.define('bem.elementSeparator', '__', 'Class names element separator.');
prefs.define('bem.modifierSeparator', '_', 'Class names modifier separator.');
prefs.define('bem.shortElementPrefix', '-',
'Symbol for describing short “block-element” notation. Class names '
+ 'prefixed with this symbol will be treated as element name for parent‘s '
'Symbol for describing short “block-element” notation. Class names '
+ 'prefixed with this symbol will be treated as element name for parents '
+ 'block name. Each symbol instance traverses one level up in parsed '
+ 'tree for block name lookup. Empty value will disable short notation.');
@ -11778,8 +11777,8 @@ emmet.exec(function(require, _) {
if (!item.__bem.block) {
reBlockName = /^[a-z]/i;
item.__bem.block = _.find(classNames, function(name) {
return reBlockName.test(name);
}) || '';
return reBlockName.test(name);
}) || '';
}
classNames = _.chain(classNames)
@ -11937,16 +11936,16 @@ emmet.exec(function(require, _) {
* It does several things:<br>
* <ul>
* <li>Expands complex class name (according to BEM symbol semantics):
* .block__elem_modifier → .block.block__elem.block__elem_modifier
* .block__elem_modifier .block.block__elem.block__elem_modifier
* </li>
* <li>Inherits block name on child elements:
* .b-block > .__el > .__el → .b-block > .b-block__el > .b-block__el__el
* .b-block > .__el > .__el .b-block > .b-block__el > .b-block__el__el
* </li>
* <li>Treats first dash symbol as '__'</li>
* <li>Double underscore (or typographic '–') is also treated as an element
* level lookup, e.g. ____el will search for element definition in parent’s
* <li>Double underscore (or typographic '') is also treated as an element
* level lookup, e.g. ____el will search for element definition in parents
* parent element:
* .b-block > .__el1 > .____el2 → .b-block > .b-block__el1 > .b-block__el2
* .b-block > .__el1 > .____el2 .b-block > .b-block__el1 > .b-block__el2
* </li>
* </ul>
*
@ -12003,16 +12002,16 @@ emmet.exec(function(require, _) {
+ 'the following properties and functions are availabe:\n'
+ '<ul>'
+ '<li><code>attr(name, before, after)</code> – a function that outputs'
+ '<li><code>attr(name, before, after)</code> a function that outputs'
+ 'specified attribute value concatenated with <code>before</code> '
+ 'and <code>after</code> strings. If attribute doesn\'t exists, the '
+ 'empty string will be returned.</li>'
+ '<li><code>node</code> – current node (instance of <code>AbbreviationNode</code>)</li>'
+ '<li><code>node</code> current node (instance of <code>AbbreviationNode</code>)</li>'
+ '<li><code>name</code> – name of current tag</li>'
+ '<li><code>name</code> name of current tag</li>'
+ '<li><code>padding</code> – current string padding, can be used '
+ '<li><code>padding</code> current string padding, can be used '
+ 'for formatting</li>'
+'</ul>');
@ -12223,7 +12222,7 @@ emmet.exec(function(require, _){
function processSnippet(item, profile, level) {
item.start = item.end = '';
if (!isVeryFirstChild(item) && profile.tag_nl !== false && shouldAddLineBreak(item, profile)) {
// check if we’re not inside inline element
// check if were not inside inline element
if (isRoot(item.parent) || !require('abbreviationUtils').isInline(item.parent)) {
item.start = require('utils').getNewline() + item.start;
}
@ -12658,11 +12657,11 @@ emmet.exec(function(require, _) {
* https://code.djangoproject.com/browser/django/trunk/django/contrib/webdesign/lorem_ipsum.py
* <br><br>
* Examples to test:<br>
* <code>lipsum</code> – generates 30 words text.<br>
* <code>lipsum*6</code> – generates 6 paragraphs (autowrapped with &lt;p&gt; element) of text.<br>
* <code>ol>lipsum10*5</code> — generates ordered list with 5 list items (autowrapped with &lt;li&gt; tag)
* <code>lipsum</code> generates 30 words text.<br>
* <code>lipsum*6</code> generates 6 paragraphs (autowrapped with &lt;p&gt; element) of text.<br>
* <code>ol>lipsum10*5</code> generates ordered list with 5 list items (autowrapped with &lt;li&gt; tag)
* with text of 10 words on each line<br>
* <code>span*3>lipsum20</code> – generates 3 paragraphs of 20-words text, each wrapped with &lt;span&gt; element .
* <code>span*3>lipsum20</code> generates 3 paragraphs of 20-words text, each wrapped with &lt;span&gt; element .
* Each paragraph phrase is unique
* @param {Function} require
* @param {Underscore} _
@ -12704,33 +12703,33 @@ emmet.define('lorem', function(require, _) {
'maxime', 'corrupti']
},
ru: {
common: ['далеко-далеко', 'за', 'словесными', 'горами', 'в стране', 'гласных', 'и согласных', 'живут', 'рыбные', 'тексты'],
words: ['вдали', 'от всех', 'они', 'буквенных', 'домах', 'на берегу', 'семантика',
'большого', 'языкового', 'океана', 'маленький', 'ручеек', 'даль',
'журчит', 'по всей', 'обеспечивает', 'ее','всеми', 'необходимыми',
'правилами', 'эта', 'парадигматическая', 'страна', 'которой', 'жаренные',
'предложения', 'залетают', 'прямо', 'рот', 'даже', 'всемогущая',
'пунктуация', 'не', 'имеет', 'власти', 'над', 'рыбными', 'текстами',
'ведущими', 'безорфографичный', 'образ', 'жизни', 'однажды', 'одна',
'маленькая', 'строчка','рыбного', 'текста', 'имени', 'lorem', 'ipsum',
'решила', 'выйти', 'большой', 'мир', 'грамматики', 'великий', 'оксмокс',
'предупреждал', 'о', 'злых', 'запятых', 'диких', 'знаках', 'вопроса',
'коварных', 'точках', 'запятой', 'но', 'текст', 'дал', 'сбить',
'себя', 'толку', 'он', 'собрал', 'семь', 'своих', 'заглавных', 'букв',
'подпоясал', 'инициал', 'за', 'пояс', 'пустился', 'дорогу',
'взобравшись', 'первую', 'вершину', 'курсивных', 'гор', 'бросил',
'последний', 'взгляд', 'назад', 'силуэт', 'своего', 'родного', 'города',
'буквоград', 'заголовок', 'деревни', 'алфавит', 'подзаголовок', 'своего',
'переулка', 'грустный', 'реторический', 'вопрос', 'скатился', 'его',
'щеке', 'продолжил', 'свой', 'путь', 'дороге', 'встретил', 'рукопись',
'она', 'предупредила', 'моей', 'все', 'переписывается', 'несколько',
'раз', 'единственное', 'что', 'меня', 'осталось', 'это', 'приставка',
'возвращайся', 'ты', 'лучше', 'свою', 'безопасную', 'страну', 'послушавшись',
'рукописи', 'наш', 'продолжил', 'свой', 'путь', 'вскоре', 'ему',
'повстречался', 'коварный', 'составитель', 'рекламных', 'текстов',
'напоивший', 'языком', 'речью', 'заманивший', 'свое', 'агенство',
'которое', 'использовало', 'снова', 'снова', 'своих', 'проектах',
'если', 'переписали', 'то', 'живет', 'там', 'до', 'сих', 'пор']
common: ['далеко-далеко', 'за', 'словесными', 'горами', 'в стране', 'гласных', 'и согласных', 'живут', 'рыбные', 'тексты'],
words: ['вдали', 'от всех', 'они', 'буквенных', 'домах', 'на берегу', 'семантика',
'большого', 'языкового', 'океана', 'маленький', 'ручеек', 'даль',
'журчит', 'по всей', 'обеспечивает', 'ее','всеми', 'необходимыми',
'правилами', 'эта', 'парадигматическая', 'страна', 'которой', 'жаренные',
'предложения', 'залетают', 'прямо', 'рот', 'даже', 'всемогущая',
'пунктуация', 'не', 'имеет', 'власти', 'над', 'рыбными', 'текстами',
'ведущими', 'безорфографичный', 'образ', 'жизни', 'однажды', 'одна',
'маленькая', 'строчка','рыбного', 'текста', 'имени', 'lorem', 'ipsum',
'решила', 'выйти', 'большой', 'мир', 'грамматики', 'великий', 'оксмокс',
'предупреждал', 'о', 'злых', 'запятых', 'диких', 'знаках', 'вопроса',
'коварных', 'точках', 'запятой', 'но', 'текст', 'дал', 'сбить',
'себя', 'толку', 'он', 'собрал', 'семь', 'своих', 'заглавных', 'букв',
'подпоясал', 'инициал', 'за', 'пояс', 'пустился', 'дорогу',
'взобравшись', 'первую', 'вершину', 'курсивных', 'гор', 'бросил',
'последний', 'взгляд', 'назад', 'силуэт', 'своего', 'родного', 'города',
'буквоград', 'заголовок', 'деревни', 'алфавит', 'подзаголовок', 'своего',
'переулка', 'грустный', 'реторический', 'вопрос', 'скатился', 'его',
'щеке', 'продолжил', 'свой', 'путь', 'дороге', 'встретил', 'рукопись',
'она', 'предупредила', 'моей', 'все', 'переписывается', 'несколько',
'раз', 'единственное', 'что', 'меня', 'осталось', 'это', 'приставка',
'возвращайся', 'ты', 'лучше', 'свою', 'безопасную', 'страну', 'послушавшись',
'рукописи', 'наш', 'продолжил', 'свой', 'путь', 'вскоре', 'ему',
'повстречался', 'коварный', 'составитель', 'рекламных', 'текстов',
'напоивший', 'языком', 'речью', 'заманивший', 'свое', 'агенство',
'которое', 'использовало', 'снова', 'снова', 'своих', 'проектах',
'если', 'переписали', 'то', 'живет', 'там', 'до', 'сих', 'пор']
}
};

View File

@ -516,6 +516,9 @@
publicUrl = items[i].publicUrl
}
// Spaces in URLs break Markdown syntax
publicUrl = publicUrl.replace(/\s/g, '%20')
onSuccess(publicUrl)
this.hide()

View File

@ -200,7 +200,8 @@ to{background-position:0 0}
.redactor-editor video,.redactor-editor img{height:auto}
.redactor-editor div,.redactor-editor p,.redactor-editor ul,.redactor-editor ol,.redactor-editor table,.redactor-editor dl,.redactor-editor figure,.redactor-editor blockquote,.redactor-editor pre{margin:0;margin-bottom:15px;border:none;background:none;box-shadow:none}
.redactor-editor iframe,.redactor-editor object,.redactor-editor hr{margin-bottom:15px}
.redactor-editor blockquote{margin-left:1.6em !important;padding-left:0;color:#777;font-style:italic}
.redactor-editor blockquote{margin-left:1.6em !important;padding:0;text-align:left;color:#777;font-style:italic}
.redactor-editor blockquote:before,.redactor-editor blockquote:after{content:''}
.redactor-editor ul,.redactor-editor ol{padding-left:2em}
.redactor-editor ul ul,.redactor-editor ol ol,.redactor-editor ul ol,.redactor-editor ol ul{margin:2px;padding:0;padding-left:2em;border:none}
.redactor-editor ol ol li{list-style-type:lower-alpha}

File diff suppressed because one or more lines are too long

View File

@ -72,6 +72,7 @@
imageResizable: true,
buttonSource: true,
removeDataAttr: false,
toolbarFixed: false,
syncBeforeCallback: this.proxy(this.onSyncBefore),
focusCallback: this.proxy(this.onFocus),
blurCallback: this.proxy(this.onBlur),

View File

@ -841,10 +841,15 @@ body .redactor-box-fullscreen {
}
.redactor-editor blockquote {
margin-left: 1.6em !important;
padding-left: 0;
padding: 0;
text-align: left;
color: #777;
font-style: italic;
}
.redactor-editor blockquote:before,
.redactor-editor blockquote:after {
content: '';
}
.redactor-editor ul,
.redactor-editor ol {
padding-left: 2em;

View File

@ -1,6 +1,6 @@
/*
Redactor 10.2.2
Updated: July 15, 2015
Redactor 10.2.5
Updated: October 1, 2015
http://imperavi.com/redactor/
@ -92,7 +92,7 @@
// Functionality
$.Redactor = Redactor;
$.Redactor.VERSION = '10.2.2';
$.Redactor.VERSION = '10.2.5';
$.Redactor.modules = ['alignment', 'autosave', 'block', 'buffer', 'build', 'button',
'caret', 'clean', 'code', 'core', 'dropdown', 'file', 'focus',
'image', 'indent', 'inline', 'insert', 'keydown', 'keyup',
@ -477,15 +477,18 @@
set: function(type)
{
// focus
if (!this.utils.browser('msie')) this.$editor.focus();
this.buffer.set();
this.selection.save();
if (!this.utils.browser('msie') && !this.opts.linebreaks)
{
this.$editor.focus();
}
// get blocks
this.alignment.blocks = this.selection.getBlocks();
this.alignment.type = type;
this.buffer.set();
this.selection.save();
// set alignment
if (this.alignment.isLinebreaksOrNoBlocks())
{
@ -562,6 +565,8 @@
},
load: function()
{
if (!this.opts.autosave) return;
this.autosave.source = this.code.get();
if (this.autosave.html === this.autosave.source) return;
@ -715,7 +720,6 @@
return;
}
var block = this.block.blocks[0];
if (block === false) return;
@ -784,6 +788,7 @@
setMultiple: function(tag)
{
var block = this.block.blocks[0];
var isContainerTable = (this.block.containerTag == 'TD' || this.block.containerTag == 'TH');
if (block !== false && this.block.blocksSize === 1)
@ -1236,6 +1241,8 @@
build: function()
{
return {
focused: false,
blured: true,
run: function()
{
this.build.createContainerBox();
@ -1361,6 +1368,12 @@
setEvents: function()
{
// drop
this.$editor.on('dragover.redactor dragenter.redactor', function(e)
{
e.preventDefault();
e.stopPropagation();
});
this.$editor.on('drop.redactor', $.proxy(function(e)
{
e = e.originalEvent || e;
@ -1419,33 +1432,50 @@
}
// focus
if ($.isFunction(this.opts.focusCallback))
this.$editor.on('focus.redactor', $.proxy(function(e)
{
this.$editor.on('focus.redactor', $.proxy(this.opts.focusCallback, this));
}
if ($.isFunction(this.opts.focusCallback))
{
this.core.setCallback('focus', e);
}
$(document).on('mousedown.redactor.' + this.uuid, $.proxy(function(e) { this.blurClickedElement = e.target; }, this));
this.build.focused = true;
this.build.blured = false;
if (this.selection.getCurrent() === false)
{
this.selection.get();
this.range.setStart(this.$editor[0], 0);
this.range.setEnd(this.$editor[0], 0);
this.selection.addRange();
}
}, this));
// blur
this.$editor.on('blur.redactor', $.proxy(function(e)
$(document).on('mousedown.redactor-blur.' + this.uuid, $.proxy(function(e)
{
if (this.start) return;
if (this.rtePaste) return;
if (!this.build.isBlured()) return;
if ($(e.target).closest('.redactor-editor, .redactor-toolbar, .redactor-dropdown').size() !== 0)
{
return;
}
this.utils.disableSelectAll();
if ($.isFunction(this.opts.blurCallback)) this.core.setCallback('blur', e);
if (!this.build.blured && $.isFunction(this.opts.blurCallback))
{
this.core.setCallback('blur', e);
}
this.build.focused = false;
this.build.blured = true;
}, this));
},
isBlured: function()
{
if (this.blurClickedElement === true) return true;
var $el = $(this.blurClickedElement);
return (!$el.hasClass('redactor-toolbar, redactor-dropdown') && !$el.is('#redactor-modal') && $el.parents('.redactor-toolbar, .redactor-dropdown, #redactor-modal').length === 0);
},
setHelpers: function()
{
@ -1578,15 +1608,19 @@
$button.on('mouseover', function()
{
if ($(this).hasClass('redactor-button-disabled')) return;
if ($(this).hasClass('redactor-button-disabled'))
{
return;
}
var pos = $button.offset();
$tooltip.show();
$tooltip.css({
top: (pos.top + $button.innerHeight()) + 'px',
left: (pos.left + $button.innerWidth()/2 - $tooltip.innerWidth()/2) + 'px'
});
$tooltip.show();
});
$button.on('mouseout', function()
@ -1601,6 +1635,8 @@
e.preventDefault();
$(document).find('.redactor-toolbar-tooltip').hide();
if (this.utils.browser('msie')) e.returnValue = false;
if (type == 'command') this.inline.format(callback);
@ -1611,9 +1647,6 @@
{
var func;
// blur
this.blurClickedElement = true;
if ($.isFunction(callback)) callback.call(this, btnName);
else if (callback.search(/\./) != '-1')
{
@ -1939,7 +1972,7 @@
var node, offset = 0;
var walker = document.createTreeWalker(this.$editor[0], NodeFilter.SHOW_TEXT, null, null);
while (node == walker.nextNode())
while (node = walker.nextNode())
{
offset += node.nodeValue.length;
if (offset > start)
@ -1974,7 +2007,7 @@
return {
onSet: function(html)
{
//html = this.clean.savePreCode(html);
html = this.clean.savePreCode(html);
// convert script tag
html = html.replace(/<script(.*?[^>]?)>([\w\W]*?)<\/script>/gi, '<pre class="redactor-script-tag" style="display: none;" $1>$2</pre>');
@ -1985,7 +2018,7 @@
// replace special characters in links
html = html.replace(/<a href="(.*?[^>]?)®(.*?[^>]?)">/gi, '<a href="$1&reg$2">');
if (this.opts.replaceDivs) html = this.clean.replaceDivs(html);
if (this.opts.replaceDivs && !this.opts.linebreaks) html = this.clean.replaceDivs(html);
if (this.opts.linebreaks) html = this.clean.replaceParagraphsToBr(html);
// save form tag
@ -2010,7 +2043,7 @@
$div.remove();
// remove font tag
html = html.replace(/<font(.*?[^<])>/gi, '');
html = html.replace(/<font(.*?)>/gi, '');
html = html.replace(/<\/font>/gi, '');
// tidy html
@ -2070,7 +2103,7 @@
html = html.replace(/<br\s?\/?>$/gi, '');
}
// remove br in the of li
// remove br in|of li tags
html = html.replace(new RegExp('<br\\s?/?></li>', 'gi'), '</li>');
html = html.replace(new RegExp('</li><br\\s?/?>', 'gi'), '</li>');
@ -2082,7 +2115,7 @@
html = html.replace(/"">/gi, '">');
// remove verified
html = html.replace(/<div(.*?[^>]) data-tagblock="redactor"(.*?[^>])>/gi, '<div$1$2>');
html = html.replace(/<div(.*?)data-tagblock="redactor"(.*?[^>])>/gi, '<div$1$2>');
html = html.replace(/<(.*?) data-verified="redactor"(.*?[^>])>/gi, '<$1$2>');
var $div = $("<div/>").html($.parseHTML(html, document, true));
@ -2107,7 +2140,7 @@
html = html.replace(/<span(.*?)id="redactor-image-editter"(.*?[^>])>(.*?)<\/span>/gi, '');
// remove font tag
html = html.replace(/<font(.*?[^<])>/gi, '');
html = html.replace(/<font(.*?)>/gi, '');
html = html.replace(/<\/font>/gi, '');
// tidy html
@ -2602,6 +2635,8 @@
getPlainText: function(html, paragraphize)
{
html = this.clean.getTextFromHtml(html);
html = html.replace(/\n\s*\n/g, "\n");
html = html.replace(/\n\n/g, "\n");
html = html.replace(/\n/g, '<br />');
if (this.opts.paragraphize && typeof paragraphize == 'undefined' && !this.utils.browser('mozilla'))
@ -2831,7 +2866,7 @@
if (this.utils.browser('msie'))
{
html = html.replace(/<span(.*?)id="selection-marker-(1|2)"(.*?)><\/span>;/gi, '');
html = html.replace(/<span(.*?)id="selection-marker-(1|2)"(.*?)><\/span>/gi, '');
}
this.$editor.html(html);
@ -2864,7 +2899,7 @@
var html = this.$editor.html();
// is there a need to synchronize
if (this.code.syncCode && this.code.syncCode == html)
if (this.code.syncCode && this.code.syncCode == html || (this.start && html == '' ))
{
// do not sync
return;
@ -3213,6 +3248,7 @@
this.$element.off('.redactor').removeData('redactor');
this.$editor.off('.redactor');
$(document).off('mousedown.redactor-blur.' + this.uuid);
$(document).off('mousedown.redactor.' + this.uuid);
$(document).off('click.redactor-image-delete.' + this.uuid);
$(document).off('click.redactor-image-resize-hide.' + this.uuid);
@ -3425,7 +3461,6 @@
// disable scroll whan dropdown scroll
$dropdown.on('mouseover.redactor-dropdown', $.proxy(this.utils.disableBodyScroll, this)).on('mouseout.redactor-dropdown', $.proxy(this.utils.enableBodyScroll, this));
e.stopPropagation();
},
closeHandler: function(e)
@ -3459,8 +3494,11 @@
if (!$dropdown.hasClass('dropact') && !$dropdown.hasClass('redactor-dropdown-link-inactive'))
{
$dropdown.removeClass('dropact');
$dropdown.off('mouseover mouseout');
if ($dropdown.hasClass('redactor-dropdown'))
{
$dropdown.removeClass('dropact');
$dropdown.off('mouseover mouseout');
}
this.dropdown.hideAll();
}
@ -3603,13 +3641,7 @@
},
isFocused: function()
{
var focusNode = document.getSelection().focusNode;
if (focusNode === null) return false;
if (this.opts.linebreaks && $(focusNode.parentNode).hasClass('redactor-linebreaks')) return true;
else if (!this.utils.isRedactorParent(focusNode.parentNode)) return false;
return this.$editor.is(':focus');
return this.$editor[0] === document.activeElement;
}
};
},
@ -4255,9 +4287,6 @@
var current = this.selection.getCurrent();
if (current && current.tagName === 'TR') return;
// blur
this.blurClickedElement = true;
// Stop formatting pre and headers
if (this.utils.isCurrentOrParent('PRE') || this.utils.isCurrentOrParentHeader()) return;
@ -4284,7 +4313,7 @@
this.buffer.set();
if (!this.utils.browser('msie'))
if (!this.utils.browser('msie') && !this.opts.linebreaks)
{
this.$editor.focus();
}
@ -4363,7 +4392,7 @@
var $parent = $span.parent();
// remove U tag if selected link + node
if ($parent && $parent[0].tagName === 'U')
if ($span[0].tagName === 'A' && $parent && $parent[0].tagName === 'U')
{
$span.parent().replaceWith($span);
}
@ -4424,6 +4453,15 @@
});
}
if (tag != 'u')
{
var _this = this;
this.$editor.find('unline').each(function(i,s)
{
_this.utils.replaceToTag(s, 'u');
});
}
this.selection.restore();
this.code.sync();
@ -4483,6 +4521,14 @@
});
}
if (tag != 'u')
{
this.$editor.find('u').each(function(i,s)
{
self.utils.replaceToTag(s, 'unline');
});
}
if (tag != 'span')
{
this.$editor.find(tag).each(function()
@ -4722,7 +4768,10 @@
if (typeof clean == 'undefined') clean = true;
this.$editor.focus();
if (!this.opts.linebreaks)
{
this.$editor.focus();
}
html = this.clean.setVerified(html);
@ -4817,6 +4866,7 @@
{
node = node[0] || node;
var offset = this.caret.getOffset();
var html = this.utils.getOuterHtml(node);
html = this.clean.setVerified(html);
@ -4836,6 +4886,8 @@
this.range.collapse(false);
this.selection.addRange();
this.caret.setOffset(offset);
return node;
},
nodeToPoint: function(node, x, y)
@ -5175,7 +5227,6 @@
return;
}
// remove hr in FF
if (this.utils.browser('mozilla'))
{
@ -5206,7 +5257,7 @@
checkKeyEvents: function(key)
{
var k = this.keyCode;
var keys = [k.BACKSPACE, k.DELETE, k.ENTER, k.SPACE, k.ESC, k.TAB, k.CTRL, k.META, k.ALT, k.SHIFT];
var keys = [k.BACKSPACE, k.DELETE, k.ENTER, k.ESC, k.TAB, k.CTRL, k.META, k.ALT, k.SHIFT];
return ($.inArray(key, keys) == -1) ? true : false;
@ -5240,7 +5291,7 @@
}
else if (!this.keydown.ctrl)
{
if (key == this.keyCode.BACKSPACE || key == this.keyCode.DELETE || (key == this.keyCode.ENTER && !e.ctrlKey && !e.shiftKey) || key == this.keyCode.SPACE)
if (key == this.keyCode.BACKSPACE || key == this.keyCode.DELETE || (key == this.keyCode.ENTER && !e.ctrlKey && !e.shiftKey))
{
this.buffer.set();
}
@ -5506,7 +5557,9 @@
space.innerHTML = '&#x200b;';
$(br1).after(space);
this.caret.setAfter(space);
this.range.setStartAfter(space);
this.range.setEndAfter(space);
$(space).remove();
}
else
@ -5517,7 +5570,6 @@
var selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
}
}
@ -5557,6 +5609,7 @@
return {
init: function(e)
{
if (this.rtePaste) return;
var key = e.which;
@ -5574,7 +5627,7 @@
}
// replace to p before / after the table or body
if (!this.opts.linebreaks && this.keyup.current.nodeType == 3 && this.keyup.current.length <= 1 && (this.keyup.parent === false || this.keyup.parent.tagName == 'BODY'))
if (!this.opts.linebreaks && this.keyup.current.nodeType === 3 && this.keyup.current.length <= 1 && (this.keyup.parent === false || this.keyup.parent.tagName == 'BODY'))
{
this.keyup.replaceToParagraph();
}
@ -5637,6 +5690,8 @@
$(this.keyup.current).remove();
}
this.keyup.removeEmptyLists();
// if empty
return this.keyup.formatEmpty(e);
}
@ -5664,6 +5719,20 @@
this.caret.setEnd(node);
},
removeEmptyLists: function()
{
var removeIt = function()
{
var html = $.trim(this.innerHTML).replace(/\/t\/n/g, '');
if (html === '')
{
$(this).remove();
}
};
this.$editor.find('li').each(removeIt);
this.$editor.find('ul, ol').each(removeIt);
},
formatEmpty: function(e)
{
var html = $.trim(this.$editor.html());
@ -5915,6 +5984,7 @@
// mailto
if (link.search('@') != -1 && /(http|ftp|https):\/\//i.test(link) === false)
{
link = link.replace('mailto:', '');
link = 'mailto:' + link;
}
// url, not anchor
@ -5993,7 +6063,13 @@
var $a = $('<a />').attr('href', link).text(text);
if (target !== '') $a.attr('target', target);
this.insert.node($a);
$a = $(this.insert.node($a));
if (this.opts.linebreaks)
{
$a.after('&nbsp;');
}
this.selection.selectElement($a);
}
else
@ -6037,6 +6113,10 @@
{
$a.text(text);
}
else if (this.opts.linebreaks)
{
$a.text(text);
}
this.selection.selectElement($a);
}
@ -6170,7 +6250,11 @@
});
// callback
this.core.setCallback('linkify', objects);
setTimeout($.proxy(function()
{
this.observe.load();
this.core.setCallback('linkify', objects);
}, this), 100);
// sync
this.code.sync();
@ -6239,7 +6323,10 @@
text = text.substring(0, this.opts.linkSize) + '...';
}
text = decodeURIComponent(text);
if (text.search('%') === -1)
{
text = decodeURIComponent(text);
}
var regexB = "\\b";
@ -6265,7 +6352,11 @@
toggle: function(cmd)
{
this.placeholder.remove();
if (!this.utils.browser('msie')) this.$editor.focus();
if (!this.utils.browser('msie') && !this.opts.linebreaks)
{
this.$editor.focus();
}
this.buffer.set();
this.selection.save();
@ -6335,6 +6426,7 @@
$td.after(newTd).remove('');
}
if (this.utils.isEmpty($list.find('li').text()))
{
var $children = $list.children('li');
@ -7198,7 +7290,9 @@
$(window).off('scroll.redactor-freeze');
if (this.linkify.isEnabled())
{
this.linkify.format();
}
}, this), 1);
},
@ -7213,18 +7307,18 @@
else
{
// bootstrap modal
if ($('.modal-body').length > 0)
var $visibleModals = $('.modal-body:visible');
if ($visibleModals.length > 0)
{
$('.modal-body').append(this.$pasteBox);
$visibleModals.append(this.$pasteBox);
}
else
{
$('body').append(this.$pasteBox);
}
}
this.$pasteBox.focus();
this.$pasteBox.get(0).focus();
},
insert: function(html)
{
@ -7261,6 +7355,7 @@
});
}, this), 10);
}
};
},
@ -7457,11 +7552,11 @@
var blocks = [];
nodes = (typeof nodes == 'undefined') ? this.selection.getNodes() : nodes;
$.each(nodes, $.proxy(function(i,node)
{
if (this.utils.isBlock(node))
{
this.selection.lastBlock = node;
blocks.push(node);
}
@ -7626,7 +7721,6 @@
{
this.selection.get();
var node1 = this.selection.getMarker(1);
this.selection.setMarker(this.range, node1, true);
@ -8064,6 +8158,12 @@
return {
setupAllowed: function()
{
var index = $.inArray('span', this.opts.removeEmpty);
if (index !== -1)
{
this.opts.removeEmpty.splice(index, 1);
}
if (this.opts.allowedTags) this.opts.deniedTags = false;
if (this.opts.allowedAttr) this.opts.removeAttr = false;
@ -8950,9 +9050,7 @@
s3executeOnSignedUrl: function(file, callback)
{
var xhr = new XMLHttpRequest();
var mark = '?';
if (this.opts.s3.search(/\?/) != '-1') mark = '&';
var mark = (this.opts.s3.search(/\?/) !== '-1') ? '?' : '&';
xhr.open('GET', this.opts.s3 + mark + 'name=' + file.name + '&type=' + file.type, true);
@ -9042,21 +9140,9 @@
}
}, this);
xhr.onerror = function()
{
//setProgress(0, 'XHR error.');
};
xhr.onerror = function() {};
xhr.upload.onprogress = function(e)
{
/*
if (e.lengthComputable)
{
var percentLoaded = Math.round((e.loaded / e.total) * 100);
setProgress(percentLoaded, percentLoaded == 100 ? 'Finalizing.' : 'Uploading.');
}
*/
};
xhr.upload.onprogress = function(e) {};
xhr.setRequestHeader('Content-Type', file.type);
xhr.setRequestHeader('x-amz-acl', 'public-read');
@ -9261,6 +9347,12 @@
return (offset == text.length) ? true : false;
},
isStartOfEditor: function()
{
var offset = this.caret.getOffsetOfElement(this.$editor[0]);
return (offset === 0) ? true : false;
},
isEndOfEditor: function()
{
var block = this.$editor[0];

View File

@ -898,9 +898,14 @@ body .redactor-box-fullscreen {
}
blockquote {
margin-left: 1.6em !important;
padding-left: 0;
padding: 0;
text-align: left;
color: #777;
font-style: italic;
&:before,
&:after {
content: '';
}
}
ul,
ol {

View File

@ -0,0 +1,322 @@
<?php
return [
'auth' => [
'title' => 'Administrace'
],
'field' => [
'invalid_type' => 'Byl použitý špatný typ :type.',
'options_method_not_exists' => "Modelová třída :model musí implementovat metodu :method(), která vrací volby pro formulářové pole ':field'"
],
'widget' => [
'not_registered' => "Třída widgetu se jménem ':name' není zaregistrovaná.",
'not_bound' => "Widget s názvem třídy ':name' není navázaná na kontroler."
],
'page' => [
'untitled' => 'Bez názvu',
'access_denied' => [
'label' => 'Přístup odmítnut',
'help' => 'Nemáte potřebná oprávnění k prohlížení této stránky.',
'cms_link' => 'Zpět do administrace'
],
'invalid_token' => [
'label' => 'Neplatný bezpečností token'
]
],
'partial' => [
'not_found_name' => "Dílčí šablona ':name' nebyla nalezena."
],
'account' => [
'sign_out' => 'Odhlásit',
'login' => 'Přihlásit se',
'reset' => 'Resetovat',
'restore' => 'Obnovit',
'login_placeholder' => 'login',
'password_placeholder' => 'heslo',
'forgot_password' => 'Zapomněli jste heslo?',
'enter_email' => 'Zadejte váš e-mail',
'enter_login' => 'Zadejte váš login',
'email_placeholder' => 'e-mail',
'enter_new_password' => 'Zadejte nové heslo',
'password_reset' => 'Obnova hesla',
'restore_success' => 'E-mail byl zaslán na vaší e-mailovou adresu s heslem a instrukcemi k obnově.',
'restore_error' => "Uživatel s přihlašovacím jménem ':login' nebyl nalezen",
'reset_success' => 'Vaše heslo bylo úspěšně obnoveno. Nyní se můžete přihlásit.',
'reset_error' => 'Data pro obnovu hesla nejsou správná. Prosím zkuste to znovu!',
'reset_fail' => 'Obnova hesla selhala!',
'apply' => 'Použít',
'cancel' => 'Zrušit',
'delete' => 'Smazat',
'ok' => 'OK'
],
'dashboard' => [
'menu_label' => 'Plocha',
'widget_label' => 'Widget',
'widget_width' => 'Šířka',
'full_width' => 'plná šířka',
'add_widget' => 'Přidat widget',
'widget_inspector_title' => 'Nastavení widgetu',
'widget_inspector_description' => 'Zde si upravte všechna nastavení widgetu',
'widget_columns_label' => 'Šířka :columns',
'widget_columns_description' => 'Šířka widgetu, zadejte číslo mezi 1 a 10.',
'widget_columns_error' => 'Zadejte prosím šířku widgetu jako číslo mezi 1 a 10.',
'columns' => '{1} sloupec|[2,Inf] sloupce',
'widget_new_row_label' => 'Vždy na novém řádku',
'widget_new_row_description' => 'Vloží widget do nového řádku.',
'widget_title_label' => 'Název widgetu',
'widget_title_error' => 'Musíte zadat název widgetu',
'status' => [
'widget_title_default' => 'Status systému',
'online' => 'online',
'maintenance' => 'v údržbě',
'update_available' => '{0} dostupných aktualizací!|{1} dostupná aktualizace!|[2,Inf] dostupných aktualizací!'
]
],
'user' => [
'name' => 'Administrátor',
'menu_label' => 'Administrátoři',
'menu_description' => 'Správa uživatelů administrace, jejich skupin a opravnění.',
'list_title' => 'Správa administrátorů',
'new' => 'Nový administrátor',
'login' => 'Přihlašovací jméno',
'first_name' => 'Křestní jméno',
'last_name' => 'Příjmení',
'full_name' => 'Celé jméno',
'email' => 'E-mail',
'groups' => 'Skupiny',
'groups_comment' => 'Vyberte do jakých skupin uživatel patří.',
'avatar' => 'Avatar',
'password' => 'Heslo',
'password_confirmation' => 'Potvrzení hesla',
'permissions' => 'Oprávnění',
'account' => 'Účet',
'superuser' => 'Super uživatel',
'superuser_comment' => 'Má neomezený přístup do všech stránek administrace.',
'send_invite' => 'Zaslat pozvánku e-mailem',
'send_invite_comment' => 'Odešle uvítací e-mail s údaji pro přihlášení.',
'delete_confirm' => 'Opravdu chcete smazat tohoto administrátora?',
'return' => 'Návrat na seznam administrátorů',
'allow' => 'Povolit',
'inherit' => 'Podědit',
'deny' => 'Odmítnout',
'group' => [
'name' => 'Skupina',
'name_field' => 'Jméno',
'description_field' => 'Popis',
'is_new_user_default_field' => 'Zařadit nové administrátory automaticky do této skupiny.',
'code_field' => 'Kód',
'code_comment' => 'Zadejte unikátní kód pro přístup přes API.',
'menu_label' => 'Skupiny',
'list_title' => 'Správa skupin',
'new' => 'Nová skupina',
'delete_confirm' => 'Opravdu chcete smazat tuto skupinu administrátorů?',
'return' => 'Návrat na seznam skupin',
'users_count' => 'Uživatelů'
],
'preferences' => [
'not_authenticated' => 'Nebyl nalezen žádný přihlášený uživatel pro načtení, nebo uložení nastavení.'
]
],
'list' => [
'default_title' => 'Seznam',
'search_prompt' => 'Hledat...',
'no_records' => 'Žádné záznamy v tomto pohledu.',
'missing_model' => 'List behavior used in :class does not have a model defined.',
'missing_column' => 'There are no column definitions for :columns.',
'missing_columns' => 'List used in :class has no list columns defined.',
'missing_definition' => "List behavior does not contain a column for ':field'.",
'behavior_not_ready' => 'List behavior has not been initialized, check that you have called makeLists() in your controller.',
'invalid_column_datetime' => "Column value ':column' is not a DateTime object, are you missing a \$dates reference in the Model?",
'pagination' => 'Zobrazuji záznamy: :from-:to z :total',
'prev_page' => 'Předchozí stránka',
'next_page' => 'Další stránka',
'loading' => 'Načítám...',
'setup_title' => 'Nastavení výpisu',
'setup_help' => 'Pomocí checkboxů si vyberte, které sloupce chcete ve výpisu vidět. Pozici změníte chytnutím a posunem nahorů, nebo dolů.',
'records_per_page' => 'Záznamů na stránku',
'records_per_page_help' => 'Vyberte kolik chcete vidět záznamů na jedné stránce. Vysoký počet záznamů může negativně ovlivnit rychlost stránek.',
'delete_selected' => 'Smazat vybrané',
'delete_selected_empty' => 'Nebyl vybrán žádný záznam ke smazání.',
'delete_selected_confirm' => 'Smazat vybrané záznamy?',
'delete_selected_success' => 'Vybrané záznamy byly úspěšně smazány.'
],
'fileupload' => [
'attachment' => 'Příloha',
'help' => 'Přidat název a popisek k příloze.',
'title_label' => 'Název',
'description_label' => 'Popis',
'default_prompt' => 'Click the %s or drag a file here to upload',
'attachment_url' => 'URL přílohy',
'upload_file' => 'Nahrát soubor',
'upload_error' => 'Chyba nahrávání',
'remove_confirm' => 'Jste si jistí?',
'remove_file' => 'Odstranit soubor'
],
'form' => [
'create_title' => 'Nový :name',
'update_title' => 'Upravit :name',
'preview_title' => 'Náhled :name',
'create_success' => ':name byl úspěšně vytvořen',
'update_success' => ':name byl úspěšně upraven',
'delete_success' => ':name byl úspěšně smazán',
'missing_id' => 'Musíte uvést ID záznamu.',
'missing_model' => 'Form behavior used in :class does not have a model defined.',
'missing_definition' => "Form behavior does not contain a field for ':field'.",
'not_found' => 'Form record with an ID of :id could not be found.',
'action_confirm' => 'Jste si jistí?',
'create' => 'Vytvořit',
'create_and_close' => 'Vytvořit a zavřít',
'creating' => 'Vytváření...',
'creating_name' => 'Vytváření :name...',
'save' => 'Uložit',
'save_and_close' => 'Uložit a zavřít',
'saving' => 'Ukládání...',
'saving_name' => 'Ukládání :name...',
'delete' => 'Smazat',
'deleting' => 'Mazání...',
'deleting_name' => 'Mazání :name...',
'reset_default' => 'Obnovit výchozí',
'resetting' => 'Obnovování',
'resetting_name' => 'Obnovování :name',
'undefined_tab' => 'Ostatní',
'field_off' => 'Off',
'field_on' => 'On',
'add' => 'Přidat',
'apply' => 'Použít',
'cancel' => 'Zrušit',
'close' => 'Zavřít',
'confirm' => 'Potvrdit',
'reload' => 'Znovu načíst',
'complete' => 'Kompletní',
'ok' => 'OK',
'or' => 'nebo',
'confirm_tab_close' => 'Opravdu chcete zavřít záložku? Neuložené změny budou ztraceny.',
'behavior_not_ready' => 'Chování formuláře není inicializováno, zkontrolujte jestli voláte metodu initForm() ve vašem kontroléru.',
'preview_no_files_message' => 'Žádný soubor nebyl nahrán.',
'preview_no_record_message' => 'Žádný záznam není vybraný.',
'select' => 'Vybrat',
'select_all' => 'vše',
'select_none' => 'nic',
'select_placeholder' => 'prosím vyberte',
'insert_row' => 'Vložit řádek',
'delete_row' => 'Smazat řádek',
'concurrency_file_changed_title' => 'Soubor byl změněn',
'concurrency_file_changed_description' => 'Soubor který upravujete byl na disku změněn jiným uživatelem. Můžete buď obnovit soubor a ztratit svoje změny, nebo přepsat soubor na disku.'
],
'relation' => [
'missing_config' => "Relation behavior does not have any configuration for ':config'.",
'missing_definition' => "Relation behavior does not contain a definition for ':field'.",
'missing_model' => 'Relation behavior used in :class does not have a model defined.',
'invalid_action_single' => 'This action cannot be performed on a singular relationship.',
'invalid_action_multi' => 'This action cannot be performed on a multiple relationship.',
'help' => 'Pro přidání klikněte na položku',
'related_data' => 'Related :name data',
'add' => 'Přidat',
'add_selected' => 'Přidat vybrané',
'add_a_new' => 'Přidat nový :name',
'link_selected' => 'Link selected',
'link_a_new' => 'Link a new :name',
'cancel' => 'Zrušit',
'close' => 'Zavřít',
'add_name' => 'Přidat :name',
'create' => 'Vytvořit',
'create_name' => 'Vytvořit :name',
'update' => 'Upravit',
'update_name' => 'Upravit :name',
'preview' => 'Náhled',
'preview_name' => 'Náhled :name',
'remove' => 'Odstranit',
'remove_name' => 'Odstranit :name',
'delete' => 'Smazat',
'delete_name' => 'Smazat :name',
'delete_confirm' => 'Jste si jistí?',
'link' => 'Link',
'link_name' => 'Link :name',
'unlink' => 'Unlink',
'unlink_name' => 'Unlink :name',
'unlink_confirm' => 'Jste si jistí?'
],
'reorder' => [
'default_title' => 'Seřadit záznamy',
'no_records' => 'Nenašli jsme žádné záznamy k seřazení.',
],
'model' => [
'name' => 'Model',
'not_found' => "Model ':class' s ID :id nebyl nalezen",
'missing_id' => 'Není specifikované ID pro hledání záznamu v modelu.',
'missing_relation' => "Model ':class' neobsahuje definici pro ':relation'.",
'missing_method' => "Model ':class' nemá implementovanou metodu ':method'.",
'invalid_class' => "Model :model použitý ve třídě :class není validní, musí dědit ze třídy Model.",
'mass_assignment_failed' => "Mass assignment failed for Model attribute ':attribute'."
],
'warnings' => [
'tips' => 'Tipy pro konfiguraci systému',
'tips_description' => 'Některé problémy s nastavením systému si vyžadují vaší pozornost.',
'permissions' => 'Složka :name nebo její podsložky nejsou pro PHP zapisovatelné. Nastavte prosím odpovídající oprávnění webového serveru pro tuto složku.',
'extension' => 'PHP rozšíření :name není nainstalované. Nainstalujte prosím knihovnu a aktivujte rozšíření.'
],
'editor' => [
'menu_label' => 'Nastavení editoru kódu',
'menu_description' => 'Nastavení editoru kódu, velikosti písma a barevného schématu.',
'font_size' => 'Velikost písma',
'tab_size' => 'Počet znaků odsazení',
'use_hard_tabs' => 'Odsazení tabulátory',
'code_folding' => 'Skládání kódu',
'word_wrap' => 'Zalamování řádek',
'highlight_active_line' => 'Zvýraznění aktivního řádku',
'auto_closing' => 'Automatické doplňování tagů a speciálních znaků',
'show_invisibles' => 'Zobrazit neviditelné znaky',
'show_gutter' => 'Zobrazit číslování řádků',
'theme' => 'Barevné schéma'
],
'tooltips' => [
'preview_website' => 'Náhled stránek'
],
'mysettings' => [
'menu_label' => 'Moje nastavení',
'menu_description' => 'Nastavení vašeho administrátorského účtu'
],
'myaccount' => [
'menu_label' => 'Můj účet',
'menu_description' => 'Nastavte si svoje jméno, e-mailovou adresu a heslo.',
'menu_keywords' => 'bezpečnost login'
],
'branding' => [
'menu_label' => 'Nastavení administrace',
'menu_description' => 'Nastavte si název, logo a barvy použité v administraci.',
'brand' => 'Značka',
'logo' => 'Logo',
'logo_description' => 'Nahrajte vlastní logo, které bude použité v administraci.',
'app_name' => 'Jméno aplikace',
'app_name_description' => 'Toto jméno se zobrazí v titulní liště stránek.',
'app_tagline' => 'Motto aplikace',
'app_tagline_description' => 'Toto motto se zobrazí na přihlašovací stránce administrace.',
'colors' => 'Barvy',
'primary_light' => 'Primární (světlá)',
'primary_dark' => 'Primární (tmavá)',
'secondary_light' => 'Sekundární (světlá)',
'secondary_dark' => 'Sekundární (tmavá)',
'styles' => 'Styly',
'custom_stylesheet' => 'Vlastní kaskádové styly'
],
'backend_preferences' => [
'menu_label' => 'Nastavení administrace',
'menu_description' => 'Nastavte si svůj účet, jako třeba jazyk.',
'locale' => 'Jazyk',
'locale_comment' => 'Vyberte si jazyk administrace, který chcete používat.'
],
'access_log' => [
'hint' => 'Tento záznam zobrazuje seznam úspěšných přihlášení do administrace. Záznamy jsou uchovávány :days dní.',
'menu_label' => 'Log přístupů',
'menu_description' => 'Zobrazit seznam úspěšných přihlášení do administrace.',
'created_at' => 'Datum & čas',
'login' => 'Login',
'ip_address' => 'IP adresa',
'first_name' => 'Jméno',
'last_name' => 'Příjmení',
'email' => 'E-mail'
],
'filter' => [
'all' => 'vše'
]
];

View File

@ -1,5 +1,5 @@
<?php
/* Greek Language Updated on 2015-08-07 v1.04 */
/* Greek Language Updated on 2015-08-29 v1.05 */
return [
'auth' => [
'title' => 'Περιοχή Διαχείρισης',
@ -236,6 +236,10 @@ return [
'unlink_name' => 'Αποσύνδεση :name',
'unlink_confirm' => 'Είστε σίγουροι;',
],
'reorder' => [
'default_title' => 'Αναδιάταξη εγγραφών',
'no_records' => 'Δεν υπάρχουν διαθέσιμες εγγραφές για ταξινόμηση.',
],
'model' => [
'name' => 'Μοντέλο',
'not_found' => "Η κλάση ':class' του μοντέλου με ID :id δεν μπόρεσε να βρεθεί",
@ -260,6 +264,7 @@ return [
'code_folding' => 'Αναδίπλωση κώδικα',
'word_wrap' => 'Αναδίπλωση κειμένου',
'highlight_active_line' => 'Επισήμανση ενεργής σειράς',
'auto_closing' => 'Αυτόματο κλείσιμο ετικετών και ειδικών χαρακτήρων',
'show_invisibles' => 'Εμφάνιση αόρατων χαρακτήρων',
'show_gutter' => 'Εμφάνιση περιθωρίου',
'theme' => 'Χρωματική απεικόνιση',

View File

@ -5,267 +5,284 @@ return [
'title' => 'بخش مدیریت',
],
'field' => [
'invalid_type' => 'نوع فیلد :type نا معتبر می باشد.',
'invalid_type' => 'نوع فیلد :type نا معتبر می باشد.',
'options_method_not_exists' => 'کلاس مدل :model باید شامل متد :method() باشد و گزینه های مورد نیاز ":field" را بازگرداند.',
],
'widget' => [
'not_registered' => "کلاس مربوط به ابزارک ':name' به سیستم معرفی نشده است",
'not_bound' => "ابزارکی تعریف شده در کلاس با نام ':name' به هیچ کنترلری ارتباط داده نشده است",
'not_bound' => "ابزارکی تعریف شده در کلاس با نام ':name' به هیچ کنترلری ارتباط داده نشده است",
],
'page' => [
'untitled' => "بدون عنوان",
'untitled' => "بدون عنوان",
'access_denied' => [
'label' => "شما مجوز دسترسی ندارید",
'help' => "شما مجوز لازم براس دسترسی به این صفحه را ندارید.",
'label' => "شما مجوز دسترسی ندارید",
'help' => "شما مجوز لازم براس دسترسی به این صفحه را ندارید.",
'cms_link' => "بازگشت به مدیریت",
],
'invalid_token' => [
'label' => 'کلید امنیتی معتبر نمی باشد'
]
],
'partial' => [
'not_found_name' => "بخشی با نام ':name' یافت نشد.",
],
'account' => [
'sign_out' => 'خروج',
'login' => 'ورود',
'reset' => 'تنظیم مجدد',
'restore' => 'بازگرداندن',
'login_placeholder' => 'ورود',
'sign_out' => 'خروج',
'login' => 'ورود',
'reset' => 'تنظیم مجدد',
'restore' => 'بازگرداندن',
'login_placeholder' => 'ورود',
'password_placeholder' => 'کلمه عبور',
'forgot_password' => "کلمه عبور خود را فراموش کرده اید؟",
'enter_email' => "پست الکترونیکی خود را وارد نمایید",
'enter_login' => "نام کاربری خود را وارد نمایید",
'email_placeholder' => "پست الکترونیکی",
'enter_new_password' => "کلمه عبور جدید را وارد نمایید",
'password_reset' => "بازگرداندن کلمه عبور",
'restore_success' => "یک نامه به پست الکترونیکی شما جهت شروع عملیات بارگرداندن کلمه عبور ارسال شد.",
'restore_error' => "کاربری با نام کاریری ':login' یافت نشد.",
'reset_success' => "کلمه عبور شما بارگردانی شد و شما هم اکنون میتوانید وارد سیستم شوید.",
'reset_error' => "اطلاعات رمز عبور نا معتبر است , لطفا مجددا تلاش نمایید!",
'reset_fail' => "عدم توانایی در بازگرداندن کلمه عبور شما!",
'apply' => 'اعمال کردن',
'cancel' => 'انصراف',
'delete' => 'حذف',
'ok' => 'تایید',
'forgot_password' => "کلمه عبور خود را فراموش کرده اید؟",
'enter_email' => "پست الکترونیکی خود را وارد نمایید",
'enter_login' => "نام کاربری خود را وارد نمایید",
'email_placeholder' => "پست الکترونیکی",
'enter_new_password' => "کلمه عبور جدید را وارد نمایید",
'password_reset' => "بازگرداندن کلمه عبور",
'restore_success' => "یک نامه به پست الکترونیکی شما جهت شروع عملیات بارگرداندن کلمه عبور ارسال شد.",
'restore_error' => "کاربری با نام کاریری ':login' یافت نشد.",
'reset_success' => "کلمه عبور شما بارگردانی شد و شما هم اکنون میتوانید وارد سیستم شوید.",
'reset_error' => "اطلاعات رمز عبور نا معتبر است , لطفا مجددا تلاش نمایید!",
'reset_fail' => "عدم توانایی در بازگرداندن کلمه عبور شما!",
'apply' => 'اعمال کردن',
'cancel' => 'انصراف',
'delete' => 'حذف',
'ok' => 'تایید',
],
'dashboard' => [
'menu_label' => 'میز کار',
'widget_label' => 'ابزارک',
'widget_width' => 'عرض',
'full_width' => 'عرض کامل',
'add_widget' => 'افزودن ابزارک',
'widget_inspector_title' => 'تنظیمات ابزارک',
'menu_label' => 'میز کار',
'widget_label' => 'ابزارک',
'widget_width' => 'عرض',
'full_width' => 'عرض کامل',
'add_widget' => 'افزودن ابزارک',
'widget_inspector_title' => 'تنظیمات ابزارک',
'widget_inspector_description' => 'پیکر بندی ابزارک گزارشگیری',
'widget_columns_label' => 'عرض :columns',
'widget_columns_description' => 'عرض ابزارک باید عددی مابین 1 تا 10 باشد.',
'widget_columns_error' => 'لطفا عرض ابزارک را عددی مابین 1 تا 10 وارد نمایید.',
'columns' => '{1} ستون|[2,Inf] ستون ها',
'widget_new_row_label' => 'تحمیل سطر جدید',
'widget_new_row_description' => 'افزودن ابزارک در سطر جدید.',
'widget_title_label' => 'عنوان ابزارک',
'widget_title_error' => 'گزینه "عنوان ابزارک" حتما باید وارد شود.',
'status' => [
'widget_columns_label' => 'عرض :columns',
'widget_columns_description' => 'عرض ابزارک باید عددی مابین 1 تا 10 باشد.',
'widget_columns_error' => 'لطفا عرض ابزارک را عددی مابین 1 تا 10 وارد نمایید.',
'columns' => '{1} ستون|[2,Inf] ستون ها',
'widget_new_row_label' => 'تحمیل سطر جدید',
'widget_new_row_description' => 'افزودن ابزارک در سطر جدید.',
'widget_title_label' => 'عنوان ابزارک',
'widget_title_error' => 'گزینه "عنوان ابزارک" حتما باید وارد شود.',
'status' => [
'widget_title_default' => 'وضعیت سیستم',
'online' => 'online',
'online' => 'online',
'maintenance' => 'در حال به روز رسانی',
'update_available' => '{0} به روز رسانی موجود است!|{1} به روز رسانی موجود است!|[2,Inf] به روز رسانی موجود است!',
'update_available' => '{0} به روز رسانی موجود است!|{1} به روز رسانی موجود است!|[2,Inf] به روز رسانی موجود است!',
]
],
'user' => [
'name' => 'مدیریت',
'menu_label' => 'مدیران',
'menu_description' => 'مدیریت کاربران , گروه ها و دسترسی های مدیران.',
'list_title' => 'مدیریت مدیران',
'new' => 'مدیر جدید',
'login' => "ورود",
'first_name' => "نام",
'last_name' => "نام خانوادگی",
'full_name' => "نام کامل",
'email' => "پست الکترونیکی",
'groups' => "گروه ها",
'groups_comment' => "مختص گروهی که این شخص به آن تعلق دارد.",
'avatar' => "نمایه",
'password' => "کلمه عبور",
'name' => 'مدیریت',
'menu_label' => 'مدیران',
'menu_description' => 'مدیریت کاربران , گروه ها و دسترسی های مدیران.',
'list_title' => 'مدیریت مدیران',
'new' => 'مدیر جدید',
'login' => "ورود",
'first_name' => "نام",
'last_name' => "نام خانوادگی",
'full_name' => "نام کامل",
'email' => "پست الکترونیکی",
'groups' => "گروه ها",
'groups_comment' => "مختص گروهی که این شخص به آن تعلق دارد.",
'avatar' => "نمایه",
'password' => "کلمه عبور",
'password_confirmation' => "تکرار کلمه عبور",
'permissions' => 'مجوز های دسترسی',
'account' => 'حساب کاربری',
'superuser' => "کاربر ممتاز",
'superuser_comment' => "اگر میخواهید این شخص به تمام قسمت ها دسترسی داشته باشد این گزینه را فعال نمایید.",
'send_invite' => 'دعوت نامه توسط پست الکترونیکی ارسال شود',
'send_invite_comment' => 'جهت ارسال دعوت نامه به پست الکترونیکی این شخص این گزینه را فعال نمایید',
'delete_confirm' => 'آیا از حذف این مدیر اطمینان دارید؟',
'return' => 'بازگشت به لیست مدیران',
'allow' => 'اجازه دسترسی',
'inherit' => 'ارث بری',
'deny' => 'عدم دسترسی',
'group' => [
'name' => 'گروه',
'name_field' => 'نام',
'superuser' => "کاربر ممتاز",
'superuser_comment' => "اگر میخواهید این شخص به تمام قسمت ها دسترسی داشته باشد این گزینه را فعال نمایید.",
'send_invite' => 'دعوت نامه توسط پست الکترونیکی ارسال شود',
'send_invite_comment' => 'جهت ارسال دعوت نامه به پست الکترونیکی این شخص این گزینه را فعال نمایید',
'delete_confirm' => 'آیا از حذف این مدیر اطمینان دارید؟',
'return' => 'بازگشت به لیست مدیران',
'allow' => 'اجازه دسترسی',
'inherit' => 'ارث بری',
'deny' => 'عدم دسترسی',
'group' => [
'name' => 'گروه',
'name_field' => 'نام',
'description_field' => 'توضیحات',
'is_new_user_default_field' => 'بطور پیشفرض مدیران جدید را در این گروه ایجاد کن.',
'code_field' => 'کد',
'code_comment' => 'کد یکتایی را جهت دسترسی به آن توسط API وارد نمایید.',
'menu_label' => 'گروه ها',
'list_title' => 'مدیریت گروه ها',
'new' => 'گروه مدیریت جدید',
'list_title' => 'مدیریت گروه ها',
'new' => 'گروه مدیریت جدید',
'delete_confirm' => 'آیا از حذف این گروه از مدیران اطمینان دارید?',
'return' => 'بازگشت به لیست گروه ها',
'return' => 'بازگشت به لیست گروه ها',
'users_count' => 'کاربران'
],
'preferences' => [
'not_authenticated' => 'هیچ کاربر ثبت شده ای جهت بارگذاری یا ذخیره تنظیمات وجود ندارد.'
]
],
'list' => [
'default_title' => 'لیست',
'search_prompt' => 'جستجو...',
'no_records' => 'چیزی یافت نشد.',
'missing_model' => 'هیچ مدلی برای لیست استفاده شده در کلاس :class تعریف نشده است.',
'missing_column' => 'ستونی برای :columns تعریف نشده است.',
'missing_columns' => 'ستونی برای لیست عریف شده در :class موجود نیست.',
'missing_definition' => "در لیست تعریف شده ستونی برای ':field' موجود نیست.",
'behavior_not_ready' => 'لسیت مقدار دهی اولیه شده است ، لطفا بررسی نمایید که متد makeLists() در کنترلر خود فراخوانی کرده باشید.',
'default_title' => 'لیست',
'search_prompt' => 'جستجو...',
'no_records' => 'چیزی یافت نشد.',
'missing_model' => 'هیچ مدلی برای لیست استفاده شده در کلاس :class تعریف نشده است.',
'missing_column' => 'ستونی برای :columns تعریف نشده است.',
'missing_columns' => 'ستونی برای لیست عریف شده در :class موجود نیست.',
'missing_definition' => "در لیست تعریف شده ستونی برای ':field' موجود نیست.",
'behavior_not_ready' => 'لسیت مقدار دهی اولیه شده است ، لطفا بررسی نمایید که متد makeLists() در کنترلر خود فراخوانی کرده باشید.',
'invalid_column_datetime' => "ستون ':column' از نوع شی تاریخ نمی باشد ، لطفا بررسی نمایید که این ستون در مدل از نوع تاریخ تعریف شده باشد.",
'pagination' => 'نمایش :from تا :to از :total مورد',
'prev_page' => 'صفحه قبل',
'next_page' => 'صفحه بعد',
'loading' => 'در حال بارگذاری...',
'setup_title' => 'راه اندازی لیست',
'setup_help' => 'ستون هایی را که میخواهید مشاهده نمایید را انتخاب نمایید. میتوانید محل قرار گیری ستونها را با جابجا نمودن آنها به .',
'records_per_page' => 'مورد در هر صفحه',
'records_per_page_help' => 'تعداد موارد نمایش داده شده در هر صفحه را انتخاب نمایید. لطفا توجه نمایید نمایش تعداد زیادی از موارد در هر صفحه از کارایی سیستم میکاهد.',
'delete_selected' => 'حذف انتخاب شده ها',
'pagination' => 'نمایش :from تا :to از :total مورد',
'prev_page' => 'صفحه قبل',
'next_page' => 'صفحه بعد',
'loading' => 'در حال بارگذاری...',
'setup_title' => 'راه اندازی لیست',
'setup_help' => 'ستون هایی را که میخواهید مشاهده نمایید را انتخاب نمایید. میتوانید محل قرار گیری ستونها را با جابجا نمودن آنها به .',
'records_per_page' => 'مورد در هر صفحه',
'records_per_page_help' => 'تعداد موارد نمایش داده شده در هر صفحه را انتخاب نمایید. لطفا توجه نمایید نمایش تعداد زیادی از موارد در هر صفحه از کارایی سیستم میکاهد.',
'delete_selected' => 'حذف انتخاب شده ها',
'delete_selected_empty' => 'مورد جهت حذف انتخاب نشده است.',
'delete_selected_confirm' => 'آیا میخواهید موارد انتخابی را حذف کنید؟',
'delete_selected_success' => 'حدف موارد انخابی انجام شد.',
],
'fileupload' => [
'attachment' => 'فایل ضمیمه',
'help' => 'برای فایل ضمیمه عنوان و توضیح مختصری وارد نمایید.',
'title_label' => 'عنوان',
'description_label' => 'توضیحات'
'attachment' => 'فایل ضمیمه',
'help' => 'برای فایل ضمیمه عنوان و توضیح مختصری وارد نمایید.',
'title_label' => 'عنوان',
'description_label' => 'توضیحات',
'default_prompt' => 'فایل را جهت ارسال به این نقطه بکشید و یا %s را کلیک کنیید',
'attachment_url' => 'آدرس پیوست',
'upload_file' => 'ارسال فایل',
'upload_error' => 'خطا در ارسال فایل',
'remove_confirm' => 'آیا اطمینان دارید؟',
'remove_file' => 'حذف فایل'
],
'form' => [
'create_title' => ":name جدید",
'update_title' => "ویرایش :name",
'preview_title' => "پیش نمایش :name",
'create_success' => ':name با موفقیت ایجاد شد.',
'update_success' => ':name با موفقیت به روز رسانی شد.',
'delete_success' => ':name با موفقیت حذف شد.',
'missing_id' => "رکورد مشخصه (ID) برای فرم انتخاب نشده است.",
'missing_model' => 'مدلی برای فرن تعریف شده در کلاس :class مشخص نشده است.',
'missing_definition' => "فرم مورد نظر شامل فیلدی برای ':field' نمی باشد.",
'not_found' => 'فرمی با مشخصه :id یافت نشد.',
'action_confirm' => "آیا اطمینان دارید؟",
'create' => 'ایجاد',
'create_and_close' => 'ایجاد و خروج',
'creating' => 'در حال ایجاد...',
'creating_name' => 'درحال ایجاد :name...',
'save' => 'ذخیره',
'save_and_close' => 'ذخیره و خروج',
'saving' => 'در حال ذخیره...',
'saving_name' => 'درحال ذخیره :name...',
'delete' => 'حذف',
'deleting' => 'در حال حذف...',
'deleting_name' => 'درحال حذف :name...',
'create_title' => ":name جدید",
'update_title' => "ویرایش :name",
'preview_title' => "پیش نمایش :name",
'create_success' => ':name با موفقیت ایجاد شد.',
'update_success' => ':name با موفقیت به روز رسانی شد.',
'delete_success' => ':name با موفقیت حذف شد.',
'missing_id' => "رکورد مشخصه (ID) برای فرم انتخاب نشده است.",
'missing_model' => 'مدلی برای فرن تعریف شده در کلاس :class مشخص نشده است.',
'missing_definition' => "فرم مورد نظر شامل فیلدی برای ':field' نمی باشد.",
'not_found' => 'فرمی با مشخصه :id یافت نشد.',
'action_confirm' => "آیا اطمینان دارید؟",
'create' => 'ایجاد',
'create_and_close' => 'ایجاد و خروج',
'creating' => 'در حال ایجاد...',
'creating_name' => 'درحال ایجاد :name...',
'save' => 'ذخیره',
'save_and_close' => 'ذخیره و خروج',
'saving' => 'در حال ذخیره...',
'saving_name' => 'درحال ذخیره :name...',
'delete' => 'حذف',
'deleting' => 'در حال حذف...',
'deleting_name' => 'درحال حذف :name...',
'reset_default' => 'بازگشت به پیش فرض',
'resetting' => 'بازگذاری مجدد',
'resetting_name' => 'بارگذاری :name',
'undefined_tab' => 'متفرقه',
'field_off' => 'خاموش',
'field_on' => 'روشن',
'add' => 'افزودن',
'apply' => 'اعمال',
'cancel' => 'انصراف',
'close' => 'خروج',
'confirm' => 'تایید',
'reload' => 'بارگذاری مجدد',
'ok' => 'تایید',
'or' => 'یا',
'confirm_tab_close' => 'در صورت بستن این پنجره موارد ذخیره نشده از بین خواهند رفت. آیا از حذف شدن این پنجره اطمینان دارید؟',
'behavior_not_ready' => 'فرم مور نظر مقدار دهی اولیه نشده است ، بررسی کنید که متد initForm() در کنترلر فرتخوانی شده باشد.',
'preview_no_files_message' => 'فایل ها ارسال نشدند',
'select' => 'انتخاب',
'select_all' => 'همه',
'select_none' => 'هیچ',
'select_placeholder' => 'لطفا انتخاب نمایید',
'insert_row' => 'افزودن سطر',
'delete_row' => 'حذف سطر',
'concurrency_file_changed_title' => 'فایل تغییر کرد',
'undefined_tab' => 'متفرقه',
'field_off' => 'خاموش',
'field_on' => 'روشن',
'add' => 'افزودن',
'apply' => 'اعمال',
'cancel' => 'انصراف',
'close' => 'خروج',
'confirm' => 'تایید',
'reload' => 'بارگذاری مجدد',
'complete' => 'تکمیل',
'ok' => 'تایید',
'or' => 'یا',
'confirm_tab_close' => 'در صورت بستن این پنجره موارد ذخیره نشده از بین خواهند رفت. آیا از حذف شدن این پنجره اطمینان دارید؟',
'behavior_not_ready' => 'فرم مور نظر مقدار دهی اولیه نشده است ، بررسی کنید که متد initForm() در کنترلر فرتخوانی شده باشد.',
'preview_no_files_message' => 'فایلی جهت ارسال وجود ندارد',
'preview_no_record_message' => 'موردی انتخاب نشده است',
'select' => 'انتخاب',
'select_all' => 'همه',
'select_none' => 'هیچ',
'select_placeholder' => 'لطفا انتخاب نمایید',
'insert_row' => 'افزودن سطر',
'delete_row' => 'حذف سطر',
'concurrency_file_changed_title' => 'فایل تغییر کرد',
'concurrency_file_changed_description' => 'فایلی که شما ویرایش کردید توسط کاربر دیگری تغییر یافته و ذخیره شده است. شما میتوانید فایل را مجددا بارگذاری نمایید و تغییراتی که اعمال کرده اید را از دست بدهید و یا تغییرات اعمال شده توسط آن کاربر را بین برده و فایل را بازنویسی نمایید.',
],
'relation' => [
'missing_config' => "Relation behavior does not have any configuration for ':config'.",
'missing_definition' => "در ارتباط مورد نظر فیلد ':field' وجود ندارد.",
'missing_model' => "مدلی برای ارتباط موجود در :class وجود ندارد.",
'missing_config' => "کنترل کننده ارتباطات پایگاه داده شامل تعریفی برای ':config' نمی باشد.",
'missing_definition' => "در ارتباط مورد نظر فیلد ':field' وجود ندارد.",
'missing_model' => "مدلی برای ارتباط موجود در :class وجود ندارد.",
'invalid_action_single' => "این عمل در ارتباط یک تعرفه نمبتواند اعمال شود.",
'invalid_action_multi' => "این عمل در ارتباط چند طرفه نمیتواند اعمال شود.",
'help' => "بر روی یک گزینه کلیک کنید تا افزوده شود",
'related_data' => "اعلاعات :name مرتبط",
'add' => "افزودن",
'add_selected' => "افرودن انتخاب شده ها",
'add_a_new' => ":name جدید",
'invalid_action_multi' => "این عمل در ارتباط چند طرفه نمیتواند اعمال شود.",
'help' => "بر روی یک گزینه کلیک کنید تا افزوده شود",
'related_data' => "اعلاعات :name مرتبط",
'add' => "افزودن",
'add_selected' => "افرودن انتخاب شده ها",
'add_a_new' => ":name جدید",
'link_selected' => "لینک انتخاب شده ها",
'link_a_new' => "لینک :name جدید",
'cancel' => "انصراف",
'cancel' => "انصراف",
'close' => "بستن",
'add_name' => "افزودن :name",
'create' => "ایجاد",
'create_name' => "ایجاد :name",
'update' => "بروز رسانی",
'update_name' => "بروز رسانی :name",
'add_name' => "افزودن :name",
'create' => "ایجاد",
'create_name' => "ایجاد :name",
'update' => "بروز رسانی",
'update_name' => "بروز رسانی :name",
'preview' => "پیش نمایش",
'preview_name' => "پیش نمایش :name",
'remove' => "حذف",
'remove_name' => "حذف :name",
'delete' => "حذف",
'delete_name' => "حذف :name",
'delete_confirm' => "آیا اطمینان دارید؟",
'remove' => "حذف",
'remove_name' => "حذف :name",
'delete' => "حذف",
'delete_name' => "حذف :name",
'delete_confirm' => "آیا اطمینان دارید؟",
'link' => "لینک",
'link_name' => "لینک :name",
'unlink' => "حذف لینک",
'unlink_name' => "حذف لینک :name",
'unlink_confirm' => "آبا اطمینان دارید؟",
],
'reorder' => [
'default_title' => 'مرتب سازی موارد',
'no_records' => 'موردی جهت مرتب سازی یافت نشد.',
],
'model' => [
'name' => "مدل",
'not_found' => "مدل ':class' با مشخصه ی :id یافت نشد",
'missing_id' => "مشخصه ای برای مودل مورد نظر یافت نشد.",
'missing_relation' => "مدل ':class' شامل تعریفی از ':relation'.",
'name' => "مدل",
'not_found' => "مدل ':class' با مشخصه ی :id یافت نشد",
'missing_id' => "مشخصه ای برای مودل مورد نظر یافت نشد.",
'missing_relation' => "مدل ':class' شامل تعریفی از ':relation'.",
'missing_method' => "مدل ':class' متدی با نام ':method' ندارد.",
'invalid_class' => "مدل :model استفاده شده در :class معتبر نمی باشد، این مدل باید از کلاس \Model ارث برده باشد.",
'invalid_class' => "مدل :model استفاده شده در :class معتبر نمی باشد، این مدل باید از کلاس \Model ارث برده باشد.",
'mass_assignment_failed' => "Mass assignment failed for Model attribute ':attribute'.",
],
'warnings' => [
'tips' => 'راهنمایی پیکر بندی سیستم',
'tips' => 'راهنمایی پیکر بندی سیستم',
'tips_description' => 'مشکلاتی در پیکربندی سیستم وجود دارد، شما باید تنظیمات زیر را بررسی نمایید.',
'permissions' => 'پوشه :name یا یکی از زیر پوشه های آن برای PHP قابل نوشتن نیستند. لطفا تنظیمات این پوشه را تعییر دهید.',
'extension' => 'افزونه PHP با نام :name نصب نشده است. لطفن این افزونه را نصب کرده و فعال نمایید.'
'permissions' => 'پوشه :name یا یکی از زیر پوشه های آن برای PHP قابل نوشتن نیستند. لطفا تنظیمات این پوشه را تعییر دهید.',
'extension' => 'افزونه PHP با نام :name نصب نشده است. لطفن این افزونه را نصب کرده و فعال نمایید.'
],
'editor' => [
'menu_label' => 'تنظیمات ویرایشگر کد',
'menu_description' => 'سفارشی سازی ویرایشگر کد، مانند اندازه فونت و رنگ بندی آن.',
'font_size' => 'اندازه فونت',
'tab_size' => 'اندازه کاراکتر TAB',
'use_hard_tabs' => 'فاصله گذاری با استفاده از TAB',
'code_folding' => 'بلاک بندی کدها',
'word_wrap' => 'چیدمان کلمات',
'menu_label' => 'تنظیمات ویرایشگر کد',
'menu_description' => 'سفارشی سازی ویرایشگر کد، مانند اندازه فونت و رنگ بندی آن.',
'font_size' => 'اندازه فونت',
'tab_size' => 'اندازه کاراکتر TAB',
'use_hard_tabs' => 'فاصله گذاری با استفاده از TAB',
'code_folding' => 'بلاک بندی کدها',
'word_wrap' => 'چیدمان کلمات',
'highlight_active_line' => 'مشخص نودن خط فعال',
'show_invisibles' => 'نمایش کاراکتر های مخفی',
'show_gutter' => 'نمایش نشانگر',
'theme' => 'رنگ بندی',
'auto_closing' => 'نشانه ها و کاراکترهای خاص بصورت خودکار بسته شوند',
'show_invisibles' => 'نمایش کاراکتر های مخفی',
'show_gutter' => 'نمایش نشانگر',
'theme' => 'رنگ بندی',
],
'tooltips' => [
'preview_website' => 'پیش نماسش وب سایت'
],
'mysettings' => [
'menu_label' => 'تنظیمات من',
'menu_label' => 'تنظیمات من',
'menu_description' => 'تنظیمات مربوط به حساب کاربری شما',
],
'myaccount' => [
'menu_label' => 'حساب کاربری من',
'menu_label' => 'حساب کاربری من',
'menu_description' => 'به روز رسانی اطلاعات حساب کار بری شما مانند نام و کلمه عبور و ... .',
'menu_keywords' => 'ورود امن'
'menu_keywords' => 'ورود امن'
],
'branding' => [
'menu_label' => 'شخصی سازی بخش مدیریت',
'menu_label' => 'شخصی سازی بخش مدیریت',
'menu_description' => 'شخصی سازی بخش مدیریت مانند نام، رنگ ها و لوگو.',
'brand' => 'برند',
'logo' => 'لوگو',
@ -283,21 +300,21 @@ return [
'custom_stylesheet' => 'شیوه نامه های سفارشی'
],
'backend_preferences' => [
'menu_label' => 'تنظیمات مدیریت',
'menu_label' => 'تنظیمات مدیریت',
'menu_description' => 'تنظیمات مربوط به زبان مربوط به قسمت مدیریت.',
'locale' => 'زبان',
'locale_comment' => 'زبان مورد نظر خود را انتخاب نمایید.',
'locale' => 'زبان',
'locale_comment' => 'زبان مورد نظر خود را انتخاب نمایید.',
],
'access_log' => [
'hint' => 'این لیست نشاندهنده ورود کاربران مدیر به سیستم می باشد. موارد برای مدت :days روز نگهداری می شوند.',
'menu_label' => 'ثبت دسترسی ها',
'hint' => 'این لیست نشاندهنده ورود کاربران مدیر به سیستم می باشد. موارد برای مدت :days روز نگهداری می شوند.',
'menu_label' => 'ثبت دسترسی ها',
'menu_description' => 'نمایش لیست ورود موفقیت آمیز کاربران مدیر.',
'created_at' => 'زمان و تاریخ',
'login' => 'ورود',
'ip_address' => 'آدرس آی پی',
'first_name' => 'نام',
'last_name' => 'نام خوانوادگی',
'email' => 'پست الکترونیکی',
'created_at' => 'زمان و تاریخ',
'login' => 'ورود',
'ip_address' => 'آدرس آی پی',
'first_name' => 'نام',
'last_name' => 'نام خوانوادگی',
'email' => 'پست الکترونیکی',
],
'filter' => [
'all' => 'همه'

View File

@ -219,7 +219,7 @@ return [
'close' => "Zamknij",
'add_name' => "Dodaj :name",
'create' => "Stwórz",
'create_name' => "Create :name",
'create_name' => "Stwórz :name",
'update' => "Aktualizuj",
'update_name' => "Aktualizuj :name",
'preview' => "Podgląd",

View File

@ -2,7 +2,7 @@
return [
'auth' => [
'title' => 'Administrations område'
'title' => 'Administrationsområde'
],
'field' => [
'invalid_type' => 'Felaktig fälttyp använd :type.',
@ -31,12 +31,12 @@ return [
'login_placeholder' => 'användarnamn',
'password_placeholder' => 'lösenord',
'forgot_password' => "Glömt ditt lösenord?",
'enter_email' => "Ange din epost-adress",
'enter_email' => "Ange din e-postadress",
'enter_login' => "Ange ditt användarnamn",
'email_placeholder' => "epost",
'email_placeholder' => "e-post",
'enter_new_password' => "Välj ett nytt lösenord",
'password_reset' => "Återställ lösenord",
'restore_success' => "Ett meddelande har sänts till din epost-adress med instruktioner om hur du återställer ditt lösenord",
'restore_success' => "Ett meddelande har sänts till din e-postadress med instruktioner om hur du återställer ditt lösenord",
'restore_error' => "En användare med användarnamnet ':login' kunde ej hittas",
'reset_success' => "Ditt lösenord har blivit återställt. Du kan nu logga in",
'reset_error' => "Felaktig data för lösenordsåterställning. Var vänlig prova igen",
@ -60,10 +60,10 @@ return [
'columns' => '{1} column|[2,Inf] kolonner',
'widget_new_row_label' => 'Forcera en ny rad',
'widget_new_row_description' => 'Lägg widgeten på en ny rad.',
'widget_title_label' => 'Widget titel',
'widget_title_label' => 'Widget-titel',
'widget_title_error' => 'En widgets titel är tvingande.',
'status' => [
'widget_title_default' => 'System status',
'widget_title_default' => 'Systemstatus',
'online' => 'online',
'maintenance' => 'i underhåll',
'update_available' => '{0} uppdateringar tillgängliga!|{1} uppdatering tillgänglig!|[2,Inf] uppdateringar tillgängliga!'
@ -86,6 +86,7 @@ return [
'password' => "Lösenord",
'password_confirmation' => "Bekräfta lösenord",
'permissions' => 'Rättigheter',
'account' => 'Konto',
'superuser' => "Superanvändare",
'superuser_comment' => "Markera denna checkbox för att ge denna person tillgång till alla områden",
'send_invite' => 'Inbjudan är sänd via e-post',
@ -107,6 +108,7 @@ return [
'new' => 'Ny administratörsgrupp',
'delete_confirm' => 'Vill du verkligen radera denna administratörgrupp?',
'return' => 'Återgå till grupplistan',
'users_count' => 'Användare'
],
'preferences' => [
'not_authenticated' => 'Det finns ingen autentiserad användare att ladda eller spara inställningar för',
@ -139,7 +141,13 @@ return [
'attachment' => 'Bilaga',
'help' => 'Lägg till en och beskriving för denna bilagan.',
'title_label' => 'Titel',
'description_label' => 'Beskriving'
'description_label' => 'Beskriving',
'default_prompt' => 'Klicka på %s eller dra en fil hit för att ladda upp',
'attachment_url' => 'Bilage-URL',
'upload_file' => 'Ladda upp fil',
'upload_error' => 'Fel vid uppladdning',
'remove_confirm' => 'Är du säker?',
'remove_file' => 'Radera fil'
],
'form' => [
'create_title' => "Ny :name",
@ -148,10 +156,10 @@ return [
'create_success' => ':name är nu skapad',
'update_success' => ':name har blivit uppdaterad',
'delete_success' => ':name kunde ej raderas',
'missing_id' => "Record ID för formuläret har ej blivit specificerat",
'missing_id' => "Rad-ID för formuläret har ej blivit specificerat",
'missing_model' => 'Formuläregenskapen som används i :class har ingen modell definierad',
'missing_definition' => "Formuläregenskapen saknar ett fält för ':field'",
'not_found' => 'Record ID :id för formuläret kunde ej hittas',
'not_found' => 'Rad-ID :id för formuläret kunde ej hittas',
'action_confirm' => 'Är du säker?',
'create' => 'Skapa',
'create_and_close' => 'Skapa och stäng',
@ -176,11 +184,13 @@ return [
'close' => 'Stäng',
'confirm' => 'Bekräfta',
'reload' => 'Ladda om',
'complete' => 'Slutför',
'ok' => 'OK',
'or' => 'eller',
'confirm_tab_close' => 'Vill du verkligen stänga fliken? Ej sparade ändringar kommer gå förlorade',
'behavior_not_ready' => 'Formuläregenskap har ej blivit initierad, kontrollera att du anropat initForm() i din controller',
'preview_no_files_message' => 'Filen är inte uppladdad',
'preview_no_record_message' => 'Ingen rad är vald.',
'select' => 'Välj',
'select_all' => 'alla',
'select_none' => 'ingen',
@ -223,6 +233,10 @@ return [
'unlink_name' => "Avlänka :name",
'unlink_confirm' => "Är du säker?",
],
'reorder' => [
'default_title' => 'Ordna om rader',
'no_records' => 'Det finns inga rader att sortera.',
],
'model' => [
'name' => "Modell",
'not_found' => "Modellen ':class' med ID :id kunde ej hittas",
@ -247,6 +261,7 @@ return [
'code_folding' => 'Dölj kod',
'word_wrap' => 'Radbryting',
'highlight_active_line' => 'Markera aktiv rad',
'auto_closing' => 'Stäng taggar och specialtecken automatiskt',
'show_invisibles' => 'Visa dolda tecken',
'show_gutter' => 'Visa ränna',
'theme' => 'Färgschema'

View File

@ -18,6 +18,9 @@ return [
'label' => "Giriş engellendi",
'help' => "Bu sayfayı görüntülemek için gerekli izinlere sahip değilsiniz.",
'cms_link' => "Ana sayfaya dön"
],
'invalid_token' => [
'label' => 'Geçersiz güvenlik anahtarı'
]
],
'partial' => [
@ -86,6 +89,7 @@ return [
'password' => "Parola",
'password_confirmation' => "Parola (Tekrar)",
'permissions' => 'İzinler',
'account' => 'Hesap',
'superuser' => "Süper Kullanıcı",
'superuser_comment' => "Kullanıcıya her alanda yetki vermek için burayı işaretleyin.",
'send_invite' => 'Email ile davet gönder',
@ -98,15 +102,16 @@ return [
'group' => [
'name' => 'Grup',
'name_field' => 'Adı',
'description_field' => 'Açıklama',
'is_new_user_default_field' => 'Yeni kullanıcılar bu gruba dahil edilsin mi?',
'code_field' => 'Grup kodu',
'code_comment' => 'Grup kodunu yazın',
'menu_label' => 'Gruplar',
'list_title' => 'Grupları Yönet',
'new' => 'Yeni Yönetici Grubu',
'delete_confirm' => 'Bu yönetici grubunu silmek istiyor musunuz?',
'return' => 'Grup listesine dön',
'description_field' => 'Adı',
'is_new_user_default_field' => 'Yeni kullanıcılar bu gruba dahil edilsin mi?',
'code_field' => 'Grup kodu',
'code_comment' => 'Grup kodunu yazın'
'users_count' => 'Users'
],
'preferences' => [
'not_authenticated' => 'Ayarları görüntülemek veya düzenlemek için yetkili bir kullanıcı yok.'
@ -129,13 +134,23 @@ return [
'setup_title' => 'Liste Ayarları',
'setup_help' => 'Listede görmek istediğiniz sütunları seçmek için onay kutularını kullanın. Sütunları yukarı veya aşağı sürükleyerek konumlarını değiştirebilirsiniz.',
'records_per_page' => 'Sayfa başına kayıt sayısı',
'records_per_page_help' => 'Sayfa başına görüntülenecek kayıt sayısını seçin. Tek sayfada yüksek miktarda kayıt görüntülemek sistem performansını azaltabilir.'
'records_per_page_help' => 'Sayfa başına görüntülenecek kayıt sayısını seçin. Tek sayfada yüksek miktarda kayıt görüntülemek sistem performansını azaltabilir.',
'delete_selected' => 'Seçili olanı sil',
'delete_selected_empty' => 'Silinecek seçili kayıt bulunamadı.',
'delete_selected_confirm' => 'Seçili kayıtları silmek istediğize emin misiniz?',
'delete_selected_success' => 'Seçili kayıtlar başarıyla silindi.'
],
'fileupload' => [
'attachment' => 'Dosya Eki',
'help' => 'Bu ek için bir başlık ve tanım girin.',
'title_label' => 'Başlık',
'description_label' => 'Tanım'
'description_label' => 'Tanım',
'default_prompt' => '%s e tıkla ya da bir dosya sürükleyin',
'attachment_url' => 'Ek URLsi',
'upload_file' => 'Dosya yükle',
'upload_error' => 'Dosya yükleme hatası',
'remove_confirm' => 'Emin misiniz?',
'remove_file' => 'Dosyayı sil'
],
'form' => [
'create_title' => ":name Oluştur",
@ -172,11 +187,13 @@ return [
'close' => 'Kapat',
'confirm' => 'Onayla',
'reload' => 'Yenile',
'complete' => 'Tamamla',
'ok' => 'Tamam',
'or' => 'veya',
'confirm_tab_close' => 'Bu sekmeyi kapatmak istediğinize emin misiniz? Kaydedilmemiş değişiklikleri kaybedeceksiniz.',
'behavior_not_ready' => 'Form oluşturulamadı, controller da initForm() metodunu kontrol edin.',
'preview_no_files_message' => 'Dosyalar yüklenmedi',
'preview_no_record_message' => 'Seçili kayıt yok.',
'select' => 'Seç',
'select_all' => 'tümü',
'select_none' => 'hiçbiri',
@ -196,6 +213,8 @@ return [
'add' => "Ekle",
'add_selected' => 'Seçilenleri ekle',
'add_a_new' => 'Yeni bir :name ekle',
'link_selected' => 'Seçileni bağla',
'link_a_new' => 'Yeni bir :name bağla',
'cancel' => 'İptal',
'close' => "Kapat",
'add_name' => ":name Ekle",
@ -209,7 +228,16 @@ return [
'remove_name' => ":name Kaldır",
'delete' => "Sil",
'delete_name' => ":name Sil",
'delete_confirm' => 'Emin misiniz?'
'delete_confirm' => 'Emin misiniz?',
'link' => 'Bağla',
'link_name' => ':name bağla',
'unlink' => 'Bağlamayı kaldır',
'unlink_name' => ':name bağlamasını kaldır',
'unlink_confirm' => 'Emin misiniz?'
],
'reorder' => [
'default_title' => 'Kayıtları yeniden sırala',
'no_records' => 'Sıralamak için bir kayıt bulunamadı.',
],
'model' => [
'name' => "Model",
@ -235,6 +263,7 @@ return [
'code_folding' => 'Kod katlama (Alt satıra inme)',
'word_wrap' => 'Uzun kelimeleri yeni satırda göster',
'highlight_active_line' => 'Aktif satırı vurgula',
'auto_closing' => 'Etiketleri ve özel karakterleri otomatik kapat',
'show_invisibles' => 'Gizli karakterleri göster',
'show_gutter' => 'Satır numarasını göster',
'theme' => 'Renk şeması',
@ -287,6 +316,6 @@ return [
'email' => 'Email'
],
'filter' => [
'all' => 'tümü'
'all' => 'tümü'
]
];
];

View File

@ -36,6 +36,7 @@ class BackendPreferences extends Model
public function getLocaleOptions()
{
$locales = Config::get('app.localeOptions', [
'cs' => [Lang::get('system::lang.locale.cs'), 'flag-cz'],
'en' => [Lang::get('system::lang.locale.en'), 'flag-gb'],
'de' => [Lang::get('system::lang.locale.de'), 'flag-de'],
'es' => [Lang::get('system::lang.locale.es'), 'flag-es'],
@ -51,7 +52,7 @@ class BackendPreferences extends Model
'pt-br' => [Lang::get('system::lang.locale.pt-br'), 'flag-br'],
'ro' => [Lang::get('system::lang.locale.ro'), 'flag-ro'],
'ru' => [Lang::get('system::lang.locale.ru'), 'flag-ru'],
'se' => [Lang::get('system::lang.locale.se'), 'flag-se'],
'sv' => [Lang::get('system::lang.locale.sv'), 'flag-se'],
'tr' => [Lang::get('system::lang.locale.tr'), 'flag-tr'],
'pl' => [Lang::get('system::lang.locale.pl'), 'flag-pl'],
'sk' => [Lang::get('system::lang.locale.sk'), 'flag-sk'],

View File

@ -22,9 +22,9 @@ class User extends UserBase
*/
public $rules = [
'login' => 'required|between:2,24|unique:backend_users',
'email' => 'required|between:3,64|email|unique:backend_users',
'password' => 'required:create|between:4,64|confirmed',
'password_confirmation' => 'required_with:password|between:4,64'
'email' => 'required|between:3,255|email|unique:backend_users',
'password' => 'required:create|between:4,255|confirmed',
'password_confirmation' => 'required_with:password|between:4,255'
];
/**

View File

@ -16,3 +16,4 @@ columns:
relation: users_count
valueFrom: count
default: 0
sortable: false

View File

@ -832,28 +832,36 @@ class Form extends WidgetBase
*/
public function getSaveData()
{
$data = ($this->arrayName) ? post($this->arrayName) : post();
$this->defineFormFields();
$result = [];
/*
* Source data
*/
$data = $this->arrayName ? post($this->arrayName) : post();
if (!$data) {
$data = [];
}
/*
* Number fields should be converted to integers
* Spin over each field and extract the postback value
*/
foreach ($this->allFields as $field) {
if ($field->type != 'number') {
continue;
}
/*
* Handle HTML array, eg: item[key][another]
*/
$parts = HtmlHelper::nameToArray($field->fieldName);
$dotted = implode('.', $parts);
if (($value = array_get($data, $dotted)) !== null) {
$value = !strlen(trim($value)) ? null : (float) $value;
array_set($data, $dotted, $value);
if (($value = $this->dataArrayGet($data, $parts)) !== null) {
/*
* Number fields should be converted to integers
*/
if ($field->type == 'number') {
$value = !strlen(trim($value)) ? null : (float) $value;
}
$this->dataArraySet($result, $parts, $value);
}
}
@ -862,46 +870,12 @@ class Form extends WidgetBase
*/
foreach ($this->formWidgets as $field => $widget) {
$parts = HtmlHelper::nameToArray($field);
$dotted = implode('.', $parts);
$widgetValue = $widget->getSaveValue(array_get($data, $dotted));
array_set($data, $dotted, $widgetValue);
$widgetValue = $widget->getSaveValue($this->dataArrayGet($result, $parts));
$this->dataArraySet($result, $parts, $widgetValue);
}
/*
* Handle fields that differ by fieldName and valueFrom
* @todo @deprecated / Not needed? Remove if year >= 2016
*/
// $remappedFields = [];
// foreach ($this->allFields as $field) {
// if ($field->fieldName == $field->valueFrom) {
// continue;
// }
// /*
// * Get the value, remove it from the data collection
// */
// $parts = HtmlHelper::nameToArray($field->fieldName);
// $dotted = implode('.', $parts);
// $value = array_get($data, $dotted);
// array_forget($data, $dotted);
// /*
// * Set the new value to the data collection
// */
// $parts = HtmlHelper::nameToArray($field->valueFrom);
// $dotted = implode('.', $parts);
// array_set($remappedFields, $dotted, $value);
// }
// if (count($remappedFields) > 0) {
// $data = array_merge($remappedFields, $data);
// // Could be useful one day for field name collisions
// // $data['X_OCTOBER_REMAPPED_FIELDS'] = $remappedFields;
// }
return $data;
return $result;
}
/*
@ -1005,4 +979,59 @@ class Form extends WidgetBase
return method_exists($object, $method);
}
/**
* Variant to array_get() but preserves dots in key names.
*/
protected function dataArrayGet(array $array, array $parts, $default = null)
{
if (is_null($parts)) {
return $array;
}
if (count($parts) === 1) {
$key = array_shift($parts);
if (isset($array[$key])) {
return $array[$key];
}
else {
return $default;
}
}
foreach ($parts as $segment) {
if (!is_array($array) || !array_key_exists($segment, $array)) {
return $default;
}
$array = $array[$segment];
}
return $array;
}
/**
* Variant to array_set() but preserves dots in key names.
*/
protected function dataArraySet(array &$array, array $parts, $value)
{
if (is_null($parts)) {
return $array = $value;
}
while (count($parts) > 1) {
$key = array_shift($parts);
if (!isset($array[$key]) || !is_array($array[$key])) {
$array[$key] = [];
}
$array =& $array[$key];
}
$array[array_shift($parts)] = $value;
return $array;
}
}

View File

@ -11,6 +11,7 @@ use DbDongle;
use Carbon\Carbon;
use October\Rain\Html\Helper as HtmlHelper;
use October\Rain\Router\Helper as RouterHelper;
use System\Helpers\DateTime as DateTimeHelper;
use Backend\Classes\ListColumn;
use Backend\Classes\WidgetBase;
use ApplicationException;
@ -53,7 +54,7 @@ class Lists extends WidgetBase
/**
* @var string Message to display when there are no records in the list.
*/
public $noRecordsMessage = 'No records found';
public $noRecordsMessage = 'backend::lang.list.no_records';
/**
* @var int Maximum rows to display for each page.
@ -767,7 +768,7 @@ class Lists extends WidgetBase
$value = implode(', ', $record->{$columnName}->lists($column->valueFrom));
}
elseif ($this->isColumnRelated($column) || $this->isColumnPivot($column)) {
$value = $record->{$columnName}->{$column->valueFrom};
$value = $record->{$columnName} ? $record->{$columnName}->{$column->valueFrom} : null;
}
else {
$value = null;
@ -804,7 +805,7 @@ class Lists extends WidgetBase
/*
* Apply default value.
*/
if (empty($value)) {
if ($value === '' || $value === null) {
$value = $column->defaults;
}
@ -946,7 +947,21 @@ class Lists extends WidgetBase
$value = $this->validateDateTimeValue($value, $column);
return $value->diffForHumans();
return DateTimeHelper::timeSince($value);
}
/**
* Process as time as current tense (Today at 0:00)
*/
protected function evalTimetenseTypeValue($record, $column, $value)
{
if ($value === null) {
return null;
}
$value = $this->validateDateTimeValue($value, $column);
return DateTimeHelper::timeTense($value);
}
/**
@ -954,9 +969,7 @@ class Lists extends WidgetBase
*/
protected function validateDateTimeValue($value, $column)
{
if ($value instanceof DateTime) {
$value = Carbon::instance($value);
}
$value = DateTimeHelper::instance()->makeCarbon($value, false);
if (!$value instanceof Carbon) {
throw new ApplicationException(Lang::get(

View File

@ -35,6 +35,7 @@
this.toggleEmptyTabs()
this.bindCollapsibleSections()
this.$el.on('oc.triggerOn.afterUpdate', this.proxy(this.toggleEmptyTabs))
this.$el.one('dispose-control', this.proxy(this.dispose))
}
@ -132,18 +133,44 @@
}
/*
* Hides tabs that have no content
* Hides tabs that have no content, it is possible this can be
* called multiple times in a single cycle due to input.trigger.
*/
FormWidget.prototype.toggleEmptyTabs = function() {
var tabControl = $('[data-control=tab]', this.$el)
var self = this,
form = this.$el
if (!tabControl.length)
return
if (this.toggleEmptyTabsTimer !== undefined) {
window.clearTimeout(this.toggleEmptyTabsTimer)
}
$('.tab-pane', tabControl).each(function() {
$('[data-target="#' + $(this).attr('id') + '"]', tabControl)
.toggle(!!$('.form-group:not(:empty)', $(this)).length)
})
this.toggleEmptyTabsTimer = window.setTimeout(function() {
var tabControl = $('[data-control=tab]', this.$el),
tabContainer = $('.nav-tabs', tabControl)
if (!tabControl.length || !$.contains(form.get(0), tabControl.get(0)))
return
/*
* Check each tab pane for form field groups
*/
$('.tab-pane', tabControl).each(function() {
$('[data-target="#' + $(this).attr('id') + '"]', tabControl)
.closest('li')
.toggle(!!$('.form-group:not(:empty):not(.hide)', $(this)).length)
})
/*
* If a hidden tab was selected, select the first visible tab
*/
if (!$('> li.active:visible', tabContainer).length) {
$('> li:visible:first', tabContainer)
.find('> a:first')
.tab('show')
}
}, 1)
}
/*

View File

@ -137,17 +137,17 @@
background: white;
border-bottom: 1px solid #e0e0e0;
}
.control-table .toolbar a {
.control-table .toolbar a.btn {
color: #323e50;
padding: 10px;
opacity: 0.5;
filter: alpha(opacity=50);
}
.control-table .toolbar a:hover {
.control-table .toolbar a.btn:hover {
opacity: 1;
filter: alpha(opacity=100);
}
.control-table .toolbar a:before {
.control-table .toolbar a.table-icon:before {
display: inline-block;
content: ' ';
width: 16px;
@ -159,10 +159,10 @@
background-position: 0 0;
background-size: 32px auto;
}
.control-table .toolbar a.add-table-row-above:before {
.control-table .toolbar a.table-icon.add-table-row-above:before {
background-position: 0 -56px;
}
.control-table .toolbar a.delete-table-row:before {
.control-table .toolbar a.table-icon.delete-table-row:before {
background-position: 0 -113px;
}
.control-table.active .toolbar {

View File

@ -78,17 +78,17 @@ return
this.toolbar=document.createElement('div')
this.toolbar.setAttribute('class','toolbar')
if(this.options.adding){var addBelowButton=document.createElement('a')
addBelowButton.setAttribute('class','btn add-table-row-below')
addBelowButton.setAttribute('class','btn table-icon add-table-row-below')
addBelowButton.setAttribute('data-cmd','record-add-below')
this.toolbar.appendChild(addBelowButton)
if(this.navigation.paginationEnabled()||!this.options.rowSorting){addBelowButton.textContent=this.options.btnAddRowLabel}else{addBelowButton.textContent=this.options.btnAddRowBelowLabel
var addAboveButton=document.createElement('a')
addAboveButton.setAttribute('class','btn add-table-row-above')
addAboveButton.setAttribute('class','btn table-icon add-table-row-above')
addAboveButton.textContent='Add row above'
addAboveButton.setAttribute('data-cmd','record-add-above')
this.toolbar.appendChild(addAboveButton)}}
if(this.options.deleting){var deleteButton=document.createElement('a')
deleteButton.setAttribute('class','btn delete-table-row')
deleteButton.setAttribute('class','btn table-icon delete-table-row')
deleteButton.textContent=this.options.btnDeleteRowLabel
deleteButton.setAttribute('data-cmd','record-delete')
this.toolbar.appendChild(deleteButton)}
@ -291,6 +291,8 @@ if(!this.validate()){ev.preventDefault()
return}
var fieldName=this.options.alias.indexOf('[')>-1?this.options.alias+'[TableData]':this.options.alias+'TableData';data.options.data[fieldName]=this.dataSource.getAllData()}}
Table.prototype.onToolbarClick=function(ev){var target=this.getEventTarget(ev),cmd=target.getAttribute('data-cmd')
if(!cmd)
return
switch(cmd){case'record-add-below':this.addRecord('below')
break
case'record-add-above':this.addRecord('above')
@ -414,12 +416,11 @@ var paginationContainer=this.tableObj.getElement().querySelector('.pagination'),
this.pageCount=this.calculatePageCount(recordCount,this.tableObj.options.recordsPerPage)
if(!paginationContainer){paginationContainer=document.createElement('div')
paginationContainer.setAttribute('class','pagination')
newPaginationContainer=true}else
curRecordCount=this.getRecordCount(paginationContainer)
newPaginationContainer=true}
else{curRecordCount=this.getRecordCount(paginationContainer)}
if(newPaginationContainer||curRecordCount!=recordCount){paginationContainer.setAttribute('data-record-count',recordCount)
var pageList=this.buildPaginationLinkList(recordCount,this.tableObj.options.recordsPerPage,this.pageIndex)
if(!newPaginationContainer)
paginationContainer.replaceChild(pageList,paginationContainer.children[0])
if(!newPaginationContainer){paginationContainer.replaceChild(pageList,paginationContainer.children[0])}
else{paginationContainer.appendChild(pageList)
this.tableObj.getElement().appendChild(paginationContainer)}}else{this.markActiveLinkItem(paginationContainer,this.pageIndex)}}
Navigation.prototype.calculatePageCount=function(recordCount,recordsPerPage){var pageCount=Math.ceil(recordCount/recordsPerPage)
@ -432,6 +433,7 @@ Navigation.prototype.buildPaginationLinkList=function(recordCount,recordsPerPage
for(var i=0;i<pageCount;i++){var item=document.createElement('li'),link=document.createElement('a')
if(i==pageIndex)
item.setAttribute('class','active')
$(item).addClass('pagination-link')
link.innerText=i+1
link.setAttribute('data-page-index',i)
link.setAttribute('href','#')
@ -440,8 +442,7 @@ pageList.appendChild(item)}
return pageList}
Navigation.prototype.markActiveLinkItem=function(paginationContainer,pageIndex){var activeItem=paginationContainer.querySelector('.active'),list=paginationContainer.children[0]
activeItem.setAttribute('class','')
for(var i=0,len=list.children.length;i<len;i++){if(i==pageIndex)
list.children[i].setAttribute('class','active')}}
for(var i=0,len=list.children.length;i<len;i++){if(i==pageIndex){list.children[i].setAttribute('class','active')}}}
Navigation.prototype.gotoPage=function(pageIndex,onSuccess){this.tableObj.unfocusTable()
if(!this.tableObj.validate())
return
@ -467,7 +468,8 @@ return
var row=this.tableObj.activeCell.parentNode,newRow=!ev.shiftKey?row.nextElementSibling:row.parentNode.children[row.parentNode.children.length-1],cellIndex=forceCellIndex!==undefined?forceCellIndex:this.tableObj.activeCell.cellIndex
if(newRow){var cell=newRow.children[cellIndex]
if(cell)
this.tableObj.focusCell(cell)}else{if(!this.paginationEnabled())
this.tableObj.focusCell(cell)}
else{if(!this.paginationEnabled())
return
if(this.pageIndex<this.pageCount-1){var self=this
this.gotoPage(this.pageIndex+1,function navDownPageSuccess(){self.focusCell('top',cellIndex)
@ -541,7 +543,7 @@ return this.navigateRight(ev)
if(ev.keyCode==9)
return this.navigateNext(ev)}
Navigation.prototype.onClick=function(ev){var target=this.tableObj.getEventTarget(ev,'A')
if(!target)
if(!target||!$(target).hasClass('pagination-link'))
return
var pageIndex=parseInt(target.getAttribute('data-page-index'))
if(pageIndex===null)
@ -569,7 +571,8 @@ this.data=JSON.parse(dataString)};Client.prototype=Object.create(BaseProto)
Client.prototype.constructor=Client
Client.prototype.dispose=function(){BaseProto.dispose.call(this)
this.data=null}
Client.prototype.getRecords=function(offset,count,onSuccess){if(!count){onSuccess(this.data,this.data.length)}else{onSuccess(this.data.slice(offset,offset+count),this.data.length)}}
Client.prototype.getRecords=function(offset,count,onSuccess){if(!count){onSuccess(this.data,this.data.length)}
else{onSuccess(this.data.slice(offset,offset+count),this.data.length)}}
Client.prototype.createRecord=function(recordData,placement,relativeToKey,offset,count,onSuccess){if(placement==='bottom'){this.data.push(recordData)}
else if(placement=='above'||placement=='below'){var recordIndex=this.getIndexOfKey(relativeToKey)
if(placement=='below')

View File

@ -49,7 +49,8 @@
if (!count) {
// Return all records
onSuccess(this.data, this.data.length)
} else {
}
else {
// Return a subset of records
onSuccess(this.data.slice(offset, offset+count), this.data.length)
}

View File

@ -66,19 +66,24 @@
paginationContainer = document.createElement('div')
paginationContainer.setAttribute('class', 'pagination')
newPaginationContainer = true
} else
}
else {
curRecordCount = this.getRecordCount(paginationContainer)
}
// Generate the new page list only if the record count has changed
if (newPaginationContainer || curRecordCount != recordCount) {
paginationContainer.setAttribute('data-record-count', recordCount)
var pageList = this.buildPaginationLinkList(recordCount,
this.tableObj.options.recordsPerPage,
this.pageIndex)
var pageList = this.buildPaginationLinkList(
recordCount,
this.tableObj.options.recordsPerPage,
this.pageIndex
)
if (!newPaginationContainer)
if (!newPaginationContainer) {
paginationContainer.replaceChild(pageList, paginationContainer.children[0])
}
else {
paginationContainer.appendChild(pageList)
this.tableObj.getElement().appendChild(paginationContainer)
@ -120,6 +125,8 @@
if (i == pageIndex)
item.setAttribute('class', 'active')
$(item).addClass('pagination-link')
link.innerText = i+1
link.setAttribute('data-page-index', i)
link.setAttribute('href', '#')
@ -141,8 +148,9 @@
activeItem.setAttribute('class', '')
for (var i=0, len = list.children.length; i < len; i++) {
if (i == pageIndex)
if (i == pageIndex) {
list.children[i].setAttribute('class', 'active')
}
}
}
@ -200,9 +208,9 @@
return
var row = this.tableObj.activeCell.parentNode,
newRow = !ev.shiftKey ?
row.nextElementSibling :
row.parentNode.children[row.parentNode.children.length - 1],
newRow = !ev.shiftKey
? row.nextElementSibling
: row.parentNode.children[row.parentNode.children.length - 1],
cellIndex = forceCellIndex !== undefined ?
forceCellIndex :
this.tableObj.activeCell.cellIndex
@ -212,7 +220,8 @@
if (cell)
this.tableObj.focusCell(cell)
} else {
}
else {
// Try to switch to the next page if that's possible
if (!this.paginationEnabled())
@ -377,8 +386,10 @@
return this.navigateUp(ev)
else if (ev.keyCode == 37)
return this.navigateLeft(ev)
if (ev.keyCode == 39)
return this.navigateRight(ev)
if (ev.keyCode == 9)
return this.navigateNext(ev)
}
@ -389,7 +400,7 @@
var target = this.tableObj.getEventTarget(ev, 'A')
if (!target)
if (!target || !$(target).hasClass('pagination-link'))
return
var pageIndex = parseInt(target.getAttribute('data-page-index'))

View File

@ -223,7 +223,7 @@
if (this.options.adding) {
var addBelowButton = document.createElement('a')
addBelowButton.setAttribute('class', 'btn add-table-row-below')
addBelowButton.setAttribute('class', 'btn table-icon add-table-row-below')
addBelowButton.setAttribute('data-cmd', 'record-add-below')
this.toolbar.appendChild(addBelowButton)
@ -236,7 +236,7 @@
addBelowButton.textContent = this.options.btnAddRowBelowLabel
var addAboveButton = document.createElement('a')
addAboveButton.setAttribute('class', 'btn add-table-row-above')
addAboveButton.setAttribute('class', 'btn table-icon add-table-row-above')
addAboveButton.textContent = 'Add row above'
addAboveButton.setAttribute('data-cmd', 'record-add-above')
this.toolbar.appendChild(addAboveButton)
@ -245,8 +245,10 @@
if (this.options.deleting) {
var deleteButton = document.createElement('a')
deleteButton.setAttribute('class', 'btn delete-table-row')
deleteButton.setAttribute('class', 'btn table-icon delete-table-row')
deleteButton.textContent = this.options.btnDeleteRowLabel
deleteButton.setAttribute('data-cmd', 'record-delete')
this.toolbar.appendChild(deleteButton)
}
@ -776,6 +778,9 @@
var target = this.getEventTarget(ev),
cmd = target.getAttribute('data-cmd')
if (!cmd)
return
switch (cmd) {
case 'record-add-below':
this.addRecord('below')

View File

@ -177,7 +177,7 @@
background: white;
border-bottom: 1px solid @table-inactive-border;
a {
a.btn {
color: #323e50;
padding: 10px;
.opacity(0.5);
@ -185,14 +185,16 @@
&:hover {
.opacity(1);
}
}
a.table-icon {
&:before {
display: inline-block;
content: ' ';
width: 16px;
height: 16px;
margin-right: 8px;
position: relative;
position: relative;
top: 3px;
background: transparent url(../images/table-icons.gif) no-repeat;
background-position: 0 0;

View File

@ -1,5 +1,6 @@
<?php namespace Cms\Classes;
use Ini;
use Cache;
use Config;
use Validator;
@ -7,7 +8,6 @@ use SystemException;
use ValidationException;
use Cms\Classes\ViewBag;
use Cms\Classes\CodeBase;
use Cms\Classes\FileHelper;
use Cms\Twig\Loader as TwigLoader;
use Cms\Twig\Extension as CmsTwigExtension;
use System\Twig\Extension as SystemTwigExtension;
@ -227,7 +227,7 @@ class CmsCompoundObject extends CmsObject
$content = [];
if ($this->settings) {
$content[] = FileHelper::formatIniString($this->settings);
$content[] = Ini::render($this->settings);
}
if ($this->code) {

View File

@ -5,6 +5,7 @@ use Lang;
use Cache;
use Config;
use Validator;
use Cms\Helpers\File as FileHelper;
use ApplicationException;
use ValidationException;
use RecursiveDirectoryIterator;

View File

@ -16,14 +16,81 @@ class CmsObjectCollection extends CollectionBase
* @param string|array $components
* @return static
*/
public function withComponent($components)
public function withComponent($components, $callback = null)
{
return $this->filter(function($object) use ($components) {
return $this->filter(function($object) use ($components, $callback) {
$hasComponent = false;
foreach ((array) $components as $component) {
if ($object->hasComponent($component)) {
foreach ((array) $components as $componentName) {
if (!$callback && $object->hasComponent($componentName)) {
$hasComponent = true;
}
if ($callback && ($component = $object->getComponent($componentName))) {
$hasComponent = call_user_func($callback, $component) ?: $hasComponent;
}
}
return $hasComponent;
});
}
/**
* Returns objects whose properties match the supplied value.
* @param string $property
* @param string $value
* @return static
*/
public function where($property, $value, $strict = true)
{
return $this->filter(function($object) use ($property, $value, $strict) {
if (!array_key_exists($property, $object->settings)) {
return false;
}
return $strict
? $object->settings[$property] === $value
: $object->settings[$property] == $value;
});
}
/**
* Returns objects whose component properties match the supplied value.
* @param string $property
* @param string $value
* @return static
*/
public function whereComponent($components, $property, $value, $strict = false)
{
return $this->filter(function($object) use ($components, $property, $value, $strict) {
$hasComponent = false;
foreach ((array) $components as $componentName) {
if (!$componentAlias = $object->hasComponent($componentName)) {
continue;
}
$componentSettings = array_get($object->settings, 'components', []);
if (!array_key_exists($componentAlias, $componentSettings)) {
continue;
}
$settings = $componentSettings[$componentAlias];
if (!array_key_exists($property, $settings)) {
continue;
}
if (
($strict && $settings[$property] === $value) ||
(!$strict && $settings[$property] == $value)
) {
$hasComponent = true;
}
}
@ -31,4 +98,5 @@ class CmsObjectCollection extends CollectionBase
return $hasComponent;
});
}
}

View File

@ -40,6 +40,10 @@ class CmsObjectQuery
*/
public function inTheme($theme)
{
if (is_string($theme)) {
$theme = Theme::load($theme);
}
$this->theme = $theme;
return $this;
}

View File

@ -140,7 +140,9 @@ abstract class ComponentBase extends Extendable
public function renderPartial()
{
$this->controller->setComponentContext($this);
return call_user_func_array([$this->controller, 'renderPartial'], func_get_args());
$result = call_user_func_array([$this->controller, 'renderPartial'], func_get_args());
$this->controller->setComponentContext(null);
return $result;
}
/**

View File

@ -18,7 +18,6 @@ use Twig_Environment;
use Cms\Twig\Loader as TwigLoader;
use Cms\Twig\DebugExtension;
use Cms\Twig\Extension as CmsTwigExtension;
use Cms\Classes\FileHelper as CmsFileHelper;
use Cms\Models\MaintenanceSettings;
use System\Models\RequestLog;
use System\Classes\ErrorHandler;
@ -106,7 +105,7 @@ class Controller
/**
* @var Cms\Classes\ComponentBase Object of the active component, used internally.
*/
protected $componentContext;
protected $componentContext = null;
/**
* @var array Component partial stack, used internally.
@ -903,7 +902,6 @@ class Controller
}
$this->vars = $vars;
$this->componentContext = null;
return $result;
}
@ -1287,7 +1285,7 @@ class Controller
* @param ComponentBase $component
* @return void
*/
public function setComponentContext(ComponentBase $component)
public function setComponentContext(ComponentBase $component = null)
{
$this->componentContext = $component;
}

View File

@ -2,6 +2,8 @@
use File;
use Config;
use Backend\Models\UserPreferences;
use Carbon\Carbon;
/**
* Represents a file or folder in the Media Library.
@ -48,7 +50,7 @@ class MediaLibraryItem
/**
* @var array Contains a default list of files and directories to ignore.
* The list can be customized with the following configuration options:
* The list can be customized with the following configuration options:
* - cms.storage.media.image_extensions
* - cms.storage.media.video_extensions
* - cms.storage.media.audo_extensions
@ -129,10 +131,14 @@ class MediaLibraryItem
/**
* Returns the item last modification date as string.
* @return string Returns the item last modification date as string.
* @return string Returns the item's last modification date as string.
*/
public function lastModifiedAsString()
{
return $this->lastModified ? date('M d, Y', $this->lastModified) : null;
if (!($date = $this->lastModified)) {
return null;
}
return Carbon::createFromTimestamp($date)->toFormattedDateString();
}
}
}

View File

@ -1,5 +1,7 @@
<?php namespace Cms\Classes;
use ApplicationException;
/**
* Helper class for processing video and audio tags inserted by the Media Manager.
*
@ -80,7 +82,7 @@ class MediaViewHelper
$controller = Controller::getController();
if (!$controller) {
throw new Phpr_ApplicationException('Media tags can only be processed for front-end requests.');
throw new ApplicationException('Media tags can only be processed for front-end requests.');
}
$partial = Partial::loadCached($controller->getTheme(), $name);

View File

@ -21,7 +21,7 @@ class Page extends CmsCompoundObject
protected $settingsValidationRules = [
'title' => 'required',
'url' => ['required', 'regex:/^\/[a-z0-9\/\:_\-\*\[\]\+\?\|\.\^\$]*$/i']
'url' => ['required', 'regex:/^\/[a-z0-9\/\:_\-\*\[\]\+\?\|\.\^\\\$]*$/i']
];
/**

View File

@ -1,5 +1,6 @@
<?php namespace Cms\Classes;
use Ini;
use Str;
/**
@ -46,7 +47,7 @@ class SectionParser
];
if ($count >= 3) {
$result['settings'] = parse_ini_string($sections[0], true);
$result['settings'] = Ini::parse($sections[0], true);
$result['code'] = $sections[1];
$result['code'] = preg_replace('/^\s*\<\?php/', '', $result['code']);
@ -56,7 +57,7 @@ class SectionParser
$result['markup'] = $sections[2];
}
elseif ($count == 2) {
$result['settings'] = parse_ini_string($sections[0], true);
$result['settings'] = Ini::parse($sections[0], true);
$result['markup'] = $sections[1];
}
elseif ($count == 1) {

View File

@ -99,7 +99,7 @@ class Index extends Controller
$this->bodyClass = 'compact-container side-panel-not-fixed';
$this->pageTitle = 'cms::lang.cms.menu_label';
$this->pageTitleTemplate = '%s CMS';
$this->pageTitleTemplate = '%s '.trans($this->pageTitle);
if (Request::ajax() && Request::input('formWidgetAlias')) {
$this->bindFormWidgetToController();
@ -307,6 +307,7 @@ class Index extends Controller
$partial = ComponentPartial::load($componentObj, 'default');
$content = $partial->getContent();
$content = str_replace('__SELF__', $alias, $content);
return $content;
}
@ -328,7 +329,7 @@ class Index extends Controller
'partial' => '\Cms\Classes\Partial',
'layout' => '\Cms\Classes\Layout',
'content' => '\Cms\Classes\Content',
'asset' => '\Cms\Classes\Asset',
'asset' => '\Cms\Classes\Asset'
];
if (!array_key_exists($type, $types)) {
@ -392,7 +393,7 @@ class Index extends Controller
'partial' => '~/modules/cms/classes/partial/fields.yaml',
'layout' => '~/modules/cms/classes/layout/fields.yaml',
'content' => '~/modules/cms/classes/content/fields.yaml',
'asset' => '~/modules/cms/classes/asset/fields.yaml',
'asset' => '~/modules/cms/classes/asset/fields.yaml'
];
if (!array_key_exists($type, $formConfigs)) {
@ -427,7 +428,7 @@ class Index extends Controller
throw new ApplicationException(trans('cms::lang.component.invalid_request'));
}
for ($index = 0; $index < $count; $index ++) {
for ($index = 0; $index < $count; $index++) {
$componentName = $componentNames[$index];
$componentAlias = $componentAliases[$index];

View File

@ -247,7 +247,7 @@ class Themes extends Controller
/**
* Add form fields defined in theme.yaml
*/
protected function formExtendFields($form)
public function formExtendFields($form)
{
$model = $form->model;
$theme = $this->findThemeObject($model->theme);

View File

@ -1,4 +1,4 @@
<?php namespace Cms\Classes;
<?php namespace Cms\Helpers;
/**
* Defines some file-system helpers for the CMS system.
@ -6,7 +6,7 @@
* @package october\system
* @author Alexey Bobkov, Samuel Georges
*/
class FileHelper
class File
{
/**
* Validates a CMS object file or directory name.
@ -68,48 +68,4 @@ class FileHelper
return true;
}
/**
* Formats an INI file string from an array
* @param array $data Data to format.
* @param int $level Specifies the level of array value.
* @return string Returns the INI file string.
*/
public static function formatIniString($data, $level = 1)
{
$content = null;
$sections = [];
foreach ($data as $key => $value) {
if (is_array($value)) {
if ($level == 1) {
$sections[$key] = self::formatIniString($value, $level+1);
}
else {
foreach ($value as $val) {
$content .= $key.'[] = "'.self::escapeIniString($val).'"'.PHP_EOL;
}
}
}
elseif (strlen($value)) {
$content .= $key.' = "'.self::escapeIniString($value).'"'.PHP_EOL;
}
}
foreach ($sections as $key => $section) {
$content .= PHP_EOL.'['.$key.']'.PHP_EOL.$section.PHP_EOL;
}
return trim($content);
}
/**
* Escapes a string for saving in INI format
* @param string $string Specifies the string to escape
* @return string Returns the processed string
*/
public static function escapeIniString($string)
{
return str_replace('"', '\"', $string);
}
}

View File

@ -0,0 +1,300 @@
<?php
return [
'cms_object' => [
'invalid_file' => 'Invalid file name: :name. File names can contain only alphanumeric symbols, underscores, dashes and dots. Some examples of correct file names: page.htm, page, subdirectory/page',
'invalid_property' => "Parametr ':name' není možno nastavit",
'file_already_exists' => "Soubor ':name' již existuje.",
'error_saving' => "Chyba ukládání souboru ':name'. Zkontrolujte práva k zápisu.",
'error_creating_directory' => 'Chyba vytváření složky :name. Zkontrolujte práva k zápisu.',
'invalid_file_extension'=>'Chybná přípona souboru: :invalid. Povolené přípony jsou: :allowed.',
'error_deleting' => "Chyba mazání souboru s šablonou ':name'. Zkontrolujte práva k zápisu.",
'delete_success' => 'Šablony úspěšně smazány: :count.',
'file_name_required' => 'Je nutno vyplnit Název souboru.'
],
'theme' => [
'not_found_name' => "Téma ':name' nebylo nalezeno.",
'active' => [
'not_set' => 'Aktivní téma nebylo nastaveno.',
'not_found' => 'Aktivní téma nebylo nalezeno.'
],
'edit' => [
'not_set' => 'Editované téma nebylo uloženo.',
'not_found' => 'Editované téma nebylo nalezeno.',
'not_match' => "Objekt který chcete právě zobrazit nepatří do téma, které nyní editujete. Prosím obnovte stránku."
],
'settings_menu' => 'Témata vzhledu',
'settings_menu_description' => 'Náhledy instalovaných témat a výběr aktivního téma.',
'default_tab' => 'Parametry',
'name_label' => 'Název',
'name_create_placeholder' => 'Název nového téma',
'author_label' => 'Autor',
'author_placeholder' => 'Jméno osoby, nebo firmy',
'description_label' => 'Popisek',
'description_placeholder' => 'Popište svoje téma',
'homepage_label' => 'Domovská stránka',
'homepage_placeholder' => 'URL domovské stránky',
'code_label' => 'Kód',
'code_placeholder' => 'Unikátní kód téma pro distribuci aktualizační sítí',
'dir_name_label' => 'Název složky',
'dir_name_create_label' => 'Název cílové složky pro uložení téma',
'theme_label' => 'Téma',
'theme_title' => 'Téma',
'activate_button' => 'Aktivovat',
'active_button' => 'Aktivní',
'customize_theme' => 'Přizpůsobení téma',
'customize_button' => 'Přizpůsobit',
'duplicate_button' => 'Duplikovat',
'duplicate_title' => 'Duplikovat téma',
'duplicate_theme_success' => 'Duplikace téma byla úspěšná!',
'manage_button' => 'Správa téma',
'manage_title' => 'Správa témat',
'edit_properties_title' => 'Téma',
'edit_properties_button' => 'Nastavit',
'save_properties' => 'Uložit nastavení',
'import_button' => 'Importovat',
'import_title' => 'Importovat téma',
'import_theme_success' => 'Téma úspěšně importováno!',
'import_uploaded_file' => 'Soubor s tématem',
'import_overwrite_label' => 'Přepsat existující soubory',
'import_overwrite_comment' => 'Odškrtněte tento box pokud chcete importovat pouze nové soubory.',
'import_folders_label' => 'Složky',
'import_folders_comment' => 'Vyberte prosím složky, které chcete importovat',
'export_button' => 'Exportovat',
'export_title' => 'Exportovat téma',
'export_folders_label' => 'Složky',
'export_folders_comment' => 'Vyberte prosím složky, které chcete exportovat',
'delete_button' => 'Smazat',
'delete_confirm' => 'Jste si jistí, že chcete smazat toto téma? Tuto akci nelze vrátit zpět!',
'delete_active_theme_failed' => 'Nelze smazat aktivní téma. Nejdříve aktivujte jiné téma.',
'delete_theme_success' => 'Téma úspěšně smazáno!',
'create_title' => 'Vytvořit téma',
'create_button' => 'Vytvořit',
'create_new_blank_theme' => 'Vytvořit nové čisté téma',
'create_theme_success' => 'Téma úspěšně vytvořeno!',
'create_theme_required_name' => 'Napište jméno pro nové téma.',
'new_directory_name_label' => 'Složka téma',
'new_directory_name_comment' => 'Zadejte název nové složky pro duplikaci téma.',
'dir_name_invalid' => 'Název může obsahovat pouze čísla, písmena a následující symboly: _-',
'dir_name_taken' => 'Tato složka s tématem již existuje.',
'find_more_themes' => 'Vyhledat více témat',
'saving' => 'Ukládám téma...',
'return' => 'Zpět na seznam témat',
],
'maintenance' => [
'settings_menu' => 'Režim údržby',
'settings_menu_description' => 'Nastavte stránku režimu údržby a její nastavení.',
'is_enabled' => 'Aktivovat režim údržby',
'is_enabled_comment' => 'Pokud je režim údržby aktivní, uživatelé uvidí stránku vybranou níže.'
],
'page' => [
'not_found_name' => "Stránka ':name' nebyla nalezena",
'not_found' => [
'label' => 'Stránka nenalezena',
'help' => 'Požadovaná stránka nebyla nalezena.'
],
'custom_error' => [
'label' => 'Chyba stránky',
'help' => "Omlouváme se, ale požadovaná stránka nelze zobrazit z důvodu nějaké chyby."
],
'menu_label' => 'Stránky',
'unsaved_label' => 'Neuložené stránky',
'no_list_records' => 'Žádné stránky',
'new' => 'Nová stránka',
'invalid_url' => 'Špatný formát URL. URL musí začínat lomítkem a může obsahovat pouze číslice, písmena a následující znaky: ._-[]:?|/+*^$',
'delete_confirm_multiple' => 'Opravdu chcete odstranit vybrané stránky?',
'delete_confirm_single' => 'Opravdu chcete odstranit tuto stránku?',
'no_layout' => '-- žádný layout --'
],
'layout' => [
'not_found_name' => "Layout ':name' nebyl nalezen",
'menu_label' => 'Layouty',
'unsaved_label' => 'Neuložený layout(y)',
'no_list_records' => 'Žádné layouty nebyly nalezeny',
'new' => 'Nový layout',
'delete_confirm_multiple' => 'Opravdu chcete odstranit vybrané layouty?',
'delete_confirm_single' => 'Opravdu chcete odstranit tento layout?'
],
'partial' => [
'not_found_name' => "Dílčí šablona ':name' nebyla nalezena.",
'invalid_name' => 'Chybný název dílčí šablony: :name.',
'menu_label' => 'Dílčí šablony',
'unsaved_label' => 'Neuložené dílčí šablony',
'no_list_records' => 'Žádné dílčí šablony',
'delete_confirm_multiple' => 'Opravdu chcete smazat tyto dílčí šablony?',
'delete_confirm_single' => 'Opravdu chcete smazat tuto dílčí šablonu?',
'new' => 'Nová šablona'
],
'content' => [
'not_found_name' => "Obsahový soubor ':name' nebyl nalezen.",
'menu_label' => 'Obsahy',
'unsaved_label' => 'Neuložený obsah',
'no_list_records' => 'Žádné obsahové soubory',
'delete_confirm_multiple' => 'Opravdu chcete smazat tyto obsahové soubory nebo složky?',
'delete_confirm_single' => 'Opravdu chcete smazat tento obsahový soubor?',
'new' => 'Žádný obsahový soubor'
],
'ajax_handler' => [
'invalid_name' => 'Invalid AJAX handler name: :name.',
'not_found' => "AJAX handler ':name' was not found."
],
'cms' => [
'menu_label' => 'CMS'
],
'sidebar' => [
'add' => 'Přidat',
'search' => 'Hledat...'
],
'editor' => [
'settings' => 'Nastavení',
'title' => 'Název souboru',
'new_title' => 'Nový název souboru',
'url' => 'URL',
'filename' => 'Název souboru',
'layout' => 'Layout',
'description' => 'Popisek',
'preview' => 'Náhled',
'meta' => 'Meta údaje',
'meta_title' => 'Meta Title',
'meta_description' => 'Meta Description',
'markup' => 'Markup',
'code' => 'PHP kód',
'content' => 'Obsah',
'hidden' => 'Skrytý',
'hidden_comment' => 'Skryté stránky jsou dostupné pouze přihlášeným administrátorům pro náhled.',
'enter_fullscreen' => 'Zapnout režim celé obrazovky',
'exit_fullscreen' => 'Opustit režim celé obrazovky'
],
'asset' => [
'menu_label' => 'Soubory',
'unsaved_label' => 'Neuložené soubory',
'drop_down_add_title' => 'Přidat...',
'drop_down_operation_title' => 'Akce...',
'upload_files' => 'Nahrát soubor(y)',
'create_file' => 'Vytvořit soubor',
'create_directory' => 'Vytvořit složku',
'directory_popup_title' => 'Vytvoření nové složky',
'directory_name' => 'Název složky',
'rename' => 'Přejmenovat',
'delete' => 'Smazat',
'move' => 'Přesunout',
'select' => 'Vybrat',
'new' => 'Nový soubor',
'rename_popup_title' => 'Přejmenovat',
'rename_new_name' => 'Nový název',
'invalid_path' => 'Cesta může obsahovat pouze číslice, písmena, mezery nebo následující znaky: ._-/',
'error_deleting_file' => 'Chyba mazání souboru :name.',
'error_deleting_dir_not_empty' => 'Chyba mazání složky :name. Složka není prázdná.',
'error_deleting_dir' => 'Chyba mazání souboru :name.',
'invalid_name' => 'Název může obsahovat pouze číslice, písmena, mezery a následující soubory: ._-',
'original_not_found' => 'Původní soubor nebo složka neexistují',
'already_exists' => 'Soubor nebo složka s tímto názvem již existují',
'error_renaming' => 'Chyba přejmenovávání souboru nebo složky',
'name_cant_be_empty' => 'Název nemůže být prázdný',
'too_large' => 'Nahrávaný soubor je příliš veliký. Maximální povolená velikost je :max_size',
'type_not_allowed' => 'Je možno nahrávat pouze tyto typy souborů: :allowed_types',
'file_not_valid' => 'Soubor není validní',
'error_uploading_file' => "Chyba nahrávání souboru ':name': :error",
'move_please_select' => 'prosím vyberte',
'move_destination' => 'Cílová složka',
'move_popup_title' => 'Přesunutí souborů',
'move_button' => 'Přesunout',
'selected_files_not_found' => 'Vybrané soubory nebyly nalezeny',
'select_destination_dir' => 'Vyberte cílovou složku',
'destination_not_found' => 'Cílová složka nebyla nalezena',
'error_moving_file' => 'Chyba přesunu souboru :file',
'error_moving_directory' => 'Chyba přesunu složky :dir',
'error_deleting_directory' => 'Chyba přesunu původní složky :dir',
'path' => 'Cesta'
],
'component' => [
'menu_label' => 'Komponenty',
'unnamed' => 'Bez jména',
'no_description' => 'Popis nevyplněn',
'alias' => 'Alias',
'alias_description' => 'Unikátní název komponenty pro použití ve stránkách, nebo kodéch layoutu.',
'validation_message' => 'Alias komponenty je povinný a může obsahovat pouze písmena, čísla a podtržítka. Alias by měl začínat písmenem.',
'invalid_request' => 'Šablona nemohla být uložena, protože jedna z komponent nemá správně vyplněná data.',
'no_records' => 'Žádná komponenta',
'not_found' => "Komponenta ':name' nebyla nalezena.",
'method_not_found' => "Komponenta ':name' nemá metodu ':method'."
],
'template' => [
'invalid_type' => 'Neznámý typ šablony.',
'not_found' => 'Požadovaná šablona nebyla nalezena.',
'saved'=> 'Šablona byla úspěšně uložena.'
],
'permissions' => [
'name' => 'Cms',
'manage_content' => 'Správa obsahu',
'manage_assets' => 'Správa souborů',
'manage_pages' => 'Správa stránek',
'manage_layouts' => 'Správa layoutů',
'manage_partials' => 'Správa dílčích šablon',
'manage_themes' => 'Správa témat',
'manage_media' => 'Správa médií'
],
'mediafinder' => [
'default_prompt' => 'Klikněte na tlačítko %s pro hledání souboru'
],
'media' => [
'invalid_path' => "Chybně zadaná cesta: ':path'.",
'menu_label' => 'Media',
'upload' => 'Nahrát',
'move' => 'Přesunout',
'delete' => 'Smazat',
'add_folder' => 'Přidat složku',
'search' => 'Vyhledat',
'display' => 'Zobrazit',
'filter_everything' => 'Vše',
'filter_images' => 'Obrázky',
'filter_video' => 'Video',
'filter_audio' => 'Audio',
'filter_documents' => 'Dokumenty',
'library' => 'Knihovna',
'folder_size_items' => 'soubor(ů)',
'size' => 'Velikost',
'title' => 'Název',
'last_modified' => 'Naposledy upraveno',
'public_url' => 'Veřejná URL',
'click_here' => 'Klikněte zde',
'thumbnail_error' => 'Chyba generování náhledu.',
'return_to_parent' => 'Zpět do nadřazené složky',
'return_to_parent_label' => 'Go up ..',
'nothing_selected' => 'Nic nevybráno.',
'multiple_selected' => 'Vybráno více položek.',
'uploading_file_num' => 'Nahrávám :number soubor(y)...',
'uploading_complete' => 'Nahrávání kompletní',
'order_by' => 'Seřadit dle',
'folder' => 'Složka',
'no_files_found' => 'No files found by your request.',
'delete_empty' => 'Vyberte položky ke smazání.',
'delete_confirm' => 'Opravu chcete smazat vybrané položky?',
'error_renaming_file' => 'Přejmenování se nezdařilo.',
'new_folder_title' => 'Nová složka',
'folder_name' => 'Název složky',
'error_creating_folder' => 'Chyba vytváření složky',
'folder_or_file_exist' => 'A folder or file with the specified name already exists.',
'move_empty' => 'Vyberte položky k přesunutí.',
'move_popup_title' => 'Přesun souborů nebo složek',
'move_destination' => 'Cílová složka',
'please_select_move_dest' => 'Prosím vyberte cílovou složku.',
'move_dest_src_match' => 'Prosím vyberte jinou cílovou složku.',
'empty_library' => 'Knihovna médií je prázdná. Nahrajte prosím soubory, nebo vytvořte složky.',
'insert' => 'Vložit',
'crop_and_insert' => 'Oříznout & vložit',
'select_single_image' => 'Prosím vyberte pouze jeden obrázek.',
'selection_not_image' => 'Vybraná položka není obrázek.',
'restore' => 'Zpět všechny změny',
'resize' => 'Změnit velikost...',
'selection_mode_normal' => 'Normální',
'selection_mode_fixed_ratio' => 'Pevný poměr stran',
'selection_mode_fixed_size' => 'Pevná velikost',
'height' => 'Výška',
'width' => 'Šířka',
'selection_mode' => 'Selection mode',
'resize_image' => 'Změna rozměrů obrázku',
'image_size' => 'Velikost obrázku:',
'selected_size' => 'Vybrané:'
]
];

View File

@ -253,7 +253,6 @@ return [
'uploading_file_num' => 'Lade :number Datei(en)...',
'uploading_complete' => 'Upload vollständig',
'order_by' => 'Sortieren nach',
'search' => 'Suchen',
'folder' => 'Ordner',
'no_files_found' => 'Keine entsprechenden Dateien gefunden.',
'delete_empty' => 'Bitte Wählen Sie Dateien zum Löschen aus.',

View File

@ -263,7 +263,6 @@ return [
'uploading_file_num' => 'Ανέβασμα :number αρχείων...',
'uploading_complete' => 'Το ανέβασμα ολοκληρώθηκε',
'order_by' => 'Ταξινόμηση κατά',
'search' => 'Αναζήτηση',
'folder' => 'Κατάλογος',
'no_files_found' => 'Δεν βρέθηκαν αρχεία από το αίτημα σας.',
'delete_empty' => 'παρακαλούμε επιλέξτε αντικείμενά για να τα σβήσετε.',

View File

@ -266,7 +266,6 @@ return [
'uploading_file_num' => 'Uploading :number file(s)...',
'uploading_complete' => 'Upload complete',
'order_by' => 'Order by',
'search' => 'Search',
'folder' => 'Folder',
'no_files_found' => 'No files found by your request.',
'delete_empty' => 'Please select items to delete.',

View File

@ -256,7 +256,6 @@ return [
'uploading_file_num' => 'Subiendo :number archivo(s)...',
'uploading_complete' => 'Subida completada',
'order_by' => 'Ordenar por',
'search' => 'Buscar',
'folder' => 'Carpeta',
'no_files_found' => 'No se han encontrado archivos.',
'delete_empty' => 'Por favor, selecciona los elementos que quieres eliminar.',

View File

@ -231,7 +231,11 @@ return [
'manage_pages' => 'مدیریت صفحات',
'manage_layouts' => 'مدیریت طرح بندی ها',
'manage_partials' => 'مدیریت بخش ها',
'manage_themes' => 'مدیریت قالب ها'
'manage_themes' => 'مدیریت قالب ها',
'manage_media' => 'مدیریت چند رسانه ها'
],
'mediafinder' => [
'default_prompt' => '%s را جهت انتخاب فایل چند رسانه ای انتخاب کنید'
],
'media' => [
'invalid_path' => "آدرس فایل ':path' معتبر نیست.",
@ -262,7 +266,6 @@ return [
'uploading_file_num' => 'ارسال :number فایل(ها)...',
'uploading_complete' => 'ارسال انجام شد',
'order_by' => 'مرتب سازی با',
'search' => 'جستجو',
'folder' => 'پوشه',
'no_files_found' => 'فایلی با درخواست شما یافت نشد',
'delete_empty' => 'لطفا موارد را جهت حذف انتخاب نمایید',

View File

@ -266,7 +266,6 @@ return [
'uploading_file_num' => 'Téléchargement de :number fichier(s)…',
'uploading_complete' => 'Téléchargement complet',
'order_by' => 'Trier par',
'search' => 'Rechercher',
'folder' => 'Répertoire',
'no_files_found' => 'Aucun fichier trouvé.',
'delete_empty' => 'Sélectionner les articles à supprimer.',

View File

@ -266,7 +266,6 @@ return [
'uploading_file_num' => 'Feltöltve :number fájl...',
'uploading_complete' => 'Feltöltés sikeresen befejezve',
'order_by' => 'Rendezés',
'search' => 'Keresés',
'folder' => 'Könyvtárak',
'no_files_found' => 'Nem található fájl a lekérésben.',
'delete_empty' => 'Kérjük, válassza ki a törölni kívánt fájlokat.',

View File

@ -266,7 +266,6 @@ return [
'uploading_file_num' => 'Caricamento in corso di :number file(s)...',
'uploading_complete' => 'Caricamento completato',
'order_by' => 'Ordina per',
'search' => 'Cerca',
'folder' => 'Cartella',
'no_files_found' => 'Nessun file corrisponde alla tua richiesta.',
'delete_empty' => 'Seleziona elementi da eliminare.',

View File

@ -258,7 +258,6 @@ return [
'uploading_file_num' => 'Laster opp :number fil(er)...',
'uploading_complete' => 'Opplasting fullført',
'order_by' => 'Sorter etter',
'search' => 'Søk',
'folder' => 'Mappe',
'no_files_found' => 'Ingen filer ble funnet.',
'delete_empty' => 'Ingen filer er valgt.',

View File

@ -7,35 +7,95 @@ return [
'file_already_exists' => 'Bestand ":name" bestaat al.',
'error_saving' => 'Bestand opslaan mislukt: ":name". Controleer de schrijfrechten.',
'error_creating_directory' => 'Map aanmaken mislukt: ":name". Controleer de schrijfrechten.',
'invalid_file_extension'=>'Ongeldige bestandsextensie: :invalid. Toegestane extensies zijn: :allowed.',
'invalid_file_extension' => 'Ongeldige bestandsextensie: :invalid. Toegestane extensies zijn: :allowed.',
'error_deleting' => 'Fout bij het verwijderen van template: ":name". Controleer de schrijfrechten.',
'delete_success' => 'Templates zijn succesvol verwijderd: :count.',
'file_name_required' => 'Het invullen van een bestandsnaam is verplicht.'
],
'theme' => [
'not_found_name' => 'Het thema \':name\' is niet gevonden.',
'active' => [
'not_set' => "Er is geen actief thema geselecteerd.",
'not_found' => "Het actieve thema is niet gevonden.",
'not_set' => 'Er is geen actief thema geselecteerd.',
'not_found' => 'Het actieve thema is niet gevonden.',
],
'edit' => [
'not_set' => "Er is geen thema ingesteld om te kunnen bewerken.",
'not_found' => "Het te bewerken thema is niet gevonden.",
'not_match' => "Het object dat je probeert te openen behoort niet tot het te bewerken thema. Herlaad de pagina."
'not_set' => 'Er is geen thema ingesteld om te kunnen bewerken.',
'not_found' => 'Het te bewerken thema is niet gevonden.',
'not_match' => 'Het object dat je probeert te openen behoort niet tot het te bewerken thema. Herlaad de pagina.'
],
'settings_menu' => 'Front-end thema',
'settings_menu_description' => 'Bekijk de lijst met geïnstalleerde themas en selecteer een beschikbaar thema.',
'settings_menu_description' => 'Bekijk de lijst met geïnstalleerde thema\'s en selecteer een beschikbaar thema.',
'find_more_themes' => 'Vind meer thema\'s op de OctoberCMS thema marktplaats.',
'activate_button' => 'Activeer',
'active_button' => 'Activeer',
'default_tab' => 'Eigenschappen',
'name_label' => 'Naam',
'name_create_placeholder' => 'Thema naam',
'author_label' => 'Auteur',
'author_placeholder' => 'Naam of bedrijfsnaam',
'description_label' => 'Omschrijving',
'description_placeholder' => 'Thema omschrijving',
'homepage_label' => 'Website',
'homepage_placeholder' => 'Website URL',
'code_label' => 'Code',
'code_placeholder' => 'Een unieke code voor dit thema (wordt gebruikt voor distributie)',
'dir_name_label' => 'Mapnaam',
'dir_name_create_label' => 'Mapnaam van het thema',
'theme_label' => 'Thema',
'theme_title' => 'Thema\'s',
'customize_theme' => 'Thema aanpassen',
'customize_button' => 'Aanpassen',
'duplicate_button' => 'Dupliceren',
'duplicate_title' => 'Dupliceer thema',
'duplicate_theme_success' => 'Thema succesvol gedupliceerd!',
'manage_button' => 'Beheer',
'manage_title' => 'Beheer thema',
'edit_properties_title' => 'Thema',
'edit_properties_button' => 'Wijzig eigenschappen',
'save_properties' => 'Eigenschappen opslaan',
'import_button' => 'Importeren',
'import_title' => 'Importeer thema',
'import_theme_success' => 'Thema succesvol geïmporteerd!',
'import_uploaded_file' => 'Thema archiefbestand',
'import_overwrite_label' => 'Overschijf bestaande bestanden',
'import_overwrite_comment' => 'Untick this box to only import new files',
'import_folders_label' => 'Mappen',
'import_folders_comment' => 'Selecteer de mappen die je wilt importeren:',
'export_button' => 'Exporteren',
'export_title' => 'Exporteer thema',
'export_folders_label' => 'Mappen',
'export_folders_comment' => 'Selecteer de mappen die je wilt exporteren:',
'delete_button' => 'Verwijderen',
'delete_confirm' => 'Weet je zeker dat je dit thema wilt verwijderen? Dit kan niet ongedaan worden gemaakt!',
'delete_active_theme_failed' => 'Kan het actieve thema niet verwijderen, maak eerst een ander thema actief.',
'delete_theme_success' => 'Thema succesvol verwijderd!',
'create_title' => 'Thema aanmaken',
'create_button' => 'Aanmaken',
'create_new_blank_theme' => 'Maak een nieuw leeg thema',
'create_theme_success' => 'Thema succesvol aangemaakt!',
'create_theme_required_name' => 'Geef a.u.b. een naam op voor dit thema.',
'new_directory_name_label' => 'Thema mapnaam',
'new_directory_name_comment' => 'Geef een nieuwe mapnaam op voor het gedupliceerde thema.',
'dir_name_invalid' => 'Naam mag alleen cijfers, letters en de volgende symbolen bevatten: _-',
'dir_name_taken' => 'Opgegeven mapnaam bestaat reeds.',
'saving' => 'Thema opslaan...',
'return' => 'Terug naar thema lijst',
],
'maintenance' => [
'settings_menu' => 'Onderhoudsmodus',
'settings_menu_description' => 'Instellingen voor de onderhoudsmodus pagina.',
'is_enabled' => 'Onderhoudsmodus inschakelen',
'is_enabled_comment' => 'Toon de volgende pagina als onderhoudsmodus is ingeschakeld:'
],
'page' => [
'not_found_name' => 'De pagina \':name\' is niet gevonden.',
'not_found' => [
'label' => "Pagina niet gevonden",
'help' => "De opgevraagde pagina kan niet worden gevonden.",
'label' => 'Pagina niet gevonden',
'help' => 'De opgevraagde pagina kan niet worden gevonden.',
],
'custom_error' => [
'label' => "Paginafout",
'help' => "Onze excuses, er is iets mis gegaan. De opgevraagde pagina kan niet worden getoond.",
'label' => 'Paginafout',
'help' => 'Onze excuses, er is iets mis gegaan. De opgevraagde pagina kan niet worden getoond.',
],
'menu_label' => 'Pagina\'s',
'no_list_records' => 'Geen pagina\'s gevonden',
@ -43,39 +103,43 @@ return [
'invalid_url' => 'Ongeldig URL formaat. De URL moet beginnen met een schuine streep en mag enkel bestaan uit letters, cijfers en de volgende tekens: ._-[]:?|/+*^$',
'delete_confirm_multiple' => 'Weet je zeker dat je de geselecteerde pagina\'s wilt verwijderen?',
'delete_confirm_single' => 'Weet je zeker dat je deze pagina wilt verwijderen?',
'no_layout' => '-- geen layout --'
'no_layout' => '-- geen layout --',
'unsaved_label' => 'Niet opgeslagen pagina\'s',
],
'layout' => [
'unsaved_label' => 'Niet opgeslagen layouts',
'not_found_name' => "De layout ':name' is niet gevonden",
'menu_label' => 'Layouts',
'no_list_records' => 'Geen layouts gevonden',
'new' => 'Nieuwe layout',
'delete_confirm_multiple' => 'Weet je zeker dat je de geselecteerde layouts wilt verwijderen?',
'delete_confirm_single' => 'Weet je zeker dat je deze layout wilt verwijderen?'
'delete_confirm_single' => 'Weet je zeker dat je deze layout wilt verwijderen?',
],
'partial' => [
'not_found_name' => "Het sjabloon (partial) ':name' is niet gevonden.",
'invalid_name' => "Ongeldige naam voor sjabloon (partial): :name.",
'unsaved_label' => 'Niet opgeslagen sjablonen',
'not_found_name' => 'Het sjabloon (partial) \':name\' is niet gevonden.',
'invalid_name' => 'Ongeldige naam voor sjabloon (partial): :name.',
'menu_label' => 'Sjablonen',
'no_list_records' => 'Geen sjablonen (partial) gevonden',
'delete_confirm_multiple' => 'Weet je zeker dat je de geselecteerde sjablonen wilt verwijderen?',
'delete_confirm_single' => 'Weet je zeker dat je dit sjabloon wilt verwijderen?',
'new' => 'Nieuw sjabloon'
'new' => 'Nieuw sjabloon',
],
'content' => [
'unsaved_label' => 'Niet opgeslagen tekstblokken',
'not_found_name' => "Het tekstblok (content) ':name' is niet gevonden.",
'menu_label' => 'Tekstblokken',
'no_list_records' => 'Geen tekstblokken (content) gevonden',
'delete_confirm_multiple' => 'Weet je zeker dat je de geselecteerde tekstblokken of mappen wilt verwijderen?',
'delete_confirm_single' => 'Weet je zeker dat je dit tekstblok wilt verwijderen?',
'new' => 'Nieuw tekstblok'
'new' => 'Nieuw tekstblok',
],
'ajax_handler' => [
'invalid_name' => "Ongeldige AJAX handlernaam: :name.",
'not_found' => "AJAX handler ':name' is niet gevonden.",
'invalid_name' => 'Ongeldige AJAX handlernaam: :name.',
'not_found' => 'AJAX handler \':name\' is niet gevonden.',
],
'cms' => [
'menu_label' => "CMS"
'menu_label' => 'CMS'
],
'sidebar' => [
'add' => 'Toevoegen',
@ -102,7 +166,8 @@ return [
'exit_fullscreen' => 'Volledig scherm afsluiten',
],
'asset' => [
'menu_label' => "Middelen",
'menu_label' => 'Middelen',
'unsaved_label' => 'Niet opgeslagen middelen',
'drop_down_add_title' => 'Toevoegen...',
'drop_down_operation_title' => 'Actie...',
'upload_files' => 'Bestand(en) uploaden',
@ -140,31 +205,96 @@ return [
'error_moving_file' => 'Fout bij verplaatsen bestand :file',
'error_moving_directory' => 'Fout bij verplaatsen map :dir',
'error_deleting_directory' => 'Fout bij het verwijderen van de oorspronkelijke map :dir',
'path' => 'Pad'
'path' => 'Pad',
],
'component' => [
'menu_label' => "Componenten",
'unnamed' => "Naamloos",
'no_description' => "Geen beschrijving opgegeven",
'alias' => "Alias",
'alias_description' => "Een unieke naam voor dit component voor gebruik in de code van een pagina of layout.",
'validation_message' => "Een alias voor het component is verplicht en mag alleen bestaan uit letters, cijfers en underscores. De alias moet beginnen met een letter.",
'invalid_request' => "De template kan niet worden opgeslagen vanwege ongeldige componentgegevens.",
'menu_label' => 'Componenten',
'unnamed' => 'Naamloos',
'no_description' => 'Geen beschrijving opgegeven',
'alias' => 'Alias',
'alias_description' => 'Een unieke naam voor dit component voor gebruik in de code van een pagina of layout.',
'validation_message' => 'Een alias voor het component is verplicht en mag alleen bestaan uit letters, cijfers en underscores. De alias moet beginnen met een letter.',
'invalid_request' => 'De template kan niet worden opgeslagen vanwege ongeldige componentgegevens.',
'no_records' => 'Geen componenten gevonden',
'not_found' => "Het component ':name' is niet gevonden.",
'method_not_found' => "Het component ':name' bevat geen ':method' methode.",
'not_found' => 'Het component \':name\' is niet gevonden.',
'method_not_found' => 'Het component \':name\' bevat geen \':method\' methode.',
],
'template' => [
'invalid_type' => "Onbekend type template.",
'not_found' => "De opgevraagde template is niet gevonden.",
'saved'=> "De template is succesvol opgeslagen."
'invalid_type' => 'Onbekend type template.',
'not_found' => 'De opgevraagde template is niet gevonden.',
'saved' => 'De template is succesvol opgeslagen.'
],
'permissions' => [
'name' => 'Cms',
'manage_content' => 'Beheer inhoud',
'manage_assets' => 'Beheer middelen',
'manage_pages' => 'Beheer pagina\'s',
'manage_layouts' => 'Beheer layouts',
'manage_partials' => 'Beheer sjablonen',
'manage_themes' => 'Beheer thema\'s'
'manage_themes' => 'Beheer thema\'s',
'manage_media' => 'Beheer media',
],
'mediafinder' => [
'default_prompt' => 'Klik op de %s knop om een media item te vinden'
],
'media' => [
'invalid_path' => 'Ongeldig pad opgegeven: \':path\'.',
'menu_label' => 'Media',
'upload' => 'Uploaden',
'move' => 'Verplaatsen',
'delete' => 'Verwijderen',
'add_folder' => 'Map toevoegen',
'search' => 'Zoeken',
'display' => 'Weergeven',
'filter_everything' => 'Alles',
'filter_images' => 'Afbeeldingen',
'filter_video' => 'Video\'s',
'filter_audio' => 'Audio',
'filter_documents' => 'Documenten',
'library' => 'Bibliotheek',
'folder_size_items' => 'item(s)',
'size' => 'Grootte',
'title' => 'Titel',
'last_modified' => 'Laatst gewijzigd',
'public_url' => 'URL',
'click_here' => 'Klik hier',
'thumbnail_error' => 'Fout opgetreden bij genereren miniatuurweergave.',
'return_to_parent' => 'Terug naar bovenliggende map',
'return_to_parent_label' => 'Naar bovenliggende ...',
'nothing_selected' => 'Er is niets geselecteerd.',
'multiple_selected' => 'Meerdere items geselecteerd.',
'uploading_file_num' => 'Uploaden van :number bestanden...',
'uploading_complete' => 'Uploaden voltooid',
'order_by' => 'Sorteer op',
'folder' => 'Map',
'no_files_found' => 'Er zijn geen bestanden gevonden.',
'delete_empty' => 'Selecteer items om te verwijderen.',
'delete_confirm' => 'Weet je zeker dat je de geselecteerde items wilt verwijderen?',
'error_renaming_file' => 'Fout bij wijzigen naam.',
'new_folder_title' => 'Nieuwe map',
'folder_name' => 'Mapnaam',
'error_creating_folder' => 'Fout bij maken van map',
'folder_or_file_exist' => 'Er bestaat reeds een map of bestand met deze naam.',
'move_empty' => 'Selecteer de items om te verplaatsen.',
'move_popup_title' => 'Verplaats bestanden of mappen',
'move_destination' => 'Doelmap',
'please_select_move_dest' => 'Selecteer een doelmap.',
'move_dest_src_match' => 'Selecteer een andere doelmap.',
'empty_library' => 'De media bibliotheek is leeg. Upload bestanden of maak mappen aan om te beginnen.',
'insert' => 'Invoegen',
'crop_and_insert' => 'Uitsnijden & Invoegen',
'select_single_image' => 'Selecteer één afbeelding.',
'selection_not_image' => 'Het geselecteerde item is geen afbeelding.',
'restore' => 'Alle wijzigingen ongedaan maken',
'resize' => 'Wijzig grootte...',
'selection_mode_normal' => 'Normaal',
'selection_mode_fixed_ratio' => 'Vaste ratio',
'selection_mode_fixed_size' => 'Vaste grootte',
'height' => 'Hoogte',
'width' => 'Breedte',
'selection_mode' => 'Selectie modus',
'resize_image' => 'Wijzig grootte van afbeelding',
'image_size' => 'Grootte afbeelding:',
'selected_size' => 'Geselecteerd:'
]
];

View File

@ -65,7 +65,6 @@ return [
'export_folders_comment' => 'Proszę zaznaczyć foldery do eksportu',
'delete_button' => 'Usuń',
'delete_confirm' => 'Czy na pewno usunąć ten motyw? Tej operacji nie można cofnąć!',
'delete_active_theme_failed' => 'Cannot delete the active theme, try making another theme active first.',
'delete_active_theme_failed' => 'Nie można usunąć aktywnego motywu. Spróbuj zmienić aktywny motyw na inny.',
'delete_theme_success' => 'Pomyślnie usunięto motyw!',
'create_title' => 'Utwórz motyw',
@ -266,7 +265,6 @@ return [
'uploading_file_num' => 'Przesyłanie :number pliku(ów)...',
'uploading_complete' => 'Przesyłanie zakończone',
'order_by' => 'Sortowanie',
'search' => 'Szukaj',
'folder' => 'Folder',
'no_files_found' => 'Nie znaleziono żadnych pasujących elementów.',
'delete_empty' => 'Wybierz elementy do usunięcia.',

View File

@ -266,7 +266,6 @@ return [
'uploading_file_num' => 'Enviando :number arquivo(s)...',
'uploading_complete' => 'Envio finalizado',
'order_by' => 'Ordenar por',
'search' => 'Buscar',
'folder' => 'Pasta',
'no_files_found' => 'Nenhum arquivo encontrado.',
'delete_empty' => 'Por favor, selecione um item para excluir.',

View File

@ -266,7 +266,6 @@ return [
'uploading_file_num' => 'Загрузка файлов: :number',
'uploading_complete' => 'Загрузка файлов завершена!',
'order_by' => 'Сортировать по',
'search' => 'Поиск',
'folder' => 'Папка',
'no_files_found' => 'Ни один из файлов не удовлетворяет вашему запросу.',
'delete_empty' => 'Пожалуйста, выберите объекты для удаления.',

View File

@ -38,8 +38,10 @@ return [
'dir_name_label' => 'Katalognamn',
'dir_name_create_label' => 'Destinationen för temakatalogen',
'theme_label' => 'Tema',
'theme_title' => 'Teman',
'activate_button' => 'Aktivera',
'active_button' => 'Aktivera',
'customize_theme' => 'Anpassa tema',
'customize_button' => 'Anpassa',
'duplicate_button' => 'Duplicera',
'duplicate_title' => 'Duplicera temat',
@ -75,6 +77,7 @@ return [
'dir_name_invalid' => 'Namn kan bara innehålla siffror, latinska bokstäver och följande symboler: _-',
'dir_name_taken' => 'Den önskade temakatalogen finns redan.',
'find_more_themes' => 'Hitta fler teman på OctoberCMS Theme Marketplace',
'saving' => 'Sparar tema...',
'return' => 'Återvänd till temalistan',
],
'maintenance' => [
@ -227,6 +230,70 @@ return [
'manage_pages' => 'Hantera sidor',
'manage_layouts' => 'Hantera layouts',
'manage_partials' => 'Hantera partials',
'manage_themes' => 'Hantera teman'
'manage_themes' => 'Hantera teman',
'manage_media' => 'Hantera media'
],
'mediafinder' => [
'default_prompt' => 'Klicka på %s knappen för att hitta ett mediaföremål'
],
'media' => [
'invalid_path' => "Felaktig filsökväg angiven: ':path'.",
'menu_label' => 'Media',
'upload' => 'Ladda upp',
'move' => 'Flytta',
'delete' => 'Radera',
'add_folder' => 'Ny mapp',
'search' => 'Sök',
'display' => 'Visa',
'filter_everything' => 'Allt',
'filter_images' => 'Bilder',
'filter_video' => 'Videor',
'filter_audio' => 'Ljud',
'filter_documents' => 'Dokument',
'library' => 'Bibliotek',
'folder_size_items' => 'föremål',
'size' => 'Storlek',
'title' => 'Titel',
'last_modified' => 'Senast ändrad',
'public_url' => 'Publik URL',
'click_here' => 'Klicka här',
'thumbnail_error' => 'Fel vid generering av thumbnail.',
'return_to_parent' => 'Återgå till mappens förälder',
'return_to_parent_label' => 'Upp ..',
'nothing_selected' => 'Inget är valt.',
'multiple_selected' => 'Flera föremål valda.',
'uploading_file_num' => 'Laddar upp :number fil(er)...',
'uploading_complete' => 'Uppladdning slutförd',
'order_by' => 'Ordna efter',
'folder' => 'Mapp',
'no_files_found' => 'Inga filer kunde hittas baserat på din sökning.',
'delete_empty' => 'Vänligen välj föremål att radera.',
'delete_confirm' => 'Är du säker att du vill radera de valda föremålen?',
'error_renaming_file' => 'Fel vid namnbyte av föremålet.',
'new_folder_title' => 'Ny mapp',
'folder_name' => 'Mappnamn',
'error_creating_folder' => 'Fel vid skapande av mapp',
'folder_or_file_exist' => 'En mapp eller fil med det angivna namnet existerar redan.',
'move_empty' => 'Vänligen välj föremål att flytta.',
'move_popup_title' => 'Flytta filer eller mappar',
'move_destination' => 'Destinationsmapp',
'please_select_move_dest' => 'Vänligen välj en destinationsmapp.',
'move_dest_src_match' => 'Vänligen välj en annan destinationsmapp.',
'empty_library' => 'Mediabiblioteket är tomt. Ladda upp filer eller skapa mappar för att börja.',
'insert' => 'Infoga',
'crop_and_insert' => 'Beskär & infoga',
'select_single_image' => 'Vänligen välj en enskild bild.',
'selection_not_image' => 'Det valda föremålet är inte en bild.',
'restore' => 'Ångra alla ändringar',
'resize' => 'Anpassa storlek...',
'selection_mode_normal' => 'Normal',
'selection_mode_fixed_ratio' => 'Fast proportion',
'selection_mode_fixed_size' => 'Fast storlek',
'height' => 'Höjd',
'width' => 'Bredd',
'selection_mode' => 'Urvalsläge',
'resize_image' => 'Anpassa bildstorlek',
'image_size' => 'Bildstorlek:',
'selected_size' => 'Vald:'
]
];

View File

@ -13,6 +13,7 @@ return [
'file_name_required' => 'Dosya adı alanı gereklidir.'
],
'theme' => [
'not_found_name' => "':name' isimli tema bulunamadı.",
'active' => [
'not_set' => "Aktif tema belirtilmedi.",
'not_found' => 'Aktif tema bulunamadı.'
@ -24,10 +25,61 @@ return [
],
'settings_menu' => 'Temalar',
'settings_menu_description' => 'Yüklü temalar listesini önizleyebilir, bir tema seçip aktifleştirebilirsiniz.',
'find_more_themes' => 'Medanis Tema Marketi\'nden başka tema alabilirsiniz.',
'default_tab' => 'Özellikler',
'name_label' => 'İsim',
'name_create_placeholder' => 'Yeni tema ismi',
'author_label' => 'Yazar',
'author_placeholder' => 'Kişi yada şirket ismi',
'description_label' => 'Açıklama',
'description_placeholder' => 'Tema açıklaması',
'homepage_label' => 'Anasayfa',
'homepage_placeholder' => 'Anasayfa Adresi(URL)',
'code_label' => 'Kod',
'code_placeholder' => 'Temanın dağıtımında kullanılmak üzere benzersiz bir kod.',
'dir_name_label' => 'Klasör ismi',
'dir_name_create_label' => 'Hedef tema dizini',
'theme_label' => 'Tema',
'theme_title' => 'Temalar',
'activate_button' => 'Aktifleştir',
'active_button' => 'Aktifleştir',
'customize_button' => 'Düzenle'
'customize_theme' => 'Temayı Özelleştir',
'customize_button' => 'Düzenle',
'duplicate_button' => 'Kopyala',
'duplicate_title' => 'Temayı kopyala',
'duplicate_theme_success' => 'Tema başarıyla kopyalandı!',
'manage_button' => 'Yönet',
'manage_title' => 'Temayı yönet',
'edit_properties_title' => 'Tema',
'edit_properties_button' => 'Özellikleri düzenle',
'save_properties' => 'Özellikleri kaydet',
'import_button' => 'İçe aktar',
'import_title' => 'Temayı içe aktar',
'import_theme_success' => 'Tema başarıyla içe aktarıldı!',
'import_uploaded_file' => 'Tema arşiv dosyası',
'import_overwrite_label' => 'Mevcut dosyaların üstüne yaz',
'import_overwrite_comment' => 'Sadece yeni dosyaları almak için bu kutucuğu boşaltın',
'import_folders_label' => 'Klasörler',
'import_folders_comment' => 'Lütfen içe aktarmak istediğiniz tema klasörlerini seçiniz.',
'export_button' => 'Dışa aktar',
'export_title' => 'Temayı dışa aktar',
'export_folders_label' => 'Klasörler',
'export_folders_comment' => 'Lütfen dışa aktarmak istediğiniz tema klasörlerini seçiniz',
'delete_button' => 'Sil',
'delete_confirm' => 'Bu temayı silmek istediniğize emin misiniz? Bu işlem geri alınamaz!',
'delete_active_theme_failed' => 'Aktif tema silinemez. Lütfen başka bir temayı aktif tema olarak seçiniz.',
'delete_theme_success' => 'Tema başarıyla silindi!',
'create_title' => 'Tema oluştur',
'create_button' => 'Oluştur',
'create_new_blank_theme' => 'Yeni boş bir tema oluştur',
'create_theme_success' => 'Tema başarıyla oluşturuldu!',
'create_theme_required_name' => 'Please specify a name for the theme.',
'new_directory_name_label' => 'Tema dizini',
'new_directory_name_comment' => 'Kopyalanacak tema için yeni bir tema dizini giriniz.',
'dir_name_invalid' => 'İsim sadece sayı, latin harfleri ve şu sembolleri içerebilir: _- ',
'dir_name_taken' => 'İstenen tema dizini zaten mevcut.',
'find_more_themes' => 'Daha fazla tema bulun',
'saving' => 'Tema kaydediliyor...',
'return' => 'Tema listesine geri dön'
],
'maintenance' => [
'settings_menu' => 'Bakım modu',
@ -36,6 +88,7 @@ return [
'is_enabled_comment' => 'Aktifleştirildiğinde, web sitesi ziyaretçileri aşağıdaki seçtiğiniz sayfayı görecektir.'
],
'page' => [
'not_found_name' => "':name' sayfası bulunamadı",
'not_found' => [
'label' => "Sayfa bulunamadı",
'help' => "İstenilen sayfa bulunamadı.",
@ -178,6 +231,70 @@ return [
'manage_pages' => 'Sayfaları düzenleyebilsin',
'manage_layouts' => 'Şablonları düzenleyebilsin',
'manage_partials' => 'Parça Kodları düzenleyebilsin',
'manage_themes' => 'Temaları düzenleyebilsin'
'manage_themes' => 'Temaları düzenleyebilsin',
'manage_media' => 'Medyaları düzenleyebilsin'
],
'mediafinder' => [
'default_prompt' => 'Bir medya öğesi bulmak için %s butonuna tıklayın'
],
'media' => [
'invalid_path' => "Geçersiz dosya dizini belirtildi: ':path'.",
'menu_label' => 'Medya',
'upload' => 'Yükle',
'move' => 'Taşı',
'delete' => 'Sil',
'add_folder' => 'Yeni Klasör',
'search' => 'Ara',
'display' => 'Görüntüle',
'filter_everything' => 'Her şey',
'filter_images' => 'Resimler',
'filter_video' => 'Video',
'filter_audio' => 'Ses',
'filter_documents' => 'Belgeler',
'library' => 'Kütüphane',
'folder_size_items' => 'öğe(ler)',
'size' => 'Boyut',
'title' => 'Başlık',
'last_modified' => 'Son düzenleme tarihi',
'public_url' => 'Public URL',
'click_here' => 'Buraya tıkla',
'thumbnail_error' => 'Önizleme oluşturulurken hata.',
'return_to_parent' => 'Ana klasöre geri dön',
'return_to_parent_label' => 'Yukarı git..',
'nothing_selected' => 'Hiçbir şey seçilmedi.',
'multiple_selected' => 'Birden fazla öğe seçildi.',
'uploading_file_num' => ':number adet dosya yükleniyor...',
'uploading_complete' => 'Yükleme tamamlandı',
'order_by' => 'Sırala',
'folder' => 'Klasör',
'no_files_found' => 'İsteğiniz doğrultusunda hiçbir dosya bulunamadı.',
'delete_empty' => 'Lütfen silinecek öğeleri seçiniz.',
'delete_confirm' => 'Bu öğe veya öğeleri gerçekten silmek istediğinize emin misiniz?',
'error_renaming_file' => 'Öğeyi yeniden isimlendirirken hata.',
'new_folder_title' => 'Yeni Klasör',
'folder_name' => 'Klasör ismi',
'error_creating_folder' => 'Klasör oluştururken hata',
'folder_or_file_exist' => 'Belirtilen isimde bir klasör ya da dosya zaten mevcut.',
'move_empty' => 'Lütfen taşınacak öğeleri seçiniz.',
'move_popup_title' => 'Dosyaları veya klasörleri taşı',
'move_destination' => 'Hedef klasör',
'please_select_move_dest' => 'Lütfen hedef klasörü seçiniz.',
'move_dest_src_match' => 'Lütfen başka bir hedef klasör seçiniz.',
'empty_library' => 'Medya kütüphanesi boş. Başlamak için dosya yükleyin yada klasör oluşturun.',
'insert' => 'Ekle',
'crop_and_insert' => 'Kırp ve Ekle',
'select_single_image' => 'Lütfen sadece bir tane resim seçiniz.',
'selection_not_image' => 'Seçili öğe bir resim değil.',
'restore' => 'Tüm değişiklikleri geri al',
'resize' => 'Yeniden boyutlandırma...',
'selection_mode_normal' => 'Normal',
'selection_mode_fixed_ratio' => 'Sabit oran',
'selection_mode_fixed_size' => 'Sabit boyut',
'height' => 'Yükseklik',
'width' => 'Genişlik',
'selection_mode' => 'Seçim modu',
'resize_image' => 'Resimi yeniden boyutlandırs',
'image_size' => 'Resim boyutu:',
'selected_size' => 'Seçili:'
]
];
];

View File

@ -262,7 +262,6 @@ return [
'uploading_file_num' => '上传 :number 文件...',
'uploading_complete' => '上传完毕',
'order_by' => '排序',
'search' => '搜索',
'folder' => '文件夹',
'no_files_found' => '没找到你请求的文件.',
'delete_empty' => '请选择删除项.',

View File

@ -262,7 +262,6 @@ return [
'uploading_file_num' => '上傳 :number 檔案...',
'uploading_complete' => '上傳完畢',
'order_by' => '排序',
'search' => '搜尋',
'folder' => '檔案夾',
'no_files_found' => '沒找到您請求的檔案.',
'delete_empty' => '請選擇刪除項.',

View File

@ -86,10 +86,10 @@ class ThemeExport extends Model
$zipName = uniqid('oc');
$zipPath = temp_path().'/'.$zipName;
if (!@mkdir($tempPath))
if (!File::makeDirectory($tempPath))
throw new ApplicationException('Unable to create directory '.$tempPath);
if (!@mkdir($metaPath = $tempPath . '/meta'))
if (!File::makeDirectory($metaPath = $tempPath . '/meta'))
throw new ApplicationException('Unable to create directory '.$metaPath);
File::copy($themePath.'/theme.yaml', $tempPath.'/theme.yaml');
@ -133,7 +133,7 @@ class ThemeExport extends Model
$headers = Response::download($zipPath, $outputName)->headers->all();
$result = Response::make(File::get($zipPath), 200, $headers);
@unlink($zipPath);
@File::delete($zipPath);
return $result;
}

View File

@ -101,7 +101,7 @@ class ThemeImport extends Model
File::put($zipPath, $file->getContents());
if (!@mkdir($tempPath))
if (!File::makeDirectory($tempPath))
throw new ApplicationException('Unable to create directory '.$tempPath);
Zip::extract($zipPath, $tempPath);

View File

@ -293,7 +293,7 @@ class AssetList extends WidgetBase
throw new ApplicationException(Lang::get('cms::lang.asset.already_exists'));
}
if (!@mkdir($newFullPath)) {
if (!File::makeDirectory($newFullPath)) {
throw new ApplicationException(Lang::get(
'cms::lang.cms_object.error_creating_directory',
['name' => $newName]
@ -422,7 +422,7 @@ class AssetList extends WidgetBase
$assetsPath = $this->getAssetsPath();
if (!file_exists($assetsPath) || !is_dir($assetsPath)) {
if (!@mkdir($assetsPath)) {
if (!File::makeDirectory($assetsPath)) {
throw new ApplicationException(Lang::get(
'cms::lang.cms_object.error_creating_directory',
['name'=>$assetsPath]

View File

@ -964,10 +964,15 @@ class MediaManager extends WidgetBase
$fileName = $uploadedFile->getClientOriginalName();
/*
* File name contains non-latin characters, attempt to slug the value
* Convert uppcare case file extensions to lower case
*/
$extension = strtolower($uploadedFile->getClientOriginalExtension());
$fileName = File::name($fileName).'.'.$extension;
/*
* File name contains non-latin characters, attempt to slug the value
*/
if (!$this->validateFileName($fileName)) {
$extension = $uploadedFile->getClientOriginalExtension();
$fileNameSlug = Str::slug(File::name($fileName), '-');
$fileName = $fileNameSlug.'.'.$extension;
}

View File

@ -1,15 +1,16 @@
<div class="layout-row min-size">
<div class="layout control-toolbar">
<div class="layout-cell">
<div class="relative toolbar-item loading-indicator-container size-input-text">
<input placeholder="<?= e(trans('cms::lang.sidebar.search')) ?>" type="text" name="search" value="<?= e($this->getSearchTerm()) ?>"
class="form-control icon search" autocomplete="off"
data-track-input
data-load-indicator
data-load-indicator-opaque
data-request="<?= $this->getEventHandler('onSearch') ?>"
/>
</div>
<div class="control-toolbar toolbar-padded">
<!-- Component Search -->
<div class="relative toolbar-item loading-indicator-container size-input-text">
<input placeholder="<?= e(trans('cms::lang.sidebar.search')) ?>" type="text" name="search" value="<?= e($this->getSearchTerm()) ?>"
class="form-control icon search" autocomplete="off"
data-track-input
data-load-indicator
data-load-indicator-opaque
data-request="<?= $this->getEventHandler('onSearch') ?>"
/>
</div>
</div>
</div>
</div>

View File

@ -178,6 +178,8 @@ class ServiceProvider extends ModuleServiceProvider
'trans' => ['Lang', 'get'],
'transchoice' => ['Lang', 'choice'],
'md' => ['Markdown', 'parse'],
'time_since' => ['System\Helpers\DateTime', 'timeSince'],
'time_tense' => ['System\Helpers\DateTime', 'timeTense'],
]);
});
}
@ -255,10 +257,10 @@ class ServiceProvider extends ModuleServiceProvider
protected function registerTwigParser()
{
/*
* Register basic Twig
* Register system Twig environment
*/
App::singleton('twig', function ($app) {
$twig = new Twig_Environment(new TwigLoader(), ['auto_reload' => true]);
App::singleton('twig.environment', function ($app) {
$twig = new Twig_Environment(new TwigLoader, ['auto_reload' => true]);
$twig->addExtension(new TwigExtension);
return $twig;
});
@ -267,16 +269,7 @@ class ServiceProvider extends ModuleServiceProvider
* Register .htm extension for Twig views
*/
App::make('view')->addExtension('htm', 'twig', function () {
return new TwigEngine(App::make('twig'));
});
/*
* Register Twig that will parse strings
*/
App::singleton('twig.string', function ($app) {
$twig = $app['twig'];
$twig->setLoader(new Twig_Loader_String);
return $twig;
return new TwigEngine(App::make('twig.environment'));
});
}

View File

@ -51,10 +51,13 @@ return [
'Str' => 'October\Rain\Support\Facades\Str',
'Markdown' => 'October\Rain\Support\Facades\Markdown',
'Yaml' => 'October\Rain\Support\Facades\Yaml',
'Ini' => 'October\Rain\Support\Facades\Ini',
'Twig' => 'October\Rain\Support\Facades\Twig',
'DbDongle' => 'October\Rain\Support\Facades\DbDongle',
'Backend' => 'Backend\Facades\Backend',
'BackendMenu' => 'Backend\Facades\BackendMenu',
'BackendAuth' => 'Backend\Facades\BackendAuth',
'AjaxException' => 'October\Rain\Exception\AjaxException',
'SystemException' => 'October\Rain\Exception\SystemException',
'ApplicationException' => 'October\Rain\Exception\ApplicationException',
'ValidationException' => 'October\Rain\Exception\ValidationException',

View File

@ -1004,6 +1004,11 @@ button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-ap
[class^="icon-"].pull-right,[class*=" icon-"].pull-right{margin-left:.3em}
[class^="oc-icon-"]:before,[class*=" oc-icon-"]:before{display:inline-block;margin-right:8px;font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;vertical-align:baseline}
[class^="oc-icon-"].empty:before,[class*=" oc-icon-"].empty:before{margin-right:0}
.icon-lg{font-size:1.33333333em;line-height:0.75em;vertical-align:-15%}
.icon-2x{font-size:2em}
.icon-3x{font-size:3em}
.icon-4x{font-size:4em}
.icon-5x{font-size:5em}
@font-face{font-family:'Open Sans';src:url('../../../backend/assets/font/OpenSans-Light.eot');src:url('../../../backend/assets/font/OpenSans-Light.eot?#iefix') format('embedded-opentype'),url('../../../backend/assets/font/OpenSans-Light.svg#open_sanslight') format('svg'),url('../../../backend/assets/font/OpenSans-Light.woff') format('woff'),url('../../../backend/assets/font/OpenSans-Light.ttf') format('truetype');font-style:normal;font-weight:300}
@font-face{font-family:'Open Sans';src:url('../../../backend/assets/font/OpenSans-Regular.eot');src:url('../../../backend/assets/font/OpenSans-Regular.eot?#iefix') format('embedded-opentype'),url('../../../backend/assets/font/OpenSans-Regular.svg#open_sansregular') format('svg'),url('../../../backend/assets/font/OpenSans-Regular.woff') format('woff'),url('../../../backend/assets/font/OpenSans-Regular.ttf') format('truetype');font-style:normal;font-weight:400}
@font-face{font-family:'Open Sans';src:url('../../../backend/assets/font/OpenSans-Semibold.eot');src:url('../../../backend/assets/font/OpenSans-Semibold.eot?#iefix') format('embedded-opentype'),url('../../../backend/assets/font/OpenSans-Semibold.svg#open_sanssemibold') format('svg'),url('../../../backend/assets/font/OpenSans-Semibold.woff') format('woff'),url('../../../backend/assets/font/OpenSans-Semibold.ttf') format('truetype');font-style:normal;font-weight:600}

View File

@ -0,0 +1,9 @@
/*
* This file has been compiled from: /modules/system/lang/cs/client.php
*/
if ($.oc === undefined) $.oc = {}
if ($.oc.langMessages === undefined) $.oc.langMessages = {}
$.oc.langMessages['cs'] = $.extend(
$.oc.langMessages['cs'] || {},
{"markdowneditor":{"formatting":"Form\u00e1tov\u00e1n\u00ed","quote":"Citace","code":"K\u00f3d","header1":"Nadpis 1","header2":"Nadpis 2","header3":"Nadpis 3","header4":"Nadpis 4","header5":"Nadpis 5","header6":"Nadpis 6","bold":"Tu\u010dn\u011b","italic":"Kurz\u00edvou","unorderedlist":"Ne\u010d\u00edslovan\u00fd seznam","orderedlist":"\u010c\u00edslovan\u00fd seznam","video":"Video","image":"Obr\u00e1zek","link":"Odkaz","horizontalrule":"Vlo\u017eit horizont\u00e1ln\u00ed linku","fullscreen":"Cel\u00e1 obrazovka","preview":"N\u00e1hled"},"mediamanager":{"insert_link":"Vlo\u017eit odkaz","insert_image":"Vlo\u017eit obr\u00e1zek","insert_video":"Vlo\u017eit video","insert_audio":"Vlo\u017eit zvuk","invalid_file_empty_insert":"Pros\u00edm vyberte soubor, na kter\u00fd se vlo\u017e\u00ed odkaz.","invalid_file_single_insert":"Vyberte jeden soubor.","invalid_image_empty_insert":"Vyberte soubor(y) pro vlo\u017een\u00ed.","invalid_video_empty_insert":"Vyberte video soubor pro vlo\u017een\u00ed.","invalid_audio_empty_insert":"Vyberte audio soubor pro vlo\u017een\u00ed."},"alert":{"confirm_button_text":"OK","cancel_button_text":"Zru\u0161it"}}
);

View File

@ -5,5 +5,5 @@ if ($.oc === undefined) $.oc = {}
if ($.oc.langMessages === undefined) $.oc.langMessages = {}
$.oc.langMessages['de'] = $.extend(
$.oc.langMessages['de'] || {},
{"markdowneditor":{"formatting":"Formatting","quote":"Quote","code":"Code","header1":"Header 1","header2":"Header 2","header3":"Header 3","header4":"Header 4","header5":"Header 5","header6":"Header 6","bold":"Bold","italic":"Italic","unorderedlist":"Unordered List","orderedlist":"Ordered List","video":"Video","image":"Image","link":"Link","horizontalrule":"Insert Horizontal Rule","fullscreen":"Full screen","preview":"Preview"},"mediamanager":{"insert_link":"Insert Media Link","insert_image":"Insert Media Image","insert_video":"Insert Media Video","insert_audio":"Insert Media Audio","invalid_file_empty_insert":"Please select file to insert a links to.","invalid_file_single_insert":"Please select a single file.","invalid_image_empty_insert":"Please select image(s) to insert.","invalid_video_empty_insert":"Please select a video file to insert.","invalid_audio_empty_insert":"Please select an audio file to insert."},"alert":{"confirm_button_text":"OK","cancel_button_text":"Cancel"}}
{"markdowneditor":{"formatting":"Formatierung","quote":"Zitat","code":"Code","header1":"\u00dcberschrift 1","header2":"\u00dcberschrift 2","header3":"\u00dcberschrift 3","header4":"\u00dcberschrift 4","header5":"\u00dcberschrift 5","header6":"\u00dcberschrift 6","bold":"Fett","italic":"Kursiv","unorderedlist":"Normale Liste","orderedlist":"Nummerierte Liste","video":"Video","image":"Bild","link":"Link","horizontalrule":"Horizontale Linie","fullscreen":"Vollbild","preview":"Vorschau"},"mediamanager":{"insert_link":"Link aus Medienbibliothek","insert_image":"Bild aus Medienbibliothek","insert_video":"Video aus Medienbibliothek","insert_audio":"Audio aus Medienbibliothek","invalid_file_empty_insert":"Bitte Datei ausw\u00e4hlen.","invalid_file_single_insert":"Bitte nur eine Datei w\u00e4hlen.","invalid_image_empty_insert":"Bitte ein Bild ausw\u00e4hlen.","invalid_video_empty_insert":"Bitte ein Video ausw\u00e4hlen.","invalid_audio_empty_insert":"Bitte eine Audiodatei ausw\u00e4hlen."},"alert":{"confirm_button_text":"OK","cancel_button_text":"Abbrechen"}}
);

View File

@ -5,5 +5,5 @@ if ($.oc === undefined) $.oc = {}
if ($.oc.langMessages === undefined) $.oc.langMessages = {}
$.oc.langMessages['el'] = $.extend(
$.oc.langMessages['el'] || {},
{"markdowneditor":{"formatting":"\u039c\u03bf\u03c1\u03c6\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7","quote":"\u03a0\u03b1\u03c1\u03ac\u03b8\u03b5\u03c3\u03b7","code":"\u039a\u03ce\u03b4\u03b9\u03ba\u03b1\u03c2","header1":"\u039a\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 1","header2":"\u039a\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 2","header3":"\u039a\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 3","header4":"\u039a\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 4","header5":"\u039a\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 5","header6":"\u039a\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 6","bold":"\u0388\u03bd\u03c4\u03bf\u03bd\u03b1","italic":"\u0399\u03c4\u03b1\u03bb\u03b9\u03ba\u03ac","unorderedlist":"\u039c\u03b7 \u03c4\u03b1\u03be\u03b9\u03bd\u03bf\u03bc\u03b7\u03bc\u03ad\u03bd\u03b7 \u03bb\u03af\u03c3\u03c4\u03b1","orderedlist":"\u03a4\u03b1\u03be\u03b9\u03bd\u03bf\u03bc\u03b7\u03bc\u03ad\u03bd\u03b7 \u03bb\u03af\u03c3\u03c4\u03b1","video":"\u0392\u03af\u03bd\u03c4\u03b5\u03bf","image":"\u0395\u03b9\u03ba\u03cc\u03bd\u03b1","link":"\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03c2","horizontalrule":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u039f\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b1\u03c2 \u0393\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2","fullscreen":"\u03a0\u03bb\u03ae\u03c1\u03b7\u03c2 \u03bf\u03b8\u03cc\u03bd\u03b7","preview":"\u03a0\u03c1\u03bf\u03b5\u03c0\u03b9\u03c3\u03ba\u03cc\u03c0\u03b7\u03c3\u03b7"},"mediamanager":{"insert_link":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03a3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5 \u03b1\u03c0\u03cc \u03c4\u03b1 \u039c\u03ad\u03c3\u03b1","insert_image":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u0395\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2 \u03b1\u03c0\u03cc \u03c4\u03b1 \u039c\u03ad\u03c3\u03b1","insert_video":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u0392\u03af\u03bd\u03c4\u03b5\u03bf \u03b1\u03c0\u03cc \u03c4\u03b1 \u039c\u03ad\u03c3\u03b1","insert_audio":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u0389\u03c7\u03bf\u03c5 \u03b1\u03c0\u03cc \u03c4\u03b1 \u039c\u03ad\u03c3\u03b1","invalid_file_empty_insert":"\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03bf\u03cd\u03bc\u03b5 \u03b5\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b5\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5\u03c2 \u03c3\u03b5 \u03b1\u03c5\u03c4\u03cc.","invalid_file_single_insert":"\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03bf\u03cd\u03bc\u03b5 \u03b5\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03ad\u03bd\u03b1 \u03bc\u03bf\u03bd\u03b1\u03b4\u03b9\u03ba\u03cc \u03b1\u03c1\u03c7\u03b5\u03af\u03bf.","invalid_image_empty_insert":"Please select image(s) to insert.","invalid_video_empty_insert":"Please select a video file to insert.","invalid_audio_empty_insert":"Please select an audio file to insert."},"alert":{"confirm_button_text":"OK","cancel_button_text":"Cancel"}}
{"markdowneditor":{"formatting":"\u039c\u03bf\u03c1\u03c6\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7","quote":"\u03a0\u03b1\u03c1\u03ac\u03b8\u03b5\u03c3\u03b7","code":"\u039a\u03ce\u03b4\u03b9\u03ba\u03b1\u03c2","header1":"\u039a\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 1","header2":"\u039a\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 2","header3":"\u039a\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 3","header4":"\u039a\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 4","header5":"\u039a\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 5","header6":"\u039a\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 6","bold":"\u0388\u03bd\u03c4\u03bf\u03bd\u03b1","italic":"\u0399\u03c4\u03b1\u03bb\u03b9\u03ba\u03ac","unorderedlist":"\u039c\u03b7 \u03c4\u03b1\u03be\u03b9\u03bd\u03bf\u03bc\u03b7\u03bc\u03ad\u03bd\u03b7 \u03bb\u03af\u03c3\u03c4\u03b1","orderedlist":"\u03a4\u03b1\u03be\u03b9\u03bd\u03bf\u03bc\u03b7\u03bc\u03ad\u03bd\u03b7 \u03bb\u03af\u03c3\u03c4\u03b1","video":"\u0392\u03af\u03bd\u03c4\u03b5\u03bf","image":"\u0395\u03b9\u03ba\u03cc\u03bd\u03b1","link":"\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03c2","horizontalrule":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u039f\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b1\u03c2 \u0393\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2","fullscreen":"\u03a0\u03bb\u03ae\u03c1\u03b7\u03c2 \u03bf\u03b8\u03cc\u03bd\u03b7","preview":"\u03a0\u03c1\u03bf\u03b5\u03c0\u03b9\u03c3\u03ba\u03cc\u03c0\u03b7\u03c3\u03b7"},"mediamanager":{"insert_link":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03a3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5 \u03b1\u03c0\u03cc \u03c4\u03b1 \u039c\u03ad\u03c3\u03b1","insert_image":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u0395\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2 \u03b1\u03c0\u03cc \u03c4\u03b1 \u039c\u03ad\u03c3\u03b1","insert_video":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u0392\u03af\u03bd\u03c4\u03b5\u03bf \u03b1\u03c0\u03cc \u03c4\u03b1 \u039c\u03ad\u03c3\u03b1","insert_audio":"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u0389\u03c7\u03bf\u03c5 \u03b1\u03c0\u03cc \u03c4\u03b1 \u039c\u03ad\u03c3\u03b1","invalid_file_empty_insert":"\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03bf\u03cd\u03bc\u03b5 \u03b5\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03ad\u03bd\u03b1 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b5\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5\u03c2 \u03c3\u03b5 \u03b1\u03c5\u03c4\u03cc.","invalid_file_single_insert":"\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03bf\u03cd\u03bc\u03b5 \u03b5\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03ad\u03bd\u03b1 \u03bc\u03bf\u03bd\u03b1\u03b4\u03b9\u03ba\u03cc \u03b1\u03c1\u03c7\u03b5\u03af\u03bf.","invalid_image_empty_insert":"\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03bf\u03cd\u03bc\u03b5 \u03b5\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03c4\u03b7\u03bd \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1 \u03ae \u03c4\u03b9\u03c2 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b5\u03c2 \u03b3\u03b9\u03b1 \u03b5\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03b7.","invalid_video_empty_insert":"\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03bf\u03cd\u03bc\u03b5 \u03b5\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03ad\u03bd\u03b1 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03b2\u03af\u03bd\u03c4\u03b5\u03bf \u03b3\u03b9\u03b1 \u03b5\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae.","invalid_audio_empty_insert":"\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03bf\u03cd\u03bc\u03b5 \u03b5\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03ad\u03bd\u03b1 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03ae\u03c7\u03bf\u03c5 \u03b3\u03b9\u03b1 \u03b5\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae."},"alert":{"confirm_button_text":"\u0395\u03bd\u03c4\u03ac\u03be\u03b5\u03b9","cancel_button_text":"\u0386\u03ba\u03c5\u03c1\u03bf"}}
);

View File

@ -5,5 +5,5 @@ if ($.oc === undefined) $.oc = {}
if ($.oc.langMessages === undefined) $.oc.langMessages = {}
$.oc.langMessages['fa'] = $.extend(
$.oc.langMessages['fa'] || {},
{"markdowneditor":{"formatting":"Formatting","quote":"Quote","code":"Code","header1":"Header 1","header2":"Header 2","header3":"Header 3","header4":"Header 4","header5":"Header 5","header6":"Header 6","bold":"Bold","italic":"Italic","unorderedlist":"Unordered List","orderedlist":"Ordered List","video":"Video","image":"Image","link":"Link","horizontalrule":"Insert Horizontal Rule","fullscreen":"Full screen","preview":"Preview"},"mediamanager":{"insert_link":"Insert Media Link","insert_image":"Insert Media Image","insert_video":"Insert Media Video","insert_audio":"Insert Media Audio","invalid_file_empty_insert":"Please select file to insert a links to.","invalid_file_single_insert":"Please select a single file.","invalid_image_empty_insert":"Please select image(s) to insert.","invalid_video_empty_insert":"Please select a video file to insert.","invalid_audio_empty_insert":"Please select an audio file to insert."},"alert":{"confirm_button_text":"OK","cancel_button_text":"Cancel"}}
{"markdowneditor":{"formatting":"\u0642\u0627\u0644\u0628 \u0628\u0646\u062f\u06cc","quote":"\u0646\u0642\u0644 \u0642\u0648\u0644","code":"\u06a9\u062f","header1":"\u0633\u0631\u062e\u0637 1","header2":"\u0633\u0631\u062e\u0637 2","header3":"\u0633\u0631\u062e\u0637 3","header4":"\u0633\u0631\u062e\u0637 4","header5":"\u0633\u0631\u062e\u0637 5","header6":"\u0633\u0631\u062e\u0637 6","bold":"\u0638\u062e\u06cc\u0645","italic":"\u0645\u0648\u0631\u0628","unorderedlist":"\u0644\u06cc\u0633\u062a \u0628\u062f\u0648\u0646 \u062a\u0631\u062a\u06cc\u0628","orderedlist":"\u0644\u06cc\u0633\u062a \u0628\u0627 \u062a\u0631\u062a\u06cc\u0628","video":"\u0648\u06cc\u062f\u06cc\u0648","image":"\u062a\u0635\u0648\u06cc\u0631","link":"\u0644\u06cc\u0646\u06a9","horizontalrule":"\u062f\u0631\u062c \u062e\u0637 \u0627\u0641\u0642\u06cc","fullscreen":"\u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647","preview":"\u067e\u06cc\u0634 \u0646\u0645\u0627\u06cc\u0634"},"mediamanager":{"insert_link":"\u062f\u0631\u062c \u0622\u062f\u0631\u0633 \u0631\u0633\u0627\u0646\u0647","insert_image":"\u062f\u0631\u062c \u062a\u0635\u0648\u06cc\u0631","insert_video":"\u062f\u0631\u062c \u0648\u06cc\u062f\u06cc\u0648","insert_audio":"\u062f\u0631\u062c \u0635\u0648\u062a","invalid_file_empty_insert":"\u0644\u0637\u0641\u0627 \u0641\u0627\u06cc\u0644\u06cc \u0631\u0627 \u062c\u0647\u062a \u062f\u0631\u062c \u0644\u06cc\u0646\u06a9 \u0622\u0646 \u0648\u0627\u0631\u062f \u0646\u0645\u0627\u06cc\u06cc\u062f","invalid_file_single_insert":"\u0644\u0637\u0641\u0627 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0648\u0627\u0631\u062f \u0646\u0645\u0627\u06cc\u06cc\u062f","invalid_image_empty_insert":"\u0644\u0637\u0641\u0627 \u062a\u0635\u0648\u06cc\u0631(\u0647\u0627) \u0631\u0627 \u062c\u0647\u062a \u062f\u0631\u062c \u0627\u0646\u062a\u062e\u0627\u0628 \u0646\u0645\u0627\u06cc\u06cc\u062f","invalid_video_empty_insert":"\u0644\u0637\u0641\u0627 \u0648\u06cc\u062f\u06cc\u0648 \u0631\u0627 \u062c\u0647\u062a \u062f\u0631\u062c \u0627\u0646\u062a\u062e\u0627\u0628 \u0646\u0645\u0627\u06cc\u06cc\u062f.","invalid_audio_empty_insert":"\u0644\u0637\u0641\u0627 \u0641\u0627\u06cc\u0644 \u0635\u0648\u062a\u06cc \u0631\u0627 \u062c\u0647\u062a \u062f\u0631\u062c \u0627\u0646\u062a\u062e\u0627\u0628 \u0646\u0645\u0627\u06cc\u06cc\u062f"},"alert":{"confirm_button_text":"\u062a\u0627\u06cc\u06cc\u062f","cancel_button_text":"\u0627\u0646\u0635\u0631\u0627\u0641"}}
);

Some files were not shown because too many files have changed in this diff Show More