diff --git a/_build/config.json b/_build/config.json index 1ba3d30..43efc37 100644 --- a/_build/config.json +++ b/_build/config.json @@ -3,7 +3,7 @@ "lowCaseName": "babel", "description": "The easy way for your multilingual site!", "author": "Jakob Class, Rico Goldsky, Joshua Luckers, Thomas Jakobi", - "version": "3.2.0", + "version": "3.3.0", "package": { "menus": [ { @@ -171,15 +171,16 @@ "readme": "docs/readme.md", "license": "docs/license.md", "changelog": "docs/changelog.md", + "setupOptions": { + "source": "setup.options.php" + }, "resolver": { "after": [ "resolve.setupoptions.php", "resolve.permissions.php", - "resolve.babelevents.php" + "resolve.babelevents.php", + "resolve.treehillstudio.php" ] - }, - "setupOptions": { - "source": "setup.options.php" } } } diff --git a/_build/resolvers/resolve.babelevents.php b/_build/resolvers/resolve.babelevents.php index b124bee..eb707cd 100644 --- a/_build/resolvers/resolve.babelevents.php +++ b/_build/resolvers/resolve.babelevents.php @@ -67,7 +67,8 @@ function removeEvent(modX $modx, $name) $babelEvents = [ 'OnBabelDuplicate', // invoked on duplicating the resource in a new language context 'OnBabelLink', // invoked on link the resource with a target resource - 'OnBabelUnlink' // invoked on unlink the resource from a target resource + 'OnBabelUnlink', // invoked on unlink the resource from a target resource + 'OnBabelTVSynced' // invoked when TVs are synchronized and changed ]; $success = true; diff --git a/_build/resolvers/resolve.treehillstudio.php b/_build/resolvers/resolve.treehillstudio.php new file mode 100644 index 0000000..b07944e --- /dev/null +++ b/_build/resolvers/resolve.treehillstudio.php @@ -0,0 +1,107 @@ +xpdo; +$c = $modx->newQuery('transport.modTransportPackage'); +$c->where( + [ + 'workspace' => 1, + "(SELECT + `signature` + FROM {$modx->getTableName('transport.modTransportPackage')} AS `latestPackage` + WHERE `latestPackage`.`package_name` = `modTransportPackage`.`package_name` + ORDER BY + `latestPackage`.`version_major` DESC, + `latestPackage`.`version_minor` DESC, + `latestPackage`.`version_patch` DESC, + IF(`release` = '' OR `release` = 'ga' OR `release` = 'pl','z',`release`) DESC, + `latestPackage`.`release_index` DESC + LIMIT 1,1) = `modTransportPackage`.`signature`", + ] +); +$c->where( + [ + 'modTransportPackage.signature:LIKE' => $options['namespace'] . '-%', + 'modTransportPackage.installed:IS NOT' => null + ] +); +$c->limit(1); + +/** @var modTransportPackage $oldPackage */ +$oldPackage = $modx->getObject('transport.modTransportPackage', $c); + +$oldVersion = ''; +if ($oldPackage) { + $oldVersion = $oldPackage->get('version_major') . + '.' . $oldPackage->get('version_minor') . + '.' . $oldPackage->get('version_patch') . + '-' . $oldPackage->get('release'); +} + +$version = ''; +if ($transport->version) { + $version = $transport->version; +} + +$modxVersionObj = $modx->getObject('modSystemSetting', ['key' => 'settings_version']); +$modxVersion = ($modxVersionObj) ? $modxVersionObj->get('value') : ''; +$managerLang = $modx->getOption('manager_language'); + +$action = ''; +switch ($options[xPDOTransport::PACKAGE_ACTION]) { + case xPDOTransport::ACTION_INSTALL: + $action = 'install'; + break; + case xPDOTransport::ACTION_UPGRADE: + $action = 'upgrade'; + break; + case xPDOTransport::ACTION_UNINSTALL: + $action = 'uninstall'; + break; +} + +$params = [ + 'name' => $options['namespace'], + 'uuid' => $modx->uuid ?? 'unknown', + 'host' => $modx->getOption('http_host', null, 'unknown'), + 'php_version' => phpversion(), + 'modx_version' => $modxVersion, + 'manager_lang' => $managerLang, + 'installation_type' => $action, + 'package_version_from' => $oldVersion, + 'package_version' => $version, + 'date' => time() +]; + +/** + * Curl POST. + */ +$curl = curl_init(); +if ($curl) { + curl_setopt($curl, CURLOPT_URL, $url); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5); + curl_setopt($curl, CURLOPT_POST, true); + curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params)); + curl_setopt($curl, CURLOPT_TIMEOUT, 5); + + $response = curl_exec($curl); + $responseInfo = curl_getinfo($curl); + $curlError = curl_error($curl); + curl_close($curl); +} + +return true; diff --git a/_build/setup.options.php b/_build/setup.options.php index 6aa0984..0827e8d 100644 --- a/_build/setup.options.php +++ b/_build/setup.options.php @@ -32,6 +32,18 @@ switch ($options[xPDOTransport::PACKAGE_ACTION]) { case xPDOTransport::ACTION_INSTALL: $output .= '

Install Babel

+

Thanks for installing Babel. This open source extra is currently + maintained by Treehill Studio - MODX development in Münsterland.

+ +

During the installation, we will collect some statistical data (the + hostname, the MODX UUID, the PHP version and the MODX version of your + MODX installation). Your data will be kept confidential and under no + circumstances be used for promotional purposes or disclosed to third + parties. We only like to know the usage count of this package.

+ +

If you install this package, you are giving us your permission to + collect, process and use that data for statistical purposes.

+

Babel will be installed. Please review the installation options carefully.


'; $output .= '
@@ -63,7 +75,19 @@ unset($setting); $output .= '

Upgrade Babel

-

Babel will be upgraded. Please review the installation options carefully.


'; +

Babel will be upgraded. This open source extra is currently + maintained by Treehill Studio - MODX development in Münsterland.

+ +

During the installation, we will collect some statistical data (the + hostname, the MODX UUID, the PHP version and the MODX version of your + MODX installation). Your data will be kept confidential and under no + circumstances be used for promotional purposes or disclosed to third + parties. We only like to know the usage count of this package.

+ +

If you upgrade this package, you are giving us your permission to + collect, process and use that data for statistical purposes.

+ +

Please review the installation options carefully.


'; $output .= '
diff --git a/_packages/babel-3.3.0-pl.transport.zip b/_packages/babel-3.3.0-pl.transport.zip new file mode 100644 index 0000000..f3b03b3 Binary files /dev/null and b/_packages/babel-3.3.0-pl.transport.zip differ diff --git a/assets/components/babel/css/mgr/babel.min.css b/assets/components/babel/css/mgr/babel.min.css index dbc5be2..4469f93 100644 --- a/assets/components/babel/css/mgr/babel.min.css +++ b/assets/components/babel/css/mgr/babel.min.css @@ -1,6 +1,6 @@ -.x-grid3-locked,.x-grid3-unlocked{overflow:hidden;position:absolute}.x-grid3-locked{border-right:1px solid #99bbe8}.x-grid3-locked .x-grid3-scroller{overflow:hidden}.x-grid3-locked .x-grid3-row{border-right:0}.x-grid3-scroll-spacer{height:19px}.x-grid3-unlocked .x-grid3-header-offset{padding-left:0}.x-grid3-unlocked .x-grid3-row{border-left:0}.babel-panel .action-buttons{text-align:center}.babel-panel .action-buttons li{display:inline-block;font-size:1.1em;line-height:.7;margin-right:5px}.babel-panel .action-buttons li:last-child{margin-right:0}.babel-panel .x-combo-list-item{min-height:20px}.babel-panel .icon-babel-description-img{height:16px;margin:0 6px 0 12px;width:16px}.babel-panel .icon-babel-description-img:first-child{margin-left:0}.home-panel.debug{background:linear-gradient(to top right,transparent,transparent,transparent,#fff)}.ribbon{height:180px;overflow:hidden;pointer-events:none;position:absolute;width:180px;z-index:10}.ribbon:after,.ribbon:before{border:5px solid #a20000;content:"";display:block;position:absolute;z-index:-1}.ribbon.top-right{right:-10px;top:-10px}.ribbon.top-right:after,.ribbon.top-right:before{border-right-color:transparent;border-top-color:transparent}.ribbon.top-right:before{left:0;top:0}.ribbon.top-right:after{bottom:0;right:0}.ribbon.top-right span{left:-46px;top:46px;transform:rotate(45deg)}.ribbon span{background-color:#be0000;box-shadow:0 5px 10px rgba(0,0,0,.1);color:#fff;display:block;font:700 18px/1 Lato,sans-serif;padding:15px 0;position:absolute;text-align:center;text-shadow:0 1px 1px rgba(0,0,0,.2);text-transform:uppercase;width:300px} +.x-grid3-locked,.x-grid3-unlocked{overflow:hidden;position:absolute}.x-grid3-locked{border-right:1px solid #99bbe8}.x-grid3-locked .x-grid3-scroller{overflow:hidden}.x-grid3-locked .x-grid3-row{border-right:0}.x-grid3-scroll-spacer{height:19px}.x-grid3-unlocked .x-grid3-header-offset{padding-left:0}.x-grid3-unlocked .x-grid3-row{border-left:0}.x-buttonmenu-babel-item-icon{text-align:center}.x-buttonmenu-babel-item-icon:before{left:2px;position:relative;top:1px}.babel-panel .action-buttons{text-align:center}.babel-panel .action-buttons li{display:inline-block;font-size:1.1em;line-height:.7;margin-right:5px}.babel-panel .action-buttons li:last-child{margin-right:0}.babel-panel .x-combo-list-item{min-height:20px}.babel-panel .icon-babel-description-img{height:16px;margin:0 6px 0 12px;width:16px}.babel-panel .icon-babel-description-img:first-child{margin-left:0}.x-fieldset.x-fieldset-check-all,.x-fieldset.x-fieldset-check-all .x-fieldset-bwrap{overflow:visible}.x-fieldset.x-fieldset-check-all .x-fieldset-bwrap .x-fieldset-body{overflow:visible!important}.x-fieldset.x-fieldset-check-all .x-form-item-check-all{background:#fff;padding:0 5px!important;position:absolute;right:5px;top:-17px}.x-fieldset.x-fieldset-check-all .x-form-item-check-all .x-form-cb-label{font-size:smaller}.x-fieldset.x-fieldset-check-all .x-form-item-check-all .x-form-cb-label:before{font-size:medium}.home-panel.debug{background:linear-gradient(to top right,transparent,transparent,transparent,#fff)}.ribbon{height:180px;overflow:hidden;pointer-events:none;position:absolute;width:180px;z-index:10}.ribbon:after,.ribbon:before{border:5px solid #a20000;content:"";display:block;position:absolute;z-index:-1}.ribbon.top-right{right:-10px;top:-10px}.ribbon.top-right:after,.ribbon.top-right:before{border-right-color:transparent;border-top-color:transparent}.ribbon.top-right:before{left:0;top:0}.ribbon.top-right:after{bottom:0;right:0}.ribbon.top-right span{left:-46px;top:46px;transform:rotate(45deg)}.ribbon span{background-color:#be0000;box-shadow:0 5px 10px rgba(0,0,0,.1);color:#fff;display:block;font:700 18px/1 Lato,sans-serif;padding:15px 0;position:absolute;text-align:center;text-shadow:0 1px 1px rgba(0,0,0,.2);text-transform:uppercase;width:300px} /*! * Babel - The easy way for your multilingual site! - * Version: 3.2.0 - * Build date: 2024-02-07 + * Version: 3.3.0 + * Build date: 2024-03-27 */ \ No newline at end of file diff --git a/assets/components/babel/css/mgr/resourcebutton.min.css b/assets/components/babel/css/mgr/resourcebutton.min.css new file mode 100644 index 0000000..81ae603 --- /dev/null +++ b/assets/components/babel/css/mgr/resourcebutton.min.css @@ -0,0 +1,6 @@ +.x-buttonmenu-babel-item-icon{text-align:center}.x-buttonmenu-babel-item-icon:before{left:2px;position:relative;top:1px}.x-fieldset.x-fieldset-check-all,.x-fieldset.x-fieldset-check-all .x-fieldset-bwrap{overflow:visible}.x-fieldset.x-fieldset-check-all .x-fieldset-bwrap .x-fieldset-body{overflow:visible!important}.x-fieldset.x-fieldset-check-all .x-form-item-check-all{background:#fff;padding:0 5px!important;position:absolute;right:5px;top:-17px}.x-fieldset.x-fieldset-check-all .x-form-item-check-all .x-form-cb-label{font-size:smaller}.x-fieldset.x-fieldset-check-all .x-form-item-check-all .x-form-cb-label:before{font-size:medium} +/*! + * Babel - The easy way for your multilingual site! + * Version: 3.3.0 + * Build date: 2024-03-27 + */ \ No newline at end of file diff --git a/assets/components/babel/js/mgr/babel.min.js b/assets/components/babel/js/mgr/babel.min.js index 5ac20da..98a1ffd 100644 --- a/assets/components/babel/js/mgr/babel.min.js +++ b/assets/components/babel/js/mgr/babel.min.js @@ -1,6 +1,6 @@ /*! * Babel - The easy way for your multilingual site! - * Version: 3.2.0 - * Build date: 2024-02-07 + * Version: 3.3.0 + * Build date: 2024-03-27 */ -var babel=function(e){babel.superclass.constructor.call(this,e=e||{})},Babel=(Ext.extend(babel,Ext.Component,{page:{},window:{},grid:{},tree:{},panel:{},combo:{},config:{},util:{},getMenu:function(t){var i=this,e=Ext.getCmp("modx-action-buttons");if(e){var s,o=[],l=0;for(s in t)s!==this.config.context_key&&(void 0!==t[s].resourceUrl&&""!==t[s].resourceUrl&&"#"!==t[s].resourceUrl?(o.push({text:''+t[s].displayText,menu:{items:[{text:''+_("babel.open")+" "+t[s].resourceTitle+" ("+t[s].resourceId+")",resourceUrl:t[s].resourceUrl,resourceId:t[s].resourceId,handler:function(){MODx.loadPage("resource/update","id="+this.resourceId)}},"-",{text:''+_("babel.unlink")+" "+t[s].resourceTitle+" ("+t[s].resourceId+")",contextKey:s,target:t[s].resourceId,handler:function(){i.unlinkTranslation(this.contextKey,this.target)}}]}}),l++):o.push({text:''+t[s].displayText,handler:Ext.emptyFn,menu:{items:[{text:''+_("babel.create_translation"),contextKey:s,handler:function(){i.createTranslation(this.contextKey)}},"-",{text:''+_("babel.link_translation"),contextKey:s,handler:function(){i.linkTranslation(this.contextKey)}}]}}));0'+_("babel.unlink_all_translations"),handler:function(){i.unlinkTranslation()}})),o.push("-"),o.push({text:''+_("babel.about"),handler:function(){i.aboutWindow()}});var n=Ext.getCmp("babel-language-select");n&&n.destroy(),n=new Ext.Button({id:"babel-language-select",text:"Select Language",menu:o,listeners:{render:{fn:function(e){e.setText(t[i.config.context_key].displayText)},scope:this},mouseover:function(e){e.showMenu()}}}),e.insertButton(0,[n]),e.doLayout()}},linkTranslation:function(i){var e=MODx.request.id,s=MODx.load({xtype:"modx-window",title:_("babel.link_translation"),url:this.config.connectorUrl,baseParams:{action:"mgr/resource/link",context:i,id:e},listeners:{success:{fn:function(e){MODx.msg.status({title:_("success"),message:e.message||_("save_successful")}),this.getMenu(e.a.result.object.menu),this.hideMask()},scope:this},failure:{fn:this.hideMask,scope:this},beforeSubmit:{fn:this.loadMask,scope:this}},fields:[{xtype:"textfield",fieldLabel:_("context"),anchor:"100%",disabled:!0,emptyText:i},{xtype:"modx-field-parent-change",fieldLabel:_("babel.select_tree_node"),id:"",name:"target-combo",anchor:"100%",end:function(e){var t=Ext.getCmp("modx-resource-tree");t&&(e.display=e.display||e.value,e.context===i)&&(t.removeListener("click",this.handleChangeParent,this),t.on("click",t._handleClick,t),t.disableHref=!1,s.fp.getForm().findField("target").setValue(e.value),s.fp.getForm().findField("page_id").setValue(null),this.setValue(e.display),this.oldValue=!1)},handleChangeParent:function(e,t){var i=Ext.getCmp("modx-resource-tree");return!!i&&(i.disableHref=!0,(i=e.id.split("_")[1])===this.config.currentid?(MODx.msg.alert("",_("resource_err_own_parent")),!1):(this.fireEvent("end",{value:"modContext"!==e.attributes.type?i:e.attributes.pk,display:Ext.util.Format.stripTags(e.text),context:e.attributes.ctx}),t.preventDefault(),t.stopEvent(),!0))}},{xtype:"modx-combo",fieldLabel:_("babel.target_pagetitle"),name:"page_id",anchor:"100%",url:this.config.connectorUrl,baseParams:{action:"mgr/resource/getlist",context:i,combo:!0},displayField:"pagetitle",valueField:"id",fields:["id","pagetitle"],editable:!0,typeAhead:!0,forceSelection:!0,listeners:{select:{fn:function(e,t){var i=e.getValue();""===i||0===i||" "===i?e.setValue(null):s.fp.getForm().findField("target").setValue(t.get("id")),s.fp.getForm().findField("target-combo").reset()},scope:this},blur:{fn:function(e){var t=e.getValue();""!==t&&0!==t&&" "!==t||e.setValue(null)},scope:this}}},{fieldLabel:_("babel.target_id"),xtype:"numberfield",name:"target",anchor:"100%",enableKeyEvents:!0,listeners:{keyup:{fn:function(){s.fp.getForm().findField("target-combo").reset(),s.fp.getForm().findField("page_id").reset()},scope:this}}},{xtype:"xcheckbox",boxLabel:_("babel.copy_tv_values"),name:"copy-tv-values"},{xtype:"xcheckbox",boxLabel:_("babel.sync_linked_tranlations"),name:"sync-linked-tranlations",checked:!0}]});s.show()},unlinkTranslation:function(e,t){this.loadMask(),e=e||"",t=parseInt(t)||0;var i=MODx.request.id,s=0===t?_("babel.unlink_all_translations_confirm"):_("babel.unlink_translation_confirm",{context:e,id:i});return MODx.msg.confirm({title:_("confirm"),text:s,url:this.config.connectorUrl,params:{action:"mgr/resource/unlink",id:i,context:e,target:t},listeners:{success:{fn:function(e){MODx.msg.status({title:_("success"),message:e.message||_("save_successful")}),this.getMenu(e.object.menu),this.hideMask()},scope:this},failure:{fn:this.hideMask,scope:this},cancel:{fn:this.hideMask,scope:this}}})},createTranslation:function(e){this.loadMask();var t=MODx.request.id;return MODx.msg.confirm({title:_("confirm"),text:_("babel.create_translation_confirm",{context:e,id:t}),url:this.config.connectorUrl,params:{action:"mgr/resource/duplicate",context_key:e,id:t},listeners:{success:{fn:function(e){this.hideMask(),MODx.loadPage("resource/update","id="+e.object.id)},scope:this},failure:{fn:this.hideMask,scope:this},cancel:{fn:this.hideMask,scope:this}}})},loadMask:function(){var e;this.overlayMask||(e=Ext.getBody().dom,this.overlayMask=new Ext.LoadMask(e,{msg:_("babel.please_wait")})),this.overlayMask.show()},hideMask:function(){this.overlayMask&&this.overlayMask.hide()},aboutWindow:function(){Ext.Msg.show({title:_("babel")+" "+Babel.config.version,msg:'© 2010-2024 by Jakob Class

Authors: Jakob Class, Rico Goldsky, Joshua Luckers, Thomas Jakobi

Repository: github.com/mikrobi/babel',buttons:Ext.Msg.OK,cls:"babel_window",width:358})}}),Ext.reg("babel",babel),new babel);Babel.combo.Context=function(e){e=e||{},Ext.applyIf(e,{url:Babel.config.connectorUrl,baseParams:{action:"mgr/context/getlist",combo:!0,exclude:"mgr"},tpl:new Ext.XTemplate('
{name:htmlEncode} ({key:htmlEncode})
')}),Babel.combo.Context.superclass.constructor.call(this,e)},Ext.extend(Babel.combo.Context,MODx.combo.Context,{setValue:function(e){Babel.combo.Context.superclass.setValue.call(this,e=""===e?null:e)}}),Ext.reg("babel-combo-context",Babel.combo.Context),Ext.ns("Ext.ux.grid"),Ext.ux.grid.LockingGridView=Ext.extend(Ext.grid.GridView,{lockText:"Lock",unlockText:"Unlock",rowBorderWidth:1,lockedBorderWidth:1,syncHeights:!1,initTemplates:function(){var e=this.templates||{};e.masterTpl||(e.masterTpl=new Ext.Template('
','
','
{lockedHeader}
','
{lockedBody}
',"
",'
','
{header}
','
{body}
',"
",'
 
','
 
',"
")),this.templates=e,Ext.ux.grid.LockingGridView.superclass.initTemplates.call(this)},getEditorParent:function(e){return this.el.dom},initElements:function(){var e=Ext.get(this.grid.getGridEl().dom.firstChild),t=e.child("div.x-grid3-locked"),i=t.child("div.x-grid3-header"),s=t.child("div.x-grid3-scroller"),o=e.child("div.x-grid3-viewport"),l=o.child("div.x-grid3-header"),n=o.child("div.x-grid3-scroller");this.grid.hideHeaders&&(i.setDisplayed(!1),l.setDisplayed(!1)),this.forceFit&&n.setStyle("overflow-x","hidden"),Ext.apply(this,{el:e,mainWrap:o,mainHd:l,innerHd:l.dom.firstChild,scroller:n,mainBody:n.child("div.x-grid3-body"),focusEl:n.child("a"),resizeMarker:e.child("div.x-grid3-resize-marker"),resizeProxy:e.child("div.x-grid3-resize-proxy"),lockedWrap:t,lockedHd:i,lockedScroller:s,lockedBody:s.child("div.x-grid3-body"),lockedInnerHd:i.child("div.x-grid3-header-inner",!0)}),this.focusEl.swallowEvent("click",!0)},getLockedRows:function(){return this.hasRows()?this.lockedBody.dom.childNodes:[]},getLockedRow:function(e){return this.getLockedRows()[e]},getCell:function(e,t){var i=this.cm.getLockedCount();return t
',{compiled:!0}),this.ident="babel-resourcematrix-"+Ext.id();var t=this,i=[],s=["id","context_key","pagetitle","parent"],o=[],l=(e.contexts&&(i=[{header:_("id"),width:70,sortable:!0,dataIndex:"id",locked:!0,id:"res_id"},{header:_("context"),width:80,sortable:!0,dataIndex:"context_key",locked:!0,id:"context_key"},{header:_("pagetitle"),width:200,sortable:!0,dataIndex:"pagetitle",locked:!0,id:"pagetitle"},{header:_("babel.all"),renderer:this.buttonColumnAllRenderer.bind(this),menuDisabled:!0,fixed:!0,locked:!0,width:50}],Ext.each(e.contexts,function(e){s.push("linkedres_id_"+e),s.push("linkedres_pagetitle_"+e),o.push(e),i.push({header:e,width:70,sortable:!1,dataIndex:"linkedres_id_"+e,id:"linkedres_id_"+e,menuDisabled:!0,renderer:t.buttonColumnContextRenderer.bind(t)})})),new Ext.ux.grid.LockingColumnModel({columns:i}));new Ext.ux.grid.LockingGridView({syncHeights:!0});Ext.apply(e,{url:Babel.config.connectorUrl,baseParams:{action:"mgr/resource/getmatrixlist",contexts:o.toString()},colModel:l,fields:s,paging:!0,remoteSort:!0,anchor:"100%",view:new Ext.ux.grid.LockingGridView,autoHeight:!1,showActionsColumn:!1,tbar:[{xtype:"babel-combo-context",id:this.ident+"-filter-context",emptyText:_("babel.select_context"),listeners:{select:{fn:this.filterByContext,scope:this}}},"->",{xtype:"textfield",id:this.ident+"-filter-query",cls:"x-form-filter",emptyText:_("babel.search"),width:300,listeners:{change:{fn:this.filterByQuery,scope:this},render:{fn:function(e){new Ext.KeyMap(e.getEl(),{key:Ext.EventObject.ENTER,fn:this.blur,scope:e})},scope:this}}},{xtype:"button",id:this.ident+"-filter-clear",cls:"x-form-filter-clear",text:_("babel.reset"),listeners:{click:{fn:this.clearFilter,scope:this}}}]}),Babel.grid.ResourceMatrix.superclass.constructor.call(this,e)},Ext.extend(Babel.grid.ResourceMatrix,MODx.grid.Grid,{linkTranslation:function(i,e){var s=MODx.load({xtype:"modx-window",title:_("babel.link_translation"),url:Babel.config.connectorUrl,baseParams:{action:"mgr/resource/link",context:i,id:e},listeners:{success:{fn:function(e){MODx.msg.status({title:_("success"),message:e.message||_("save_successful")}),this.hideMask(),this.refresh()},scope:this},failure:{fn:this.hideMask,scope:this},beforeSubmit:{fn:this.loadMask,scope:this}},fields:[{xtype:"textfield",fieldLabel:_("context"),anchor:"100%",disabled:!0,emptyText:i},{xtype:"modx-field-parent-change",fieldLabel:_("babel.select_tree_node"),id:"",name:"target-combo",anchor:"100%",end:function(e){var t=Ext.getCmp("modx-resource-tree");t&&(e.display=e.display||e.value,e.context===i)&&(t.removeListener("click",this.handleChangeParent,this),t.on("click",t._handleClick,t),t.disableHref=!1,s.fp.getForm().findField("target").setValue(e.value),s.fp.getForm().findField("page_id").setValue(null),this.setValue(e.display),this.oldValue=!1)},handleChangeParent:function(e,t){var i=Ext.getCmp("modx-resource-tree");return!!i&&(i.disableHref=!0,(i=e.id.split("_")[1])===this.config.currentid?(MODx.msg.alert("",_("resource_err_own_parent")),!1):(this.fireEvent("end",{value:"modContext"!==e.attributes.type?i:e.attributes.pk,display:Ext.util.Format.stripTags(e.text),context:e.attributes.ctx}),t.preventDefault(),t.stopEvent(),!0))}},{xtype:"modx-combo",fieldLabel:_("babel.target_pagetitle"),name:"page_id",anchor:"100%",url:Babel.config.connectorUrl,baseParams:{action:"mgr/resource/getlist",context:i,combo:!0},displayField:"pagetitle",valueField:"id",fields:["id","pagetitle"],editable:!0,typeAhead:!0,forceSelection:!0,listeners:{select:{fn:function(e,t){var i=e.getValue();""===i||0===i||" "===i?e.setValue(null):s.fp.getForm().findField("target").setValue(t.get("id")),s.fp.getForm().findField("target-combo").reset()},scope:this},blur:{fn:function(e){var t=e.getValue();""!==t&&0!==t&&" "!==t||e.setValue(null)},scope:this}}},{fieldLabel:_("babel.target_id"),xtype:"numberfield",name:"target",anchor:"100%",enableKeyEvents:!0,listeners:{keyup:{fn:function(){s.fp.getForm().findField("target-combo").reset(),s.fp.getForm().findField("page_id").reset()},scope:this}}},{xtype:"xcheckbox",boxLabel:_("babel.copy_tv_values"),name:"copy-tv-values"},{xtype:"xcheckbox",boxLabel:_("babel.sync_linked_tranlations"),name:"sync-linked-tranlations",checked:!0}]});s.reset(),s.show()},unlinkTranslation:function(e,t,i){this.loadMask(),e=e||"";var s=0===(i=parseInt(i)||0)?_("babel.unlink_all_translations_confirm"):_("babel.unlink_translation_confirm",{context:e,id:t});return MODx.msg.confirm({title:_("confirm"),text:s,url:Babel.config.connectorUrl,params:{action:"mgr/resource/unlink",id:t,context:e,target:i},listeners:{success:{fn:function(e){MODx.msg.status({title:_("success"),message:e.message||_("save_successful")}),this.hideMask(),this.refresh()},scope:this},failure:{fn:this.hideMask,scope:this},cancel:{fn:this.hideMask,scope:this}}})},createTranslation:function(e,t){return this.loadMask(),MODx.msg.confirm({title:_("confirm"),text:_("babel.create_translation_confirm",{context:e,id:t}),url:Babel.config.connectorUrl,params:{action:"mgr/resource/duplicate",context_key:e,id:t},listeners:{success:{fn:function(e){this.hideMask(),MODx.loadPage("resource/update","id="+e.object.id)},scope:this},failure:{fn:this.hideMask,scope:this},cancel:{fn:this.hideMask,scope:this}}})},clearFilter:function(){var e=this.getStore();e.baseParams.context="",e.baseParams.query="",Ext.getCmp(this.ident+"-filter-context").reset(),Ext.getCmp(this.ident+"-filter-query").reset(),this.getBottomToolbar().changePage(1),this.refresh()},filterByContext:function(e,t){this.getStore().baseParams.context=t.data.key,this.getBottomToolbar().changePage(1),this.refresh()},filterByQuery:function(e,t){return this.getStore().baseParams.query=t,this.getBottomToolbar().changePage(1),this.refresh(),!0},loadMask:function(){var e;this.overlayMask||(e=Ext.getBody().dom,this.overlayMask=new Ext.LoadMask(e,{msg:_("babel.please_wait")})),this.overlayMask.show()},hideMask:function(){this.overlayMask&&this.overlayMask.hide()},buttonColumnAllRenderer:function(){return this.buttonColumnTpl.apply({action_buttons:[{className:"unlink-all",icon:"chain-broken",text:_("babel.unlink")}]})},buttonColumnContextRenderer:function(e,t,i){var s,o=[];return t.id!=="linkedres_id_"+i.get("context_key")&&(s=t.id.substr("linkedres_id_".length),""===i.get(t.id)?o.push({className:"create",icon:"plus-circle",text:_("babel.create_translation"),ctx:s,target:0},{className:"link",icon:"link",text:_("babel.link_translation"),ctx:s,target:0}):(t=i.get("linkedres_pagetitle_"+s),i=i.get("linkedres_id_"+s),o.push({className:"update",icon:"pencil-square-o",text:_("edit")+": "+t+" ("+i+")",ctx:s,target:i},{className:"unlink",icon:"chain-broken",text:_("babel.unlink")+": "+t+" ("+i+")",ctx:s,target:i}))),this.buttonColumnTpl.apply({action_buttons:o})},onClick:function(e){var t=e.getTarget();if("icon"===t.className.split(" ")[0]){var e=t.className.split(" ")[1],i=this.getSelectionModel().getSelected();switch(e){case"unlink-all":this.unlinkTranslation("",i.get("id"),0);break;case"create":this.createTranslation(t.dataset.ctx,i.get("id"));break;case"link":this.linkTranslation(t.dataset.ctx,i.get("id"));break;case"update":MODx.loadPage("resource/update","id="+t.dataset.target),console.log(i);break;case"unlink":this.unlinkTranslation(t.dataset.ctx,i.get("id"),t.dataset.target)}}}}),Ext.reg("babel-grid-resourcematrix",Babel.grid.ResourceMatrix),Babel.panel.Home=function(e){e=e||{},Ext.applyIf(e,{cls:"container home-panel"+(Babel.config.debug?" debug":"")+" modx"+Babel.config.modxversion,defaults:{collapsible:!1,autoHeight:!0},items:[{html:"

"+_("babel")+"

"+(Babel.config.debug?'
'+_("babel.debug_mode")+"
":""),border:!1,cls:"modx-page-header"},{defaults:{autoHeight:!0},border:!0,cls:"babel-panel",items:[{xtype:"babel-panel-overview"}]}]}),Babel.panel.Home.superclass.constructor.call(this,e)},Ext.extend(Babel.panel.Home,MODx.Panel),Ext.reg("babel-panel-home",Babel.panel.Home),Babel.panel.HomeTab=function(e){e=e||{},Ext.applyIf(e,{id:"babel-panel-"+e.tabtype,title:e.title,items:[{html:"

"+e.description+"

",border:!1,cls:"panel-desc"},{layout:"form",cls:"x-form-label-left main-wrapper",defaults:{autoHeight:!0},border:!0,items:[{id:"babel-panel-"+e.tabtype+"-"+e.contenttype,xtype:"babel-"+e.contenttype+"-"+e.tabtype,preventRender:!0,contexts:Babel.config.contexts,listeners:{afterrender:function(){this.store.on("load",function(){var e=this.getTopToolbar().getHeight(),t=this.getView().lockedHd.getHeight(),i=this.getView().lockedBody.getHeight(),s=this.getBottomToolbar().getHeight();this.setHeight(e+t+i+s+14)},this)}}}]}]}),Babel.panel.HomeTab.superclass.constructor.call(this,e)},Ext.extend(Babel.panel.HomeTab,MODx.Panel),Ext.reg("babel-panel-hometab",Babel.panel.HomeTab),Babel.panel.Overview=function(e){e=e||{},this.ident="babel-overview-"+Ext.id(),this.panelOverviewTabs=[{xtype:"babel-panel-hometab",title:_("babel.contexts"),description:"
"+_("babel.contexts_desc")+'
'+_("babel.contexts_desc_link")+''+_("babel.contexts_desc_unlink")+''+_("babel.contexts_desc_update")+''+_("babel.contexts_desc_create")+"
",tabtype:"resourcematrix",contenttype:"grid"}],(Babel.config.permissions.babel_settings||Babel.config.permissions.settings)&&this.panelOverviewTabs.push({xtype:"babel-panel-settings"}),Ext.applyIf(e,{id:this.ident,items:[{xtype:"modx-tabs",border:!0,stateful:!0,stateId:"babel-panel-overview",stateEvents:["tabchange"],getState:function(){return{activeTab:this.items.indexOf(this.getActiveTab())}},autoScroll:!0,deferredRender:!0,forceLayout:!1,defaults:{layout:"form",autoHeight:!0,hideMode:"offsets"},items:this.panelOverviewTabs,listeners:{tabchange:function(e,t){"babel-panel-settings"===t.xtype?Ext.getCmp("babel-grid-system-settings")&&Ext.getCmp("babel-grid-system-settings").getStore().reload():"babel-panel-hometab"===t.xtype&&Ext.getCmp("babel-panel-"+t.tabtype+"-"+t.contenttype)&&Ext.getCmp("babel-panel-"+t.tabtype+"-"+t.contenttype).getStore().reload()}}}]}),Babel.panel.Overview.superclass.constructor.call(this,e)},Ext.extend(Babel.panel.Overview,MODx.Panel),Ext.reg("babel-panel-overview",Babel.panel.Overview),MODx.grid.SettingsGrid&&(Babel.panel.Settings=function(e){e=e||{},MODx.request.ns="babel",Ext.applyIf(e,{id:"babel-panel-settings",title:_("babel.settings"),items:[{html:"

"+_("babel.settings_desc")+"

",border:!1,cls:"panel-desc"},{xtype:"babel-grid-system-settings",id:"babel-grid-system-settings",cls:"main-wrapper",preventSaveRefresh:!0}]}),Babel.panel.Settings.superclass.constructor.call(this,e)},Ext.extend(Babel.panel.Settings,MODx.Panel),Ext.reg("babel-panel-settings",Babel.panel.Settings),Babel.grid.SystemSettings=function(e){e=e||{},Ext.applyIf(e,{id:"babel-grid-systemsettings",url:Babel.config.connectorUrl,baseParams:{action:"mgr/settings/getlist",area:MODx.request.area||""},save_action:"mgr/settings/updatefromgrid",tbar:[],queryParam:3<=Babel.config.modxversion?"query":"key"}),Babel.grid.SystemSettings.superclass.constructor.call(this,e)},Ext.extend(Babel.grid.SystemSettings,MODx.grid.SettingsGrid,{_showMenu:function(e,t,i){i.stopEvent(),i.preventDefault(),this.menu.record=this.getStore().getAt(t).data,this.getSelectionModel().isSelected(t)||this.getSelectionModel().selectRow(t),this.menu.removeAll();t=[];this.menu.record.menu?t=this.menu.record.menu:t.push({text:_("setting_update")||_("edit"),handler:this.updateSetting}),0'+t[s].displayText,menu:{items:[{text:''+_("babel.open")+" "+t[s].resourceTitle+" ("+t[s].resourceId+")",resourceUrl:t[s].resourceUrl,resourceId:t[s].resourceId,handler:function(){MODx.loadPage("resource/update","id="+this.resourceId)}},"-",{text:''+_("babel.unlink")+" "+t[s].resourceTitle+" ("+t[s].resourceId+")",contextKey:s,target:t[s].resourceId,handler:function(){i.unlinkTranslation(this.contextKey,0,this.target)}}]}}),l++):(o.push({text:''+t[s].displayText,handler:Ext.emptyFn,menu:{items:[{text:''+_("babel.create_translation"),contextKey:s,handler:function(){i.createTranslation(this.contextKey)}},"-",{text:''+_("babel.link_translation"),contextKey:s,handler:function(){i.linkTranslation(this.contextKey)}}]}}),n++));0'+_("babel.unlink_all_translations"),handler:function(){i.unlinkTranslation()}})),0'+_("babel.create_multiple_translations"),contextKey:s,target:t[s].resourceId,handler:function(){i.createTranslation()}})),o.push("-"),o.push({text:''+_("babel.about"),handler:function(){i.aboutWindow()}});var a=Ext.getCmp("babel-language-select");a&&a.destroy(),a=new Ext.Button({id:"babel-language-select",text:"Select Language",menu:o,listeners:{render:{fn:function(e){e.setText(t[i.config.context_key].displayText)},scope:this},mouseover:function(e){e.showMenu()}}}),e.insertButton(0,[a]),e.doLayout()}},linkTranslation:function(i,e,t){var s=this,o=(e=e||MODx.request.id,MODx.load({xtype:"modx-window",title:_("babel.link_translation"),closeAction:"close",url:s.config.connectorUrl,baseParams:{action:"mgr/resource/link",context:i,id:e},listeners:{success:{fn:function(e){MODx.msg.status({title:_("success"),message:e.message||_("save_successful")}),t?t.refresh():s.getMenu(e.a.result.object.menu),s.hideMask()},scope:this},failure:{fn:s.hideMask,scope:this},beforeSubmit:{fn:s.loadMask,scope:this}},fields:[{xtype:"textfield",fieldLabel:_("context"),anchor:"100%",disabled:!0,emptyText:i},{xtype:"modx-field-parent-change",fieldLabel:_("babel.select_tree_node"),id:"",name:"target-combo",anchor:"100%",end:function(e){var t=Ext.getCmp("modx-resource-tree");t&&(e.display=e.display||e.value,e.context===i)&&(t.removeListener("click",this.handleChangeParent,this),t.on("click",t._handleClick,t),t.disableHref=!1,o.fp.getForm().findField("target").setValue(e.value),o.fp.getForm().findField("page_id").setValue(null),this.setValue(e.display),this.oldValue=!1)},handleChangeParent:function(e,t){var i=Ext.getCmp("modx-resource-tree");return!!i&&(i.disableHref=!0,(i=e.id.split("_")[1])===this.config.currentid?(MODx.msg.alert("",_("resource_err_own_parent")),!1):(this.fireEvent("end",{value:"modContext"!==e.attributes.type?i:e.attributes.pk,display:Ext.util.Format.stripTags(e.text),context:e.attributes.ctx}),t.preventDefault(),t.stopEvent(),!0))}},{xtype:"modx-combo",fieldLabel:_("babel.target_pagetitle"),name:"page_id",anchor:"100%",url:s.config.connectorUrl,baseParams:{action:"mgr/resource/getlist",context:i,combo:!0},displayField:"pagetitle",valueField:"id",fields:["id","pagetitle"],editable:!0,typeAhead:!0,forceSelection:!0,listeners:{select:{fn:function(e,t){var i=e.getValue();""===i||0===i||" "===i?e.setValue(null):o.fp.getForm().findField("target").setValue(t.get("id")),o.fp.getForm().findField("target-combo").reset()},scope:this},blur:{fn:function(e){var t=e.getValue();""!==t&&0!==t&&" "!==t||e.setValue(null)},scope:this}}},{fieldLabel:_("babel.target_id"),xtype:"numberfield",name:"target",anchor:"100%",enableKeyEvents:!0,listeners:{keyup:{fn:function(){o.fp.getForm().findField("target-combo").reset(),o.fp.getForm().findField("page_id").reset()},scope:this}}},{xtype:"xcheckbox",hideLabel:!0,boxLabel:_("babel.copy_tv_values"),name:"copy"},{xtype:"xcheckbox",hideLabel:!0,boxLabel:_("babel.sync_linked_tranlations_target"),name:"sync",checked:!0}]}));o.show()},unlinkTranslation:function(e,t,i,s){e=e||"",i=parseInt(i)||0,t=t||MODx.request.id;var o=this,l=0===i?_("babel.unlink_all_translations_confirm"):_("babel.unlink_translation_confirm",{context:e,id:t});return o.loadMask(),MODx.msg.confirm({title:_("confirm"),text:l,url:this.config.connectorUrl,params:{action:"mgr/resource/unlink",id:t,context:e,target:i},listeners:{success:{fn:function(e){MODx.msg.status({title:_("success"),message:e.message||_("save_successful")}),s?s.refresh():o.getMenu(e.object.menu),o.hideMask()},scope:this},failure:{fn:o.hideMask,scope:this},cancel:{fn:o.hideMask,scope:this}}})},createTranslation:function(t,i=0){var s,o=this;i=i||MODx.request.id,this.loadMask(),t?(s=MODx.load({xtype:"modx-window",title:_("babel.create_translation"),closeAction:"close",buttons:[{text:_("close"),handler:function(){s.close()},scope:this},{text:_("create"),cls:"primary-button",handler:function(){var e=s.fp.getForm().getValues();MODx.Ajax.request({url:this.config.connectorUrl,params:{action:"mgr/resource/duplicate",context_key:t,id:i,copy:e.copy,sync:e.sync},listeners:{success:{fn:function(e){o.hideMask(),MODx.loadPage("resource/update","id="+e.object.id)},scope:this}}})},scope:this}],listeners:{beforeSubmit:{fn:o.loadMask,scope:this},close:{fn:o.hideMask,scope:this}},fields:[{style:"padding-top: 15px",html:"

"+_("babel.create_translation_confirm",{context:t,id:i})+"

"},{xtype:"xcheckbox",hideLabel:!0,boxLabel:_("babel.sync_linked_tranlations"),name:"sync",checked:!0}]})).show():Babel.config.hasOwnProperty("menu")&&Babel.config.hasOwnProperty("context_key")?(o.babelMenu=Babel.config.menu,o.babelContext=Babel.config.context_key,o.createTranslations(t,i)):MODx.Ajax.request({url:o.config.connectorUrl,params:{action:"mgr/resource/getmenu",id:i},listeners:{success:{fn:function(e){e.object.menu&&e.object.context_key&&(o.babelMenu=e.object.menu,o.babelContext=e.object.context_key,o.createTranslations(t,i))},scope:this}}})},createTranslations:function(e,t){var i,s=this,o=[];Ext.each(Babel.config.contexts,function(e){e===s.babelContext||!s.babelMenu.hasOwnProperty(e)||"undefined"!==s.babelMenu[e].resourceUrl&&""!==s.babelMenu[e].resourceUrl&&"#"!==s.babelMenu[e].resourceUrl||o.push({boxLabel:s.babelMenu[e].displayText,name:"contexts",inputValue:e})}),o.length?(i=MODx.load({xtype:"modx-window",title:_("babel.create_multiple_translations"),closeAction:"close",buttons:[{text:_("close"),handler:function(){i.close()},scope:this},{text:_("create"),cls:"primary-button",handler:function(){var e=i.fp.getForm().getValues();i.close(),s.addTranslation(t,e)},scope:this}],listeners:{beforeSubmit:{fn:s.loadMask,scope:this},close:{fn:s.hideMask,scope:this},afterrender:function(){var e=Ext.getCmp("babel-all-contexts");e&&e.setValue(1)}},fields:[{xtype:"fieldset",cls:"x-fieldset-check-all",title:_("babel.contexts"),defaults:{hideLabel:!0},items:[{xtype:"xcheckbox",id:"babel-all-contexts",boxLabel:_("babel.all"),itemCls:"x-form-item-check-all",submitValue:!1,listeners:{check:{fn:function(t){var i=[],e=Ext.getCmp("babel-contexts");Ext.each(Babel.config.contexts,function(e){e!==s.babelContext&&s.babelMenu.hasOwnProperty(e)&&i.push(t.getValue())}),e.setValue(i)},scope:this}}},{xtype:"checkboxgroup",id:"babel-contexts",columns:3,anchor:"100%",style:"margin-top: -10px",items:o}]},{xtype:"xcheckbox",hideLabel:!0,boxLabel:_("babel.copy_tv_values"),name:"copy"},{xtype:"xcheckbox",hideLabel:!0,boxLabel:_("babel.sync_linked_tranlations"),name:"sync",checked:!0}]})).show():(MODx.msg.alert("",_("babel.create_multiple_translations_err_no_contexts")),s.hideMask())},addTranslation:function(e,t){var i=this,s=(this.contexts=t.hasOwnProperty("contexts")?Array.isArray(t.contexts)?t.contexts:[t.contexts]:[],delete t.contexts,"/babelduplicate/");this.console=MODx.load({xtype:"modx-console",register:"mgr",topic:s,show_filename:!1,clear:!0,listeners:{complete:{fn:function(){var e=MODx.request.id,e=(MODx.msg.status({title:_("success"),message:_("babel.create_multiple_translations_finished")}),MODx.Ajax.request({url:i.config.connectorUrl,params:{action:"mgr/resource/getmenu",id:e},listeners:{success:{fn:function(e){i.hideMask(),e.object.menu&&i.getMenu(e.object.menu),"resource/update"===MODx.request.a&&MODx.loadPage("resource/update","id="+MODx.request.id)},scope:this}}}),Ext.getCmp("modx-resource-tree"));e&&e.rendered&&e.refresh(),i.hideMask()},scope:this}}}),this.console.show(Ext.getBody()),i.requestTranslation(0,s,e,t)},requestTranslation:function(e,t,i,s){var o=this;MODx.Ajax.request({url:this.config.connectorUrl,params:{action:"mgr/resource/duplicate",register:"mgr",topic:t,id:i,context_key:o.contexts[e],last:e===o.contexts.length-1,copy:s.copy,sync:s.sync},listeners:{success:{fn:function(){(e+=1)
Authors: Jakob Class, Rico Goldsky, Joshua Luckers, Thomas Jakobi

Repository: github.com/mikrobi/babel',buttons:Ext.Msg.OK,cls:"babel_window",width:358})}}),Ext.reg("babel",babel),new babel);Babel.combo.Context=function(e){e=e||{},Ext.applyIf(e,{url:Babel.config.connectorUrl,baseParams:{action:"mgr/context/getlist",combo:!0,exclude:"mgr"},tpl:new Ext.XTemplate('
{name:htmlEncode} ({key:htmlEncode})
')}),Babel.combo.Context.superclass.constructor.call(this,e)},Ext.extend(Babel.combo.Context,MODx.combo.Context,{setValue:function(e){Babel.combo.Context.superclass.setValue.call(this,e=""===e?null:e)}}),Ext.reg("babel-combo-context",Babel.combo.Context),Ext.ns("Ext.ux.grid"),Ext.ux.grid.LockingGridView=Ext.extend(Ext.grid.GridView,{lockText:"Lock",unlockText:"Unlock",rowBorderWidth:1,lockedBorderWidth:1,syncHeights:!1,initTemplates:function(){var e=this.templates||{};e.masterTpl||(e.masterTpl=new Ext.Template('
','
','
{lockedHeader}
','
{lockedBody}
',"
",'
','
{header}
','
{body}
',"
",'
 
','
 
',"
")),this.templates=e,Ext.ux.grid.LockingGridView.superclass.initTemplates.call(this)},getEditorParent:function(e){return this.el.dom},initElements:function(){var e=Ext.get(this.grid.getGridEl().dom.firstChild),t=e.child("div.x-grid3-locked"),i=t.child("div.x-grid3-header"),s=t.child("div.x-grid3-scroller"),o=e.child("div.x-grid3-viewport"),l=o.child("div.x-grid3-header"),n=o.child("div.x-grid3-scroller");this.grid.hideHeaders&&(i.setDisplayed(!1),l.setDisplayed(!1)),this.forceFit&&n.setStyle("overflow-x","hidden"),Ext.apply(this,{el:e,mainWrap:o,mainHd:l,innerHd:l.dom.firstChild,scroller:n,mainBody:n.child("div.x-grid3-body"),focusEl:n.child("a"),resizeMarker:e.child("div.x-grid3-resize-marker"),resizeProxy:e.child("div.x-grid3-resize-proxy"),lockedWrap:t,lockedHd:i,lockedScroller:s,lockedBody:s.child("div.x-grid3-body"),lockedInnerHd:i.child("div.x-grid3-header-inner",!0)}),this.focusEl.swallowEvent("click",!0)},getLockedRows:function(){return this.hasRows()?this.lockedBody.dom.childNodes:[]},getLockedRow:function(e){return this.getLockedRows()[e]},getCell:function(e,t){var i=this.cm.getLockedCount();return t
',{compiled:!0}),this.ident="babel-resourcematrix-"+Ext.id();var t=this,i=[],s=["id","context_key","pagetitle","parent"],o=[],l=(e.contexts&&(i=[{header:_("id"),width:70,sortable:!0,dataIndex:"id",locked:!0,id:"res_id"},{header:_("context"),width:80,sortable:!0,dataIndex:"context_key",locked:!0,id:"context_key"},{header:_("pagetitle"),width:200,sortable:!0,dataIndex:"pagetitle",locked:!0,id:"pagetitle"},{header:_("babel.all"),renderer:this.buttonColumnAllRenderer.bind(this),menuDisabled:!0,fixed:!0,locked:!0,width:50}],Ext.each(e.contexts,function(e){s.push("linkedres_id_"+e),s.push("linkedres_pagetitle_"+e),o.push(e),i.push({header:e,width:70,sortable:!1,dataIndex:"linkedres_id_"+e,id:"linkedres_id_"+e,menuDisabled:!0,renderer:t.buttonColumnContextRenderer.bind(t)})})),new Ext.ux.grid.LockingColumnModel({columns:i}));Ext.apply(e,{url:Babel.config.connectorUrl,baseParams:{action:"mgr/resource/getmatrixlist",contexts:o.toString()},colModel:l,fields:s,paging:!0,remoteSort:!0,anchor:"100%",view:new Ext.ux.grid.LockingGridView,autoHeight:!1,showActionsColumn:!1,tbar:[{xtype:"babel-combo-context",id:this.ident+"-filter-context",emptyText:_("babel.select_context"),listeners:{select:{fn:this.filterByContext,scope:this}}},"->",{xtype:"textfield",id:this.ident+"-filter-query",cls:"x-form-filter",emptyText:_("babel.search"),width:300,listeners:{change:{fn:this.filterByQuery,scope:this},render:{fn:function(e){new Ext.KeyMap(e.getEl(),{key:Ext.EventObject.ENTER,fn:this.blur,scope:e})},scope:this}}},{xtype:"button",id:this.ident+"-filter-clear",cls:"x-form-filter-clear",text:_("babel.reset"),listeners:{click:{fn:this.clearFilter,scope:this}}}]}),Babel.grid.ResourceMatrix.superclass.constructor.call(this,e)},Ext.extend(Babel.grid.ResourceMatrix,MODx.grid.Grid,{linkTranslation:function(e,t){Babel.linkTranslation(e,t,this)},unlinkTranslation:function(e,t,i){return Babel.unlinkTranslation(e,t,i,this)},createTranslation:function(e,t){Babel.createTranslation(e,t)},clearFilter:function(){var e=this.getStore();e.baseParams.context="",e.baseParams.query="",Ext.getCmp(this.ident+"-filter-context").reset(),Ext.getCmp(this.ident+"-filter-query").reset(),this.getBottomToolbar().changePage(1),this.refresh()},filterByContext:function(e,t){this.getStore().baseParams.context=t.data.key,this.getBottomToolbar().changePage(1),this.refresh()},filterByQuery:function(e,t){return this.getStore().baseParams.query=t,this.getBottomToolbar().changePage(1),this.refresh(),!0},buttonColumnAllRenderer:function(){return this.buttonColumnTpl.apply({action_buttons:[{className:"create-multiple",icon:"plus-square",text:_("babel.create_multiple_translations")},{className:"unlink-all",icon:"chain-broken",text:_("babel.unlink_all")}]})},buttonColumnContextRenderer:function(e,t,i){var s,o=[];return t.id!=="linkedres_id_"+i.get("context_key")&&(s=t.id.substr("linkedres_id_".length),""===i.get(t.id)?o.push({className:"create",icon:"plus-circle",text:_("babel.create_translation"),ctx:s,target:0},{className:"link",icon:"link",text:_("babel.link_translation"),ctx:s,target:0}):(t=i.get("linkedres_pagetitle_"+s),i=i.get("linkedres_id_"+s),o.push({className:"update",icon:"pencil-square-o",text:_("edit")+": "+t+" ("+i+")",ctx:s,target:i},{className:"unlink",icon:"chain-broken",text:_("babel.unlink")+": "+t+" ("+i+")",ctx:s,target:i}))),this.buttonColumnTpl.apply({action_buttons:o})},onClick:function(e){var t=e.getTarget();if("icon"===t.className.split(" ")[0]){var e=t.className.split(" ")[1],i=this.getSelectionModel().getSelected();switch(e){case"unlink-all":this.unlinkTranslation("",i.get("id"),0);break;case"create-multiple":this.createTranslation("",i.get("id"));break;case"create":this.createTranslation(t.dataset.ctx,i.get("id"));break;case"link":this.linkTranslation(t.dataset.ctx,i.get("id"));break;case"update":MODx.loadPage("resource/update","id="+t.dataset.target);break;case"unlink":this.unlinkTranslation(t.dataset.ctx,i.get("id"),t.dataset.target)}}}}),Ext.reg("babel-grid-resourcematrix",Babel.grid.ResourceMatrix),Babel.panel.Home=function(e){e=e||{},Ext.applyIf(e,{cls:"container home-panel"+(Babel.config.debug?" debug":"")+" modx"+Babel.config.modxversion,defaults:{collapsible:!1,autoHeight:!0},items:[{html:"

"+_("babel")+"

"+(Babel.config.debug?'
'+_("babel.debug_mode")+"
":""),border:!1,cls:"modx-page-header"},{defaults:{autoHeight:!0},border:!0,cls:"babel-panel",items:[{xtype:"babel-panel-overview"},{xtype:"hidden",value:0,id:"modx-resource-parent-hidden"}]}]}),Babel.panel.Home.superclass.constructor.call(this,e)},Ext.extend(Babel.panel.Home,MODx.Panel),Ext.reg("babel-panel-home",Babel.panel.Home),Babel.panel.HomeTab=function(e){e=e||{},Ext.applyIf(e,{id:"babel-panel-"+e.tabtype,title:e.title,items:[{html:"

"+e.description+"

",border:!1,cls:"panel-desc"},{layout:"form",cls:"x-form-label-left main-wrapper",defaults:{autoHeight:!0},border:!0,items:[{id:"babel-panel-"+e.tabtype+"-"+e.contenttype,xtype:"babel-"+e.contenttype+"-"+e.tabtype,preventRender:!0,contexts:Babel.config.contexts,listeners:{afterrender:function(){this.store.on("load",function(){var e=this.getTopToolbar().getHeight(),t=this.getView().lockedHd.getHeight(),i=this.getView().lockedBody.getHeight(),s=this.getView().lockedScroller.getHeight(),o=this.getBottomToolbar().getHeight(),l=this.getView().lockedBody.getWidth(),n=this.getView().mainBody.getWidth(),a=this.getEl().getWidth();this.setHeight(e+t+(i=a"+_("babel.contexts_desc")+'
'+_("babel.contexts_desc_link")+''+_("babel.contexts_desc_unlink")+''+_("babel.contexts_desc_update")+''+_("babel.contexts_desc_create")+''+_("babel.contexts_desc_create_multiple")+"
",tabtype:"resourcematrix",contenttype:"grid"}],(Babel.config.permissions.babel_settings||Babel.config.permissions.settings)&&this.panelOverviewTabs.push({xtype:"babel-panel-settings"}),Ext.applyIf(e,{id:this.ident,items:[{xtype:"modx-tabs",border:!0,stateful:!0,stateId:"babel-panel-overview",stateEvents:["tabchange"],getState:function(){return{activeTab:this.items.indexOf(this.getActiveTab())}},autoScroll:!0,deferredRender:!0,forceLayout:!1,defaults:{layout:"form",autoHeight:!0,hideMode:"offsets"},items:this.panelOverviewTabs,listeners:{tabchange:function(e,t){"babel-panel-settings"===t.xtype?Ext.getCmp("babel-grid-system-settings")&&Ext.getCmp("babel-grid-system-settings").getStore().reload():"babel-panel-hometab"===t.xtype&&Ext.getCmp("babel-panel-"+t.tabtype+"-"+t.contenttype)&&Ext.getCmp("babel-panel-"+t.tabtype+"-"+t.contenttype).getStore().reload()}}}]}),Babel.panel.Overview.superclass.constructor.call(this,e)},Ext.extend(Babel.panel.Overview,MODx.Panel),Ext.reg("babel-panel-overview",Babel.panel.Overview),MODx.grid.SettingsGrid&&(Babel.panel.Settings=function(e){e=e||{},MODx.request.ns="babel",Ext.applyIf(e,{id:"babel-panel-settings",title:_("babel.settings"),items:[{html:"

"+_("babel.settings_desc")+"

",border:!1,cls:"panel-desc"},{xtype:"babel-grid-system-settings",id:"babel-grid-system-settings",cls:"main-wrapper",preventSaveRefresh:!0}]}),Babel.panel.Settings.superclass.constructor.call(this,e)},Ext.extend(Babel.panel.Settings,MODx.Panel),Ext.reg("babel-panel-settings",Babel.panel.Settings),Babel.grid.SystemSettings=function(e){e=e||{},Ext.applyIf(e,{id:"babel-grid-systemsettings",url:Babel.config.connectorUrl,baseParams:{action:"mgr/settings/getlist",area:MODx.request.area||""},save_action:"mgr/settings/updatefromgrid",tbar:[],queryParam:3<=Babel.config.modxversion?"query":"key"}),Babel.grid.SystemSettings.superclass.constructor.call(this,e)},Ext.extend(Babel.grid.SystemSettings,MODx.grid.SettingsGrid,{_showMenu:function(e,t,i){i.stopEvent(),i.preventDefault(),this.menu.record=this.getStore().getAt(t).data,this.getSelectionModel().isSelected(t)||this.getSelectionModel().selectRow(t),this.menu.removeAll();t=[];this.menu.record.menu?t=this.menu.record.menu:t.push({text:_("setting_update")||_("edit"),handler:this.updateSetting}),0'+t[i].displayText,menu:{items:[{text:''+_("babel.open")+" "+t[i].resourceTitle+" ("+t[i].resourceId+")",resourceUrl:t[i].resourceUrl,resourceId:t[i].resourceId,handler:function(){MODx.loadPage("resource/update","id="+this.resourceId)}},"-",{text:''+_("babel.unlink")+" "+t[i].resourceTitle+" ("+t[i].resourceId+")",contextKey:i,target:t[i].resourceId,handler:function(){n.unlinkTranslation(this.contextKey,this.target)}}]}}),o++):s.push({text:''+t[i].displayText,handler:Ext.emptyFn,menu:{items:[{text:''+_("babel.create_translation"),contextKey:i,handler:function(){n.createTranslation(this.contextKey)}},"-",{text:''+_("babel.link_translation"),contextKey:i,handler:function(){n.linkTranslation(this.contextKey)}}]}}));0'+_("babel.unlink_all_translations"),handler:function(){n.unlinkTranslation()}})),s.push("-"),s.push({text:''+_("babel.about"),handler:function(){n.aboutWindow()}});var a=Ext.getCmp("babel-language-select");a&&a.destroy(),a=new Ext.Button({id:"babel-language-select",text:"Select Language",menu:s,listeners:{render:{fn:function(e){e.setText(t[n.config.context_key].displayText)},scope:this},mouseover:function(e){e.showMenu()}}}),e.insertButton(0,[a]),e.doLayout()}},linkTranslation:function(n){var e=MODx.request.id,i=MODx.load({xtype:"modx-window",title:_("babel.link_translation"),url:this.config.connectorUrl,baseParams:{action:"mgr/resource/link",context:n,id:e},listeners:{success:{fn:function(e){MODx.msg.status({title:_("success"),message:e.message||_("save_successful")}),this.getMenu(e.a.result.object.menu),this.hideMask()},scope:this},failure:{fn:this.hideMask,scope:this},beforeSubmit:{fn:this.loadMask,scope:this}},fields:[{xtype:"textfield",fieldLabel:_("context"),anchor:"100%",disabled:!0,emptyText:n},{xtype:"modx-field-parent-change",fieldLabel:_("babel.select_tree_node"),id:"",name:"target-combo",anchor:"100%",end:function(e){var t=Ext.getCmp("modx-resource-tree");t&&(e.display=e.display||e.value,e.context===n)&&(t.removeListener("click",this.handleChangeParent,this),t.on("click",t._handleClick,t),t.disableHref=!1,i.fp.getForm().findField("target").setValue(e.value),i.fp.getForm().findField("page_id").setValue(null),this.setValue(e.display),this.oldValue=!1)},handleChangeParent:function(e,t){var n=Ext.getCmp("modx-resource-tree");return!!n&&(n.disableHref=!0,(n=e.id.split("_")[1])===this.config.currentid?(MODx.msg.alert("",_("resource_err_own_parent")),!1):(this.fireEvent("end",{value:"modContext"!==e.attributes.type?n:e.attributes.pk,display:Ext.util.Format.stripTags(e.text),context:e.attributes.ctx}),t.preventDefault(),t.stopEvent(),!0))}},{xtype:"modx-combo",fieldLabel:_("babel.target_pagetitle"),name:"page_id",anchor:"100%",url:this.config.connectorUrl,baseParams:{action:"mgr/resource/getlist",context:n,combo:!0},displayField:"pagetitle",valueField:"id",fields:["id","pagetitle"],editable:!0,typeAhead:!0,forceSelection:!0,listeners:{select:{fn:function(e,t){var n=e.getValue();""===n||0===n||" "===n?e.setValue(null):i.fp.getForm().findField("target").setValue(t.get("id")),i.fp.getForm().findField("target-combo").reset()},scope:this},blur:{fn:function(e){var t=e.getValue();""!==t&&0!==t&&" "!==t||e.setValue(null)},scope:this}}},{fieldLabel:_("babel.target_id"),xtype:"numberfield",name:"target",anchor:"100%",enableKeyEvents:!0,listeners:{keyup:{fn:function(){i.fp.getForm().findField("target-combo").reset(),i.fp.getForm().findField("page_id").reset()},scope:this}}},{xtype:"xcheckbox",boxLabel:_("babel.copy_tv_values"),name:"copy-tv-values"},{xtype:"xcheckbox",boxLabel:_("babel.sync_linked_tranlations"),name:"sync-linked-tranlations",checked:!0}]});i.show()},unlinkTranslation:function(e,t){this.loadMask(),e=e||"",t=parseInt(t)||0;var n=MODx.request.id,i=0===t?_("babel.unlink_all_translations_confirm"):_("babel.unlink_translation_confirm",{context:e,id:n});return MODx.msg.confirm({title:_("confirm"),text:i,url:this.config.connectorUrl,params:{action:"mgr/resource/unlink",id:n,context:e,target:t},listeners:{success:{fn:function(e){MODx.msg.status({title:_("success"),message:e.message||_("save_successful")}),this.getMenu(e.object.menu),this.hideMask()},scope:this},failure:{fn:this.hideMask,scope:this},cancel:{fn:this.hideMask,scope:this}}})},createTranslation:function(e){this.loadMask();var t=MODx.request.id;return MODx.msg.confirm({title:_("confirm"),text:_("babel.create_translation_confirm",{context:e,id:t}),url:this.config.connectorUrl,params:{action:"mgr/resource/duplicate",context_key:e,id:t},listeners:{success:{fn:function(e){this.hideMask(),MODx.loadPage("resource/update","id="+e.object.id)},scope:this},failure:{fn:this.hideMask,scope:this},cancel:{fn:this.hideMask,scope:this}}})},loadMask:function(){var e;this.overlayMask||(e=Ext.getBody().dom,this.overlayMask=new Ext.LoadMask(e,{msg:_("babel.please_wait")})),this.overlayMask.show()},hideMask:function(){this.overlayMask&&this.overlayMask.hide()},aboutWindow:function(){Ext.Msg.show({title:_("babel")+" "+Babel.config.version,msg:'© 2010-2024 by Jakob Class

Authors: Jakob Class, Rico Goldsky, Joshua Luckers, Thomas Jakobi

Repository: github.com/mikrobi/babel',buttons:Ext.Msg.OK,cls:"babel_window",width:358})}}),Ext.reg("babel",babel),new babel); +var babel=function(e){babel.superclass.constructor.call(this,e=e||{})},Babel=(Ext.extend(babel,Ext.Component,{page:{},window:{},grid:{},tree:{},panel:{},combo:{},config:{},util:{},getMenu:function(t){var n=this,e=Ext.getCmp("modx-action-buttons");if(e){var s,o=[],a=0,i=0;for(s in t)s!==this.config.context_key&&(void 0!==t[s].resourceUrl&&""!==t[s].resourceUrl&&"#"!==t[s].resourceUrl?(o.push({text:''+t[s].displayText,menu:{items:[{text:''+_("babel.open")+" "+t[s].resourceTitle+" ("+t[s].resourceId+")",resourceUrl:t[s].resourceUrl,resourceId:t[s].resourceId,handler:function(){MODx.loadPage("resource/update","id="+this.resourceId)}},"-",{text:''+_("babel.unlink")+" "+t[s].resourceTitle+" ("+t[s].resourceId+")",contextKey:s,target:t[s].resourceId,handler:function(){n.unlinkTranslation(this.contextKey,0,this.target)}}]}}),a++):(o.push({text:''+t[s].displayText,handler:Ext.emptyFn,menu:{items:[{text:''+_("babel.create_translation"),contextKey:s,handler:function(){n.createTranslation(this.contextKey)}},"-",{text:''+_("babel.link_translation"),contextKey:s,handler:function(){n.linkTranslation(this.contextKey)}}]}}),i++));0'+_("babel.unlink_all_translations"),handler:function(){n.unlinkTranslation()}})),0'+_("babel.create_multiple_translations"),contextKey:s,target:t[s].resourceId,handler:function(){n.createTranslation()}})),o.push("-"),o.push({text:''+_("babel.about"),handler:function(){n.aboutWindow()}});var c=Ext.getCmp("babel-language-select");c&&c.destroy(),c=new Ext.Button({id:"babel-language-select",text:"Select Language",menu:o,listeners:{render:{fn:function(e){e.setText(t[n.config.context_key].displayText)},scope:this},mouseover:function(e){e.showMenu()}}}),e.insertButton(0,[c]),e.doLayout()}},linkTranslation:function(n,e,t){var s=this,o=(e=e||MODx.request.id,MODx.load({xtype:"modx-window",title:_("babel.link_translation"),closeAction:"close",url:s.config.connectorUrl,baseParams:{action:"mgr/resource/link",context:n,id:e},listeners:{success:{fn:function(e){MODx.msg.status({title:_("success"),message:e.message||_("save_successful")}),t?t.refresh():s.getMenu(e.a.result.object.menu),s.hideMask()},scope:this},failure:{fn:s.hideMask,scope:this},beforeSubmit:{fn:s.loadMask,scope:this}},fields:[{xtype:"textfield",fieldLabel:_("context"),anchor:"100%",disabled:!0,emptyText:n},{xtype:"modx-field-parent-change",fieldLabel:_("babel.select_tree_node"),id:"",name:"target-combo",anchor:"100%",end:function(e){var t=Ext.getCmp("modx-resource-tree");t&&(e.display=e.display||e.value,e.context===n)&&(t.removeListener("click",this.handleChangeParent,this),t.on("click",t._handleClick,t),t.disableHref=!1,o.fp.getForm().findField("target").setValue(e.value),o.fp.getForm().findField("page_id").setValue(null),this.setValue(e.display),this.oldValue=!1)},handleChangeParent:function(e,t){var n=Ext.getCmp("modx-resource-tree");return!!n&&(n.disableHref=!0,(n=e.id.split("_")[1])===this.config.currentid?(MODx.msg.alert("",_("resource_err_own_parent")),!1):(this.fireEvent("end",{value:"modContext"!==e.attributes.type?n:e.attributes.pk,display:Ext.util.Format.stripTags(e.text),context:e.attributes.ctx}),t.preventDefault(),t.stopEvent(),!0))}},{xtype:"modx-combo",fieldLabel:_("babel.target_pagetitle"),name:"page_id",anchor:"100%",url:s.config.connectorUrl,baseParams:{action:"mgr/resource/getlist",context:n,combo:!0},displayField:"pagetitle",valueField:"id",fields:["id","pagetitle"],editable:!0,typeAhead:!0,forceSelection:!0,listeners:{select:{fn:function(e,t){var n=e.getValue();""===n||0===n||" "===n?e.setValue(null):o.fp.getForm().findField("target").setValue(t.get("id")),o.fp.getForm().findField("target-combo").reset()},scope:this},blur:{fn:function(e){var t=e.getValue();""!==t&&0!==t&&" "!==t||e.setValue(null)},scope:this}}},{fieldLabel:_("babel.target_id"),xtype:"numberfield",name:"target",anchor:"100%",enableKeyEvents:!0,listeners:{keyup:{fn:function(){o.fp.getForm().findField("target-combo").reset(),o.fp.getForm().findField("page_id").reset()},scope:this}}},{xtype:"xcheckbox",hideLabel:!0,boxLabel:_("babel.copy_tv_values"),name:"copy"},{xtype:"xcheckbox",hideLabel:!0,boxLabel:_("babel.sync_linked_tranlations_target"),name:"sync",checked:!0}]}));o.show()},unlinkTranslation:function(e,t,n,s){e=e||"",n=parseInt(n)||0,t=t||MODx.request.id;var o=this,a=0===n?_("babel.unlink_all_translations_confirm"):_("babel.unlink_translation_confirm",{context:e,id:t});return o.loadMask(),MODx.msg.confirm({title:_("confirm"),text:a,url:this.config.connectorUrl,params:{action:"mgr/resource/unlink",id:t,context:e,target:n},listeners:{success:{fn:function(e){MODx.msg.status({title:_("success"),message:e.message||_("save_successful")}),s?s.refresh():o.getMenu(e.object.menu),o.hideMask()},scope:this},failure:{fn:o.hideMask,scope:this},cancel:{fn:o.hideMask,scope:this}}})},createTranslation:function(t,n=0){var s,o=this;n=n||MODx.request.id,this.loadMask(),t?(s=MODx.load({xtype:"modx-window",title:_("babel.create_translation"),closeAction:"close",buttons:[{text:_("close"),handler:function(){s.close()},scope:this},{text:_("create"),cls:"primary-button",handler:function(){var e=s.fp.getForm().getValues();MODx.Ajax.request({url:this.config.connectorUrl,params:{action:"mgr/resource/duplicate",context_key:t,id:n,copy:e.copy,sync:e.sync},listeners:{success:{fn:function(e){o.hideMask(),MODx.loadPage("resource/update","id="+e.object.id)},scope:this}}})},scope:this}],listeners:{beforeSubmit:{fn:o.loadMask,scope:this},close:{fn:o.hideMask,scope:this}},fields:[{style:"padding-top: 15px",html:"

"+_("babel.create_translation_confirm",{context:t,id:n})+"

"},{xtype:"xcheckbox",hideLabel:!0,boxLabel:_("babel.sync_linked_tranlations"),name:"sync",checked:!0}]})).show():Babel.config.hasOwnProperty("menu")&&Babel.config.hasOwnProperty("context_key")?(o.babelMenu=Babel.config.menu,o.babelContext=Babel.config.context_key,o.createTranslations(t,n)):MODx.Ajax.request({url:o.config.connectorUrl,params:{action:"mgr/resource/getmenu",id:n},listeners:{success:{fn:function(e){e.object.menu&&e.object.context_key&&(o.babelMenu=e.object.menu,o.babelContext=e.object.context_key,o.createTranslations(t,n))},scope:this}}})},createTranslations:function(e,t){var n,s=this,o=[];Ext.each(Babel.config.contexts,function(e){e===s.babelContext||!s.babelMenu.hasOwnProperty(e)||"undefined"!==s.babelMenu[e].resourceUrl&&""!==s.babelMenu[e].resourceUrl&&"#"!==s.babelMenu[e].resourceUrl||o.push({boxLabel:s.babelMenu[e].displayText,name:"contexts",inputValue:e})}),o.length?(n=MODx.load({xtype:"modx-window",title:_("babel.create_multiple_translations"),closeAction:"close",buttons:[{text:_("close"),handler:function(){n.close()},scope:this},{text:_("create"),cls:"primary-button",handler:function(){var e=n.fp.getForm().getValues();n.close(),s.addTranslation(t,e)},scope:this}],listeners:{beforeSubmit:{fn:s.loadMask,scope:this},close:{fn:s.hideMask,scope:this},afterrender:function(){var e=Ext.getCmp("babel-all-contexts");e&&e.setValue(1)}},fields:[{xtype:"fieldset",cls:"x-fieldset-check-all",title:_("babel.contexts"),defaults:{hideLabel:!0},items:[{xtype:"xcheckbox",id:"babel-all-contexts",boxLabel:_("babel.all"),itemCls:"x-form-item-check-all",submitValue:!1,listeners:{check:{fn:function(t){var n=[],e=Ext.getCmp("babel-contexts");Ext.each(Babel.config.contexts,function(e){e!==s.babelContext&&s.babelMenu.hasOwnProperty(e)&&n.push(t.getValue())}),e.setValue(n)},scope:this}}},{xtype:"checkboxgroup",id:"babel-contexts",columns:3,anchor:"100%",style:"margin-top: -10px",items:o}]},{xtype:"xcheckbox",hideLabel:!0,boxLabel:_("babel.copy_tv_values"),name:"copy"},{xtype:"xcheckbox",hideLabel:!0,boxLabel:_("babel.sync_linked_tranlations"),name:"sync",checked:!0}]})).show():(MODx.msg.alert("",_("babel.create_multiple_translations_err_no_contexts")),s.hideMask())},addTranslation:function(e,t){var n=this,s=(this.contexts=t.hasOwnProperty("contexts")?Array.isArray(t.contexts)?t.contexts:[t.contexts]:[],delete t.contexts,"/babelduplicate/");this.console=MODx.load({xtype:"modx-console",register:"mgr",topic:s,show_filename:!1,clear:!0,listeners:{complete:{fn:function(){var e=MODx.request.id,e=(MODx.msg.status({title:_("success"),message:_("babel.create_multiple_translations_finished")}),MODx.Ajax.request({url:n.config.connectorUrl,params:{action:"mgr/resource/getmenu",id:e},listeners:{success:{fn:function(e){n.hideMask(),e.object.menu&&n.getMenu(e.object.menu),"resource/update"===MODx.request.a&&MODx.loadPage("resource/update","id="+MODx.request.id)},scope:this}}}),Ext.getCmp("modx-resource-tree"));e&&e.rendered&&e.refresh(),n.hideMask()},scope:this}}}),this.console.show(Ext.getBody()),n.requestTranslation(0,s,e,t)},requestTranslation:function(e,t,n,s){var o=this;MODx.Ajax.request({url:this.config.connectorUrl,params:{action:"mgr/resource/duplicate",register:"mgr",topic:t,id:n,context_key:o.contexts[e],last:e===o.contexts.length-1,copy:s.copy,sync:s.sync},listeners:{success:{fn:function(){(e+=1)
Authors: Jakob Class, Rico Goldsky, Joshua Luckers, Thomas Jakobi

Repository: github.com/mikrobi/babel',buttons:Ext.Msg.OK,cls:"babel_window",width:358})}}),Ext.reg("babel",babel),new babel); \ No newline at end of file diff --git a/core/components/babel/composer.json b/core/components/babel/composer.json index e0ddd66..9126205 100644 --- a/core/components/babel/composer.json +++ b/core/components/babel/composer.json @@ -31,6 +31,7 @@ }, "require": { "php": ">=7.2", + "ext-curl": "*", "ext-json": "*", "ext-pdo": "*" }, diff --git a/core/components/babel/docs/changelog.md b/core/components/babel/docs/changelog.md index 86eeae7..200e5e7 100644 --- a/core/components/babel/docs/changelog.md +++ b/core/components/babel/docs/changelog.md @@ -5,11 +5,19 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [3.3.0] - TBA +## [3.3.0] - 2024-03-27 + +### Added + +- Add a menu entry/button to create multiple translations in selectable contexts +- Include a possible scrollbar height in the context grid height +- [#204] New event when TV values have been synchronized - thanks to Arjen +- Add an option to link a new created translation with all existing translations ### Fixed -- [#202] Fix synchronized TVs never triggered +- [#202] Fix synchronized TVs never triggered - thanks to Arjen +- Don't change the parent of a new linked resource to a folder ## [3.2.0] - 2024-02-07 @@ -25,7 +33,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - System settings tab in custom manager page - Change the Babel button text by the `babel.displayText` system setting (language, context or combination) - Show all contexts in the Babel button by disabling the `babel.restrictToGroup` system setting -- New snippet property `restrictToGroup` for the BabelLinks snippet. +- New snippet property `restrictToGroup` for the BabelLinks snippet ### Fixed diff --git a/core/components/babel/lexicon/cs/default.inc.php b/core/components/babel/lexicon/cs/default.inc.php index 59e9605..f0ff8fa 100644 --- a/core/components/babel/lexicon/cs/default.inc.php +++ b/core/components/babel/lexicon/cs/default.inc.php @@ -15,19 +15,20 @@ $_lang['babel.contexts'] = 'Kontexty'; $_lang['babel.contexts_desc'] = 'Správa odkazů mezi zdroji v různých kontextech/jazycích na jednom místě. K úpravě odkazů použijte následující tlačítka:'; $_lang['babel.contexts_desc_create'] = 'Vytvoření nového prostředku, který má být propojen'; +$_lang['babel.contexts_desc_create_multiple'] = 'Vytvoření více nových prostředku, který má být propojen'; $_lang['babel.contexts_desc_link'] = 'Odkaz na tento zdroj a související zdroje'; $_lang['babel.contexts_desc_unlink'] = 'Přerušení spojení'; $_lang['babel.contexts_desc_update'] = 'Aktualizace tohoto propojeného zdroje'; $_lang['babel.copy_tv_values'] = 'Zkopírovat synchronizované TV do cílového dokumentu'; +$_lang['babel.create_multiple_translations'] = 'Vytvořit více překladů'; +$_lang['babel.create_multiple_translations_err_no_contexts'] = 'Pro překlad nejsou k dispozici žádné další kontexty.'; +$_lang['babel.create_multiple_translations_finished'] = 'Vytvoření přeložených zdrojů bylo dokončeno.'; $_lang['babel.create_translation'] = 'Vytvořit překlad'; $_lang['babel.create_translation_confirm'] = 'Jste si jisti, že chcete vytvořit nový překlad tohoto zdroje na "[[+context]]" context?'; $_lang['babel.debug_mode'] = 'Debug Mode'; $_lang['babel.desc'] = 'Správa vícejazyčného systému'; -$_lang['babel.target_id'] = 'ID cíle'; $_lang['babel.link_translation'] = 'Odkaz na existující zdroj'; $_lang['babel.open'] = 'Otevřeno'; -$_lang['babel.or'] = '… nebo'; -$_lang['babel.target_pagetitle'] = '... nebo vyhledat název stránky cíle'; $_lang['babel.please_wait'] = 'Počkejte prosím …'; $_lang['babel.reset'] = 'Obnovení'; $_lang['babel.resource_err_from_other_context'] = 'Dokument [[+resource]] neexistuje v kontextu "[[+context]]".'; @@ -39,14 +40,19 @@ $_lang['babel.select_tree_node'] = 'Výběr uzlu ve stromu zdrojů'; $_lang['babel.settings'] = 'Nastavení'; $_lang['babel.settings_desc'] = 'Upravte nastavení aplikace Babel. Hodnotu nastavení systému můžete upravit dvojklikem na buňku tabulky "Hodnota" nebo kliknutím pravým tlačítkem myši do buňky tabulky.'; -$_lang['babel.sync_linked_tranlations'] = 'Synchronizovat všechny překlady z cílového'; +$_lang['babel.sync_linked_tranlations'] = 'Synchronizovat všechny překlady'; +$_lang['babel.sync_linked_tranlations_target'] = 'Synchronizovat všechny překlady z cílového'; $_lang['babel.systemsetting_key_err_nv'] = 'Nastavení lze upravovat pouze s předponou babel.'; $_lang['babel.systemsetting_usergroup_err_nv'] = 'Nastavení mohou měnit pouze uživatelé s oprávněním settings nebo settings_babel.'; +$_lang['babel.target_id'] = 'ID cíle'; +$_lang['babel.target_pagetitle'] = '... nebo vyhledat název stránky cíle'; $_lang['babel.translation_err_could_not_create_resource'] = 'Nastala chyba při vytváření překladu v kontextu [[+context]].'; $_lang['babel.translation_pending'] = '[čeká se na překlad]'; +$_lang['babel.translation_success_create_resource'] = 'V kontextu [[+context]] byl vytvořen přeložený zdroj pro [[+id]].'; $_lang['babel.tv_caption'] = 'Překladové odkazy Babel Translation'; $_lang['babel.tv_description'] = 'Spravováno pluginem Babel. Prosím neměnit!'; $_lang['babel.unlink'] = 'Odpojení'; +$_lang['babel.unlink_all'] = 'Odpojit vše'; $_lang['babel.unlink_all_translations'] = 'Zrušení propojení všech překladů'; $_lang['babel.unlink_all_translations_confirm'] = 'Opravdu chcete zrušit propojení všech překladů z tohoto zdroje?'; $_lang['babel.unlink_translation_confirm'] = 'Jste si jisti, že chcete zrušit propojení překladu z tohoto zdroje na "[[+context]]" kontext?'; diff --git a/core/components/babel/lexicon/cs/properties.inc.php b/core/components/babel/lexicon/cs/properties.inc.php index 3365e00..edf98f9 100644 --- a/core/components/babel/lexicon/cs/properties.inc.php +++ b/core/components/babel/lexicon/cs/properties.inc.php @@ -10,7 +10,7 @@ $_lang['babel.babellinks.activeCls'] = 'CSS třída pro aktivní jazykový odkaz.'; $_lang['babel.babellinks.ignoreSiteStatus'] = 'Příznak, zda ignorovat site_status (když je web offline)'; $_lang['babel.babellinks.includeUnlinked'] = 'Příznak, zda se má zobrazit nepropojený kontext.'; -$_lang['babel.babellinks.resourceId'] = 'Id dokumentu jehož překladové odkazy mají být zobrazeny.'; +$_lang['babel.babellinks.resourceId'] = 'ID dokumentu jehož překladové odkazy mají být zobrazeny.'; $_lang['babel.babellinks.restrictToGroup'] = 'Omezit kontexty v tlačítku Babel na skupinu aktuálního kontextu.'; $_lang['babel.babellinks.showCurrent'] = 'Má se zobrazovat odkaz na aktuální jazykovou mutaci.'; $_lang['babel.babellinks.showUnpublished'] = 'Příznak, zda-li se má zobrazovat i nepublikovaný překlad.'; diff --git a/core/components/babel/lexicon/de/default.inc.php b/core/components/babel/lexicon/de/default.inc.php index 13948d0..1a74b3b 100644 --- a/core/components/babel/lexicon/de/default.inc.php +++ b/core/components/babel/lexicon/de/default.inc.php @@ -11,40 +11,46 @@ $_lang['babel.context_err_invalid_key'] = '[[+context]] ist kein gültiger Kontext-Schlüssel.'; $_lang['babel.context_err_ns'] = 'Der Kontext wurde nicht angegeben.'; $_lang['babel.contexts'] = 'Kontexte'; -$_lang['babel.contexts_desc'] = 'Verwalten Sie die Verknüpfungen zwischen den Ressourcen in verschiedenen Kontexten/Sprachen an einem Ort. Verwenden Sie die folgenden Schaltflächen, um die Verknüpfungen zu bearbeiten:'; -$_lang['babel.contexts_desc_create'] = 'Erstellen Sie eine neue zu verknüpfende Ressource'; -$_lang['babel.contexts_desc_link'] = 'Verknüpfung zu dieser Ressource und den damit verknüpften Ressourcen'; -$_lang['babel.contexts_desc_unlink'] = 'Verknüpfung unterbrechen'; +$_lang['babel.contexts_desc'] = 'Verwalten Sie die Verlinkungen zwischen den Ressourcen in verschiedenen Kontexten/Sprachen an einem Ort. Verwenden Sie die folgenden Schaltflächen, um die Verlinkungen zu bearbeiten:'; +$_lang['babel.contexts_desc_create'] = 'Eine neue verlinkte Ressourcen erstellen'; +$_lang['babel.contexts_desc_create_multiple'] = 'Mehrere neue zu verlinkte Ressourcen erstellen'; +$_lang['babel.contexts_desc_link'] = 'Verlinkung zu dieser Ressource und den damit verlinkten Ressourcen'; +$_lang['babel.contexts_desc_unlink'] = 'Verlinkung unterbrechen'; $_lang['babel.contexts_desc_update'] = 'Aktualisieren Sie diese verlinkte Ressource'; $_lang['babel.copy_tv_values'] = 'Synchronisierte TVs zum Ziel kopieren'; +$_lang['babel.create_multiple_translations'] = 'Mehrere Übersetzungen erstellen'; +$_lang['babel.create_multiple_translations_err_no_contexts'] = 'Keine zusätzlichen Kontexte für die Übersetzung verfügbar.'; +$_lang['babel.create_multiple_translations_finished'] = 'Die Erstellung der übersetzten Ressourcen wurde abgeschlossen.'; $_lang['babel.create_translation'] = 'Übersetzung anlegen'; $_lang['babel.create_translation_confirm'] = 'Sind Sie sicher, dass Sie eine neue Übersetzung für diese Ressource im Kontext "[[+context]]" anlegen möchten?'; $_lang['babel.debug_mode'] = 'Debug Modus'; $_lang['babel.desc'] = 'Verwaltungssystem für mehrsprachige Sites'; -$_lang['babel.target_id'] = 'Ziel-ID'; -$_lang['babel.link_translation'] = 'Mit einer existierenden Ressource verknüpfen'; +$_lang['babel.link_translation'] = 'Mit einer existierenden Ressource verlinken'; $_lang['babel.open'] = 'Öffnen'; -$_lang['babel.or'] = '… oder'; -$_lang['babel.target_pagetitle'] = 'Seitentitel des Ziels'; $_lang['babel.please_wait'] = 'Bitte warten …'; $_lang['babel.reset'] = 'Zurücksetzen'; $_lang['babel.resource_err_from_other_context'] = 'Die Ressource [[+resource]] befindet sich nicht im Kontext "[[+context]]".'; $_lang['babel.resource_err_invalid_id'] = '[[+resource]] ist keine gültige Ressourcen-ID.'; -$_lang['babel.resource_err_link_of_selflink_not_possible'] = 'Eine Verknüpfung mit einer Ressource kann selbst nicht verknüpft werden.'; -$_lang['babel.resource_err_unlink_of_selflink_not_possible'] = 'Die Verknüpfung einer Ressource auf sich selbst kann nicht entfernt werden.'; +$_lang['babel.resource_err_link_of_selflink_not_possible'] = 'Eine Ressource kann nicht mit sich selbst verlinkt werden.'; +$_lang['babel.resource_err_unlink_of_selflink_not_possible'] = 'Die Verlinkung einer Ressource mit sich selbst kann nicht entfernt werden.'; $_lang['babel.search'] = 'Suche …'; $_lang['babel.select_context'] = 'Kontext auswählen'; $_lang['babel.select_tree_node'] = 'Wählen Sie einen Knoten im Ressourcenbaum'; $_lang['babel.settings'] = 'Einstellungen'; $_lang['babel.settings_desc'] = 'Bearbeiten Sie die Einstellungen von Babel. Sie können den Wert einer Systemeinstellung mit einem Doppelklick auf die ‚Wert‘-Tabellenzelle oder die Systemeinstellung mit einem Rechtsklick in der Tabellenzelle bearbeiten.'; $_lang['babel.sync_linked_tranlations'] = 'Alle Übersetzungen synchronisieren'; +$_lang['babel.sync_linked_tranlations_target'] = 'Alle Übersetzungen synchronisieren'; $_lang['babel.systemsetting_key_err_nv'] = 'Sie können nur Einstellungen mit dem Präfix babel bearbeiten.'; $_lang['babel.systemsetting_usergroup_err_nv'] = 'Nur Benutzer mit einer settings Berechtigung oder einer settings_babel Berechtigung können die Einstellungen ändern.'; +$_lang['babel.target_id'] = 'Ziel-ID'; +$_lang['babel.target_pagetitle'] = 'Seitentitel des Ziels'; $_lang['babel.translation_err_could_not_create_resource'] = 'Beim Erstellen der Übersetzung im Kontext [[+context]] ist ein Fehler aufgetreten.'; $_lang['babel.translation_pending'] = '[Übersetzung ausstehend]'; +$_lang['babel.translation_success_create_resource'] = 'Eine übersetzte Ressource für [[+id]] wurde im Kontext [[+context]] erstellt.'; $_lang['babel.tv_caption'] = 'Babel-Übersetzungslinks'; $_lang['babel.tv_description'] = 'Wird vom Babel-Plugin verwaltet. Bitte nicht ändern!'; -$_lang['babel.unlink'] = 'Verknüpfung lösen'; -$_lang['babel.unlink_all_translations'] = 'Verknüpfungen aller Übersetzungen lösen'; -$_lang['babel.unlink_all_translations_confirm'] = 'Sind Sie sicher, dass Sie die Verknüpfungen aller Übersetzungen von dieser Ressource lösen möchten?'; -$_lang['babel.unlink_translation_confirm'] = 'Sind Sie sicher, dass Sie die Verknüpfung der Übersetzung im Kontext "[[+context]]" von dieser Ressource lösen möchten?'; +$_lang['babel.unlink'] = 'Verlinkung entfernen'; +$_lang['babel.unlink_all'] = 'Alle Verlinkungen entfernen'; +$_lang['babel.unlink_all_translations'] = 'Verlinkungen aller Übersetzungen entfernen'; +$_lang['babel.unlink_all_translations_confirm'] = 'Sind Sie sicher, dass Sie die Verlinkungen aller Übersetzungen von dieser Ressource entfernen möchten?'; +$_lang['babel.unlink_translation_confirm'] = 'Sind Sie sicher, dass Sie die Verlinkung der Übersetzung im Kontext "[[+context]]" von dieser Ressource entfernen möchten?'; diff --git a/core/components/babel/lexicon/en/default.inc.php b/core/components/babel/lexicon/en/default.inc.php index 0af8470..bf97c3b 100644 --- a/core/components/babel/lexicon/en/default.inc.php +++ b/core/components/babel/lexicon/en/default.inc.php @@ -13,18 +13,20 @@ $_lang['babel.contexts'] = 'Contexts'; $_lang['babel.contexts_desc'] = 'Manage the links between the resources in different contexts/languages in one place. Use the following buttons to edit the links:'; $_lang['babel.contexts_desc_create'] = 'Create a new resource to be linked'; +$_lang['babel.contexts_desc_create_multiple'] = 'Create multiple new resources to be linked'; $_lang['babel.contexts_desc_link'] = 'Link to this resource and its linked resources'; $_lang['babel.contexts_desc_unlink'] = 'Break link'; $_lang['babel.contexts_desc_update'] = 'Update this linked resource'; $_lang['babel.copy_tv_values'] = 'Copy synchronized TVs to target'; +$_lang['babel.create_multiple_translations'] = 'Create multiple translations'; +$_lang['babel.create_multiple_translations_err_no_contexts'] = 'No additional contexts available for translation.'; +$_lang['babel.create_multiple_translations_finished'] = 'The creation of the translated resources was finished.'; $_lang['babel.create_translation'] = 'Create translation'; -$_lang['babel.create_translation_confirm'] = 'Are you sure you want to create new translation for this resource to "[[+context]]" context?'; +$_lang['babel.create_translation_confirm'] = 'Are you sure you want to create a new translation for this resource to the "[[+context]]" context?'; $_lang['babel.debug_mode'] = 'Debug Mode'; $_lang['babel.desc'] = 'Managing multilingual system'; -$_lang['babel.target_id'] = 'Target ID'; $_lang['babel.link_translation'] = 'Link to existing resource'; $_lang['babel.open'] = 'Open'; -$_lang['babel.target_pagetitle'] = '… or search for the pagetitle of the target'; $_lang['babel.please_wait'] = 'Please wait …'; $_lang['babel.reset'] = 'Reset'; $_lang['babel.resource_err_from_other_context'] = 'Resource [[+resource]] does not exist in context "[[+context]]".'; @@ -36,14 +38,19 @@ $_lang['babel.select_tree_node'] = 'Select a node in the resource tree'; $_lang['babel.settings'] = 'Settings'; $_lang['babel.settings_desc'] = 'Edit the settings of Babel. You can edit the value of a system setting by double-clicking the ‘Value’ table cell or by right-clicking in the table cell.'; -$_lang['babel.sync_linked_tranlations'] = 'Synchronize all translations from the target'; +$_lang['babel.sync_linked_tranlations'] = 'Synchronize all translations'; +$_lang['babel.sync_linked_tranlations_target'] = 'Synchronize all translations from the target'; $_lang['babel.systemsetting_key_err_nv'] = 'You can only edit settings with the prefix babel.'; $_lang['babel.systemsetting_usergroup_err_nv'] = 'Only users with a settings permission or settings_babel permission can change the settings.'; +$_lang['babel.target_id'] = 'Target ID'; +$_lang['babel.target_pagetitle'] = '… or search for the pagetitle of the target'; $_lang['babel.translation_err_could_not_create_resource'] = 'An error occured while trying to create a translation in context [[+context]].'; $_lang['babel.translation_pending'] = '[translations pending]'; +$_lang['babel.translation_success_create_resource'] = 'A translated resource for [[+id]] was created in context [[+context]].'; $_lang['babel.tv_caption'] = 'Babel Translation Links'; $_lang['babel.tv_description'] = 'Maintained by Babel plugin. Please do not change!'; $_lang['babel.unlink'] = 'Unlink'; +$_lang['babel.unlink_all'] = 'Unlink all'; $_lang['babel.unlink_all_translations'] = 'Unlink all translations'; $_lang['babel.unlink_all_translations_confirm'] = 'Are you sure you want to unlink all translations from this resource?'; $_lang['babel.unlink_translation_confirm'] = 'Are you sure you want to unlink translation from this resource to "[[+context]]" context?'; diff --git a/core/components/babel/lexicon/en/properties.inc.php b/core/components/babel/lexicon/en/properties.inc.php index 5f9d539..72e5f2a 100644 --- a/core/components/babel/lexicon/en/properties.inc.php +++ b/core/components/babel/lexicon/en/properties.inc.php @@ -8,7 +8,7 @@ $_lang['babel.babellinks.activeCls'] = 'CSS class for the active language link.'; $_lang['babel.babellinks.ignoreSiteStatus'] = 'Flag whether to ignore the site_status (when the site is offline)'; $_lang['babel.babellinks.includeUnlinked'] = 'Flag whether to show unlinked context.'; -$_lang['babel.babellinks.resourceId'] = 'Id of resource of which links to translations should be displayed.'; +$_lang['babel.babellinks.resourceId'] = 'ID of resource of which links to translations should be displayed.'; $_lang['babel.babellinks.restrictToGroup'] = 'Restrict the contexts in the snippet output to the group of the current context.'; $_lang['babel.babellinks.showCurrent'] = 'Flag whether to show a link to a translation of the current language.'; $_lang['babel.babellinks.showUnpublished'] = 'Flag whether to show unpublished translations.'; diff --git a/core/components/babel/lexicon/fr/default.inc.php b/core/components/babel/lexicon/fr/default.inc.php index 9ca968e..34ae8ef 100644 --- a/core/components/babel/lexicon/fr/default.inc.php +++ b/core/components/babel/lexicon/fr/default.inc.php @@ -13,19 +13,20 @@ $_lang['babel.contexts'] = 'Contextes'; $_lang['babel.contexts_desc'] = 'Gérer les liens entre les ressources dans différents contextes/langues en un seul endroit. Utilisez les boutons suivants pour modifier les liens :'; $_lang['babel.contexts_desc_create'] = 'Créer une nouvelle ressource à lier'; +$_lang['babel.contexts_desc_create_multiple'] = 'Créer plusieurs nouvelles ressources à lier'; $_lang['babel.contexts_desc_link'] = 'Lien vers cette ressource et ses ressources liées'; $_lang['babel.contexts_desc_unlink'] = 'Interrompre le lien'; $_lang['babel.contexts_desc_update'] = 'Mettre à jour cette ressource liée'; $_lang['babel.copy_tv_values'] = 'Copie des TV synchronisées vers la cible'; +$_lang['babel.create_multiple_translations'] = 'Créer des traductions multiples'; +$_lang['babel.create_multiple_translations_err_no_contexts'] = 'Aucun contexte supplémentaire disponible pour la traduction.'; +$_lang['babel.create_multiple_translations_finished'] = 'La création des ressources traduites est terminée.'; $_lang['babel.create_translation'] = 'Créer une traduction'; -$_lang['babel.create_translation_confirm'] = 'Êtes-vous sûr de vouloir créer une nouvelle traduction pour cette ressource vers "[[+contexte]]" context ?'; +$_lang['babel.create_translation_confirm'] = 'Êtes-vous sûr de vouloir créer une nouvelle traduction pour cette ressource vers "[[+context]]" context ?'; $_lang['babel.debug_mode'] = 'Mode débogage'; $_lang['babel.desc'] = 'Gestion d\'un système multilingue'; -$_lang['babel.target_id'] = 'ID de la cible'; $_lang['babel.link_translation'] = 'Lien vers une ressource existante'; $_lang['babel.open'] = 'Ouvrir'; -$_lang['babel.or'] = '… ou'; -$_lang['babel.target_pagetitle'] = '... ou rechercher le titre de la page de la cible'; $_lang['babel.please_wait'] = 'Veuillez patienter …'; $_lang['babel.reset'] = 'Réinitialiser'; $_lang['babel.resource_err_from_other_context'] = 'La ressource [[+resource]] n\'existe pas dans le context "[[+context]]".'; @@ -37,14 +38,19 @@ $_lang['babel.select_tree_node'] = 'Sélectionner un nœud dans l\'arborescence des ressources'; $_lang['babel.settings'] = 'Paramètres'; $_lang['babel.settings_desc'] = 'Modifier les paramètres de Babel. Vous pouvez modifier la valeur d’un paramètre du système en double-cliquant sur la cellule du tableau ou en cliquant avec le bouton droit de la souris sur la cellule.'; -$_lang['babel.sync_linked_tranlations'] = 'Synchroniser toutes les traductions de la cible'; +$_lang['babel.sync_linked_tranlations'] = 'Synchroniser toutes les traductions'; +$_lang['babel.sync_linked_tranlations_target'] = 'Synchroniser toutes les traductions de la cible'; $_lang['babel.systemsetting_key_err_nv'] = 'Vous ne pouvez modifier les paramètres qu’avec le préfixe babel.'; $_lang['babel.systemsetting_usergroup_err_nv'] = 'Seuls les utilisateurs disposant d\'une autorisation settings ou settings_babel peuvent modifier les paramètres.'; +$_lang['babel.target_id'] = 'ID de la cible'; +$_lang['babel.target_pagetitle'] = '... ou rechercher le titre de la page de la cible'; $_lang['babel.translation_err_could_not_create_resource'] = 'Une erreur est survenue lors de la création de traduction dans le contexte [[+context]].'; $_lang['babel.translation_pending'] = '[traduction en attente]'; +$_lang['babel.translation_success_create_resource'] = 'Une ressource traduite pour [[+id]] a été créée dans le contexte [[+context]].'; $_lang['babel.tv_caption'] = 'Liens de traduction de Babel'; $_lang['babel.tv_description'] = 'Mis à jour par le plugin Babel. Veuillez ne pas modifier !'; $_lang['babel.unlink'] = 'Détacher'; +$_lang['babel.unlink_all'] = 'Détacher tous'; $_lang['babel.unlink_all_translations'] = 'Détacher toutes les traductions'; $_lang['babel.unlink_all_translations_confirm'] = 'Êtes-vous sûr de vouloir dissocier toutes les traductions de cette ressource ?'; -$_lang['babel.unlink_translation_confirm'] = 'Êtes-vous sûr de vouloir dissocier la traduction de cette ressource du contexte "[[+contexte]]" ?'; +$_lang['babel.unlink_translation_confirm'] = 'Êtes-vous sûr de vouloir dissocier la traduction de cette ressource du contexte "[[+context]]" ?'; diff --git a/core/components/babel/lexicon/fr/properties.inc.php b/core/components/babel/lexicon/fr/properties.inc.php index 81e21a4..8aae1ea 100644 --- a/core/components/babel/lexicon/fr/properties.inc.php +++ b/core/components/babel/lexicon/fr/properties.inc.php @@ -8,7 +8,7 @@ $_lang['babel.babellinks.activeCls'] = 'Classe CSS pour les liens de la langue active.'; $_lang['babel.babellinks.ignoreSiteStatus'] = 'Drapeau indiquant s\'il faut ignorer le site_status (lorsque le site est hors ligne)'; $_lang['babel.babellinks.includeUnlinked'] = 'Indique s\'il faut afficher le contexte non lié.'; -$_lang['babel.babellinks.resourceId'] = 'Id de la ressource dont les liens vers les traductions doivent être affichés.'; +$_lang['babel.babellinks.resourceId'] = 'ID de la ressource dont les liens vers les traductions doivent être affichés.'; $_lang['babel.babellinks.restrictToGroup'] = 'Restreindre les contextes dans la sortie du snippet au groupe du contexte actuel.'; $_lang['babel.babellinks.showCurrent'] = 'Indicateur permettant d\'afficher ou non un lien vers une traduction de la langue actuelle.'; $_lang['babel.babellinks.showUnpublished'] = 'Indique s\'il faut afficher les traductions non publiées.'; diff --git a/core/components/babel/lexicon/it/default.inc.php b/core/components/babel/lexicon/it/default.inc.php index 7db758d..78129a0 100644 --- a/core/components/babel/lexicon/it/default.inc.php +++ b/core/components/babel/lexicon/it/default.inc.php @@ -13,19 +13,20 @@ $_lang['babel.contexts'] = 'Contexts'; $_lang['babel.contexts_desc'] = 'Gestire i collegamenti tra le risorse in diversi contesti/lingue in un unico posto. Utilizzate i seguenti pulsanti per modificare i collegamenti:'; $_lang['babel.contexts_desc_create'] = 'Creare una nuova risorsa da collegare'; +$_lang['babel.contexts_desc_create_multiple'] = 'Creare più nuove risorse da collegare'; $_lang['babel.contexts_desc_link'] = 'Collegamento a questa risorsa e alle risorse ad essa collegate'; $_lang['babel.contexts_desc_unlink'] = 'Interrompere il collegamento'; $_lang['babel.contexts_desc_update'] = 'Aggiornare questa risorsa collegata'; $_lang['babel.copy_tv_values'] = 'Copia le TVs sincronizzate alla destinazione'; +$_lang['babel.create_multiple_translations'] = 'Crea traduzioni multiple'; +$_lang['babel.create_multiple_translations_err_no_contexts'] = 'Nessun contesto aggiuntivo disponibile per la traduzione.'; +$_lang['babel.create_multiple_translations_finished'] = 'La creazione delle risorse tradotte è stata completata.'; $_lang['babel.create_translation'] = 'Crea traduzione'; -$_lang['babel.create_translation_confirm'] = 'Si è sicuri di voler creare una nuova traduzione per questa risorsa a "[[+context]]" contesto?'; +$_lang['babel.create_translation_confirm'] = 'Sei sicuro di voler creare una nuova traduzione per questa risorsa nel contesto "[[+context]]"?'; $_lang['babel.debug_mode'] = 'Debug Mode'; $_lang['babel.desc'] = 'Gestione di un sistema multilingue'; -$_lang['babel.target_id'] = 'ID di destinazione'; $_lang['babel.link_translation'] = 'Collegamento alla risorsa esistente'; $_lang['babel.open'] = 'Aperto'; -$_lang['babel.or'] = '… o'; -$_lang['babel.target_pagetitle'] = 'Titolo della pagina di destinazione'; $_lang['babel.please_wait'] = 'Attendere …'; $_lang['babel.reset'] = 'Reset'; $_lang['babel.resource_err_from_other_context'] = 'La risorsa [[+resource]] non esiste nel contesto "[[+context]]".'; @@ -37,14 +38,19 @@ $_lang['babel.select_tree_node'] = 'Selezionare un nodo nell\'albero delle risorse'; $_lang['babel.settings'] = 'Impostazioni'; $_lang['babel.settings_desc'] = 'Modifica delle impostazioni di Babel. È possibile modificare il valore di un\'impostazione di sistema facendo doppio clic sulla cella della tabella \'Valore\' o facendo clic con il pulsante destro del mouse sulla cella della tabella.'; -$_lang['babel.sync_linked_tranlations'] = 'Sincronizzare tutte le traduzioni dalla destinazione'; +$_lang['babel.sync_linked_tranlations'] = 'Sincronizzare tutte le traduzioni'; +$_lang['babel.sync_linked_tranlations_target'] = 'Sincronizzare tutte le traduzioni dalla destinazione'; $_lang['babel.systemsetting_key_err_nv'] = 'È possibile modificare solo le impostazioni con il prefisso babel.'; $_lang['babel.systemsetting_usergroup_err_nv'] = 'Solo gli utenti con l\'autorizzazione settings o settings_babel possono modificare le impostazioni.'; +$_lang['babel.target_id'] = 'ID di destinazione'; +$_lang['babel.target_pagetitle'] = 'Titolo della pagina di destinazione'; $_lang['babel.translation_err_could_not_create_resource'] = 'Si è verificato un errore durante la creazione della traduzione nel contesto [[+context]].'; $_lang['babel.translation_pending'] = '[traduzione in sospeso]'; +$_lang['babel.translation_success_create_resource'] = 'Una risorsa tradotta per [[+id]] è stata creata nel contesto [[+context]].'; $_lang['babel.tv_caption'] = 'Links Traduzioni Babel'; $_lang['babel.tv_description'] = 'Gestito dal plugin di Babel. Si prega di non cambiarlo!'; $_lang['babel.unlink'] = 'Unlink'; +$_lang['babel.unlink_all'] = 'Scollega tutti i link'; $_lang['babel.unlink_all_translations'] = 'Scollegamento di tutte le traduzioni'; $_lang['babel.unlink_all_translations_confirm'] = 'Siete sicuri di voler scollegare tutte le traduzioni da questa risorsa?'; -$_lang['babel.unlink_translation_confirm'] = 'Si è sicuri di voler scollegare la traduzione da questa risorsa a "[[+contesto]]" contesto?'; +$_lang['babel.unlink_translation_confirm'] = 'Si è sicuri di voler scollegare la traduzione da questa risorsa a "[[+context]]" contesto?'; diff --git a/core/components/babel/lexicon/it/properties.inc.php b/core/components/babel/lexicon/it/properties.inc.php index 87be333..e00f331 100644 --- a/core/components/babel/lexicon/it/properties.inc.php +++ b/core/components/babel/lexicon/it/properties.inc.php @@ -8,8 +8,8 @@ $_lang['babel.babellinks.activeCls'] = 'Classe CSS per il link della lingua attiva.'; $_lang['babel.babellinks.ignoreSiteStatus'] = 'Contrassegno se ignorare il site_status (quando il sito è offline)'; $_lang['babel.babellinks.includeUnlinked'] = 'Contrassegnare se mostrare il contesto non collegato.'; -$_lang['babel.babellinks.resourceId'] = 'Id della risorsa i cui links alla traduzione dovrebbero essere mostrati.'; -$_lang['babel.babellinks.restrictToGroup'] = 'Limita i contesti nell\'output dello snippet al gruppo del contesto corrente'; +$_lang['babel.babellinks.resourceId'] = 'ID della risorsa i cui links alla traduzione dovrebbero essere mostrati.'; +$_lang['babel.babellinks.restrictToGroup'] = 'Limita i contesti nell\'output dello snippet al gruppo del contesto corrente.'; $_lang['babel.babellinks.showCurrent'] = 'Flag se mostrare un link alla traduzione per la lingua corrente.'; $_lang['babel.babellinks.showUnpublished'] = 'Flag se mostrare le traduzioni non pubblicate.'; $_lang['babel.babellinks.toArray'] = 'Flag per decidere se scaricare l\'output come array.'; diff --git a/core/components/babel/lexicon/nl/default.inc.php b/core/components/babel/lexicon/nl/default.inc.php index 76e3d94..aa1205e 100644 --- a/core/components/babel/lexicon/nl/default.inc.php +++ b/core/components/babel/lexicon/nl/default.inc.php @@ -15,19 +15,20 @@ $_lang['babel.contexts'] = 'Contexten'; $_lang['babel.contexts_desc'] = 'Beheer de links tussen de bronnen in verschillende contexten/talen op één plek. Gebruik de volgende knoppen om de links te bewerken:'; $_lang['babel.contexts_desc_create'] = 'Maak een nieuwe bron aan die moet worden gekoppeld'; +$_lang['babel.contexts_desc_create_multiple'] = 'Meerdere nieuwe bronnen maken om te koppelen'; $_lang['babel.contexts_desc_link'] = 'Link naar deze bron en de gekoppelde bronnen'; $_lang['babel.contexts_desc_unlink'] = 'Verbinding verbreken'; $_lang['babel.contexts_desc_update'] = 'Werk deze gekoppelde bron bij'; $_lang['babel.copy_tv_values'] = 'Kopieer template variabelen naar geselecteerde pagina'; +$_lang['babel.create_multiple_translations'] = 'Meerdere vertalingen maken'; +$_lang['babel.create_multiple_translations_err_no_contexts'] = 'Geen extra contexten beschikbaar voor vertaling.'; +$_lang['babel.create_multiple_translations_finished'] = 'Het aanmaken van de vertaalde bronnen is voltooid.'; $_lang['babel.create_translation'] = 'Maak vertaling'; $_lang['babel.create_translation_confirm'] = 'Weet je zeker dat je een nieuwe vertaling van deze pagina wil toevoegen in de "[[+context]]" channel?'; $_lang['babel.debug_mode'] = 'Debug Mode'; $_lang['babel.desc'] = 'Meertalig systeem beheren'; -$_lang['babel.target_id'] = 'Doel-ID'; $_lang['babel.link_translation'] = 'Koppelen aan bestaande pagina'; $_lang['babel.open'] = 'Openen'; -$_lang['babel.or'] = '… of'; -$_lang['babel.target_pagetitle'] = '... of zoek naar de paginatitel van het doelwit'; $_lang['babel.please_wait'] = 'Even wachten …'; $_lang['babel.reset'] = 'Reset'; $_lang['babel.resource_err_from_other_context'] = 'Resource [[+resource]] bestaat niet in channel "[[+context]]".'; @@ -39,14 +40,19 @@ $_lang['babel.select_tree_node'] = 'Selecteer een knooppunt in de boomstructuur'; $_lang['babel.settings'] = 'Instellingen'; $_lang['babel.settings_desc'] = 'De instellingen van Babel bewerken. Je kunt de waarde van een systeeminstelling bewerken door te dubbelklikken op de tabelcel \'Waarde\' of door rechts te klikken in de tabelcel.'; -$_lang['babel.sync_linked_tranlations'] = 'Alle vertalingen van het doel synchroniseren'; +$_lang['babel.sync_linked_tranlations'] = 'Alle vertalingen synchroniseren'; +$_lang['babel.sync_linked_tranlations_target'] = 'Alle vertalingen van het doel synchroniseren'; $_lang['babel.systemsetting_key_err_nv'] = 'Je kunt alleen instellingen bewerken met het voorvoegsel babel.'; $_lang['babel.systemsetting_usergroup_err_nv'] = 'Alleen gebruikers met de rechten settings of settings_babel kunnen de instellingen wijzigen.'; +$_lang['babel.target_id'] = 'Doel-ID'; +$_lang['babel.target_pagetitle'] = '... of zoek naar de paginatitel van het doelwit'; $_lang['babel.translation_err_could_not_create_resource'] = 'Er is een fout opgetreden tijdens het maken van een vertaling in channel [[+context]].'; $_lang['babel.translation_pending'] = '[in afwachting van vertaling]'; +$_lang['babel.translation_success_create_resource'] = 'Er is een vertaalde bron voor [[+id]] gemaakt in context [[+context]].'; $_lang['babel.tv_caption'] = 'Babel Vertaal Links'; $_lang['babel.tv_description'] = 'Onderhouden door Babel plugin. Gelieve niet te veranderen!'; $_lang['babel.unlink'] = 'Verwijder'; -$_lang['babel.unlink_all_translations'] = 'Alle vertalingen ontkoppelen'; +$_lang['babel.unlink_all'] = 'Alles verwijderen'; +$_lang['babel.unlink_all_translations'] = 'Alle vertalingen verwijderen'; $_lang['babel.unlink_all_translations_confirm'] = 'Weet je zeker dat je alle vertalingen uit deze bron wilt verwijderen?'; $_lang['babel.unlink_translation_confirm'] = 'Weet je zeker dat je deze vertaling wil verwijderen van deze pagina in de "[[+context]]" channel?'; diff --git a/core/components/babel/lexicon/nl/properties.inc.php b/core/components/babel/lexicon/nl/properties.inc.php index b424f9c..6744fc0 100644 --- a/core/components/babel/lexicon/nl/properties.inc.php +++ b/core/components/babel/lexicon/nl/properties.inc.php @@ -10,7 +10,7 @@ $_lang['babel.babellinks.activeCls'] = 'CSS class voor de actieve taal link.'; $_lang['babel.babellinks.ignoreSiteStatus'] = 'Vlag of de site_status moet worden genegeerd (als de site offline is)'; $_lang['babel.babellinks.includeUnlinked'] = 'Vlag of niet-gelinkte context moet worden weergegeven.'; -$_lang['babel.babellinks.resourceId'] = 'Id van resource waarvan link naar vertaling moeten worden weergegeven.'; +$_lang['babel.babellinks.resourceId'] = 'ID van resource waarvan link naar vertaling moeten worden weergegeven.'; $_lang['babel.babellinks.restrictToGroup'] = "Beperk de contexten in de knipseluitvoer tot de groep van de huidige context."; $_lang['babel.babellinks.showCurrent'] = 'Wel of niet tonen van link naar vertaling van de huidige taal.'; $_lang['babel.babellinks.showUnpublished'] = 'Wel of niet tonen van ongepubliceerde vertalingen.'; diff --git a/core/components/babel/lexicon/pl/default.inc.php b/core/components/babel/lexicon/pl/default.inc.php index 8b70655..d00d9c2 100644 --- a/core/components/babel/lexicon/pl/default.inc.php +++ b/core/components/babel/lexicon/pl/default.inc.php @@ -15,19 +15,20 @@ $_lang['babel.contexts'] = 'Konteksty'; $_lang['babel.contexts_desc'] = 'Zarządzaj linkami między zasobami w różnych kontekstach/językach w jednym miejscu. Użyj poniższych przycisków, aby edytować linki:'; $_lang['babel.contexts_desc_create'] = 'Utwórz nowy zasób do połączenia'; +$_lang['babel.contexts_desc_create_multiple'] = 'Tworzenie wielu nowych zasobów do połączenia'; $_lang['babel.contexts_desc_link'] = 'Link do tego zasobu i powiązanych z nim zasobów'; $_lang['babel.contexts_desc_unlink'] = 'Przerwać połączenie'; $_lang['babel.contexts_desc_update'] = 'Zaktualizuj ten powiązany zasób'; $_lang['babel.copy_tv_values'] = 'Skopiuj wartości synchronizowanych zmiennych szablonu (TV) do zasobu docelowego'; +$_lang['babel.create_multiple_translations'] = 'Utwórz wiele tłumaczeń'; +$_lang['babel.create_multiple_translations_err_no_contexts'] = 'Brak dodatkowych kontekstów dostępnych dla tłumaczenia.'; +$_lang['babel.create_multiple_translations_finished'] = 'Tworzenie przetłumaczonych zasobów zostało zakończone.'; $_lang['babel.create_translation'] = 'Utwórz tłumaczenie'; $_lang['babel.create_translation_confirm'] = 'Czy jesteś pewien, że chcesz stworzyć nowe tłumaczenie tego zasobu dla kontekstu "[[+context]]"?'; $_lang['babel.debug_mode'] = 'Tryb debugowania'; $_lang['babel.desc'] = 'Zarządzanie systemem wielojęzycznym'; -$_lang['babel.target_id'] = 'ID zasobu docelowego'; $_lang['babel.link_translation'] = 'Połącz z istniejącym zasobem'; $_lang['babel.open'] = 'Otwórz'; -$_lang['babel.or'] = '… lub'; -$_lang['babel.target_pagetitle'] = 'Tytuł strony docelowej'; $_lang['babel.please_wait'] = 'Proszę czekać …'; $_lang['babel.reset'] = 'Reset'; $_lang['babel.resource_err_from_other_context'] = 'Zasób [[+resource]] nie istnieje dla kontekstu "[[+context]]".'; @@ -39,14 +40,19 @@ $_lang['babel.select_tree_node'] = 'Wybierz węzeł w drzewie zasobów'; $_lang['babel.settings'] = 'Ustawienia'; $_lang['babel.settings_desc'] = 'Edycja ustawień Babel. Wartość ustawienia systemowego można edytować, klikając dwukrotnie komórkę tabeli "Wartość" lub klikając prawym przyciskiem myszy komórkę tabeli.'; -$_lang['babel.sync_linked_tranlations'] = 'Synchronizacja wszystkich tłumaczeń z pliku docelowego'; +$_lang['babel.sync_linked_tranlations'] = 'Synchronizacja wszystkich tłumaczeń'; +$_lang['babel.sync_linked_tranlations_target'] = 'Synchronizacja wszystkich tłumaczeń z pliku docelowego'; $_lang['babel.systemsetting_key_err_nv'] = 'Edytować można tylko ustawienia z przedrostkiem babel.'; $_lang['babel.systemsetting_usergroup_err_nv'] = 'Tylko użytkownicy z uprawnieniami settings lub settings_babel mogą zmieniać ustawienia.'; +$_lang['babel.target_id'] = 'ID zasobu docelowego'; +$_lang['babel.target_pagetitle'] = 'Tytuł strony docelowej'; $_lang['babel.translation_err_could_not_create_resource'] = 'Wystąpił błąd podczas próby utworzenia tłumaczenia dla kontekstu [[+context]].'; $_lang['babel.translation_pending'] = '[wymaga przetłumaczenia]'; +$_lang['babel.translation_success_create_resource'] = 'Przetłumaczony zasób dla [[+id]] został utworzony w kontekście [[+context]].'; $_lang['babel.tv_caption'] = 'Łącza do tłumaczeń Babel'; $_lang['babel.tv_description'] = 'Zarządzane przez wtyczkę Babel. Proszę nie modyfikować!'; $_lang['babel.unlink'] = 'Odłącz'; +$_lang['babel.unlink_all'] = 'Usuń wszystko'; $_lang['babel.unlink_all_translations'] = 'Odłącz wszystkie tłumaczenia'; $_lang['babel.unlink_all_translations_confirm'] = 'Czy na pewno chcesz usunąć wszystkie tłumaczenia z tego zasobu?'; $_lang['babel.unlink_translation_confirm'] = 'Czy jesteś pewien, że chcesz odłączyć tłumaczenie tego zasobu dla kontekstu "[[+context]]"?'; diff --git a/core/components/babel/lexicon/pl/properties.inc.php b/core/components/babel/lexicon/pl/properties.inc.php index 3adc89c..6b9ed3c 100644 --- a/core/components/babel/lexicon/pl/properties.inc.php +++ b/core/components/babel/lexicon/pl/properties.inc.php @@ -11,7 +11,7 @@ $_lang['babel.babellinks.ignoreSiteStatus'] = 'Flaga, czy ignorować site_status (gdy witryna jest w trybie offline)'; $_lang['babel.babellinks.includeUnlinked'] = 'Pokazuj odłączone konteksty.'; $_lang['babel.babellinks.resourceId'] = 'ID zasobu, dla którego wyświetlać łącza przetłumaczonych wersji.'; -$_lang['babel.babellinks.restrictToGroup'] = 'Ogranicz konteksty w wyjściu snippetu do grupy bieżącego kontekstu'; +$_lang['babel.babellinks.restrictToGroup'] = 'Ogranicz konteksty w wyjściu snippetu do grupy bieżącego kontekstu.'; $_lang['babel.babellinks.showCurrent'] = 'Wyświetl łącze do aktywnego języka.'; $_lang['babel.babellinks.showUnpublished'] = 'Pokazuj nieopublikowane tłumaczenia.'; $_lang['babel.babellinks.toArray'] = 'Flaga określająca, czy zamiast tego dane wyjściowe mają być zrzucane jako tablica.'; diff --git a/core/components/babel/lexicon/pt-br/default.inc.php b/core/components/babel/lexicon/pt-br/default.inc.php index a5bd7aa..e6dc9f8 100644 --- a/core/components/babel/lexicon/pt-br/default.inc.php +++ b/core/components/babel/lexicon/pt-br/default.inc.php @@ -15,19 +15,20 @@ $_lang['babel.contexts'] = 'Contextos'; $_lang['babel.contexts_desc'] = 'Gerencie os links entre os recursos em diferentes contextos/idiomas em um só lugar. Use os botões a seguir para editar os links:'; $_lang['babel.contexts_desc_create'] = 'Criar um novo recurso a ser vinculado'; +$_lang['babel.contexts_desc_create_multiple'] = 'Criar vários recursos novos para serem vinculados'; $_lang['babel.contexts_desc_link'] = 'Link para este recurso e seus recursos vinculados'; $_lang['babel.contexts_desc_unlink'] = 'Quebrar o link'; $_lang['babel.contexts_desc_update'] = 'Atualizar este recurso vinculado'; $_lang['babel.copy_tv_values'] = 'Copiar TVs sincronizados para o destino'; +$_lang['babel.create_multiple_translations'] = 'Criar várias traduções'; +$_lang['babel.create_multiple_translations_err_no_contexts'] = 'Não há contextos adicionais disponíveis para tradução.'; +$_lang['babel.create_multiple_translations_finished'] = 'A criação dos recursos traduzidos foi concluída.'; $_lang['babel.create_translation'] = 'Criar tradução'; $_lang['babel.create_translation_confirm'] = 'Tem a certeza de que deseja criar uma nova tradução para esta página (recurso) para o contexto "[[+context]]"?'; $_lang['babel.debug_mode'] = 'Modo de depuração'; $_lang['babel.desc'] = 'Gerir sistema multilingue'; -$_lang['babel.target_id'] = 'ID do destino'; $_lang['babel.link_translation'] = 'Ligar a página (recurso) existente'; $_lang['babel.open'] = 'Abrir'; -$_lang['babel.or'] = '… ou'; -$_lang['babel.target_pagetitle'] = '... ou pesquisar o título da página de destino'; $_lang['babel.please_wait'] = 'Por favor, aguarde …'; $_lang['babel.reset'] = 'Repor'; $_lang['babel.resource_err_from_other_context'] = 'A Página (recurso) [[+resource]] não existe no contexto "[[+context]]".'; @@ -39,14 +40,19 @@ $_lang['babel.select_tree_node'] = 'Selecione um nó na árvore de recursos'; $_lang['babel.settings'] = 'Configurações'; $_lang['babel.settings_desc'] = 'Editar as configurações do Babel. Você pode editar o valor de uma configuração do sistema clicando duas vezes na célula da tabela "Valor" ou clicando com o botão direito do mouse na célula da tabela.'; -$_lang['babel.sync_linked_tranlations'] = 'Sincronizar todas as traduções a partir do destino'; +$_lang['babel.sync_linked_tranlations'] = 'Sincronizar todas as traduções'; +$_lang['babel.sync_linked_tranlations_target'] = 'Sincronizar todas as traduções a partir do destino'; $_lang['babel.systemsetting_key_err_nv'] = 'Você só pode editar configurações com o prefixo babel.'; $_lang['babel.systemsetting_usergroup_err_nv'] = 'Somente usuários com a permissão settings ou settings_babel podem alterar as configurações.'; +$_lang['babel.target_id'] = 'ID do destino'; +$_lang['babel.target_pagetitle'] = '... ou pesquisar o título da página de destino'; $_lang['babel.translation_err_could_not_create_resource'] = 'Ocorreu um erro ao tentar criar uma tradução no contexto [[+context]].'; $_lang['babel.translation_pending'] = '[traduções pendentes]'; +$_lang['babel.translation_success_create_resource'] = 'Um recurso traduzido para [[+id]] foi criado no contexto [[+context]].'; $_lang['babel.tv_caption'] = 'Ligações de Tradução do Babel'; $_lang['babel.tv_description'] = 'Gerido pelo plugin Babel. Por favor, não modificar!'; $_lang['babel.unlink'] = 'Separar'; +$_lang['babel.unlink_all'] = 'Separar tudo'; $_lang['babel.unlink_all_translations'] = 'Separar todas as traduções'; $_lang['babel.unlink_all_translations_confirm'] = 'Tem a certeza de que deseja separar todas as traduções para esta página (recurso)?'; $_lang['babel.unlink_translation_confirm'] = 'Tem a certeza de que deseja separar a tradução para esta página (recurso) para o contexto "[[+context]]"?'; diff --git a/core/components/babel/lexicon/pt-br/properties.inc.php b/core/components/babel/lexicon/pt-br/properties.inc.php index d001458..761d77e 100644 --- a/core/components/babel/lexicon/pt-br/properties.inc.php +++ b/core/components/babel/lexicon/pt-br/properties.inc.php @@ -10,7 +10,7 @@ $_lang['babel.babellinks.activeCls'] = 'Classe de CSS para a hiperligação da língua ativa.'; $_lang['babel.babellinks.ignoreSiteStatus'] = 'Sinalizador para ignorar ou não o site_status (quando o site estiver off-line)'; $_lang['babel.babellinks.includeUnlinked'] = 'Indicar se deseja apresentar contextos sem associação.'; -$_lang['babel.babellinks.resourceId'] = 'Id da página (recurso) para a qual as hiperligações das traduções devam ser apresentadas.'; +$_lang['babel.babellinks.resourceId'] = 'ID da página (recurso) para a qual as hiperligações das traduções devam ser apresentadas.'; $_lang['babel.babellinks.restrictToGroup'] = 'Restringir os contextos na saída do snippet ao grupo do contexto atual.'; $_lang['babel.babellinks.showCurrent'] = 'Indicar se deseja apresentar uma hiperligação para uma tradução do idioma atual.'; $_lang['babel.babellinks.showUnpublished'] = 'Indicar se deseja apresentar traduções não publicadas.'; diff --git a/core/components/babel/lexicon/pt/default.inc.php b/core/components/babel/lexicon/pt/default.inc.php index 7fa6f04..9ffd0ff 100644 --- a/core/components/babel/lexicon/pt/default.inc.php +++ b/core/components/babel/lexicon/pt/default.inc.php @@ -15,19 +15,20 @@ $_lang['babel.contexts'] = 'Contextos'; $_lang['babel.contexts_desc'] = 'Gerir as ligações entre os recursos em diferentes contextos/línguas num único local. Utilize os seguintes botões para editar as ligações:'; $_lang['babel.contexts_desc_create'] = 'Criar um novo recurso a ser ligado'; +$_lang['babel.contexts_desc_create_multiple'] = 'Criar vários recursos novos para serem ligados'; $_lang['babel.contexts_desc_link'] = 'Ligação a este recurso e aos recursos associados'; $_lang['babel.contexts_desc_unlink'] = 'Quebrar a ligação'; $_lang['babel.contexts_desc_update'] = 'Atualizar este recurso ligado'; $_lang['babel.copy_tv_values'] = 'Copiar TVs sincronizados para o destino'; +$_lang['babel.create_multiple_translations'] = 'Criar várias traduções'; +$_lang['babel.create_multiple_translations_err_no_contexts'] = 'Não há contextos adicionais disponíveis para tradução.'; +$_lang['babel.create_multiple_translations_finished'] = 'A criação dos recursos traduzidos foi concluída.'; $_lang['babel.create_translation'] = 'Criar tradução'; $_lang['babel.create_translation_confirm'] = 'Tem a certeza de que deseja criar uma nova tradução para esta página (recurso) para o contexto "[[+context]]"?'; $_lang['babel.debug_mode'] = 'Modo de depuração'; $_lang['babel.desc'] = 'Gerir sistema multilingue'; -$_lang['babel.target_id'] = 'ID do destino'; $_lang['babel.link_translation'] = 'Ligar a página (recurso) existente'; $_lang['babel.open'] = 'Abrir'; -$_lang['babel.or'] = '… ou'; -$_lang['babel.target_pagetitle'] = '... ou procurar o título da página de destino'; $_lang['babel.please_wait'] = 'Por favor, aguarde …'; $_lang['babel.reset'] = 'Reiniciar'; $_lang['babel.resource_err_from_other_context'] = 'A Página (recurso) [[+resource]] não existe no contexto "[[+context]]".'; @@ -39,14 +40,19 @@ $_lang['babel.select_tree_node'] = 'Selecionar um nó na árvore de recursos'; $_lang['babel.settings'] = 'Definições'; $_lang['babel.settings_desc'] = 'Editar as definições da Babel. Pode editar o valor de uma definição do sistema fazendo duplo clique na célula da tabela "Valor" ou clicando com o botão direito do rato na célula da tabela.'; -$_lang['babel.sync_linked_tranlations'] = 'Sincronizar todas as traduções a partir do destino'; +$_lang['babel.sync_linked_tranlations'] = 'Sincronizar todas as traduções'; +$_lang['babel.sync_linked_tranlations_target'] = 'Sincronizar todas as traduções a partir do destino'; $_lang['babel.systemsetting_key_err_nv'] = 'Só é possível editar definições com o prefixo babel.'; $_lang['babel.systemsetting_usergroup_err_nv'] = 'Apenas os utilizadores com uma permissão de definições ou uma permissão settings_babel podem alterar as definições.'; +$_lang['babel.target_id'] = 'ID do destino'; +$_lang['babel.target_pagetitle'] = '... ou procurar o título da página de destino'; $_lang['babel.translation_err_could_not_create_resource'] = 'Ocorreu um erro ao tentar criar uma tradução no contexto [[+context]].'; $_lang['babel.translation_pending'] = '[traduções pendentes]'; +$_lang['babel.translation_success_create_resource'] = 'Um recurso traduzido para [[+id]] foi criado no contexto [[+context]].'; $_lang['babel.tv_caption'] = 'Ligações de Tradução do Babel'; $_lang['babel.tv_description'] = 'Gerido pelo plugin Babel. Por favor, não modificar!'; $_lang['babel.unlink'] = 'Separar'; +$_lang['babel.unlink_all'] = 'Separar tudo'; $_lang['babel.unlink_all_translations'] = 'Separar todas as traduções'; $_lang['babel.unlink_all_translations_confirm'] = 'Tem a certeza de que deseja separar todas as traduções para esta página (recurso)?'; $_lang['babel.unlink_translation_confirm'] = 'Tem a certeza de que deseja separar a tradução para esta página (recurso) para o contexto "[[+context]]"?'; diff --git a/core/components/babel/lexicon/pt/properties.inc.php b/core/components/babel/lexicon/pt/properties.inc.php index bf6d864..90b5851 100644 --- a/core/components/babel/lexicon/pt/properties.inc.php +++ b/core/components/babel/lexicon/pt/properties.inc.php @@ -10,7 +10,7 @@ $_lang['babel.babellinks.activeCls'] = 'Classe de CSS para a hiperligação da língua ativa.'; $_lang['babel.babellinks.ignoreSiteStatus'] = 'Sinalizar se o site_status deve ser ignorado (quando o site está offline)'; $_lang['babel.babellinks.includeUnlinked'] = 'Indicar se deseja apresentar contextos sem associação.'; -$_lang['babel.babellinks.resourceId'] = 'Id da página (recurso) para a qual as hiperligações das traduções devam ser apresentadas.'; +$_lang['babel.babellinks.resourceId'] = 'ID da página (recurso) para a qual as hiperligações das traduções devam ser apresentadas.'; $_lang['babel.babellinks.restrictToGroup'] = 'Restringir os contextos na saída do snippet ao grupo do contexto atual.'; $_lang['babel.babellinks.showCurrent'] = 'Indicar se deseja apresentar uma hiperligação para uma tradução do idioma atual.'; $_lang['babel.babellinks.showUnpublished'] = 'Indicar se deseja apresentar traduções não publicadas.'; diff --git a/core/components/babel/lexicon/ro/default.inc.php b/core/components/babel/lexicon/ro/default.inc.php index 44bf65c..1d63219 100644 --- a/core/components/babel/lexicon/ro/default.inc.php +++ b/core/components/babel/lexicon/ro/default.inc.php @@ -15,19 +15,20 @@ $_lang['babel.contexts'] = 'Contexte'; $_lang['babel.contexts_desc'] = 'Gestionați legăturile dintre resursele din diferite contexte/limbi într-un singur loc. Utilizați următoarele butoane pentru a edita legăturile:'; $_lang['babel.contexts_desc_create'] = 'Creați o nouă resursă care să fie legată'; +$_lang['babel.contexts_desc_create_multiple'] = 'Creați mai multe resurse noi care să fie legate'; $_lang['babel.contexts_desc_link'] = 'Legătura cu această resursă și cu resursele legate de aceasta'; $_lang['babel.contexts_desc_unlink'] = 'Întrerupeți legătura'; $_lang['babel.contexts_desc_update'] = 'Actualizați această resursă legată'; $_lang['babel.copy_tv_values'] = 'Copiază TV sincronizate la țintă'; +$_lang['babel.create_multiple_translations'] = 'Creați mai multe traduceri'; +$_lang['babel.create_multiple_translations_err_no_contexts'] = 'Nu există contexte suplimentare disponibile pentru traducere.'; +$_lang['babel.create_multiple_translations_finished'] = 'Crearea resurselor traduse a fost finalizată.'; $_lang['babel.create_translation'] = 'Crează traducere'; $_lang['babel.create_translation_confirm'] = 'Sunteți sigur că doriți să creați o nouă traducere pentru această resursă pentru "[[+context]]" context?'; $_lang['babel.debug_mode'] = 'Modul Debug'; $_lang['babel.desc'] = 'Gestionarea sistemului multilingv'; -$_lang['babel.target_id'] = 'IDul paginii țintă'; $_lang['babel.link_translation'] = 'Legătura cu resursa existentă'; $_lang['babel.open'] = 'Deschideți'; -$_lang['babel.or'] = '… sau'; -$_lang['babel.target_pagetitle'] = '... sau căutați titlul paginii țintă'; $_lang['babel.please_wait'] = 'Vă rugăm să așteptați …'; $_lang['babel.reset'] = 'Resetare'; $_lang['babel.resource_err_from_other_context'] = 'Resursa [[+resource]] nu există în contextul "[[+context]]".'; @@ -39,14 +40,19 @@ $_lang['babel.select_tree_node'] = 'Selectați un nod din arborele de resurse'; $_lang['babel.settings'] = 'Setări'; $_lang['babel.settings_desc'] = 'Modificați setările din Babel. Puteți edita valoarea unei setări de sistem făcând dublu clic pe celula de tabel "Value" (Valoare) sau făcând clic dreapta în celula de tabel.'; -$_lang['babel.sync_linked_tranlations'] = 'Sincronizarea tuturor traducerilor de la țintă'; +$_lang['babel.sync_linked_tranlations'] = 'Sincronizarea tuturor traducerilor'; +$_lang['babel.sync_linked_tranlations_target'] = 'Sincronizarea tuturor traducerilor de la țintă'; $_lang['babel.systemsetting_key_err_nv'] = 'Puteți edita numai setările cu prefixul babel.'; $_lang['babel.systemsetting_usergroup_err_nv'] = 'Numai utilizatorii care au permisiunea settings sau settings_babel pot modifica setările.'; +$_lang['babel.target_id'] = 'IDul paginii țintă'; +$_lang['babel.target_pagetitle'] = '... sau căutați titlul paginii țintă'; $_lang['babel.translation_err_could_not_create_resource'] = 'Eroare la crearea documentului de tradus în contextul [[+context]].'; $_lang['babel.translation_pending'] = '[traducere în curs]'; +$_lang['babel.translation_success_create_resource'] = 'O resursă tradusă pentru [[+id]] a fost creată în contextul [[+context]].'; $_lang['babel.tv_caption'] = 'Babel - legăturile către resursele traduse'; $_lang['babel.tv_description'] = 'Menținut de pluginul Babel. Vă rugăm nu modificați!'; $_lang['babel.unlink'] = 'Dezlegare'; +$_lang['babel.unlink_all'] = 'Dezlegare toate'; $_lang['babel.unlink_all_translations'] = 'Dezlegarea tuturor traducerilor'; $_lang['babel.unlink_all_translations_confirm'] = 'Sunteți sigur că doriți să dezlipiți toate traducerile din această resursă?'; $_lang['babel.unlink_translation_confirm'] = 'Sunteți sigur că doriți să dezlipiți traducerea din această resursă la "[[+context]]" context?'; diff --git a/core/components/babel/lexicon/ro/properties.inc.php b/core/components/babel/lexicon/ro/properties.inc.php index f87726e..dbe723c 100644 --- a/core/components/babel/lexicon/ro/properties.inc.php +++ b/core/components/babel/lexicon/ro/properties.inc.php @@ -10,7 +10,7 @@ $_lang['babel.babellinks.activeCls'] = 'Clasa CSS pentru legătura activă către resursele traduse.'; $_lang['babel.babellinks.ignoreSiteStatus'] = 'Semnalizează dacă se ignoră statusul site-ului (atunci când site-ul este offline)'; $_lang['babel.babellinks.includeUnlinked'] = 'Semnalizează dacă se afișează sau nu contextul fără legătură.'; -$_lang['babel.babellinks.resourceId'] = 'Id-ul resursei de afișat.'; +$_lang['babel.babellinks.resourceId'] = 'ID-ul resursei de afișat.'; $_lang['babel.babellinks.restrictToGroup'] = 'Restrânge contextele din extrasul de fragment la grupul contextului curent.'; $_lang['babel.babellinks.showCurrent'] = 'Afișează o legătură către limba curentă.'; $_lang['babel.babellinks.showUnpublished'] = 'Afișează traducerile nepublicate.'; diff --git a/core/components/babel/lexicon/ru/default.inc.php b/core/components/babel/lexicon/ru/default.inc.php index ca18c4d..5c99ab3 100644 --- a/core/components/babel/lexicon/ru/default.inc.php +++ b/core/components/babel/lexicon/ru/default.inc.php @@ -13,19 +13,20 @@ $_lang['babel.contexts'] = 'Контексты'; $_lang['babel.contexts_desc'] = 'Управляйте связями между ресурсами в разных контекстах/языках в одном месте. Используйте следующие кнопки для редактирования ссылок:'; $_lang['babel.contexts_desc_create'] = 'Создайте новый ресурс, который необходимо связать'; +$_lang['babel.contexts_desc_create_multiple'] = 'Создайте несколько новых ресурсов, которые необходимо связать'; $_lang['babel.contexts_desc_link'] = 'Ссылка на этот ресурс и связанные с ним ресурсы'; $_lang['babel.contexts_desc_unlink'] = 'Разрывная связь'; $_lang['babel.contexts_desc_update'] = 'Обновите этот связанный ресурс'; $_lang['babel.copy_tv_values'] = 'Копировать значения синхронизируемых TV'; +$_lang['babel.create_multiple_translations'] = 'Создать несколько переводов'; +$_lang['babel.create_multiple_translations_err_no_contexts'] = 'Нет дополнительных контекстов для перевода.'; +$_lang['babel.create_multiple_translations_finished'] = "Создание переведенных ресурсов было завершено."; $_lang['babel.create_translation'] = 'Создать перевод'; $_lang['babel.create_translation_confirm'] = 'Вы уверены, что хотите создать перевод в контексте «[[+context]]» для данного ресурса?'; $_lang['babel.debug_mode'] = 'Режим отладки'; $_lang['babel.desc'] = 'Управление мультиязычной системой'; -$_lang['babel.target_id'] = 'Идентификатор цели'; $_lang['babel.link_translation'] = 'Связать с существующим ресурсом'; $_lang['babel.open'] = 'Открыть'; -$_lang['babel.or'] = '... или'; -$_lang['babel.target_pagetitle'] = '... или поиск по заголовку целевой страницы'; $_lang['babel.please_wait'] = 'Пожалуйста, подождите …'; $_lang['babel.reset'] = 'Сбросить'; $_lang['babel.resource_err_from_other_context'] = 'Ресурс [[+resource]] не существует в контексте «[[+context]]».'; @@ -37,14 +38,19 @@ $_lang['babel.select_tree_node'] = 'Выберите узел в дереве ресурсов'; $_lang['babel.settings'] = 'Настройки'; $_lang['babel.settings_desc'] = 'Редактирование настроек Babel. Вы можете изменить значение системного параметра, дважды щелкнув ячейку таблицы "Значение" или щелкнув правой кнопкой мыши в ячейке таблицы.'; -$_lang['babel.sync_linked_tranlations'] = 'Синхронизировать все переводы с целевого ресурса'; +$_lang['babel.sync_linked_tranlations'] = 'Синхронизируйте все переводы'; +$_lang['babel.sync_linked_tranlations_target'] = 'Синхронизировать все переводы с целевого ресурса'; $_lang['babel.systemsetting_key_err_nv'] = 'Вы можете редактировать настройки только с префиксом babel.'; $_lang['babel.systemsetting_usergroup_err_nv'] = 'Изменять настройки могут только пользователи с правами settings или settings_babel.'; +$_lang['babel.target_id'] = 'Идентификатор цели'; +$_lang['babel.target_pagetitle'] = '... или поиск по заголовку целевой страницы'; $_lang['babel.translation_err_could_not_create_resource'] = 'Произошла ошибка при попытке создать перевод в контексте «[[+context]]».'; $_lang['babel.translation_pending'] = '[ожидает перевода]'; +$_lang['babel.translation_success_create_resource'] = 'Переведенный ресурс для [[+id]] был создан в контексте [[+context]].'; $_lang['babel.tv_caption'] = 'Ссылки на перевод Babel'; $_lang['babel.tv_description'] = 'Используется плагином Babel. Не изменяйте!'; $_lang['babel.unlink'] = 'Отвязать'; +$_lang['babel.unlink_all'] = 'Отключить все'; $_lang['babel.unlink_all_translations'] = 'Отвязать все переводы'; $_lang['babel.unlink_all_translations_confirm'] = 'Вы уверены, что хотите отвязать все переводы для данного ресурса?'; $_lang['babel.unlink_translation_confirm'] = 'Вы уверены, что хотите отвязать перевод в контексте «[[+context]]» для данного ресурса?'; diff --git a/core/components/babel/lexicon/ru/languages.inc.php b/core/components/babel/lexicon/ru/languages.inc.php index b817a67..44c971e 100644 --- a/core/components/babel/lexicon/ru/languages.inc.php +++ b/core/components/babel/lexicon/ru/languages.inc.php @@ -5,36 +5,36 @@ * @package babel * @subpackage lexicon */ -$_lang ['babel.language_ar'] = 'Арабский'; -$_lang ['babel.language_bg'] = 'Болгарский'; -$_lang ['babel.language_ca'] = 'Каталонский'; -$_lang ['babel.language_cs'] = 'Чешский'; -$_lang ['babel.language_da'] = 'Датский'; -$_lang ['babel.language_de'] = 'Немецкий'; -$_lang ['babel.language_en'] = 'Английский'; -$_lang ['babel.language_es'] = 'Испанский'; -$_lang ['babel.language_fa'] = 'Персидский'; -$_lang ['babel.language_fi'] = 'Финский'; -$_lang ['babel.language_fr'] = 'Французский'; -$_lang ['babel.language_he'] = 'Иврит'; -$_lang ['babel.language_hu'] = 'Венгерский'; -$_lang ['babel.language_id'] = 'Индонезийский'; -$_lang ['babel.language_it'] = 'Итальянский'; -$_lang ['babel.language_ja'] = 'Японский'; -$_lang ['babel.language_ko'] = 'Корейский'; -$_lang ['babel.language_lt'] = 'Литовский'; -$_lang ['babel.language_ms'] = 'Малайский'; -$_lang ['babel.language_nl'] = 'Голландский'; -$_lang ['babel.language_no'] = 'Норвежский (Bokmål)'; -$_lang ['babel.language_pl'] = 'Польский'; -$_lang ['babel.language_pt'] = 'Португальский'; -$_lang ['babel.language_ro'] = 'Румынский'; -$_lang ['babel.language_ru'] = 'Русский'; -$_lang ['babel.language_sk'] = 'Словацкий'; -$_lang ['babel.language_sl'] = 'Словенский'; -$_lang ['babel.language_sr'] = 'Сербский'; -$_lang ['babel.language_sv'] = 'Шведский'; -$_lang ['babel.language_tr'] = 'Турецкий'; -$_lang ['babel.language_uk'] = 'Украинский'; -$_lang ['babel.language_vi'] = 'Вьетнамский'; -$_lang ['babel.language_zh'] = 'Китайский'; +$_lang['babel.language_ar'] = 'Арабский'; +$_lang['babel.language_bg'] = 'Болгарский'; +$_lang['babel.language_ca'] = 'Каталонский'; +$_lang['babel.language_cs'] = 'Чешский'; +$_lang['babel.language_da'] = 'Датский'; +$_lang['babel.language_de'] = 'Немецкий'; +$_lang['babel.language_en'] = 'Английский'; +$_lang['babel.language_es'] = 'Испанский'; +$_lang['babel.language_fa'] = 'Персидский'; +$_lang['babel.language_fi'] = 'Финский'; +$_lang['babel.language_fr'] = 'Французский'; +$_lang['babel.language_he'] = 'Иврит'; +$_lang['babel.language_hu'] = 'Венгерский'; +$_lang['babel.language_id'] = 'Индонезийский'; +$_lang['babel.language_it'] = 'Итальянский'; +$_lang['babel.language_ja'] = 'Японский'; +$_lang['babel.language_ko'] = 'Корейский'; +$_lang['babel.language_lt'] = 'Литовский'; +$_lang['babel.language_ms'] = 'Малайский'; +$_lang['babel.language_nl'] = 'Голландский'; +$_lang['babel.language_no'] = 'Норвежский (Bokmål)'; +$_lang['babel.language_pl'] = 'Польский'; +$_lang['babel.language_pt'] = 'Португальский'; +$_lang['babel.language_ro'] = 'Румынский'; +$_lang['babel.language_ru'] = 'Русский'; +$_lang['babel.language_sk'] = 'Словацкий'; +$_lang['babel.language_sl'] = 'Словенский'; +$_lang['babel.language_sr'] = 'Сербский'; +$_lang['babel.language_sv'] = 'Шведский'; +$_lang['babel.language_tr'] = 'Турецкий'; +$_lang['babel.language_uk'] = 'Украинский'; +$_lang['babel.language_vi'] = 'Вьетнамский'; +$_lang['babel.language_zh'] = 'Китайский'; diff --git a/core/components/babel/lexicon/ru/properties.inc.php b/core/components/babel/lexicon/ru/properties.inc.php index 781a680..0c49398 100644 --- a/core/components/babel/lexicon/ru/properties.inc.php +++ b/core/components/babel/lexicon/ru/properties.inc.php @@ -9,7 +9,7 @@ $_lang['babel.babellinks.ignoreSiteStatus'] = 'Флаг, игнорировать ли site_status (когда сайт не в сети)'; $_lang['babel.babellinks.includeUnlinked'] = 'Флаг, показывать ли несвязанный контекст.'; $_lang['babel.babellinks.resourceId'] = 'ID ресурсов, ссылки на перевод которых должны отображаться.'; -$_lang['babel.babellinks.restrictToGroup'] = 'Ограничьте контексты в выводе сниппета группой текущего контекста'; +$_lang['babel.babellinks.restrictToGroup'] = 'Ограничьте контексты в выводе сниппета группой текущего контекста.'; $_lang['babel.babellinks.showCurrent'] = 'Показывать ссылку на перевод текущего языка.'; $_lang['babel.babellinks.showUnpublished'] = 'Показывать неопубликованные ресурсы.'; $_lang['babel.babellinks.toArray'] = 'Флаг, следует ли выводить вывод в виде массива.'; diff --git a/core/components/babel/processors/mgr/resource/duplicate.class.php b/core/components/babel/processors/mgr/resource/duplicate.class.php index 57271b9..f8cdda7 100644 --- a/core/components/babel/processors/mgr/resource/duplicate.class.php +++ b/core/components/babel/processors/mgr/resource/duplicate.class.php @@ -8,15 +8,18 @@ use mikrobi\Babel\Processors\ObjectUpdateProcessor; -class BabelDuplicateResourceProcessor extends ObjectUpdateProcessor +class BabelResourceDuplicateProcessor extends ObjectUpdateProcessor { public $classKey = 'modResource'; public $objectType = 'resource'; public $languageTopics = ['resource', 'babel:default']; public $permission = 'resource_duplicate'; - /** @var xPDOObject $newObject The newly duplicated object */ - protected $newObject; + /** @var modResource $object The resource to duplicate */ + public $object; + + /** @var modResource $newObject The newly duplicated resource */ + public $newObject; /** * {@inheritDoc} @@ -48,20 +51,52 @@ public function initialize() */ public function process() { - $contextKey = $this->getProperty('context_key'); - $this->newObject = $this->babel->duplicateResource($this->object, $contextKey); + $context = $this->getProperty('context_key'); + $this->newObject = $this->babel->duplicateResource($this->object, $context); if (!$this->newObject) { return $this->failure($this->modx->lexicon('babel.translation_err_could_not_create_resource', [ - 'context' => $contextKey + 'context' => $context ])); } + $targetResources = $this->babel->getLinkedResources($this->getProperty('target')); $linkedResources = $this->babel->getLinkedResources($this->object->get('id')); - $linkedResources[$contextKey] = $this->newObject->get('id'); - $this->babel->updateBabelTv($linkedResources, $linkedResources); + $linkedResources[$context] = $this->newObject->get('id'); + + $syncLinkedTranslations = $this->getProperty('sync'); + if ($syncLinkedTranslations == 1) { + /* Join all existing linked resources from both resources */ + $mergedResources = array_merge($targetResources, $linkedResources); + $this->babel->updateBabelTv($mergedResources, $mergedResources); + } else { + /* Only join between 2 resources */ + $mergeLinked = array_merge($linkedResources, [ + $this->getProperty('context_key') => $this->newObject->get('id') + ]); + $this->babel->updateBabelTv($this->object->get('id'), $mergeLinked); + $mergeTarget = array_merge($targetResources, [ + $this->object->get('context_key') => $this->object->get('id') + ]); + $this->babel->updateBabelTv($this->newObject->get('id'), $mergeTarget); + } + + $copyTvValues = $this->getProperty('copy'); + if ($copyTvValues == 1) { + /* copy values of synchronized TVs to target resource */ + $this->babel->synchronizeTvs($this->object->get('id')); + } $this->fireDuplicateEvent(); $this->logManagerAction(); + + $this->modx->log(xPDO::LOG_LEVEL_INFO, $this->modx->lexicon('babel.translation_success_create_resource', [ + 'id' => $this->newObject->get('id'), + 'context' => $context, + ])); + if ($this->getBooleanProperty('last')) { + $this->modx->log(modX::LOG_LEVEL_INFO, 'COMPLETED'); + } + return $this->cleanup(); } @@ -93,8 +128,9 @@ public function logManagerAction() */ public function cleanup() { - return $this->success('', $this->newObject); + $output = $this->newObject->toArray(); + return $this->success('', $output); } } -return 'BabelDuplicateResourceProcessor'; +return 'BabelResourceDuplicateProcessor'; diff --git a/core/components/babel/processors/mgr/resource/getmenu.class.php b/core/components/babel/processors/mgr/resource/getmenu.class.php new file mode 100644 index 0000000..4ea29c5 --- /dev/null +++ b/core/components/babel/processors/mgr/resource/getmenu.class.php @@ -0,0 +1,41 @@ +modx->getObject($this->classKey, $this->getProperty('id')); + if ($resource) { + $menu = $this->babel->getMenu($resource); + if ($menu) { + $output = [ + 'menu' => $menu, + 'context_key' => $resource->get('context_key'), + ]; + return $this->success('', $output); + } + } + return $this->failure($this->modx->lexicon('babel.resource_err_invalid_id', [ + 'resource' => $this->getProperty('id') + ]), []); + } +} + +return 'BabelResourceGetMenuProcessor'; diff --git a/core/components/babel/processors/mgr/resource/link.class.php b/core/components/babel/processors/mgr/resource/link.class.php index fe4b80e..f6bc166 100644 --- a/core/components/babel/processors/mgr/resource/link.class.php +++ b/core/components/babel/processors/mgr/resource/link.class.php @@ -8,12 +8,15 @@ use mikrobi\Babel\Processors\ObjectUpdateProcessor; -class BabelLinkResourceProcessor extends ObjectUpdateProcessor +class BabelResourceLinkProcessor extends ObjectUpdateProcessor { public $classKey = 'modResource'; public $objectType = 'resource'; public $languageTopics = ['resource', 'babel:default']; + /** @var modResource $object The link source */ + public $object; + /** @var modResource $targetResource The link target */ protected $targetResource; @@ -43,7 +46,9 @@ public function initialize() if (empty($contextKey)) { return $this->modx->lexicon('babel.context_err_ns'); } - $context = $this->modx->getObject('modContext', ['key' => $contextKey]); + $context = $this->modx->getObject('modContext', [ + 'key' => $contextKey + ]); if (!$context) { return $this->modx->lexicon('babel.context_err_invalid_key', [ 'context' => $contextKey @@ -80,7 +85,7 @@ public function process() } $linkedResources[$context] = $this->targetResource->get('id'); - $syncLinkedTranslations = $this->getProperty('sync-linked-tranlations'); + $syncLinkedTranslations = $this->getProperty('sync'); if ($syncLinkedTranslations == 1) { /* Join all existing linked resources from both resources */ $mergedResources = array_merge($targetResources, $linkedResources); @@ -97,7 +102,7 @@ public function process() $this->babel->updateBabelTv($this->targetResource->get('id'), $mergeTarget); } - $copyTvValues = $this->getProperty('copy-tv-values'); + $copyTvValues = $this->getProperty('copy'); if ($copyTvValues == 1) { /* copy values of synchronized TVs to target resource */ $this->babel->synchronizeTvs($this->object->get('id')); @@ -133,4 +138,4 @@ public function cleanup() } } -return 'BabelLinkResourceProcessor'; +return 'BabelResourceLinkProcessor'; diff --git a/core/components/babel/processors/mgr/resource/unlink.class.php b/core/components/babel/processors/mgr/resource/unlink.class.php index b1b5fc3..afc297a 100644 --- a/core/components/babel/processors/mgr/resource/unlink.class.php +++ b/core/components/babel/processors/mgr/resource/unlink.class.php @@ -8,12 +8,15 @@ use mikrobi\Babel\Processors\ObjectUpdateProcessor; -class BabelUnlinkResourceProcessor extends ObjectUpdateProcessor +class BabelResourceUnlinkProcessor extends ObjectUpdateProcessor { public $classKey = 'modResource'; public $objectType = 'resource'; public $languageTopics = ['resource', 'babel:default']; + /** @var modResource $object */ + public $object; + /** @var modResource $targetResource The link target */ protected $targetResource; @@ -123,4 +126,4 @@ public function cleanup() } } -return 'BabelUnlinkResourceProcessor'; +return 'BabelResourceUnlinkProcessor'; diff --git a/core/components/babel/src/Babel.php b/core/components/babel/src/Babel.php index b991620..ebc541d 100644 --- a/core/components/babel/src/Babel.php +++ b/core/components/babel/src/Babel.php @@ -67,7 +67,7 @@ class Babel * The version * @var string $version */ - public $version = '3.2.0'; + public $version = '3.3.0'; /** * The class config @@ -305,8 +305,10 @@ public function synchronizeTvs($resourceId) return; } + $tvChanges = []; foreach ($syncTvs as $tvId) { /* go through each TV which should be synchronized */ + /** @var modTemplateVar $tv */ $tv = $this->modx->getObject('modTemplateVar', $tvId); if (!$tv) { continue; @@ -318,11 +320,29 @@ public function synchronizeTvs($resourceId) /* don't synchronize resource with itself */ continue; } - $tv->setValue($linkedResourceId, $tvValue); + $tvValueLinkedResource = $tv->getValue($linkedResourceId); + if ($tvValueLinkedResource !== $tvValue) { + /* update only changed TVs */ + $tv->setValue($linkedResourceId, $tvValue); + /* collect the changes */ + $tvChanges[] = [ + 'tvId' => $tvId, + 'tvValue' => $tvValue, + 'linkedId' => $linkedResourceId + ]; + } } $tv->save(); } + /* if tv changes are collected trigger the OnBabelTVSynced event */ + if (!empty($tvChanges)) { + $this->modx->invokeEvent('OnBabelTVSynced', [ + 'tvChanges' => $tvChanges, + 'resourceId' => $resourceId + ]); + } + $this->modx->cacheManager->refresh(); } @@ -390,15 +410,6 @@ public function duplicateResource($resource, $contextKey) $newTemplateVarResource->save(); } - /* set parent of duplicate as a folder */ - if ($newParentId) { - $newParent = $this->modx->getObject('modResource', $newParentId); - if ($newParent) { - $newParent->set('isfolder', 1); - $newParent->save(); - } - } - /* invoke OnDocFormSave event */ $this->modx->invokeEvent('OnDocFormSave', [ 'mode' => modSystemEvent::MODE_NEW, @@ -557,8 +568,19 @@ public function removeLanguageLinksToResource($resourceId) * -> search for the context key of the specified resource id */ $contextKey = array_search($resourceId, $linkedResources); /* sanity check, is the contextKey really a context in babel's settings? */ - if (array_key_exists($contextKey, $this->contextKeyToGroup)) { - unset($linkedResources[$contextKey]); + $changed = false; + if ($this->getOption('restrictToGroup')) { + if (array_key_exists($contextKey, $this->contextKeyToGroup)) { + unset($linkedResources[$contextKey]); + $changed = true; + } + } else { + if (array_key_exists($contextKey, $this->getOption('contexts'))) { + unset($linkedResources[$contextKey]); + $changed = true; + } + } + if ($changed) { $newValue = $this->encodeTranslationLinks($linkedResources); $templateVarResource->set('value', $newValue); $templateVarResource->save(); @@ -629,58 +651,6 @@ public function getContextKey($cultureKey) return (($ctxSetting) ? $ctxSetting->get("context_key") : false); } - /** - * Gets a Chunk and caches it; also falls back to file-based templates - * for easier debugging. - * - * @access public - * @param string $name The name of the Chunk - * @param array $properties The properties for the Chunk - * @return string The processed content of the Chunk - */ - public function getChunk($name, array $properties = []) - { - if (!isset($this->chunks[$name])) { - $chunk = $this->modx->getObject('modChunk', ['name' => $name]); - if (empty($chunk)) { - $chunk = $this->_getTplChunk($name, $this->getOption('chunkSuffix')); - if (!$chunk) { - return false; - } - } - $this->chunks[$name] = $chunk->getContent(); - } else { - $o = $this->chunks[$name]; - $chunk = $this->modx->newObject('modChunk'); - $chunk->setContent($o); - } - $chunk->setCacheable(false); - return $chunk->process($properties); - } - - /** - * Returns a modChunk object from a template file. - * - * @access private - * @param string $name The name of the Chunk. Will parse to name.chunk.tpl by default. - * @param string $suffix The suffix to add to the chunk filename. - * @return modChunk/boolean Returns the modChunk object if found, otherwise - * false. - */ - private function _getTplChunk($name, $suffix = '.chunk.tpl') - { - $chunk = false; - $f = $this->getOption('chunksPath') . strtolower($name) . $suffix; - if (file_exists($f)) { - $o = file_get_contents($f); - /** @var modChunk $chunk */ - $chunk = $this->modx->newObject('modChunk'); - $chunk->set('name', $name); - $chunk->setContent($o); - } - return $chunk; - } - /** * Get placeholders to create language selection menu. * Used in plugin and processors. diff --git a/core/components/babel/src/Plugins/Events/OnDocFormPrerender.php b/core/components/babel/src/Plugins/Events/OnDocFormPrerender.php index 8066f36..aca27c7 100644 --- a/core/components/babel/src/Plugins/Events/OnDocFormPrerender.php +++ b/core/components/babel/src/Plugins/Events/OnDocFormPrerender.php @@ -34,6 +34,8 @@ public function process() $assetsUrl = $this->babel->getOption('assetsUrl'); $jsUrl = $this->babel->getOption('jsUrl') . 'mgr/'; $jsSourceUrl = $assetsUrl . '../../../source/js/mgr/'; + $cssUrl = $this->babel->getOption('cssUrl') . 'mgr/'; + $cssSourceUrl = $assetsUrl . '../../../source/css/mgr/'; $resource = &$this->scriptProperties['resource']; $linkedResources = $this->babel->getLinkedResources($resource->get('id')); @@ -51,8 +53,10 @@ public function process() $this->modx->controller->addLexiconTopic('babel:default'); if ($this->babel->getOption('debug') && ($this->babel->getOption('assetsUrl') != MODX_ASSETS_URL . 'components/babel/')) { + $this->modx->controller->addCss($cssSourceUrl . 'babel.css?v=v' . $this->babel->version); $this->modx->controller->addJavascript($jsSourceUrl . 'babel.js?v=v' . $this->babel->version); } else { + $this->modx->controller->addCss($cssUrl . 'resourcebutton.min.css?v=v' . $this->babel->version); $this->modx->controller->addJavascript($jsUrl . 'resourcebutton.min.js?v=v' . $this->babel->version); } $this->modx->controller->addHtml('