From c641542ee25da00098df24cbe200624a36409a81 Mon Sep 17 00:00:00 2001 From: JcDenis Date: Thu, 19 Aug 2021 00:48:47 +0200 Subject: [PATCH] updated PSR2 coding standard --- release.txt => CHANGELOG.md | 23 + _admin.php | 184 +- _define.php | 26 +- _install.php | 81 +- _prepend.php | 20 +- _uninstall.php | 58 +- icon-big.png | Bin 0 -> 1744 bytes icon.png | Bin 691 -> 799 bytes inc/class.dc.translater.php | 3053 ++++++++--------- inc/class.translater.proposals.php | 91 +- inc/class.translater.rest.php | 89 +- inc/lib.translater.google.php | 151 +- inc/lib.translater.microsoft.php | 240 +- inc/lib.translater.proposal.php | 209 +- index.php | 2273 ++++++------ .../fr/help/{help.html => translater.html} | 125 +- locales/fr/main.lang.php | 352 +- locales/fr/main.po | 375 +- locales/fr/resources.php | 7 +- 19 files changed, 3605 insertions(+), 3752 deletions(-) rename release.txt => CHANGELOG.md (79%) create mode 100644 icon-big.png rename locales/fr/help/{help.html => translater.html} (77%) diff --git a/release.txt b/CHANGELOG.md similarity index 79% rename from release.txt rename to CHANGELOG.md index 590d033..20cba0d 100644 --- a/release.txt +++ b/CHANGELOG.md @@ -1,6 +1,29 @@ x.x xxxxxxxx - help translation - source translation + - settings page + +2021.08.19 + * Fixed PSR-2 Coding Style + +2018.10.26 - Pierre Van Glabeke + * Bug avec php 7.2 (https://forum.dotclear.org/viewtopic.php?pid=342810#p342810) + +2018.10.18 - Pierre Van Glabeke + * Modifs localisation + +2018.02.14 - Pierre Van Glabeke + * Suppression ?> en fin de lang.php + +2017.05.10 - Pierre Van Glabeke + * Suppression ligne 614 de "continue" dans \inc\class.dc.translater.php + +2016.08.20 - Pierre Van Glabeke + * Ajout Pluriel dans po + * Ajout favori + +2016.07.08 - Pierre Van Glabeke + * Modifs localisation 2013.05.11 * Rewrited proposal tools diff --git a/_admin.php b/_admin.php index db7739c..667c857 100644 --- a/_admin.php +++ b/_admin.php @@ -3,8 +3,7 @@ # # This file is part of translater, a plugin for Dotclear 2. # -# Copyright (c) 2009-2013 Jean-Christian Denis and contributors -# contact@jcdenis.fr +# Copyright (c) 2009-2016 Jean-Christian Denis and contributors # # Licensed under the GPL version 2.0 license. # A copy of this license is available in LICENSE file or at @@ -12,96 +11,109 @@ # # -- END LICENSE BLOCK ------------------------------------ -if (!defined('DC_CONTEXT_ADMIN')){return;} +if (!defined('DC_CONTEXT_ADMIN')) { + return; +} $core->blog->settings->addNamespace('translater'); -$core->addBehavior('pluginsToolsTabs',array('translaterAdminBehaviors','pluginsToolsTabs')); -$core->addBehavior('adminCurrentThemeDetails',array('translaterAdminBehaviors','adminCurrentThemeDetails')); -$core->addBehavior('addTranslaterProposalTool',array('translaterAdminBehaviors','addGoogleProposalTool')); -$core->addBehavior('addTranslaterProposalTool',array('translaterAdminBehaviors','addYahooProposalTool')); -$core->addBehavior('addTranslaterProposalTool',array('translaterAdminBehaviors','addMicrosoftProposalTool')); -$core->rest->addFunction('getProposal',array('translaterRest','getProposal')); +$core->addBehavior('pluginsToolsTabs', ['translaterAdminBehaviors', 'pluginsToolsTabs']); +$core->addBehavior('adminCurrentThemeDetails', ['translaterAdminBehaviors', 'adminCurrentThemeDetails']); +$core->addBehavior('addTranslaterProposalTool', ['translaterAdminBehaviors', 'addGoogleProposalTool']); +$core->addBehavior('addTranslaterProposalTool', ['translaterAdminBehaviors', 'addYahooProposalTool']); +$core->addBehavior('addTranslaterProposalTool', ['translaterAdminBehaviors', 'addMicrosoftProposalTool']); +$core->rest->addFunction('getProposal', ['translaterRest', 'getProposal']); $_menu['Plugins']->addItem( - __('Translater'), - 'plugin.php?p=translater', - 'index.php?pf=translater/icon.png', - preg_match('/plugin.php\?p=translater(&.*)?$/',$_SERVER['REQUEST_URI']), - $core->auth->isSuperAdmin() + __('Translater'), + 'plugin.php?p=translater', + 'index.php?pf=translater/icon.png', + preg_match('/plugin.php\?p=translater(&.*)?$/', $_SERVER['REQUEST_URI']), + $core->auth->isSuperAdmin() ); class translaterAdminBehaviors { - # Plugins tab - public static function pluginsToolsTabs($core) - { - if (!$core->blog->settings->translater->translater_plugin_menu || !$core->auth->isSuperAdmin()) { - return; - } - - echo - '
'. - ''. - ''. - ''. - ''. - ''. - ''. - ''; - - $modules = $core->plugins->getModules(); - - foreach ($modules as $name => $plugin) - { - echo - ''. - ''. - ''. - ''. - ''. - ''. - ''; - } - echo '
 '.__('Name').''.__('Version').''.__('Details').''.__('Author').'
'. - ''.__($plugin['name']).''.$name.''.$plugin['version'].''.$plugin['desc'].''.$plugin['author'].'
'; - } - - # Themes menu - public static function adminCurrentThemeDetails($core,$id,$infos) - { - if (!$core->blog->settings->translater->translater_theme_menu || !$core->auth->isSuperAdmin()) { - return; - } - - $root = path::real($infos['root']); - - if ($id != 'default' && is_dir($root.'/locales')) - { - return - '

'.__('Translate this theme').'

'; - } - } - - # Google Translater tools - public static function addGoogleProposalTool($proposal) - { - $proposal->addTool('googleProposalTool'); - } - - # Yahoo Babelfish tools - public static function addYahooProposalTool($proposal) - { - $proposal->addTool('yahooProposalTool'); - } - - # Microsoft Bing tools - public static function addMicrosoftProposalTool($proposal) - { - $proposal->addTool('microsoftProposalTool'); - } + # Plugins tab + public static function pluginsToolsTabs($core) + { + if (!$core->blog->settings->translater->translater_plugin_menu || !$core->auth->isSuperAdmin()) { + return; + } + + echo + '
' . + '' . + '' . + '' . + '' . + '' . + '' . + ''; + + $modules = $core->plugins->getModules(); + + foreach ($modules as $name => $plugin) { + echo + '' . + '' . + '' . + '' . + '' . + '' . + ''; + } + echo + '
 ' . __('Name') . '' . __('Version') . '' . __('Details') . '' . __('Author') . '
' . + '' . __($plugin['name']) . '' . $name . '' . $plugin['version'] . '' . $plugin['desc'] . '' . $plugin['author'] . '
'; + } + + # Themes menu + public static function adminCurrentThemeDetails($core, $id, $infos) + { + if (!$core->blog->settings->translater->translater_theme_menu || !$core->auth->isSuperAdmin()) { + return; + } + + $root = path::real($infos['root']); + + if ($id != 'default' && is_dir($root.'/locales')) { + return + '

' . __('Translate this theme') . '

'; + } + } + + # Google Translater tools + public static function addGoogleProposalTool($proposal) + { + $proposal->addTool('googleProposalTool'); + } + + # Yahoo Babelfish tools + public static function addYahooProposalTool($proposal) + { + $proposal->addTool('yahooProposalTool'); + } + + # Microsoft Bing tools + public static function addMicrosoftProposalTool($proposal) + { + $proposal->addTool('microsoftProposalTool'); + } } -?> \ No newline at end of file + +$core->addBehavior('adminDashboardFavorites', 'translaterDashboardFavorites'); + +function translaterDashboardFavorites($core, $favs) +{ + $favs->register('translater', [ + 'title' => __('Translater'), + 'url' => 'plugin.php?p=translater', + 'small-icon' => 'index.php?pf=translater/icon.png', + 'large-icon' => 'index.php?pf=translater/icon-big.png', + 'permissions' => 'usage,contentadmin' + ]); +} \ No newline at end of file diff --git a/_define.php b/_define.php index 6a23ca1..8bac4fb 100644 --- a/_define.php +++ b/_define.php @@ -3,8 +3,7 @@ # # This file is part of translater, a plugin for Dotclear 2. # -# Copyright (c) 2009-2013 Jean-Christian Denis and contributors -# contact@jcdenis.fr +# Copyright (c) 2009-2021 Jean-Christian Denis and contributors # # Licensed under the GPL version 2.0 license. # A copy of this license is available in LICENSE file or at @@ -12,13 +11,20 @@ # # -- END LICENSE BLOCK ------------------------------------ -if (!defined('DC_RC_PATH')){return;} +if (!defined('DC_RC_PATH')) { + return; +} $this->registerModule( - /* Name */ "translater", - /* Description*/ "Translate your Dotclear plugins and themes", - /* Author */ "JC Denis", - /* Version */ '2013.05.11', - /* Permissions */ null -); -?> \ No newline at end of file + 'translater', + 'Translate your Dotclear plugins and themes', + 'Jean-Christian Denis & contributors', + '2021.08.15', + [ + 'permissions' => 'usage,contentadmin,admin', + 'type' => 'plugin', + 'dc_min' => '2.19', + 'support' => 'http://forum.dotclear.org/viewtopic.php?id=39220', + 'details' => 'https://plugins.dotaddict.org/dc2/details/translater' + ] +); \ No newline at end of file diff --git a/_install.php b/_install.php index 35cac0d..a95aba7 100644 --- a/_install.php +++ b/_install.php @@ -3,8 +3,7 @@ # # This file is part of translater, a plugin for Dotclear 2. # -# Copyright (c) 2009-2013 Jean-Christian Denis and contributors -# contact@jcdenis.fr +# Copyright (c) 2009-2016 Jean-Christian Denis and contributors # # Licensed under the GPL version 2.0 license. # A copy of this license is available in LICENSE file or at @@ -12,48 +11,48 @@ # # -- END LICENSE BLOCK ------------------------------------ -if (!defined('DC_CONTEXT_ADMIN')){return;} +if (!defined('DC_CONTEXT_ADMIN')) { + return; +} $rdc_version = '2.5-alpha'; -$new_version = $core->plugins->moduleInfo('translater','version'); +$new_version = $core->plugins->moduleInfo('translater', 'version'); $old_version = $core->getVersion('translater'); -if (version_compare($old_version,$new_version,'>=')) return; +if (version_compare($old_version, $new_version, '>=')) { + return; +} -try -{ - if (version_compare(str_replace("-r","-p",DC_VERSION),$rdc_version,'<')) { - throw new Exception(sprintf('%s requires Dotclear %s','translater',$rdc_version)); - } - - $core->blog->settings->addNamespace('translater'); - - $core->blog->settings->translater->put('translater_plugin_menu',0,'boolean','Put a link in plugins page',false,true); - $core->blog->settings->translater->put('translater_theme_menu',0,'boolean','Put a link in themes page',false,true); - $core->blog->settings->translater->put('translater_backup_auto',1,'boolean','Make a backup of languages old files when there are modified',false,true); - $core->blog->settings->translater->put('translater_backup_limit',20,'string','Maximum backups per module',false,true); - $core->blog->settings->translater->put('translater_backup_folder','module','string','In which folder to store backups',false,true); - $core->blog->settings->translater->put('translater_start_page','setting,','string','Page to start on',false,true); - $core->blog->settings->translater->put('translater_write_po',1,'boolean','Write .po languages files',false,true); - $core->blog->settings->translater->put('translater_write_langphp',1,'boolean','Write .lang.php languages files',false,true); - $core->blog->settings->translater->put('translater_scan_tpl',0,'boolean','Translate strings of templates files',false,true); - $core->blog->settings->translater->put('translater_parse_nodc',1,'boolean','Translate only untranslated strings of Dotclear',false,true); - $core->blog->settings->translater->put('translater_hide_default',1,'boolean','Hide default modules of Dotclear',false,true); - $core->blog->settings->translater->put('translater_parse_comment',1,'boolean','Write comments and strings informations in lang files',false,true); - $core->blog->settings->translater->put('translater_parse_user',1,'boolean','Write inforamtions about author in lang files',false,true); - $core->blog->settings->translater->put('translater_parse_userinfo','displayname, email','string','Type of informations about user to write',false,true); - $core->blog->settings->translater->put('translater_import_overwrite',0,'boolean','Overwrite existing languages when import packages',false,true); - $core->blog->settings->translater->put('translater_export_filename','type-module-l10n-timestamp','string','Name of files of exported package',false,true); - $core->blog->settings->translater->put('translater_proposal_tool','google','string','Id of default tool for proposed translation',false,true); - $core->blog->settings->translater->put('translater_proposal_lang','en','string','Default source language for proposed translation',false,true); - - $core->setVersion('translater',$new_version); - - return true; +try { + if (version_compare(str_replace("-r", "-p", DC_VERSION), $rdc_version, '<')) { + throw new Exception(sprintf('%s requires Dotclear %s', 'translater', $rdc_version)); + } + + $core->blog->settings->addNamespace('translater'); + + $core->blog->settings->translater->put('translater_plugin_menu', 0, 'boolean', 'Put a link in plugins page', false, true); + $core->blog->settings->translater->put('translater_theme_menu', 0,'boolean', 'Put a link in themes page', false, true); + $core->blog->settings->translater->put('translater_backup_auto', 1,'boolean', 'Make a backup of languages old files when there are modified', false, true); + $core->blog->settings->translater->put('translater_backup_limit', 20,'string', 'Maximum backups per module', false, true); + $core->blog->settings->translater->put('translater_backup_folder', 'module',' string', 'In which folder to store backups', false, true); + $core->blog->settings->translater->put('translater_start_page', 'setting,', 'string', 'Page to start on', false, true); + $core->blog->settings->translater->put('translater_write_po', 1, 'boolean', 'Write .po languages files', false, true); + $core->blog->settings->translater->put('translater_write_langphp', 1, 'boolean', 'Write .lang.php languages files', false, true); + $core->blog->settings->translater->put('translater_scan_tpl', 0, 'boolean', 'Translate strings of templates files', false, true); + $core->blog->settings->translater->put('translater_parse_nodc', 1, 'boolean', 'Translate only untranslated strings of Dotclear', false, true); + $core->blog->settings->translater->put('translater_hide_default', 1, 'boolean', 'Hide default modules of Dotclear', false, true); + $core->blog->settings->translater->put('translater_parse_comment', 1, 'boolean', 'Write comments and strings informations in lang files', false, true); + $core->blog->settings->translater->put('translater_parse_user', 1,'boolean', 'Write inforamtions about author in lang files', false, true); + $core->blog->settings->translater->put('translater_parse_userinfo', 'displayname, email', 'string','Type of informations about user to write', false, true); + $core->blog->settings->translater->put('translater_import_overwrite', 0, 'boolean', 'Overwrite existing languages when import packages', false, true); + $core->blog->settings->translater->put('translater_export_filename', 'type-module-l10n-timestamp', 'string','Name of files of exported package', false, true); + $core->blog->settings->translater->put('translater_proposal_tool', 'google', 'string', 'Id of default tool for proposed translation', false, true); + $core->blog->settings->translater->put('translater_proposal_lang', 'en', 'string', 'Default source language for proposed translation', false, true); + + $core->setVersion('translater', $new_version); + + return true; +} catch (Exception $e) { + $core->error->add($e->getMessage()); } -catch (Exception $e) -{ - $core->error->add($e->getMessage()); -} -return false; -?> \ No newline at end of file +return false; \ No newline at end of file diff --git a/_prepend.php b/_prepend.php index 6e177f1..62d19ef 100644 --- a/_prepend.php +++ b/_prepend.php @@ -3,8 +3,7 @@ # # This file is part of translater, a plugin for Dotclear 2. # -# Copyright (c) 2009-2013 Jean-Christian Denis and contributors -# contact@jcdenis.fr +# Copyright (c) 2009-2016 Jean-Christian Denis and contributors # # Licensed under the GPL version 2.0 license. # A copy of this license is available in LICENSE file or at @@ -12,15 +11,16 @@ # # -- END LICENSE BLOCK ------------------------------------ -if (!defined('DC_RC_PATH')){return;} +if (!defined('DC_RC_PATH')) { + return; +} global $__autoload; -$__autoload['dcTranslater'] = dirname(__FILE__).'/inc/class.dc.translater.php'; -$__autoload['translaterRest'] = dirname(__FILE__).'/inc/class.translater.rest.php'; -$__autoload['translaterProposals'] = dirname(__FILE__).'/inc/class.translater.proposals.php'; +$__autoload['dcTranslater'] = dirname(__FILE__) . '/inc/class.dc.translater.php'; +$__autoload['translaterRest'] = dirname(__FILE__) . '/inc/class.translater.rest.php'; +$__autoload['translaterProposals'] = dirname(__FILE__) . '/inc/class.translater.proposals.php'; -$__autoload['translaterProposalTool'] = dirname(__FILE__).'/inc/lib.translater.proposal.php'; -$__autoload['googleProposalTool'] = dirname(__FILE__).'/inc/lib.translater.google.php'; -$__autoload['microsoftProposalTool'] = dirname(__FILE__).'/inc/lib.translater.microsoft.php'; -?> \ No newline at end of file +$__autoload['translaterProposalTool'] = dirname(__FILE__) . '/inc/lib.translater.proposal.php'; +$__autoload['googleProposalTool'] = dirname(__FILE__) . '/inc/lib.translater.google.php'; +$__autoload['microsoftProposalTool'] = dirname(__FILE__) . '/inc/lib.translater.microsoft.php'; \ No newline at end of file diff --git a/_uninstall.php b/_uninstall.php index 0e83c16..15650a4 100644 --- a/_uninstall.php +++ b/_uninstall.php @@ -3,8 +3,7 @@ # # This file is part of translater, a plugin for Dotclear 2. # -# Copyright (c) 2009-2013 Jean-Christian Denis and contributors -# contact@jcdenis.fr +# Copyright (c) 2009-2016 Jean-Christian Denis and contributors # # Licensed under the GPL version 2.0 license. # A copy of this license is available in LICENSE file or at @@ -12,48 +11,49 @@ # # -- END LICENSE BLOCK ------------------------------------ -if (!defined('DC_CONTEXT_ADMIN')){return;} +if (!defined('DC_CONTEXT_ADMIN')) { + return; +} $this->addUserAction( - /* type */ 'settings', - /* action */ 'delete_all', - /* ns */ 'translater', - /* description */ __('delete all settings') + /* type */ 'settings', + /* action */ 'delete_all', + /* ns */ 'translater', + /* description */ __('delete all settings') ); $this->addUserAction( - /* type */ 'plugins', - /* action */ 'delete', - /* ns */ 'translater', - /* description */ __('delete plugin files') + /* type */ 'plugins', + /* action */ 'delete', + /* ns */ 'translater', + /* description */ __('delete plugin files') ); $this->addUserAction( - /* type */ 'versions', - /* action */ 'delete', - /* ns */ 'translater', - /* description */ __('delete the version number') + /* type */ 'versions', + /* action */ 'delete', + /* ns */ 'translater', + /* description */ __('delete the version number') ); $this->addDirectAction( - /* type */ 'settings', - /* action */ 'delete_all', - /* ns */ 'translater', - /* description */ sprintf(__('delete all %s settings'),'translater') + /* type */ 'settings', + /* action */ 'delete_all', + /* ns */ 'translater', + /* description */ sprintf(__('delete all %s settings'), 'translater') ); $this->addDirectAction( - /* type */ 'plugins', - /* action */ 'delete', - /* ns */ 'translater', - /* description */ sprintf(__('delete %s plugin files'),'translater') + /* type */ 'plugins', + /* action */ 'delete', + /* ns */ 'translater', + /* description */ sprintf(__('delete %s plugin files'), 'translater') ); $this->addDirectAction( - /* type */ 'versions', - /* action */ 'delete', - /* ns */ 'translater', - /* description */ sprintf(__('delete %s version number'),'translater') -); -?> \ No newline at end of file + /* type */ 'versions', + /* action */ 'delete', + /* ns */ 'translater', + /* description */ sprintf(__('delete %s version number'), 'translater') +); \ No newline at end of file diff --git a/icon-big.png b/icon-big.png new file mode 100644 index 0000000000000000000000000000000000000000..ad8442eb1a25675598923fc68445f9ae77fd8691 GIT binary patch literal 1744 zcmX9d*B!rMh0b|5)2| z1nK)yWw0nqnjuS&Nz-!K_(M_`MiBfD8tn9zsC*EC2-9HPyMS zdtwwM+<*C|SEJQB4Slq-pH~f1+k(0iF%WzjZNX1b_ug^Fx|I45q=jZjhS>pIDj!m< zt+l#rt;C^r=2vPKz|sq03u%CedblsZfQrOAzp+SZm|Z9Wre#hLX7cThfnrkZQadbo0thRYGOeX+Dk_T`+@S9(x2Wb*3i$xwN@>aasAD&82T%W4yi1u)pTLcZ z?Cnev2Y`Z9kAS(7lhP$I6z&g>S6Xc_uobTWdx;h#ZlC+;p9BBfw?s@wOQH%zA=zj#q&AD3hH7vrqSMbO_l)!`$# z-&q++b-d%=xH=>oqn$7H0VOk3MhM2`3i_$=%c34d(|ZntD=q8Boe&qQ%a`kPRvv}B z9pLXh131^|2&iBJq4Hv0MeT%TQA;k;Ib)@>)gT?daF~D(uNK$;tM~P3cz&T%6$gFX zZ(`Xew1s{*%c9|jyxd3r{V(wNmbl}_sxD@18qS&<)X~N|Zgk!@1$VAmSZ4Uo+`=jK zyza~5x?%67;zdg&i?MVqRz?gNoETm|RrQDW?9lK!pIgn3E3Qjs?-BUDmKm4gW4AwL zyvh41+#!oiVPecodGO_3t)2;eyX7S#tdqmfR7#sTkB5DIyvlIX19)*fpxSb#VszDS zmi(3Z1G4(&^za@O=9N$ zN%ix$tk4bH@mA6<^k28{`QQ~aS+MEDAysq(c(on*t9?iRu=2)6IP4MfA7+6t)6=k44HkZJtyQ2}5E5g8;WUDi!3UQuoqdAseYb zwWXieU{{*&5%}!u$OFvgw{(0v)%2wtQH?;@iOWwW>eF7P$g`otMFQoCEh;bj{{>&_ z+*^=kwq+2$KpAgTJK;qqm&edR+Fc}G@ZH}&gJl#lH%-1b(Z3o;A_QZ7voZTjhu{JE zDXFccF6kgbS%xIKbPcNN)7ZSWYf3y4$h8a282q$GO&g1fIQj`r)gNL+{jBP6nhp_2 z;3;r<4sk2sIIdjt5S`^v$9v6mOVZVWd(o0q3 ziO1wRCax3wdy|(0nmc3bnanqzSL3RnNlYo3)SOo59V3?q}8ysV_n7_pVq^Nk;FU~~L&B0Df&x>+hU|>ioRN4w6MFp_ zzy$B7IFo0^I2~hU*eUcTBj95gNw-1appWPF7QS#?ae1)>!tgixpw+r$@ix)ZZv!w| zmXJzeLx?VcHd0E zSmHV68Hqpp$@zqF8`HgnLLPljFxE}Srr-VsAUvq2-T$Ro(B+RkNk9~}MR+wrQt*Ft CH?fxh literal 0 HcmV?d00001 diff --git a/icon.png b/icon.png index 877f82feae4e68deb2af0b8a8100a141e4f9668c..4dcb2e05a2043d76c039c78987a7bb1ec7a2adb6 100644 GIT binary patch delta 722 zcmV;@0xkWs1)m0xS%0xfL_t(|+G70w|33pI03d)Eg{yaiX&^of#1cTP2gKiC3SKw6 zFfcOWHUJ=in4q)>5Ssw;LuAchlNs^503d)^ptKecvjg!pAkF|{F(BR!#HX{?USnVd zS`%(0&0ri_}><^oeFT?Q1J0SwkaAbTAUM=gH1@p!v}3q#HIZ4Bk>xftFtaWHWG`wdnM zG7KPqKn8F?4R{2^GygC$G5lg=zQpnG4=`l^^C$fkclx3K;H3vv+y zda3~kAdm~3fcOhgaz0SudbWRmPR*9G{PB#PKcoKs&VMAJTs%nOT~1-GA55(A?En7m z1aeP;ybHu?009JYK{XK90`VOno(PIU&cDAd0-gWv3k&;lAin~Lr{CfdbNax-smA~3 z$A*6l3|D}GT?7=j00dPe1;E@%KOf7;do&fXo4g>;GF@M6@06aR~dpX5*Q`#PHt? zDBcdW=Kw$eu^h{{gxh)s7_T6(^Y%N21;>BF#Y?&V{*r()L1`u!h#R2%^8f+Fq9Vct zR|sP}s|qnZdG{5Ps3Bk~5Su}h{8=F01`0qR{tXad0E!9HsN*6}(*OVf07*qoM6N<$ Ef+yv zc;V%N&-eYj&+}9PsOpL;j;@FT^J4{_L0PNTDm_~l0?{!ki+}$EZv_z8Yuo8~ z;>*SwJ=sLVSk_W;0D-J^s(?+9I~mTQX5Xc-H zTfu%-h^d9zVS(wL38H7(w_%^_uii0$K+948DhTA%f;Hw%2S0NNEO>GHWzVbLC&udT zkhO3uEVCU!Ie*bUAt%}ba;()aIZ6Qp@}w&6x|k9*7g8`rL*Kdi8;ED#;QEIV91l(Y zIPowK+e{Jd0T~0&6kK`z6@7djhdf!wwp#S^9d~>P!TC5WQwj!Wi!>p*WY}^u%h{eQ z=zmnefl-ky`!{2#b7T1JN1S<4gx>S%7mb%u>(n#eMt>IOu!McA;3x+dj`&)kcQ>NR zJ&uNJk)NcSsHaJ(Bfj-+4LUZX_KhiPp!Z7*=_dL}^;D#!n^Y%t?x})H^rbz{bn>rN z{`b&sB(1yxOEeGNsKBbVy)J<@-IZVrNT8;(WdlgpV3?4>z5j-KcShYvhIF;`syH;O z;4sxR=U!8WvH_&)Fx`{jom+!BltbOsW$0YX=;l`8oc@A=`#Cg^2+-J<4BG}!cNx;< zYn^FzomJf=?FdV+vYNrAbpqFG?2CNO*+u3z64s*5SP~ji00000NkvXXu0mjfi7_s6 diff --git a/inc/class.dc.translater.php b/inc/class.dc.translater.php index 54fe45b..0e922a5 100644 --- a/inc/class.dc.translater.php +++ b/inc/class.dc.translater.php @@ -3,8 +3,7 @@ # # This file is part of translater, a plugin for Dotclear 2. # -# Copyright (c) 2009-2013 Jean-Christian Denis and contributors -# contact@jcdenis.fr +# Copyright (c) 2009-2016 Jean-Christian Denis and contributors # # Licensed under the GPL version 2.0 license. # A copy of this license is available in LICENSE file or at @@ -12,1574 +11,1516 @@ # # -- END LICENSE BLOCK ------------------------------------ -if (!defined('DC_CONTEXT_ADMIN')){return;} +if (!defined('DC_CONTEXT_ADMIN')) { + return; +} /** * Translater tools. */ class dcTranslater { - public $core; - public $proposal; - - # List of l10n code/name allowed from clearbricks l10n class - protected static $iso = array(); - # List of type of folder where backups could be saved - public static $allowed_backup_folders = array( - 'public', - 'module', - 'plugin', - 'cache', - 'translater' - ); - # List of l10n groups (subname) of file allowed - public static $allowed_l10n_groups = array( - 'main', - 'public', - 'theme', - 'admin', - 'date', - 'error' - ); - # List of informations about author allowed - public static $allowed_user_informations = array( - 'firstname', - 'displayname', - 'name', - 'email', - 'url' - ); - # List of settings and infos - private $default_settings = array( - 'plugin_menu' => array( - 'id' => 'translater_plugin_menu', - 'value' => 0, - 'type' => 'boolean', - 'label' => 'Put an link in plugins page' - ), - 'theme_menu' => array( - 'id' => 'translater_theme_menu', - 'value' => 0, - 'type' => 'boolean', - 'label' => 'Put a link in themes page' - ), - 'backup_auto' => array( - 'id' => 'translater_backup_auto', - 'value' => 1, - 'type' => 'boolean', - 'label' => 'Make a backup of languages old files when there are modified' - ), - 'backup_limit' => array( - 'id' => 'translater_backup_limit', - 'value' => 20, - 'type' => 'string', - 'label' => 'Maximum backups per module' - ), - 'backup_folder' => array( - 'id' => 'translater_backup_folder', - 'value' => 'module', - 'type' => 'string', - 'label' => 'In which folder to store backups' - ), - 'start_page' => array( - 'id' => 'translater_start_page', - 'value' => 'setting', - 'type' => 'string', - 'label' => 'Page to start on' - ), - 'write_po' => array( - 'id' => 'translater_write_po', - 'value' => 1, - 'type' => 'boolean', - 'label' => 'Write .po languages files' - ), - 'write_langphp' => array( - 'id' => 'translater_write_langphp', - 'value' => 1, - 'type' => 'boolean', - 'label' => 'Write .lang.php languages files' - ), - 'scan_tpl' => array( - 'id' => 'translater_scan_tpl', - 'value' => 0, - 'type' => 'boolean', - 'label' => 'Translate strings of templates files' - ), - 'parse_nodc' => array( - 'id' => 'translater_parse_nodc', - 'value' => 1, - 'type' => 'boolean', - 'label' => 'Translate only untranslated strings of Dotclear', - ), - 'hide_default' => array( - 'id' => 'translater_hide_default', - 'value' => 1, - 'type' => 'boolean', - 'label' => 'Hide default modules of Dotclear', - ), - 'parse_comment' => array( - 'id' => 'translater_parse_comment', - 'value' => 1, - 'type' => 'boolean', - 'label' => 'Write comments and strings informations in lang files' - ), - 'parse_user' => array( - 'id' => 'translater_parse_user', - 'value' => 1, - 'type' => 'boolean', - 'label' => 'Write inforamtions about author in lang files' - ), - 'parse_userinfo' => array( - 'id' => 'translater_parse_userinfo', - 'value' => 'displayname, email', - 'type' => 'string', - 'label' => 'Type of informations about user to write' - ), - 'import_overwrite' => array( - 'id' => 'translater_import_overwrite', - 'value' => 0, - 'type' => 'boolean', - 'label' => 'Overwrite existing languages when import packages' - ), - 'export_filename' => array( - 'id' => 'translater_export_filename', - 'value' => 'type-module-l10n-timestamp', - 'type' => 'string', - 'label' => 'Name of files of exported package' - ), - 'proposal_tool' => array( - 'id' => 'translater_proposal_tool', - 'value' => 'google', - 'type' => 'string', - 'label' => 'Id of default tool for proposed translation' - ), - 'proposal_lang' => array( - 'id' => 'translater_proposal_lang', - 'value' => 'en', - 'type' => 'string', - 'label' => 'Default source language for proposed translation' - ) - ); - # List of default modules of Dotclear - public static $default_dotclear_modules = array( - 'plugin' => array( - 'aboutConfig', - 'akismet', - 'antispam', - 'blogroll', - 'blowupConfig', - 'daInstaller', - 'externalMedia', - 'fairTrackbacks', - 'importExport', - 'maintenance', - 'pages', - 'pings', - 'simpleMenu', - 'tags', - 'themeEditor', - 'userPref', - 'widgets' - ), - 'theme' => array( - 'default', - 'blueSilence', - 'customCSS', - 'ductile' - ) - ); - - # List of modules (from plugins,thems, by dcModule::getModules) - private $modules = array(); - # Particular module - private $module = array(); - - # Construtor - function __construct($core) - { - $this->core =& $core; - $core->blog->settings->addNamespace('translater'); - $this->loadModules(); - $this->proposal = new translaterProposals($core); - } - - # Return array of default settings - public function getDefaultSettings() - { - return $this->default_settings; - } - - # Get settings for current blog - public function getSettings($id=null) - { - $res = array(); - foreach($this->default_settings AS $k => $v) - { - if ($k == $id) - { - return $this->core->blog->settings->translater->get( - $this->default_settings[$k]['id'] - ); - } - $res[$k] = $this->core->blog->settings->translater->get( - $this->default_settings[$k]['id'] - ); - } - return $res; - } - - # Get a setting according to default settings list - public function get($id) - { - if (isset($this->default_settings[$id])) - { - return $this->core->blog->settings->translater->get( - $this->default_settings[$id]['id'] - ); - } - return null; - } - - # See get() - public function __get($id) - { - return $this->get($id); - } - - # Set a setting according to default settings list - public function set($k,$v) - { - if (!isset($this->default_settings[$k])) return false; + public $core; + public $proposal; + + # List of l10n code/name allowed from clearbricks l10n class + protected static $iso = array(); + # List of type of folder where backups could be saved + public static $allowed_backup_folders = array( + 'public', + 'module', + 'plugin', + 'cache', + 'translater' + ); + # List of l10n groups (subname) of file allowed + public static $allowed_l10n_groups = array( + 'main', + 'public', + 'theme', + 'admin', + 'date', + 'error' + ); + # List of informations about author allowed + public static $allowed_user_informations = array( + 'firstname', + 'displayname', + 'name', + 'email', + 'url' + ); + # List of settings and infos + private $default_settings = array( + 'plugin_menu' => array( + 'id' => 'translater_plugin_menu', + 'value' => 0, + 'type' => 'boolean', + 'label' => 'Put an link in plugins page' + ), + 'theme_menu' => array( + 'id' => 'translater_theme_menu', + 'value' => 0, + 'type' => 'boolean', + 'label' => 'Put a link in themes page' + ), + 'backup_auto' => array( + 'id' => 'translater_backup_auto', + 'value' => 1, + 'type' => 'boolean', + 'label' => 'Make a backup of languages old files when there are modified' + ), + 'backup_limit' => array( + 'id' => 'translater_backup_limit', + 'value' => 20, + 'type' => 'string', + 'label' => 'Maximum backups per module' + ), + 'backup_folder' => array( + 'id' => 'translater_backup_folder', + 'value' => 'module', + 'type' => 'string', + 'label' => 'In which folder to store backups' + ), + 'start_page' => array( + 'id' => 'translater_start_page', + 'value' => 'setting', + 'type' => 'string', + 'label' => 'Page to start on' + ), + 'write_po' => array( + 'id' => 'translater_write_po', + 'value' => 1, + 'type' => 'boolean', + 'label' => 'Write .po languages files' + ), + 'write_langphp' => array( + 'id' => 'translater_write_langphp', + 'value' => 1, + 'type' => 'boolean', + 'label' => 'Write .lang.php languages files' + ), + 'scan_tpl' => array( + 'id' => 'translater_scan_tpl', + 'value' => 0, + 'type' => 'boolean', + 'label' => 'Translate strings of templates files' + ), + 'parse_nodc' => array( + 'id' => 'translater_parse_nodc', + 'value' => 1, + 'type' => 'boolean', + 'label' => 'Translate only untranslated strings of Dotclear', + ), + 'hide_default' => array( + 'id' => 'translater_hide_default', + 'value' => 1, + 'type' => 'boolean', + 'label' => 'Hide default modules of Dotclear', + ), + 'parse_comment' => array( + 'id' => 'translater_parse_comment', + 'value' => 1, + 'type' => 'boolean', + 'label' => 'Write comments and strings informations in lang files' + ), + 'parse_user' => array( + 'id' => 'translater_parse_user', + 'value' => 1, + 'type' => 'boolean', + 'label' => 'Write inforamtions about author in lang files' + ), + 'parse_userinfo' => array( + 'id' => 'translater_parse_userinfo', + 'value' => 'displayname, email', + 'type' => 'string', + 'label' => 'Type of informations about user to write' + ), + 'import_overwrite' => array( + 'id' => 'translater_import_overwrite', + 'value' => 0, + 'type' => 'boolean', + 'label' => 'Overwrite existing languages when import packages' + ), + 'export_filename' => array( + 'id' => 'translater_export_filename', + 'value' => 'type-module-l10n-timestamp', + 'type' => 'string', + 'label' => 'Name of files of exported package' + ), + 'proposal_tool' => array( + 'id' => 'translater_proposal_tool', + 'value' => 'google', + 'type' => 'string', + 'label' => 'Id of default tool for proposed translation' + ), + 'proposal_lang' => array( + 'id' => 'translater_proposal_lang', + 'value' => 'en', + 'type' => 'string', + 'label' => 'Default source language for proposed translation' + ) + ); + # List of default modules of Dotclear + public static $default_dotclear_modules = array( + 'plugin' => array( + 'aboutConfig', + 'akismet', + 'antispam', + 'attachments', + 'blogroll', + 'blowupConfig', + 'breadcrumb', + 'dcCKEditor', + 'dclegacy', + 'dcLegacyEditor', + 'fairTrackbacks', + 'importExport', + 'maintenance', + 'pages', + 'pings', + 'simpleMenu', + 'tags', + 'themeEditor', + 'userPref', + 'widgets' + ), + 'theme' => array( + 'default', + 'berlin', + 'blueSilence', + 'customCSS', + 'ductile' + ) + ); + + # List of modules (from plugins,thems, by dcModule::getModules) + private $modules = array(); + # Particular module + private $module = array(); + + # Construtor + function __construct($core) + { + $this->core =& $core; + $core->blog->settings->addNamespace('translater'); + $this->loadModules(); + $this->proposal = new translaterProposals($core); + } + + # Return array of default settings + public function getDefaultSettings() + { + return $this->default_settings; + } + + # Get settings for current blog + public function getSettings($id = null) + { + $res = array(); + foreach($this->default_settings AS $k => $v) { + if ($k == $id) { + return $this->core->blog->settings->translater->get( + $this->default_settings[$k]['id'] + ); + } + $res[$k] = $this->core->blog->settings->translater->get( + $this->default_settings[$k]['id'] + ); + } + return $res; + } + + # Get a setting according to default settings list + public function get($id) + { + if (isset($this->default_settings[$id])) + { + return $this->core->blog->settings->translater->get( + $this->default_settings[$id]['id'] + ); + } + return null; + } + + # See get() + public function __get($id) + { + return $this->get($id); + } + + # Set a setting according to default settings list + public function set($k, $v) + { + if (!isset($this->default_settings[$k])) { + return false; + } - $this->dropOldSettings($this->default_settings[$k]['id']); - $this->core->blog->settings->translater->put( - $this->default_settings[$k]['id'], - $v, - $this->default_settings[$k]['type'], - $this->default_settings[$k]['label'], - true,true - ); - return true; - } - - # See set() - public function __set($k,$v) - { - return $this->set($k,$v); - } - - # Drop old "per blog" settings (as of version 2013.05.11) - private function dropOldSettings($id) - { - $this->core->blog->settings->translater->drop($id); - } - - # Retrieve a particular info for a given module - public function moduleInfo($id,$info) - { - if (isset($this->modules['plugin'][$id])) - { - $type = 'plugin'; - } - elseif (isset($this->modules['theme'][$id])) - { - $type = 'theme'; - } - else - { - return null; - } - - if ($info == 'type') - { - return $type; - } - - return isset($this->modules[$type][$id][$info]) ? $this->modules[$type][$id][$info] : null; - } - - # Load array of modules infos by type of modules - private function loadModules() - { - $themes = new dcThemes($this->core); - $themes->loadModules($this->core->blog->themes_path,null); - $this->modules['theme'] = $this->modules['plugin'] = array(); - - $m = $themes->getModules(); - foreach($m AS $k => $v) - { - if (!$v['root_writable']) continue; - $this->modules['theme'][$k] = $v; - $this->modules['theme'][$k]['id'] = $k; - $this->modules['theme'][$k]['type'] = 'theme'; - } - - $m = $this->core->plugins->getModules(); - foreach($m AS $k => $v) - { - if (!$v['root_writable']) continue; - $this->modules['plugin'][$k] = $v; - $this->modules['plugin'][$k]['id'] = $k; - $this->modules['plugin'][$k]['type'] = 'plugin'; - } - } + $this->dropOldSettings($this->default_settings[$k]['id']); + $this->core->blog->settings->translater->put( + $this->default_settings[$k]['id'], + $v, + $this->default_settings[$k]['type'], + $this->default_settings[$k]['label'], + true,true + ); + return true; + } + + # See set() + public function __set($k, $v) + { + return $this->set($k, $v); + } + + # Drop old "per blog" settings (as of version 2013.05.11) + private function dropOldSettings($id) + { + $this->core->blog->settings->translater->drop($id); + } + + # Retrieve a particular info for a given module + public function moduleInfo($id, $info) + { + if (isset($this->modules['plugin'][$id])) { + $type = 'plugin'; + } elseif (isset($this->modules['theme'][$id])) { + $type = 'theme'; + } else { + return null; + } + + if ($info == 'type') { + return $type; + } + + return isset($this->modules[$type][$id][$info]) ? $this->modules[$type][$id][$info] : null; + } + + # Load array of modules infos by type of modules + private function loadModules() + { + $themes = new dcThemes($this->core); + $themes->loadModules($this->core->blog->themes_path, null); + $this->modules['theme'] = $this->modules['plugin'] = array(); + + $m = $themes->getModules(); + foreach($m AS $k => $v) { + if (!$v['root_writable']) { + continue; + } + $this->modules['theme'][$k] = $v; + $this->modules['theme'][$k]['id'] = $k; + $this->modules['theme'][$k]['type'] = 'theme'; + } + + $m = $this->core->plugins->getModules(); + foreach($m AS $k => $v) + { + if (!$v['root_writable']) { + continue; + } + $this->modules['plugin'][$k] = $v; + $this->modules['plugin'][$k]['id'] = $k; + $this->modules['plugin'][$k]['type'] = 'plugin'; + } + } - # Return array of modules infos by type of modules - public function listModules($type='') - { - return in_array($type,array('plugin','theme')) ? - $this->modules[$type] : - array_merge($this->modules['theme'],$this->modules['plugin']); - } - - # Return array object of a particular module for a given type of module - public function getModule($module='',$type='') - { - $o = new ArrayObject(); - - # Load nothing? - if (empty($module)) { - return false; - } - - # Unknow type? - if (!in_array($type,array('plugin','theme'))) { - $modules = array_merge($this->modules['theme'],$this->modules['plugin']); - } - else { - $modules = $this->modules[$type]; - } - - # Unknow module? - if (!isset($modules[$module])) { - throw new Exception(sprintf( - __('Cannot find module %s'),$module) - ); - return false; - } - - # Module info - foreach($modules[$module] as $a => $b) { - $o->{$a} = $b; - } - $o->root = path::real($o->root); - # Locales path - $o->locales = $o->root.'/locales'; - # Module exists - $o->exists = true; - # Module Basename - $i = path::info($o->root); - $o->basename = $i['basename']; - - return $o; - } - - public function getBackupFolder($module,$throw=false) - { - $dir = false; - switch($this->backup_folder) - { - case 'module': - # plugin - if (isset($this->modules['plugin'][$module]) - && $this->modules['plugin'][$module]['root_writable']) - { - $dir = path::real($this->modules['plugin'][$module]['root']).'/locales'; - } - #theme - elseif (isset($this->modules['theme'][$module]) - && $this->modules['theme'][$module]['root_writable']) - { - $dir = path::real($this->modules['theme'][$module]['root']).'/locales'; - } - break; + # Return array of modules infos by type of modules + public function listModules($type='') + { + return in_array($type, array('plugin', 'theme')) ? + $this->modules[$type] : + array_merge($this->modules['theme'], $this->modules['plugin']); + } + + # Return array object of a particular module for a given type of module + public function getModule($module='',$type='') + { + $o = new ArrayObject(); + + # Load nothing? + if (empty($module)) { + return false; + } + + # Unknow type? + if (!in_array($type, array('plugin', 'theme'))) { + $modules = array_merge($this->modules['theme'], $this->modules['plugin']); + } else { + $modules = $this->modules[$type]; + } + + # Unknow module? + if (!isset($modules[$module])) { + throw new Exception(sprintf( + __('Cannot find module %s'), $module + )); + return false; + } + + # Module info + foreach($modules[$module] as $a => $b) { + $o->{$a} = $b; + } + $o->root = path::real($o->root); + # Locales path + $o->locales = $o->root . '/locales'; + # Module exists + $o->exists = true; + # Module Basename + $i = path::info($o->root); + $o->basename = $i['basename']; + + return $o; + } + + public function getBackupFolder($module, $throw = false) + { + $dir = false; + switch($this->backup_folder) { + case 'module': + # plugin + if (isset($this->modules['plugin'][$module]) + && $this->modules['plugin'][$module]['root_writable']) { + $dir = path::real($this->modules['plugin'][$module]['root']) . '/locales'; + #theme + } + elseif (isset($this->modules['theme'][$module]) + && $this->modules['theme'][$module]['root_writable']) { + $dir = path::real($this->modules['theme'][$module]['root']) . '/locales'; + } + break; - case 'plugin': - $tmp = path::real(array_pop(explode(PATH_SEPARATOR, DC_PLUGINS_ROOT))); - if ($tmp && is_writable($tmp)) - { - $dir = $tmp; - } - break; + case 'plugin': + $tmp = path::real(array_pop(explode(PATH_SEPARATOR, DC_PLUGINS_ROOT))); + if ($tmp && is_writable($tmp)) { + $dir = $tmp; + } + break; - case 'public': - $tmp = path::real($this->core->blog->public_path); - if ($tmp && is_writable($tmp)) - { - $dir = $tmp; - } - break; + case 'public': + $tmp = path::real($this->core->blog->public_path); + if ($tmp && is_writable($tmp)) { + $dir = $tmp; + } + break; - case 'cache': - $tmp = path::real(DC_TPL_CACHE); - if ($tmp && is_writable($tmp)) - { - @mkDir($tmp.'/l10n'); - $dir = $tmp.'/l10n'; - } - break; + case 'cache': + $tmp = path::real(DC_TPL_CACHE); + if ($tmp && is_writable($tmp)) { + @mkDir($tmp . '/l10n'); + $dir = $tmp . '/l10n'; + } + break; - case 'translater': - $tmp = path::real($this->modules['plugin']['translater']['root']); - if ($tmp && is_writable($tmp)) - { - @mkDir($tmp.'/locales'); - $dir = $tmp.'/locales'; - } - break; - } - if (!$dir && $throw) - { - throw new Exception(sprintf( - __('Cannot find backups folder for module %s'),$module) - ); - } - - return $dir; - } - - public function getLangsFolder($module='',$throw=false) - { - $dir = $module == 'dotclear' ? - DC_ROOT : - self::getModuleFolder($module,false); - - if (!$dir && $throw) - { - throw new Exception(sprintf( - __('Cannot find languages folder for module %s'),$module) - ); - } - - return !$dir ? false : $dir.'/locales'; - } + case 'translater': + $tmp = path::real($this->modules['plugin']['translater']['root']); + if ($tmp && is_writable($tmp)) { + @mkDir($tmp . '/locales'); + $dir = $tmp . '/locales'; + } + break; + } + if (!$dir && $throw) { + throw new Exception(sprintf( + __('Cannot find backups folder for module %s'), $module + )); + } + + return $dir; + } + + public function getLangsFolder($module = '', $throw = false) + { + $dir = $module == 'dotclear' ? + DC_ROOT : + self::getModuleFolder($module, false); + + if (!$dir && $throw) { + throw new Exception(sprintf( + __('Cannot find languages folder for module %s'), $module + )); + } + + return !$dir ? false : $dir . '/locales'; + } - public function getModuleFolder($module='',$throw=false) - { - $dir = false; - if ((isset($this->modules['plugin'][$module]['root']) - && ($tmp = path::real($this->modules['plugin'][$module]['root']))) || - (isset($this->modules['theme'][$module]['root']) - && ($tmp = path::real($this->modules['theme'][$module]['root'])))) - { - $dir = $tmp; - } - if (!$dir && $throw) - { - throw new Exception(sprintf( - __('Cannot find root folder for module %s'),$module) - ); - } - - return $dir; - } + public function getModuleFolder($module = '', $throw = false) + { + $dir = false; + if ((isset($this->modules['plugin'][$module]['root']) + && ($tmp = path::real($this->modules['plugin'][$module]['root']))) || + (isset($this->modules['theme'][$module]['root']) + && ($tmp = path::real($this->modules['theme'][$module]['root'])))) { + $dir = $tmp; + } + if (!$dir && $throw) { + throw new Exception(sprintf( + __('Cannot find root folder for module %s'), $module + )); + } + + return $dir; + } - public function isBackupLimit($module,$throw=false) - { - # Find folder of backups - $backup = self::getBackupFolder($module,true); - - # Count backup files - $count = 0; - foreach(self::scandir($backup) AS $file) - { - if (!is_dir($backup.'/'.$file) - && preg_match('/^(l10n-'.$module.'(.*?).bck.zip)$/',$backup)) - { - $count++; - } - } - - # Limite exceed - if ($count >= $this->backup_limit) - { - if ($throw) - { - throw new Exception(sprintf( - __('Limit of %s backups for module %s exceed'), - $this->backup_limit,$module) - ); - } - return true; - } - else - { - return false; - } - } + public function isBackupLimit($module, $throw = false) + { + # Find folder of backups + $backup = self::getBackupFolder($module, true); + + # Count backup files + $count = 0; + foreach(self::scandir($backup) AS $file) { + if (!is_dir($backup . '/' . $file) + && preg_match('/^(l10n-'. $module . '(.*?).bck.zip)$/', $backup)) { + $count++; + } + } + + # Limite exceed + if ($count >= $this->backup_limit) { + if ($throw) { + throw new Exception(sprintf( + __('Limit of %s backups for module %s exceed'), + $this->backup_limit, $module + )); + } + return true; + } else { + return false; + } + } - public function listBackups($module,$return_filename=false) - { - # Not a module installed - self::getLangsFolder($module,true); - - # No backup folder for this module - $backup = self::getBackupFolder($module,false); - if (!$backup) return array(); - - # Scan files for backups - $res = $sort = array(); - $files = self::scandir($backup); - foreach($files AS $file) - { - # Not a bakcup file - $is_backup = preg_match( - '/^(l10n-('.$module.')-(.*?)-([0-9]*?).bck.zip)$/',$file,$m); - - if (is_dir($backup.'/'.$file) - || !$is_backup - || !self::isIsoCode($m[3])) continue; - - # Backup infos - if ($return_filename) - { - $res[] = $file; - } - else - { - $res[$m[3]][$file] = path::info($backup.'/'.$file); - $res[$m[3]][$file]['time']= filemtime($backup.'/'.$file); - $res[$m[3]][$file]['size'] = filesize($backup.'/'.$file); - $res[$m[3]][$file]['module'] = $module; - } - } - return $res; - } - - public function createBackup($module,$lang) - { - # Not a module installed - $locales = self::getLangsFolder($module,true); - - # No backup folder for this module - $backup = self::getBackupFolder($module,true); - - # Not an existing lang - if (!is_dir($locales.'/'.$lang)) - { - throw new Exception(sprintf( - __('Cannot find language folder %s for module %s'),$lang,$module) - ); - } - - # Scan files for a lang - $res = array(); - $files = self::scandir($locales.'/'.$lang); - foreach($files as $file) - { - # Only lang file - if (!is_dir($locales.'/'.$lang.'/'.$file) - && (self::isLangphpFile($file) - || self::isPoFile($file))) - { - $res[$locales.'/'.$lang.'/'.$file] = - $module.'/locales/'.$lang.'/'.$file; - } - } - - # Do Zip - if (!empty($res)) - { - self::isBackupLimit($module,true); - - @set_time_limit(300); - $fp = fopen($backup.'/l10n-'.$module.'-'.$lang.'-'.time().'.bck.zip','wb'); - $zip = new fileZip($fp); - foreach($res AS $src => $dest) - { - $zip->addFile($src,$dest); - } - $zip->write(); - $zip->close(); - unset($zip); - } - } - - public function deleteBackup($module,$file) - { - # Not a module installed - self::getLangsFolder($module,true); - - # No backup folder for this module - $backup = self::getBackupFolder($module,true); - - # Not a bakcup file - $is_backup = preg_match('/^(l10n-('.$module.')-(.*?)-([0-9]*?).bck.zip)$/',$file,$m); - - if (is_dir($backup.'/'.$file) - || !$is_backup - || !self::isIsoCode($m[3])) continue; - - if (!files::isDeletable($backup.'/'.$file)) - { - throw new Exception(sprintf( - __('Cannot delete backup file %s'),$file) - ); - } - - unlink($backup.'/'.$file); - } - - public function restoreBackup($module,$file) - { - # Not a module installed - $locales = self::getModuleFolder($module,true); - - # No backup folder for this module - $backup = self::getBackupFolder($module,true); - - if (!file_exists($backup.'/'.$file)) - { - throw new Exception(sprintf( - __('Cannot find backup file %s'),$file) - ); - } - - $zip = new fileUnzip($backup.'/'.$file); - $zip_files = $zip->getFilesList(); - - foreach($zip_files AS $zip_file) - { - $f = self::explodeZipFilename($zip_file,true); - if ($module != $f['module']) continue; - - $zip->unzip($zip_file,$locales.'/locales/'.$f['lang'].'/'.$f['group'].$f['ext']); - $done = true; - } - $zip->close(); - unset($zip); - } - - public function exportPack($modules,$langs) - { - # Not a query good formed - if (!is_array($modules) || 1 > count($modules) - || !is_array($langs) || 1 > count($langs)) - { - throw new Exception( - __('Wrong export query') - ); - } - - # Filter default filename - $filename = files::tidyFileName($this->export_filename); - - # Not a filename good formed - if (empty($filename)) - { - throw new Exception(sprintf( - __('Cannot use export mask %s'),$this->export_filename) - ); - } - - # Modules folders - $res = array(); - $count = array(); - foreach($modules AS $module) - { - # Not a module installed - $locales = self::getLangsFolder($module,false); - if (!$locales) continue; - - # Langs folders - foreach($langs AS $lang) - { - # Not a lang folder - if (!is_dir($locales.'/'.$lang)) continue; - - # Scan files for a lang - $files = self::scandir($locales.'/'.$lang); - foreach($files as $file) - { - # Not a lang file - if (is_dir($locales.'/'.$lang.'/'.$file) - || !self::isLangphpFile($file) - && !self::isPoFile($file)) continue; - - # Add file to zip in format "module/locales/lang/filename" - $res[$locales.'/'.$lang.'/'.$file] = - $module.'/locales/'.$lang.'/'.$file; - - $count[$module] = 1; - } - } - } - - # Nothing to do - if (empty($res)) - { - throw new Exception('Nothing to export'); - } - - # Prepare files to zip - @set_time_limit(300); - $fp = fopen('php://output','wb'); - $zip = new fileZip($fp); - foreach($res as $from => $to) - { - $zip->addFile($from,$to); - } - - # Set filename - $file_infos = 1 < count($count) ? - array(time(),'modules','multi',self::$dcTranslaterVersion) : - array( - time(), - $modules[0], - self::moduleInfo($modules[0],'type'), - self::moduleInfo($modules[0],'version') - ); - $filename = - files::tidyFileName( - dt::str( - str_replace( - array('timestamp','module','type','version'), - $file_infos, - $this->export_filename - ) - ) - ); - - # Send Zip - header('Content-Disposition: attachment;filename='.$filename.'.zip'); - header('Content-Type: application/x-zip'); - $zip->write(); - unset($zip); - exit; - } - - public function importPack($modules,$zip_file) - { - # Not a file uploaded - files::uploadStatus($zip_file); - - # No modules to update - if (!is_array($modules) || 1 > count($modules)) - { - throw new Exception(__('Wrong import query')); - } - - $done = false; - $res = array(); - - # Load Unzip object - $zip = new fileUnzip($zip_file['tmp_name']); - $files = $zip->getFilesList(); - - # Scan zip - foreach($files AS $file) - { - $f = self::explodeZipFilename($file,false); - - # Not a requested module - if (!is_array($f) - || !in_array($f['module'],$modules)) continue; - - # Get locales folder (even if "locales" is not set) - if (!$dir = self::getModuleFolder($f['module'],false)) continue; - $locales = $dir.'/locales'; - - # Not allow overwrite - if (!$this->import_overwrite - && file_exists($locales.'/'.$f['lang'].'/'.$f['group'].$f['ext'])) continue; - - $res[] = array( - 'from' => $file, - 'root' => $locales.'/'.$f['lang'], - 'to' => $locales.'/'.$f['lang'].'/'.$f['group'].$f['ext'] - ); - } - # Unzip files - foreach ($res AS $rs) - { - if (!is_dir($rs['root'])) - files::makeDir($rs['root'],true); + public function listBackups($module, $return_filename = false) + { + # Not a module installed + self::getLangsFolder($module, true); + + # No backup folder for this module + $backup = self::getBackupFolder($module, false); + if (!$backup) { + return array(); + } + + # Scan files for backups + $res = $sort = array(); + $files = self::scandir($backup); + foreach($files AS $file) { + # Not a bakcup file + $is_backup = preg_match( + '/^(l10n-(' . $module . ')-(.*?)-([0-9]*?).bck.zip)$/', $file, $m + ); + + if (is_dir($backup . '/' . $file) + || !$is_backup + || !self::isIsoCode($m[3])) { + continue; + } + + # Backup infos + if ($return_filename) { + $res[] = $file; + } else { + $res[$m[3]][$file] = path::info($backup . '/' . $file); + $res[$m[3]][$file]['time']= filemtime($backup . '/' . $file); + $res[$m[3]][$file]['size'] = filesize($backup . '/' . $file); + $res[$m[3]][$file]['module'] = $module; + } + } + return $res; + } + + public function createBackup($module, $lang) + { + # Not a module installed + $locales = self::getLangsFolder($module, true); + + # No backup folder for this module + $backup = self::getBackupFolder($module, true); + + # Not an existing lang + if (!is_dir($locales . '/' . $lang)) { + throw new Exception(sprintf( + __('Cannot find language folder %s for module %s') ,$lang, $module + )); + } + + # Scan files for a lang + $res = array(); + $files = self::scandir($locales . '/' . $lang); + foreach($files as $file) { + # Only lang file + if (!is_dir($locales . '/' . $lang . '/' . $file) + && (self::isLangphpFile($file) + || self::isPoFile($file))) { + $res[$locales . '/' . $lang . '/' . $file] = + $module . '/locales/' . $lang . '/' . $file; + } + } + + # Do Zip + if (!empty($res)) { + self::isBackupLimit($module, true); + + @set_time_limit(300); + $fp = fopen($backup . '/l10n-' . $module . '-' . $lang . '-' . time() . '.bck.zip', 'wb'); + $zip = new fileZip($fp); + foreach($res AS $src => $dest) { + $zip->addFile($src, $dest); + } + $zip->write(); + $zip->close(); + unset($zip); + } + } + + public function deleteBackup($module, $file) + { + # Not a module installed + self::getLangsFolder($module, true); + + # No backup folder for this module + $backup = self::getBackupFolder($module, true); + + # Not a bakcup file + $is_backup = preg_match('/^(l10n-(' . $module . ')-(.*?)-([0-9]*?).bck.zip)$/', $file, $m); + + if (is_dir($backup . '/' . $file) + || !$is_backup + || !self::isIsoCode($m[3])) { + return; + } + + if (!files::isDeletable($backup . '/' . $file)) { + throw new Exception(sprintf( + __('Cannot delete backup file %s'), $file + )); + } + + unlink($backup . '/' . $file); + } + + public function restoreBackup($module, $file) + { + # Not a module installed + $locales = self::getModuleFolder($module, true); + + # No backup folder for this module + $backup = self::getBackupFolder($module, true); + + if (!file_exists($backup . '/' . $file)) { + throw new Exception(sprintf( + __('Cannot find backup file %s'), $file + )); + } + + $zip = new fileUnzip($backup . '/' . $file); + $zip_files = $zip->getFilesList(); + + foreach($zip_files AS $zip_file) { + $f = self::explodeZipFilename($zip_file, true); + if ($module != $f['module']) { + continue; + } + + $zip->unzip($zip_file, $locales . '/locales/' . $f['lang'] . '/' . $f['group'] . $f['ext']); + $done = true; + } + $zip->close(); + unset($zip); + } + + public function exportPack($modules, $langs) + { + # Not a query good formed + if (!is_array($modules) || 1 > count($modules) + || !is_array($langs) || 1 > count($langs)) { + throw new Exception( + __('Wrong export query') + ); + } + + # Filter default filename + $filename = files::tidyFileName($this->export_filename); + + # Not a filename good formed + if (empty($filename)) { + throw new Exception(sprintf( + __('Cannot use export mask %s'), $this->export_filename + )); + } + + # Modules folders + $res = array(); + $count = array(); + foreach($modules AS $module) { + # Not a module installed + $locales = self::getLangsFolder($module, false); + if (!$locales) { + continue; + } + + # Langs folders + foreach($langs AS $lang) { + # Not a lang folder + if (!is_dir($locales . '/' . $lang)) { + continue; + } + + # Scan files for a lang + $files = self::scandir($locales . '/' . $lang); + foreach($files as $file) { + # Not a lang file + if (is_dir($locales . '/' . $lang . '/' . $file) + || !self::isLangphpFile($file) + && !self::isPoFile($file)) { + continue; + } + + # Add file to zip in format "module/locales/lang/filename" + $res[$locales . '/' . $lang . '/' . $file] = + $module . '/locales/' . $lang . '/' . $file; + + $count[$module] = 1; + } + } + } + + # Nothing to do + if (empty($res)) { + throw new Exception('Nothing to export'); + } + + # Prepare files to zip + @set_time_limit(300); + $fp = fopen('php://output', 'wb'); + $zip = new fileZip($fp); + foreach($res as $from => $to) { + $zip->addFile($from,$to); + } + + # Set filename + $file_infos = 1 < count($count) ? + array(time(), 'modules', 'multi', self::$dcTranslaterVersion) : + array( + time(), + $modules[0], + self::moduleInfo($modules[0], 'type'), + self::moduleInfo($modules[0], 'version') + ); + $filename = + files::tidyFileName( + dt::str( + str_replace( + array('timestamp', 'module', 'type', 'version'), + $file_infos, + $this->export_filename + ) + ) + ); + + # Send Zip + header('Content-Disposition: attachment;filename=' . $filename . '.zip'); + header('Content-Type: application/x-zip'); + $zip->write(); + unset($zip); + exit; + } + + public function importPack($modules, $zip_file) + { + # Not a file uploaded + files::uploadStatus($zip_file); + + # No modules to update + if (!is_array($modules) || 1 > count($modules)) { + throw new Exception(__('Wrong import query')); + } + + $done = false; + $res = array(); + + # Load Unzip object + $zip = new fileUnzip($zip_file['tmp_name']); + $files = $zip->getFilesList(); + + # Scan zip + foreach($files AS $file) { + $f = self::explodeZipFilename($file, false); + + # Not a requested module + if (!is_array($f) + || !in_array($f['module'],$modules)) { + continue; + } + + # Get locales folder (even if "locales" is not set) + if (!$dir = self::getModuleFolder($f['module'], false)) { + continue; + } + $locales = $dir . '/locales'; + + # Not allow overwrite + if (!$this->import_overwrite + && file_exists($locales . '/' . $f['lang'] . '/' . $f['group'] . $f['ext'])) { + continue; + } + + $res[] = array( + 'from' => $file, + 'root' => $locales . '/' . $f['lang'], + 'to' => $locales . '/' . $f['lang'] . '/' . $f['group'] . $f['ext'] + ); + } + # Unzip files + foreach ($res AS $rs) { + if (!is_dir($rs['root'])) { + files::makeDir($rs['root'], true); + } - $zip->unzip($rs['from'],$rs['to']); - $done = true; - } - $zip->close(); - unlink($zip_file['tmp_name']); - - # No file unzip - if (!$done) - { - throw new Exception(sprintf( - __('Nothing to import for these modules in pack %s'), - $zip_file['name']) - ); - } - } - - public function explodeZipFilename($file='',$throw=false) - { - # module/locales/lang/group.ext - $is_file = preg_match( - '/^(.*?)\/locales\/(.*?)\/(.*?)(.po|.lang.php)$/',$file,$f); - - # Explode file to infos - if ($is_file) { - $module = null !== self::moduleInfo($f[1],'name') ? - $f[1] : false; - $lang = self::isIsoCode($f[2]) ? - $f[2] : false; - $group = in_array($f[3],self::$allowed_l10n_groups) ? - $f[3] : false; - $ext = self::isLangphpFile($f[4]) || self::isPoFile($f[4]) ? - $f[4] : false; - } - # Not good formed - if (!$is_file || !$module || !$lang || !$group || !$ext) - { - if ($throw) - { - throw new Exception(sprintf( - __('Zip file %s is not in translater format'),$file) - ); - } - return false; - } - return array( - 'module' => $module, - 'lang' => $lang, - 'group' => $group, - 'ext' => $ext - ); - } - - public function listLangs($module,$return_path=false) - { - $res = array(); - - # Not a module installed - $locales = self::getLangsFolder($module,true); - - # Add prefix "locales" as scandir remove it - $prefix = preg_match('/(locales(.*))$/',$locales) ? 'locales' : ''; - - # Retrieve langs folders - $files = self::scandir($locales); - foreach($files as $file) - { - if (!preg_match( - '/(.*?(locales\/)([^\/]*?)\/([^\/]*?)(.lang.php|.po))$/', - $prefix.$file,$m)) continue; - - if (!self::isIsoCode($m[3])) continue; - - if ($return_path) - { - $res[$m[3]][] = $file; # Path - } - else - { - $res[$m[3]] = self::$iso[$m[3]]; # Lang name - } - } - return $res; - } - - public function addLang($module,$lang,$from_lang='') - { - # Not a module installed - $locales = self::getLangsFolder($module,true); - - # Path is right formed - self::isIsoCode($lang,true); - - # Retrieve langs folders - $langs = self::listLangs($module); - - # Lang folder is not present - if (isset($langs[$lang])) - { - throw new Exception(sprintf( - __('Language %s already exists for module %s'),$lang,$module) - ); - } - - # Create new lang directory - files::makeDir($locales.'/'.$lang,true); - - # Verify folder of other lang - if (!empty($from_lang) && !isset($langs[$from_lang])) - { - throw new Exception(sprintf( - __('Cannot copy file from language %s for module %s'), - $from_lang,$module) - ); - } - - # Copy files from other lang - if (!empty($from_lang) - && isset($langs[$from_lang])) - { - $files = self::scandir($locales.'/'.$from_lang); - foreach($files as $file) - { - if (is_dir($locales.'/'.$from_lang.'/'.$file) - || !self::isLangphpFile($file) - && !self::isPoFile($file)) continue; - - files::putContent($locales.'/'.$lang.'/'.$file, - file_get_contents($locales.'/'.$from_lang.'/'.$file)); - } - } - else - { - # Create basic empty lang file as translater need these files to be present - self::setLangphpFile($module,$lang,'main',array()); - self::setPoFile($module,$lang,'main',array()); - } - } - - public function updLang($module,$lang,$msgs) - { - # Not a module installed - $locales = self::getLangsFolder($module,true); - - # Path is right formed - self::isIsoCode($lang,true); - - # Retrieve langs folders - $langs = self::listLangs($module); - - # Lang folder is not present - if (!isset($langs[$lang])) - { - throw new Exception(sprintf( - __('Cannot find language folder %s for module %s'),$lang,$module) - ); - } - - # Sort msgids by groups - $rs = array(); - foreach($msgs as $msg) - { - $msg['group'] = isset($msg['group']) ? $msg['group'] : ''; - $msg['msgid'] = isset($msg['msgid']) ? $msg['msgid'] : ''; - $msg['msgstr'] = isset($msg['msgstr']) ? trim($msg['msgstr']) : ''; + $zip->unzip($rs['from'], $rs['to']); + $done = true; + } + $zip->close(); + unlink($zip_file['tmp_name']); + + # No file unzip + if (!$done) { + throw new Exception(sprintf( + __('Nothing to import for these modules in pack %s'), + $zip_file['name'] + )); + } + } + + public function explodeZipFilename($file = '', $throw = false) + { + # module/locales/lang/group.ext + $is_file = preg_match( + '/^(.*?)\/locales\/(.*?)\/(.*?)(.po|.lang.php)$/', $file, $f + ); + + # Explode file to infos + if ($is_file) { + $module = null !== self::moduleInfo($f[1], 'name') ? + $f[1] : false; + $lang = self::isIsoCode($f[2]) ? + $f[2] : false; + $group = in_array($f[3], self::$allowed_l10n_groups) ? + $f[3] : false; + $ext = self::isLangphpFile($f[4]) || self::isPoFile($f[4]) ? + $f[4] : false; + } + # Not good formed + if (!$is_file || !$module || !$lang || !$group || !$ext) { + if ($throw) { + throw new Exception(sprintf( + __('Zip file %s is not in translater format'), $file + )); + } + return false; + } + return array( + 'module' => $module, + 'lang' => $lang, + 'group' => $group, + 'ext' => $ext + ); + } + + public function listLangs($module, $return_path = false) + { + $res = array(); + + # Not a module installed + $locales = self::getLangsFolder($module, true); + + # Add prefix "locales" as scandir remove it + $prefix = preg_match('/(locales(.*))$/', $locales) ? 'locales' : ''; + + # Retrieve langs folders + $files = self::scandir($locales); + foreach($files as $file) { + if (!preg_match( + '/(.*?(locales\/)([^\/]*?)\/([^\/]*?)(.lang.php|.po))$/', + $prefix . $file, $m)) { + continue; + } + + if (!self::isIsoCode($m[3])) { + continue; + } + + if ($return_path) { + $res[$m[3]][] = $file; # Path + } else { + $res[$m[3]] = self::$iso[$m[3]]; # Lang name + } + } + return $res; + } + + public function addLang($module, $lang, $from_lang = '') + { + # Not a module installed + $locales = self::getLangsFolder($module, true); + + # Path is right formed + self::isIsoCode($lang, true); + + # Retrieve langs folders + $langs = self::listLangs($module); + + # Lang folder is not present + if (isset($langs[$lang])) { + throw new Exception(sprintf( + __('Language %s already exists for module %s'), $lang, $module + )); + } + + # Create new lang directory + files::makeDir($locales . '/' . $lang, true); + + # Verify folder of other lang + if (!empty($from_lang) && !isset($langs[$from_lang])) { + throw new Exception(sprintf( + __('Cannot copy file from language %s for module %s'), + $from_lang, $module + )); + } + + # Copy files from other lang + if (!empty($from_lang) + && isset($langs[$from_lang])) { + $files = self::scandir($locales . '/' . $from_lang); + foreach($files as $file) { + if (is_dir($locales . '/' . $from_lang . '/' . $file) + || !self::isLangphpFile($file) + && !self::isPoFile($file)) { + continue; + } + + files::putContent($locales . '/' . $lang . '/' . $file, + file_get_contents($locales . '/' . $from_lang . '/' . $file) + ); + } + } else { + # Create basic empty lang file as translater need these files to be present + self::setLangphpFile($module, $lang, 'main', array()); + self::setPoFile($module, $lang, 'main', array()); + } + } + + public function updLang($module, $lang, $msgs) + { + # Not a module installed + $locales = self::getLangsFolder($module, true); + + # Path is right formed + self::isIsoCode($lang, true); + + # Retrieve langs folders + $langs = self::listLangs($module); + + # Lang folder is not present + if (!isset($langs[$lang])) { + throw new Exception(sprintf( + __('Cannot find language folder %s for module %s'), $lang, $module + )); + } + + # Sort msgids by groups + $rs = array(); + foreach($msgs as $msg) { + $msg['group'] = isset($msg['group']) ? $msg['group'] : ''; + $msg['msgid'] = isset($msg['msgid']) ? $msg['msgid'] : ''; + $msg['msgstr'] = isset($msg['msgstr']) ? trim($msg['msgstr']) : ''; /* - if (get_magic_quotes_gpc()) { - $msg['msgid'] = stripcslashes($msg['msgid']); - $msg['msgstr'] = stripcslashes($msg['msgstr']); - } -*/ if ($msg['msgstr'] == '') continue; - - $rs[$msg['group']][$msg['msgid']] = $msg['msgstr']; - } - - # Backup files if auto-backup is on - if ($this->backup_auto) - { - self::createBackup($module,$lang); - } - - # Delete empty files (files with no group) - foreach(self::$allowed_l10n_groups AS $group) - { - if (isset($rs[$group])) continue; - - $po_file = $locales.'/'.$lang.'/'.$group.'.po'; - $langphp_file = $locales.'/'.$lang.'/'.$group.'.lang.php'; - - if (file_exists($po_file)) - { - unlink($po_file); - } - if (file_exists($langphp_file)) - { - unlink($langphp_file); - } - } - - # No msgstr to write - if (empty($rs)) - { - throw new Exception(sprintf( - __('No string to write, language %s deleted for module %s'), - $lang,$module) - ); - } - - # Write .po and .lang.php files - foreach($rs AS $group => $msgs) - { - self::setLangphpFile($module,$lang,$group,$msgs); - self::setPoFile($module,$lang,$group,$msgs); - } - } - - public function delLang($module,$lang,$del_empty_dir=true) - { - # Not a module installed - $locales = self::getLangsFolder($module,true); - - # Path is right formed - self::isIsoCode($lang,true); - - # Retrieve langs folders - $files = self::listLangs($module,true); - - # Lang folder is not present - if (!isset($files[$lang])) - { - throw new Exception(sprintf( - __('Cannot find language folder %s for module %s'),$lang,$module) - ); - } - - # Delete .po and .lang.php files - foreach($files[$lang] as $file) - { - unlink($locales.'/'.$file); - } - - # Delete lang folder if empty - $dir = self::scandir($locales.'/'.$lang); - if (empty($dir)) - { - rmdir($locales.'/'.$lang); - } - - # Delete locales folder if empty - $loc = self::scandir($locales); - if (empty($loc)) - { - rmdir($locales); - } - } - - public static function encodeMsg($str) - { - return text::toUTF8(stripslashes(trim($str))); - } - - /* Scan a module folder to find all l10n strings in .php files */ - public function getMsgIds($module) - { - $res = array(); - - # Not a module installed - $dir = self::getModuleFolder($module,true); - - $files = self::scandir($dir); - - $scan_ext = array('php'); - if ($this->scan_tpl) - { - $scan_ext[] = 'html'; - } - - foreach($files AS $file) - { - if (is_dir($dir.'/'.$file) - || !in_array(files::getExtension($file),$scan_ext)) continue; - - $contents = file($dir.'/'.$file); - foreach($contents AS $line => $content) - { - # php files - //if (preg_match_all("|__\((['\"]{1})(.*)([\"']{1})\)|U",$content,$matches)) - if (preg_match_all("|__\((['\"]{1})(.*?)([\"']{1})\)|",$content,$matches)) - { - foreach($matches[2] as $id) - { - $res[] = array( - 'msgid' => self::encodeMsg($id), - 'file' => $file, - 'line' => $line + 1 - ); - } - } - # tpl files - if ($this->scan_tpl - && preg_match_all('/\{\{tpl:lang\s([^}]+)\}\}/',$content,$matches)) - { - foreach($matches[1] as $id) - { - $res[] = array( - 'msgid' => self::encodeMsg($id), - 'file' => $file, - 'line' => $line + 1 - ); - } - } - } - unset($contents); - } - return $res; - } - - /* Scan a lang folder to find l10n translations in files */ - public function getMsgStrs($module,$requested_lang='') - { - $res = array(); - - # Not a module installed - $locales = self::getLangsFolder($module,true); - - $langs = self::listLangs($module,true); - - # Not an existing lang - if (!isset($langs[$requested_lang])) return $res; - - # Lang files - $exists = array(); - foreach($langs[$requested_lang] as $file) - { - if (in_array($file,$exists)) continue; - $exists[] = $file; - $path = path::clean($locales.'/'.$file); - - # .po files - if (self::isPoFile($file)) - { - $po = self::getPoFile($path); - if (!is_array($po)) continue; - - foreach($po as $id => $str) - { - $is_po[$requested_lang][$id] = 1; - - $res[] = array( - 'msgid' => self::encodeMsg($id), - 'msgstr' => self::encodeMsg($str), - 'lang' => $requested_lang, - 'type' => 'po', - 'path' => $path, - 'file' => basename($file), - 'group'=> str_replace('.po','',basename($file)) - ); - } - } - # .lang.php files - elseif (self::isLangphpFile($file)) - { - $php = self::getLangphpFile($path); - foreach($php AS $id => $str) - { - # Don't overwrite .po - if (isset($is_po[$requested_lang][$id])) continue; - $res[] = array( - 'msgid' => self::encodeMsg($id), - 'msgstr' => self::encodeMsg($str), - 'lang' => $requested_lang, - 'type' => 'php', - 'path' => $path, - 'file' => basename($file), - 'group'=> str_replace('.lang.php','',basename($file)) - ); - } - } - } - return $res; - } - - public function getMsgs($module,$requested_lang='') - { - # Get messages ids of a module - $m_msgids = self::getMsgIds($module); - - # Get messages translations for a module - $m_msgstrs = self::getMsgStrs($module,$requested_lang); - - # Get messages translations for others modules - foreach(self::listModules() AS $o_module => $o_infos) - { - if ($o_module == $module) continue; - $m_o_msgstrs[$o_module] = self::getMsgStrs($o_module,$requested_lang); - } - $m_o_msgstrs['dotclear'] = self::getMsgStrs('dotclear',$requested_lang); - - # Only one lang or all - $langs = '' == $requested_lang ? - self::listLangs($module) : - array($requested_lang => self::isIsoCode($requested_lang)); - - # Let's go reorder the mixture - $res = array(); - foreach($langs AS $lang => $iso) - { - $res[$lang] = array(); - - # From id list - foreach($m_msgids AS $rs) - { - $res[$lang][$rs['msgid']]['files'][] = array(trim($rs['file'],'/'),$rs['line']); - $res[$lang][$rs['msgid']]['group'] = 'main'; - $res[$lang][$rs['msgid']]['msgstr'] = ''; - $res[$lang][$rs['msgid']]['in_dc'] = false; - $res[$lang][$rs['msgid']]['o_msgstrs'] = array(); - } - - # From str list - foreach($m_msgstrs AS $rs) - { - if ($rs['lang'] != $lang) continue; - - if (!isset($res[$lang][$rs['msgid']])) - { - $res[$lang][$rs['msgid']]['files'][] = array(); - $res[$lang][$rs['msgid']]['in_dc'] = false; - $res[$lang][$rs['msgid']]['o_msgstrs'] = array(); - } - $res[$lang][$rs['msgid']]['group'] = $rs['group']; - $res[$lang][$rs['msgid']]['msgstr'] = $rs['msgstr']; - $res[$lang][$rs['msgid']]['in_dc'] = false; - } - - # From others str list - foreach($m_o_msgstrs AS $o_module => $o_msgstrs) - { - foreach($o_msgstrs AS $rs) - { - if ($rs['lang'] != $lang) continue; - - if (!isset($res[$lang][$rs['msgid']])) continue; - - $res[$lang][$rs['msgid']]['o_msgstrs'][] = array( - 'msgstr' => $rs['msgstr'], - 'module' => $o_module, - 'file' => $rs['file'] - ); - if ($o_module == 'dotclear') - { - $res[$lang][$rs['msgid']]['in_dc'] = true; - } - } - } - } - return '' == $requested_lang ? $res : $res[$requested_lang]; - } - - /* Write a lang file */ - private function writeLangFile($dir,$content,$throw) - { - $path = path::info($dir); - if (is_dir($path['dirname']) && !is_writable($path['dirname']) - || file_exists($dir) && !is_writable($dir)) - { - throw new Exception(sprintf( - __('Cannot grant write acces on lang file %s'),$dir) - ); - } - - # -- BEHAVIOR -- dcTranslaterBeforeWriteLangFile - $this->core->callBehavior('dcTranslaterBeforeWriteLangFile',$dir,$content,$throw); - - $f = @files::putContent($dir,$content); - if (!$f && $throw) - { - throw new Exception(sprintf( - __('Cannot write lang file %s'),$dir) - ); - } - - # -- BEHAVIOR -- dcTranslaterAfterWriteLangFile - $this->core->callBehavior('dcTranslaterAfterWriteLangFile',$f,$dir,$content,$throw); - - return $f; - } - - /* Try if a file is a .lang.php file */ - public static function isLangphpFile($file) - { - return files::getExtension($file) == 'php' && stristr($file,'.lang.php'); - } - - /* Get and parse a .lang.php file */ - public static function getLangphpFile($file) - { - if (!file_exists($file)) return array(); - - $res = array(); - $content = implode('',file($file)); - $count = preg_match_all('/(\$GLOBALS\[\'__l10n\'\]\[\'(.*?)\'\]\s*\x3D\s*\'(.*?)\';)/',$content, $m); - - if (!$count) return array(); - - for ($i=0; $i<$count; $i++) - { - $id = $m[2][$i]; - $str = self::langphpString($m[3][$i]); - - if ($str) - { - $res[self::langphpString($id)] = $str; - } - } - if (!empty($res[''])) - { - $res = array_diff_key($res,array(''=>1)); - } - return $res; - } - - /* Construct and write a .lang.php file */ - private function setLangphpFile($module,$lang,$group,$fields) - { - if (!$this->write_langphp) return; - - # Not a module installed - $locales = self::getLangsFolder($module,true); - - # Path is right formed - $lang_name = self::isIsoCode($lang,true); - - $l = "parse_comment) - { - $l .= - '// Language: '.$lang_name." \n". - '// Module: '.$module." - ".self::moduleInfo($module,'version')."\n". - '// Date: '.dt::str('%Y-%m-%d %H:%M:%S')." \n"; - - if ($this->parse_user && !empty($this->parse_userinfo)) - { - $search = self::$allowed_user_informations; - foreach($search AS $n) - { - $replace[] = $this->core->auth->getInfo('user_'.$n); - } - $info = trim(str_replace($search,$replace,$this->parse_userinfo)); - if (!empty($info)) - { - $l .= '// Author: '.html::escapeHTML($info)."\n"; - } - } - $l .= - '// Translated with dcTranslater - '.$this->core->plugins->moduleInfo('translater','version')." \n\n"; - } - if ($this->parse_comment) - { - $infos = self::getMsgids($module); - foreach($infos AS $info) - { - if (isset($fields[$info['msgid']])) - { - $comments[$info['msgid']] = (isset($comments[$info['msgid']]) ? - $comments[$info['msgid']] : ''). - '#'.trim($info['file'],'/').':'.$info['line']."\n"; - } - } - } - - foreach($fields as $id => $str) - { - if ($this->parse_comment && isset($comments[$id])) - { - $l .= $comments[$id]; - } - - $l .= - '$GLOBALS[\'__l10n\'][\''.addcslashes($id,"'").'\'] = '. - '\''.self::langphpString($str,true)."';\n"; - - if ($this->parse_comment) - { - $l .= "\n"; - } - } - $l .= "?>"; - - self::writeLangFile($locales.'/'.$lang.'/'.$group.'.lang.php',$l,true); - } - - /* Parse a .lang.php string */ - private static function langphpString($string,$reverse=false) - { - if ($reverse) - { - $smap = array('\'', "\n", "\t", "\r"); - $rmap = array('\\\'', '\\n"' . "\n" . '"', '\\t', '\\r'); - return trim((string) str_replace($smap, $rmap, $string)); - } - else - { - $smap = array('/\\\\n/', '/\\\\r/', '/\\\\t/', "/\\\'/"); - $rmap = array("\n", "\r", "\t", "'"); - return trim((string) preg_replace($smap, $rmap, $string)); - } - } - - /* Try if a file is a .po file */ - public static function isPoFile($file) - { - return files::getExtension($file) == 'po'; - } - - /* Get and parse a .po file */ - public static function getPoFile($file) - { - if (!file_exists($file)) return false; - - $res = array(); - $content = implode('',file($file)); - - $count = preg_match_all('/msgid\s(.*(?:\n".*")*)\nmsgstr\s(.*(?:\n".*")*)/',$content,$m); - - if (!$count) return false; - - for ($i=0; $i<$count; $i++) - { - $id = preg_replace('/"(.*)"/s','\\1',$m[1][$i]); - $str= preg_replace('/"(.*)"/s','\\1',$m[2][$i]); - - $str = self::poString($str); - - if ($str) - { - $res[self::poString($id)] = $str; - } - } - - if (!empty($res[''])) - { - $res = array_diff_key($res,array(''=>1)); - } - return $res; - } - /* Construct and parse a .po file */ - private function setPoFile($module,$lang,$group,$fields) - { - if (!$this->write_po) return; - - # Not a module installed - $locales = self::getLangsFolder($module,true); - - # Path is right formed - self::isIsoCode($lang,true); - - $l = ''; - if ($this->parse_comment) - { - $l .= - '# Language: '.self::$iso[$lang]."\n". - '# Module: '.$module." - ".self::moduleInfo($module,'version')."\n". - '# Date: '.dt::str('%Y-%m-%d %H:%M:%S')."\n"; - - if ($this->parse_user && !empty($this->parse_userinfo)) - { - $search = self::$allowed_user_informations; - foreach($search AS $n) - { - $replace[] = $this->core->auth->getInfo('user_'.$n); - } - $info = trim(str_replace($search,$replace,$this->parse_userinfo)); - if (!empty($info)) - { - $l .= '# Author: '.html::escapeHTML($info)."\n"; - } - } - $l .= - '# Translated with translater '.$this->core->plugins->moduleInfo('translater','version')."\n"; - } - $l .= - "\n". - "msgid \"\"\n". - "msgstr \"\"\n". - '"Content-Type: text/plain; charset=UTF-8\n"'."\n". - '"Project-Id-Version: '.$module.' '.self::moduleInfo($module,'version').'\n"'."\n". - '"POT-Creation-Date: \n"'."\n". - '"PO-Revision-Date: '.date('c').'\n"'."\n". - '"Last-Translator: '.$this->core->auth->getInfo('user_cn').'\n"'."\n". - '"Language-Team: \n"'."\n". - '"MIME-Version: 1.0\n"'."\n". - '"Content-Transfer-Encoding: 8bit\n"'."\n\n"; - - if ($this->parse_comment) - { - $infos = self::getMsgids($module); - foreach($infos AS $info) - { - if (isset($fields[$info['msgid']])) - { - $comments[$info['msgid']] = (isset($comments[$info['msgid']]) ? - $comments[$info['msgid']] : ''). - '#: '.trim($info['file'],'/').':'.$info['line']."\n"; - } - } - } - - foreach($fields as $id => $str) - { - if ($this->parse_comment && isset($comments[$id])) - { - $l .= $comments[$id]; - } - $l .= - 'msgid "'.self::poString($id,true) .'"'."\n". - 'msgstr "'.self::poString($str,true).'"'."\n\n"; - } - - self::writeLangFile($locales.'/'.$lang.'/'.$group.'.po',$l,true); - } - - /* Parse .po string */ - private static function poString($string,$reverse=false) - { - if ($reverse) - { - $smap = array('"', "\n", "\t", "\r"); - $rmap = array('\\"', '\\n"' . "\n" . '"', '\\t', '\\r'); - return trim((string) str_replace($smap, $rmap, $string)); - } - else - { - $smap = array('/"\s+"/', '/\\\\n/', '/\\\\r/', '/\\\\t/', '/\\\"/'); - $rmap = array('', "\n", "\r", "\t", '"'); - return trim((string) preg_replace($smap, $rmap, $string)); - } - } - - /* Scan recursively a folder and return files and folders names */ - public static function scandir($path,$dir='',$res=array()) - { - $path = path::real($path); - if (!is_dir($path) || !is_readable($path)) return array(); - - $files = files::scandir($path); - - foreach($files AS $file) - { - if ($file == '.' || $file == '..') continue; - - if (is_dir($path.'/'.$file)) - { - $res[] = $file; - $res = self::scanDir($path.'/'.$file,$dir.'/'.$file,$res); - } - else - { - $res[] = empty($dir) ? $file : $dir.'/'.$file; - } - } - return $res; - } - - /* Return array of langs like in clearbreaks l10n */ - public static function getIsoCodes($flip=false,$name_with_code=false) - { - if (empty(self::$iso)) - { - self::$iso = l10n::getISOcodes($flip,$name_with_code); - } - return self::$iso; - } - - /* Find if lang code exists or lang name */ - public static function isIsoCode($iso,$throw=false) - { - $codes = self::getIsoCodes(); - $code = isset($codes[$iso]) ? $codes[$iso] : false; - if (!$code && $throw) - { - throw new Exception(sprintf( - __('Cannot find language for code %s'),$iso) - ); - } - return $code; - } -} -?> \ No newline at end of file + if (get_magic_quotes_gpc()) { + $msg['msgid'] = stripcslashes($msg['msgid']); + $msg['msgstr'] = stripcslashes($msg['msgstr']); + } +*/ if ($msg['msgstr'] == '') { + continue; + } + + $rs[$msg['group']][$msg['msgid']] = $msg['msgstr']; + } + + # Backup files if auto-backup is on + if ($this->backup_auto) { + self::createBackup($module, $lang); + } + + # Delete empty files (files with no group) + foreach(self::$allowed_l10n_groups AS $group) { + if (isset($rs[$group])) { + continue; + } + + $po_file = $locales . '/' . $lang . '/' . $group . '.po'; + $langphp_file = $locales . '/' . $lang . '/' . $group . '.lang.php'; + + if (file_exists($po_file)) { + unlink($po_file); + } + if (file_exists($langphp_file)) { + unlink($langphp_file); + } + } + + # No msgstr to write + if (empty($rs)) { + throw new Exception(sprintf( + __('No string to write, language %s deleted for module %s'), + $lang, $module + )); + } + + # Write .po and .lang.php files + foreach($rs AS $group => $msgs) { + self::setLangphpFile($module, $lang, $group, $msgs); + self::setPoFile($module, $lang, $group, $msgs); + } + } + + public function delLang($module, $lang, $del_empty_dir = true) + { + # Not a module installed + $locales = self::getLangsFolder($module, true); + + # Path is right formed + self::isIsoCode($lang, true); + + # Retrieve langs folders + $files = self::listLangs($module, true); + + # Lang folder is not present + if (!isset($files[$lang])) { + throw new Exception(sprintf( + __('Cannot find language folder %s for module %s'), $lang, $module + )); + } + + # Delete .po and .lang.php files + foreach($files[$lang] as $file) { + unlink($locales . '/' . $file); + } + + # Delete lang folder if empty + $dir = self::scandir($locales . '/' . $lang); + if (empty($dir)) { + rmdir($locales . '/' . $lang); + } + + # Delete locales folder if empty + $loc = self::scandir($locales); + if (empty($loc)) { + rmdir($locales); + } + } + + public static function encodeMsg($str) + { + return text::toUTF8(stripslashes(trim($str))); + } + + /* Scan a module folder to find all l10n strings in .php files */ + public function getMsgIds($module) + { + $res = array(); + + # Not a module installed + $dir = self::getModuleFolder($module, true); + + $files = self::scandir($dir); + + $scan_ext = array('php'); + if ($this->scan_tpl) { + $scan_ext[] = 'html'; + } + + foreach($files AS $file) { + if (is_dir($dir . '/' . $file) + || !in_array(files::getExtension($file),$scan_ext)) { + continue; + } + + $contents = file($dir . '/' . $file); + foreach($contents AS $line => $content) { + # php files + //if (preg_match_all("|__\((['\"]{1})(.*)([\"']{1})\)|U", $content, $matches)) + if (preg_match_all("|__\((['\"]{1})(.*?)([\"']{1})\)|", $content, $matches)) { + foreach($matches[2] as $id) { + $res[] = array( + 'msgid' => self::encodeMsg($id), + 'file' => $file, + 'line' => $line + 1 + ); + } + } + # tpl files + if ($this->scan_tpl + && preg_match_all('/\{\{tpl:lang\s([^}]+)\}\}/', $content, $matches)) { + foreach($matches[1] as $id) { + $res[] = array( + 'msgid' => self::encodeMsg($id), + 'file' => $file, + 'line' => $line + 1 + ); + } + } + } + unset($contents); + } + return $res; + } + + /* Scan a lang folder to find l10n translations in files */ + public function getMsgStrs($module, $requested_lang = '') + { + $res = array(); + + # Not a module installed + $locales = self::getLangsFolder($module, true); + + $langs = self::listLangs($module, true); + + # Not an existing lang + if (!isset($langs[$requested_lang])) { + return $res; + } + + # Lang files + $exists = array(); + foreach($langs[$requested_lang] as $file) { + if (in_array($file,$exists)) { + continue; + } + $exists[] = $file; + $path = path::clean($locales . '/' . $file); + + # .po files + if (self::isPoFile($file)) { + $po = self::getPoFile($path); + if (!is_array($po)) { + continue; + } + + foreach($po as $id => $str) { + $is_po[$requested_lang][$id] = 1; + + $res[] = array( + 'msgid' => self::encodeMsg($id), + 'msgstr' => self::encodeMsg($str), + 'lang' => $requested_lang, + 'type' => 'po', + 'path' => $path, + 'file' => basename($file), + 'group'=> str_replace('.po', '', basename($file)) + ); + } + # .lang.php files + } elseif (self::isLangphpFile($file)) { + $php = self::getLangphpFile($path); + foreach($php AS $id => $str) { + # Don't overwrite .po + if (isset($is_po[$requested_lang][$id])) { + continue; + } + $res[] = array( + 'msgid' => self::encodeMsg($id), + 'msgstr' => self::encodeMsg($str), + 'lang' => $requested_lang, + 'type' => 'php', + 'path' => $path, + 'file' => basename($file), + 'group'=> str_replace('.lang.php', '', basename($file)) + ); + } + } + } + return $res; + } + + public function getMsgs($module, $requested_lang = '') + { + # Get messages ids of a module + $m_msgids = self::getMsgIds($module); + + # Get messages translations for a module + $m_msgstrs = self::getMsgStrs($module, $requested_lang); + + # Get messages translations for others modules + foreach(self::listModules() AS $o_module => $o_infos) { + if ($o_module == $module) continue; + $m_o_msgstrs[$o_module] = self::getMsgStrs($o_module, $requested_lang); + } + $m_o_msgstrs['dotclear'] = self::getMsgStrs('dotclear', $requested_lang); + + # Only one lang or all + $langs = '' == $requested_lang ? + self::listLangs($module) : + array($requested_lang => self::isIsoCode($requested_lang)); + + # Let's go reorder the mixture + $res = array(); + foreach($langs AS $lang => $iso) { + $res[$lang] = array(); + + # From id list + foreach($m_msgids AS $rs) { + $res[$lang][$rs['msgid']]['files'][] = array(trim($rs['file'],'/'), $rs['line']); + $res[$lang][$rs['msgid']]['group'] = 'main'; + $res[$lang][$rs['msgid']]['msgstr'] = ''; + $res[$lang][$rs['msgid']]['in_dc'] = false; + $res[$lang][$rs['msgid']]['o_msgstrs'] = array(); + } + + # From str list + foreach($m_msgstrs AS $rs) { + if ($rs['lang'] != $lang) { + continue; + } + + if (!isset($res[$lang][$rs['msgid']])) { + $res[$lang][$rs['msgid']]['files'][] = array(); + $res[$lang][$rs['msgid']]['in_dc'] = false; + $res[$lang][$rs['msgid']]['o_msgstrs'] = array(); + } + $res[$lang][$rs['msgid']]['group'] = $rs['group']; + $res[$lang][$rs['msgid']]['msgstr'] = $rs['msgstr']; + $res[$lang][$rs['msgid']]['in_dc'] = false; + } + + # From others str list + foreach($m_o_msgstrs AS $o_module => $o_msgstrs) { + foreach($o_msgstrs AS $rs) { + if ($rs['lang'] != $lang) { + continue; + } + + if (!isset($res[$lang][$rs['msgid']])) { + continue; + } + + $res[$lang][$rs['msgid']]['o_msgstrs'][] = array( + 'msgstr' => $rs['msgstr'], + 'module' => $o_module, + 'file' => $rs['file'] + ); + if ($o_module == 'dotclear') { + $res[$lang][$rs['msgid']]['in_dc'] = true; + } + } + } + } + return '' == $requested_lang ? $res : $res[$requested_lang]; + } + + /* Write a lang file */ + private function writeLangFile($dir, $content, $throw) + { + $path = path::info($dir); + if (is_dir($path['dirname']) && !is_writable($path['dirname']) + || file_exists($dir) && !is_writable($dir)) { + throw new Exception(sprintf( + __('Cannot grant write acces on lang file %s'), $dir + )); + } + + # -- BEHAVIOR -- dcTranslaterBeforeWriteLangFile + $this->core->callBehavior('dcTranslaterBeforeWriteLangFile', $dir, $content, $throw); + + $f = @files::putContent($dir,$content); + if (!$f && $throw) { + throw new Exception(sprintf( + __('Cannot write lang file %s'), $dir + )); + } + + # -- BEHAVIOR -- dcTranslaterAfterWriteLangFile + $this->core->callBehavior('dcTranslaterAfterWriteLangFile', $f, $dir, $content, $throw); + + return $f; + } + + /* Try if a file is a .lang.php file */ + public static function isLangphpFile($file) + { + return files::getExtension($file) == 'php' && stristr($file, '.lang.php'); + } + + /* Get and parse a .lang.php file */ + public static function getLangphpFile($file) + { + if (!file_exists($file)) { + return array(); + } + + $res = array(); + $content = implode('',file($file)); + $count = preg_match_all('/(\$GLOBALS\[\'__l10n\'\]\[\'(.*?)\'\]\s*\x3D\s*\'(.*?)\';)/', $content, $m); + + if (!$count) { + return array(); + } + + for ($i = 0; $i < $count; $i++) { + $id = $m[2][$i]; + $str = self::langphpString($m[3][$i]); + + if ($str) { + $res[self::langphpString($id)] = $str; + } + } + if (!empty($res[''])) { + $res = array_diff_key($res,array(''=>1)); + } + return $res; + } + + /* Construct and write a .lang.php file */ + private function setLangphpFile($module, $lang, $group, $fields) + { + if (!$this->write_langphp) { + return; + } + + # Not a module installed + $locales = self::getLangsFolder($module, true); + + # Path is right formed + $lang_name = self::isIsoCode($lang, true); + + $l = "parse_comment) { + $l .= + '// Language: ' . $lang_name . " \n" . + '// Module: ' . $module . " - " . self::moduleInfo($module, 'version') . "\n" . + '// Date: ' . dt::str('%Y-%m-%d %H:%M:%S') . " \n"; + + if ($this->parse_user && !empty($this->parse_userinfo)) { + $search = self::$allowed_user_informations; + foreach($search AS $n) { + $replace[] = $this->core->auth->getInfo('user_' . $n); + } + $info = trim(str_replace($search,$replace,$this->parse_userinfo)); + if (!empty($info)) { + $l .= '// Author: ' . html::escapeHTML($info) . "\n"; + } + } + $l .= + '// Translated with dcTranslater - ' . $this->core->plugins->moduleInfo('translater', 'version') . " \n\n"; + } + if ($this->parse_comment) { + $infos = self::getMsgids($module); + foreach($infos AS $info) { + if (isset($fields[$info['msgid']])) { + $comments[$info['msgid']] = (isset($comments[$info['msgid']]) ? + $comments[$info['msgid']] : '') . + '#'.trim($info['file'],'/') . ':' . $info['line'] . "\n"; + } + } + } + + foreach($fields as $id => $str) { + if ($this->parse_comment && isset($comments[$id])) { + $l .= $comments[$id]; + } + + $l .= + '$GLOBALS[\'__l10n\'][\'' . addcslashes($id, "'") . '\'] = ' . + '\'' . self::langphpString($str, true) . "';\n"; + + if ($this->parse_comment) { + $l .= "\n"; + } + } + $l .= ""; + + self::writeLangFile($locales . '/' . $lang . '/' . $group . '.lang.php', $l, true); + } + + /* Parse a .lang.php string */ + private static function langphpString($string, $reverse = false) + { + if ($reverse) { + $smap = array('\'', "\n", "\t", "\r"); + $rmap = array('\\\'', '\\n"' . "\n" . '"', '\\t', '\\r'); + return trim((string) str_replace($smap, $rmap, $string)); + } else { + $smap = array('/\\\\n/', '/\\\\r/', '/\\\\t/', "/\\\'/"); + $rmap = array("\n", "\r", "\t", "'"); + return trim((string) preg_replace($smap, $rmap, $string)); + } + } + + /* Try if a file is a .po file */ + public static function isPoFile($file) + { + return files::getExtension($file) == 'po'; + } + + /* Get and parse a .po file */ + public static function getPoFile($file) + { + if (!file_exists($file)) { + return false; + } + + $res = array(); + $content = implode('',file($file)); + + $count = preg_match_all('/msgid\s(.*(?:\n".*")*)\nmsgstr\s(.*(?:\n".*")*)/', $content, $m); + + if (!$count) return false; + + for ($i = 0; $i < $count; $i++) { + $id = preg_replace('/"(.*)"/s','\\1', $m[1][$i]); + $str= preg_replace('/"(.*)"/s','\\1', $m[2][$i]); + + $str = self::poString($str); + + if ($str) { + $res[self::poString($id)] = $str; + } + } + + if (!empty($res[''])) { + $res = array_diff_key($res, array(''=>1)); + } + return $res; + } + /* Construct and parse a .po file */ + private function setPoFile($module, $lang, $group, $fields) + { + if (!$this->write_po) { + return; + } + + # Not a module installed + $locales = self::getLangsFolder($module, true); + + # Path is right formed + self::isIsoCode($lang, true); + + $l = ''; + if ($this->parse_comment) { + $l .= + '# Language: ' . self::$iso[$lang] . "\n" . + '# Module: ' . $module . " - " . self::moduleInfo($module, 'version') . "\n" . + '# Date: ' . dt::str('%Y-%m-%d %H:%M:%S') . "\n"; + + if ($this->parse_user && !empty($this->parse_userinfo)) { + $search = self::$allowed_user_informations; + foreach($search AS $n) { + $replace[] = $this->core->auth->getInfo('user_' . $n); + } + $info = trim(str_replace($search, $replace, $this->parse_userinfo)); + if (!empty($info)) { + $l .= '# Author: ' . html::escapeHTML($info) . "\n"; + } + } + $l .= + '# Translated with translater ' . $this->core->plugins->moduleInfo('translater', 'version') . "\n"; + } + $l .= + "\n". + "msgid \"\"\n" . + "msgstr \"\"\n" . + '"Content-Type: text/plain; charset=UTF-8\n"' . "\n" . + '"Project-Id-Version: ' . $module . ' ' . self::moduleInfo($module, 'version') . '\n"' . "\n" . + '"POT-Creation-Date: \n"' . "\n" . + '"PO-Revision-Date: ' . date('c') . '\n"' . "\n" . + '"Last-Translator: ' . $this->core->auth->getInfo('user_cn') . '\n"' . "\n" . + '"Language-Team: \n"' . "\n" . + '"MIME-Version: 1.0\n"' . "\n" . + '"Content-Transfer-Encoding: 8bit\n"' . "\n" . + '"Plural-Forms: nplurals=2; plural=(n > 1);\n"' . "\n\n"; + + if ($this->parse_comment) { + $infos = self::getMsgids($module); + foreach($infos AS $info) { + if (isset($fields[$info['msgid']])) { + $comments[$info['msgid']] = (isset($comments[$info['msgid']]) ? + $comments[$info['msgid']] : '') . + '#: '.trim($info['file'],'/') . ':' . $info['line'] . "\n"; + } + } + } + + foreach($fields as $id => $str) { + if ($this->parse_comment && isset($comments[$id])) { + $l .= $comments[$id]; + } + $l .= + 'msgid "' . self::poString($id, true) . '"' . "\n" . + 'msgstr "' . self::poString($str, true) . '"' . "\n\n"; + } + + self::writeLangFile($locales . '/' . $lang . '/' . $group . '.po', $l, true); + } + + /* Parse .po string */ + private static function poString($string, $reverse = false) + { + if ($reverse) { + $smap = array('"', "\n", "\t", "\r"); + $rmap = array('\\"', '\\n"' . "\n" . '"', '\\t', '\\r'); + return trim((string) str_replace($smap, $rmap, $string)); + } else { + $smap = array('/"\s+"/', '/\\\\n/', '/\\\\r/', '/\\\\t/', '/\\\"/'); + $rmap = array('', "\n", "\r", "\t", '"'); + return trim((string) preg_replace($smap, $rmap, $string)); + } + } + + /* Scan recursively a folder and return files and folders names */ + public static function scandir($path, $dir = '', $res = array()) + { + $path = path::real($path); + if (!is_dir($path) || !is_readable($path)) { + return array(); + } + + $files = files::scandir($path); + + foreach($files AS $file) { + if ($file == '.' || $file == '..') { + continue; + } + + if (is_dir($path . '/' . $file)) { + $res[] = $file; + $res = self::scanDir($path . '/' . $file, $dir . '/' . $file, $res); + } else { + $res[] = empty($dir) ? $file : $dir . '/' . $file; + } + } + return $res; + } + + /* Return array of langs like in clearbreaks l10n */ + public static function getIsoCodes($flip = false, $name_with_code = false) + { + if (empty(self::$iso)) { + self::$iso = l10n::getISOcodes($flip, $name_with_code); + } + return self::$iso; + } + + /* Find if lang code exists or lang name */ + public static function isIsoCode($iso, $throw = false) + { + $codes = self::getIsoCodes(); + $code = isset($codes[$iso]) ? $codes[$iso] : false; + if (!$code && $throw) { + throw new Exception(sprintf( + __('Cannot find language for code %s'), $iso + )); + } + return $code; + } +} \ No newline at end of file diff --git a/inc/class.translater.proposals.php b/inc/class.translater.proposals.php index 441d051..3303fbd 100644 --- a/inc/class.translater.proposals.php +++ b/inc/class.translater.proposals.php @@ -3,62 +3,59 @@ # # This file is part of translater, a plugin for Dotclear 2. # -# Copyright (c) 2009-2013 Jean-Christian Denis and contributors -# contact@jcdenis.fr -# +# Copyright (c) 2009-2016 Jean-Christian Denis and contributors +# # Licensed under the GPL version 2.0 license. # A copy of this license is available in LICENSE file or at # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html # # -- END LICENSE BLOCK ------------------------------------ - /** * Translater proposal tools container. */ class translaterProposals { - public $core; - - private $stack = array(); - - public function __construct($core) - { - $this->core = $core; - - # --BEHAVIOR-- addTranslaterProposalTool - $core->callBehavior('addTranslaterProposalTool',$this); - } - - public function addTool($id) - { - if (!class_exists($id)) { - return; - } - - $r = new ReflectionClass($id); - $p = $r->getParentClass(); + public $core; - if (!$p || $p->name != 'translaterProposalTool') { - return; - } - - $this->stack[$id] = new $id($this->core); - } - - public function getTools() - { - return $this->stack; - } - - public function getTool($id) - { - return array_key_exists($id,$this->stack) ? $this->stack[$id] : null; - } - - public function hasTool($id) - { - return array_key_exists($id,$this->stack); - } -} -?> \ No newline at end of file + private $stack = array(); + + public function __construct($core) + { + $this->core = $core; + + # --BEHAVIOR-- addTranslaterProposalTool + $core->callBehavior('addTranslaterProposalTool', $this); + } + + public function addTool($id) + { + if (!class_exists($id)) { + return; + } + + $r = new ReflectionClass($id); + $p = $r->getParentClass(); + + if (!$p || $p->name != 'translaterProposalTool') { + return; + } + + $this->stack[$id] = new $id($this->core); + } + + public function getTools() + { + return $this->stack; + } + + public function getTool($id) + { + return array_key_exists($id, $this->stack) ? $this->stack[$id] : null; + } + + public function hasTool($id) + { + return array_key_exists($id, $this->stack); + } +} \ No newline at end of file diff --git a/inc/class.translater.rest.php b/inc/class.translater.rest.php index 490e51f..cd61df2 100644 --- a/inc/class.translater.rest.php +++ b/inc/class.translater.rest.php @@ -3,8 +3,7 @@ # # This file is part of translater, a plugin for Dotclear 2. # -# Copyright (c) 2009-2013 Jean-Christian Denis and contributors -# contact@jcdenis.fr +# Copyright (c) 2009-2016 Jean-Christian Denis and contributors # # Licensed under the GPL version 2.0 license. # A copy of this license is available in LICENSE file or at @@ -12,7 +11,9 @@ # # -- END LICENSE BLOCK ------------------------------------ -if (!defined('DC_CONTEXT_ADMIN')){return;} +if (!defined('DC_CONTEXT_ADMIN')) { + return; +} /** * Translater REST service. @@ -22,55 +23,47 @@ if (!defined('DC_CONTEXT_ADMIN')){return;} */ class translaterRest { - public static function getProposal($core,$get) - { - $from = !empty($get['langFrom']) ? trim($get['langFrom']) : ''; - $to = !empty($get['langTo']) ? trim($get['langTo']) : ''; - $tool = !empty($get['langTool']) ? trim($get['langTool']) : ''; - $str_in = !empty($get['langStr']) ? trim($get['langStr']) : ''; + public static function getProposal($core, $get) + { + $from = !empty($get['langFrom']) ? trim($get['langFrom']) : ''; + $to = !empty($get['langTo']) ? trim($get['langTo']) : ''; + $tool = !empty($get['langTool']) ? trim($get['langTool']) : ''; + $str_in = !empty($get['langStr']) ? trim($get['langStr']) : ''; - $str_in = text::toUTF8($str_in); - $str_in = trim($str_in); - $str_out = ''; + $str_in = text::toUTF8($str_in); + $str_in = trim($str_in); + $str_out = ''; - $rsp = new xmlTag(); + $rsp = new xmlTag(); - try - { - if (empty($from) || empty($to) || empty($tool)) - { - throw new Exception(__('Missing params')); - } + try { + if (empty($from) || empty($to) || empty($tool)) { + throw new Exception(__('Missing params')); + } - $translater = new dcTranslater($core); + $translater = new dcTranslater($core); - if (!empty($str_in)) - { - if (!$translater->proposal->hasTool($tool)) - { - throw new Exception(__('Failed to get translation tool')); - } - if (!$translater->proposal->getTool($tool)->isActive()) - { - throw new Exception(__('Translation tool is not configured')); - } + if (!empty($str_in)) { + if (!$translater->proposal->hasTool($tool)) { + throw new Exception(__('Failed to get translation tool')); + } + if (!$translater->proposal->getTool($tool)->isActive()) { + throw new Exception(__('Translation tool is not configured')); + } - $str_out = (string) $translater->proposal->getTool($tool)->translate($str_in,$from,$to); - } + $str_out = (string) $translater->proposal->getTool($tool)->translate($str_in ,$from, $to); + } - $x = new xmlTag('proposal'); - $x->lang_from = $from; - $x->lang_to = $to; - $x->tool = $tool; - $x->str_from = $str_in; - $x->str_to = text::toUTF8(html::decodeEntities($str_out)); - $rsp->insertNode($x); - } - catch (Exception $e) - { - $core->error->add($e->getMessage()); - } - return $rsp; - } -} -?> \ No newline at end of file + $x = new xmlTag('proposal'); + $x->lang_from = $from; + $x->lang_to = $to; + $x->tool = $tool; + $x->str_from = $str_in; + $x->str_to = text::toUTF8(html::decodeEntities($str_out)); + $rsp->insertNode($x); + } catch (Exception $e) { + $core->error->add($e->getMessage()); + } + return $rsp; + } +} \ No newline at end of file diff --git a/inc/lib.translater.google.php b/inc/lib.translater.google.php index ebe613c..47436d1 100644 --- a/inc/lib.translater.google.php +++ b/inc/lib.translater.google.php @@ -3,8 +3,7 @@ # # This file is part of translater, a plugin for Dotclear 2. # -# Copyright (c) 2009-2013 Jean-Christian Denis and contributors -# contact@jcdenis.fr +# Copyright (c) 2009-2016 Jean-Christian Denis and contributors # # Licensed under the GPL version 2.0 license. # A copy of this license is available in LICENSE file or at @@ -12,7 +11,9 @@ # # -- END LICENSE BLOCK ------------------------------------ -if (!defined('DC_CONTEXT_ADMIN')){return;} +if (!defined('DC_CONTEXT_ADMIN')) { + return; +} /** * Google proposal tool. @@ -21,77 +22,75 @@ if (!defined('DC_CONTEXT_ADMIN')){return;} */ class googleProposalTool extends translaterProposalTool { - private $api = 'https://www.googleapis.com/language/translate/v2'; - private $agent = 'dcTranslater - http://jcd.lv/?q=translater'; - private $key = null; //ex: AsSDqsGsfdSDSQFQsfedj9bnzY390aIg-1d - - protected function setup() - { - $this->key = $this->core->blog->settings->translater->translater_google_proposal_key; - - $this->setName(__('Google')); - $this->setDesc(__('Google Translation Tool API')); - $this->setActive(!empty($this->key)); - } - - public function form() - { - return - '

'. - '

'.__('You must have on Google API console:').'

'. - ''; - } - - public function save() - { - $key = empty($_POST['translater_google_proposal_key']) ? - '' : $_POST['translater_google_proposal_key']; - - $this->core->blog->settings->translater->put('translater_google_proposal_key',$key,'string','',true,true); - } - - public function translate($str,$from,$to) - { - try - { - $data = array( - 'key' => $this->key, - 'q' => $str, - 'source' => $from, - 'target' => $to - ); - - $path = ''; - $client = netHttp::initClient($this->api,$path); - $client->setUserAgent($this->agent); - $client->useGzip(false); - $client->setPersistReferers(false); - $client->get($path,$data); + private $api = 'https://www.googleapis.com/language/translate/v2'; + private $agent = 'dcTranslater - http://jcd.lv/?q=translater'; + private $key = null; //ex: AsSDqsGsfdSDSQFQsfedj9bnzY390aIg-1d - $rs = $client->getContent(); - - if ($client->getStatus() != 200) { - throw new Exception(__('Failed to query service.')); - } - - if (null === ($dec = json_decode($rs))) { - throw new Exception('Failed to decode result'); - } - - if ('' == @$dec->data->translations[0]->translatedText) { - throw new Exception('No data response'); - } - - return $dec->data->translations[0]->translatedText; - } - catch (Exception $e) {} - return ''; - } -} -?> \ No newline at end of file + protected function setup() + { + $this->key = $this->core->blog->settings->translater->translater_google_proposal_key; + + $this->setName(__('Google')); + $this->setDesc(__('Google Translation Tool API')); + $this->setActive(!empty($this->key)); + } + + public function form() + { + return + '

'. + '

' . __('You must have on Google API console:') . '

' . + ''; + } + + public function save() + { + $key = empty($_POST['translater_google_proposal_key']) ? + '' : $_POST['translater_google_proposal_key']; + + $this->core->blog->settings->translater->put('translater_google_proposal_key', $key, 'string', '', true, true); + } + + public function translate($str, $from, $to) + { + try { + $data = array( + 'key' => $this->key, + 'q' => $str, + 'source' => $from, + 'target' => $to + ); + + $path = ''; + $client = netHttp::initClient($this->api, $path); + $client->setUserAgent($this->agent); + $client->useGzip(false); + $client->setPersistReferers(false); + $client->get($path,$data); + + $rs = $client->getContent(); + + if ($client->getStatus() != 200) { + throw new Exception(__('Failed to query service.')); + } + + if (null === ($dec = json_decode($rs))) { + throw new Exception('Failed to decode result'); + } + + if ('' == @$dec->data->translations[0]->translatedText) { + throw new Exception('No data response'); + } + + return $dec->data->translations[0]->translatedText; + } + catch (Exception $e) {} + return ''; + } +} \ No newline at end of file diff --git a/inc/lib.translater.microsoft.php b/inc/lib.translater.microsoft.php index e11d6c3..208b4b3 100644 --- a/inc/lib.translater.microsoft.php +++ b/inc/lib.translater.microsoft.php @@ -3,8 +3,7 @@ # # This file is part of translater, a plugin for Dotclear 2. # -# Copyright (c) 2009-2013 Jean-Christian Denis and contributors -# contact@jcdenis.fr +# Copyright (c) 2009-2016 Jean-Christian Denis and contributors # # Licensed under the GPL version 2.0 license. # A copy of this license is available in LICENSE file or at @@ -12,7 +11,9 @@ # # -- END LICENSE BLOCK ------------------------------------ -if (!defined('DC_CONTEXT_ADMIN')){return;} +if (!defined('DC_CONTEXT_ADMIN')) { + return; +} /** * Microsoft proposal tool. @@ -21,115 +22,115 @@ if (!defined('DC_CONTEXT_ADMIN')){return;} */ class microsoftProposalTool extends translaterProposalTool { - private $client = null; //ex: b6057813-234b-4154-b324-6342c27f608f - private $secret = null; //ex: DsdDScn/+xdSFF1GDxdx1wbkKPphAfAVSH5VXDBVDI= - - protected function setup() - { - $this->setActive(false); - $this->client = $this->core->blog->settings->translater->translater_microsoft_proposal_client; - $this->secret = $this->core->blog->settings->translater->translater_microsoft_proposal_secret; - - $this->setName(__('Bing')); - $this->setDesc(__('Microsoft Bing translation tool')); - $this->setActive(!empty($this->client) && !empty($this->secret)); - } - - public function form() - { - return - '

'. - '

'. - '

'.__('You must have:').'

'. - ''; - } - - public function save() - { - $client = empty($_POST['translater_microsoft_proposal_client']) ? - '' : $_POST['translater_microsoft_proposal_client']; - $secret = empty($_POST['translater_microsoft_proposal_secret']) ? - '' : $_POST['translater_microsoft_proposal_secret']; - - $this->core->blog->settings->translater->put('translater_microsoft_proposal_client',$client,'string','',true,true); - $this->core->blog->settings->translater->put('translater_microsoft_proposal_secret',$secret,'string','',true,true); - } - - public function translate($str,$from,$to) - { - try { - return $this->doYourFuckingJob($this->client,$this->secret,$str,$from,$to); - } - catch (Exception $e) {} - return ''; - } - - // - // Microsoft fucking oAuth - // - - private function doYourFuckingJob($client,$secret,$str,$from,$to) - { - try { - //Client ID of the application. - $clientID = $client; - //Client Secret key of the application. - $clientSecret = $secret; - //OAuth Url. - $authUrl = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/"; - //Application Scope Url - $scopeUrl = "http://api.microsofttranslator.com"; - //Application grant type - $grantType = "client_credentials"; - - //Get the Access token. - $accessToken = $this->getTokens($grantType, $scopeUrl, $clientID, $clientSecret, $authUrl); - //Create the authorization Header string. - $authHeader = "Authorization: Bearer ". $accessToken; - - //Set the params.// - $fromLanguage = $from; - $toLanguage = $to; - $inputStr = $str; - $contentType = 'text/plain'; - $category = 'general'; - - $params = "text=".urlencode($inputStr)."&to=".$toLanguage."&from=".$fromLanguage; - $translateUrl = "http://api.microsofttranslator.com/v2/Http.svc/Translate?$params"; - - //Get the curlResponse. - $curlResponse = $this->curlRequest($translateUrl, $authHeader); - - //Interprets a string of XML into an object. - $xmlObj = simplexml_load_string($curlResponse); - foreach((array)$xmlObj[0] as $val){ - $translatedStr = $val; - } - - return (string) $translatedStr; - /* - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo "
From $fromLanguageTo $toLanguage
".$inputStr."".$translatedStr."
"; - */ - } catch (Exception $e) { - throw $e; - } - } - + private $client = null; //ex: b6057813-234b-4154-b324-6342c27f608f + private $secret = null; //ex: DsdDScn/+xdSFF1GDxdx1wbkKPphAfAVSH5VXDBVDI= + + protected function setup() + { + $this->setActive(false); + $this->client = $this->core->blog->settings->translater->translater_microsoft_proposal_client; + $this->secret = $this->core->blog->settings->translater->translater_microsoft_proposal_secret; + + $this->setName(__('Bing')); + $this->setDesc(__('Microsoft Bing translation tool')); + $this->setActive(!empty($this->client) && !empty($this->secret)); + } + + public function form() + { + return + '

' . + '

' . + '

' . __('You must have:') . '

' . + ''; + } + + public function save() + { + $client = empty($_POST['translater_microsoft_proposal_client']) ? + '' : $_POST['translater_microsoft_proposal_client']; + $secret = empty($_POST['translater_microsoft_proposal_secret']) ? + '' : $_POST['translater_microsoft_proposal_secret']; + + $this->core->blog->settings->translater->put('translater_microsoft_proposal_client', $client, 'string', '', true, true); + $this->core->blog->settings->translater->put('translater_microsoft_proposal_secret', $secret, 'string', '', true, true); + } + + public function translate($str, $from, $to) + { + try { + return $this->doYourFuckingJob($this->client, $this->secret, $str, $from, $to); + } catch (Exception $e) {} + + return ''; + } + + // + // Microsoft fucking oAuth + // + + private function doYourFuckingJob($client, $secret, $str, $from, $to) + { + try { + //Client ID of the application. + $clientID = $client; + //Client Secret key of the application. + $clientSecret = $secret; + //OAuth Url. + $authUrl = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/"; + //Application Scope Url + $scopeUrl = "http://api.microsofttranslator.com"; + //Application grant type + $grantType = "client_credentials"; + + //Get the Access token. + $accessToken = $this->getTokens($grantType, $scopeUrl, $clientID, $clientSecret, $authUrl); + //Create the authorization Header string. + $authHeader = "Authorization: Bearer " . $accessToken; + + //Set the params.// + $fromLanguage = $from; + $toLanguage = $to; + $inputStr = $str; + $contentType = 'text/plain'; + $category = 'general'; + + $params = "text=" . urlencode($inputStr) . "&to=" . $toLanguage . "&from=" . $fromLanguage; + $translateUrl = "http://api.microsofttranslator.com/v2/Http.svc/Translate?$params"; + + //Get the curlResponse. + $curlResponse = $this->curlRequest($translateUrl, $authHeader); + + //Interprets a string of XML into an object. + $xmlObj = simplexml_load_string($curlResponse); + foreach((array)$xmlObj[0] as $val){ + $translatedStr = $val; + } + + return (string) $translatedStr; + /* + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
From $fromLanguageTo $toLanguage
" . $inputStr . "" . $translatedStr . "
"; + */ + } catch (Exception $e) { + throw $e; + } + } + /* * Get the access token. * @@ -141,8 +142,8 @@ class microsoftProposalTool extends translaterProposalTool * * @return string. */ - private function getTokens($grantType, $scopeUrl, $clientID, $clientSecret, $authUrl) - { + private function getTokens($grantType, $scopeUrl, $clientID, $clientSecret, $authUrl) + { try { //Initialize the Curl Session. $ch = curl_init(); @@ -169,9 +170,9 @@ class microsoftProposalTool extends translaterProposalTool $strResponse = curl_exec($ch); //Get the Error Code returned by Curl. $curlErrno = curl_errno($ch); - if($curlErrno){ + if($curlErrno) { $curlError = curl_error($ch); - curl_close($ch); + curl_close($ch); throw new Exception($curlError); } //Close the Curl Session. @@ -186,7 +187,7 @@ class microsoftProposalTool extends translaterProposalTool throw $e; } } - + /* * Create and execute the HTTP CURL request. * @@ -214,12 +215,11 @@ class microsoftProposalTool extends translaterProposalTool $curlErrno = curl_errno($ch); if ($curlErrno) { $curlError = curl_error($ch); - curl_close($ch); + curl_close($ch); throw new Exception($curlError); } //Close a cURL session. curl_close($ch); return $curlResponse; } -} -?> \ No newline at end of file +} \ No newline at end of file diff --git a/inc/lib.translater.proposal.php b/inc/lib.translater.proposal.php index 0daa7c5..8a16c18 100644 --- a/inc/lib.translater.proposal.php +++ b/inc/lib.translater.proposal.php @@ -3,8 +3,7 @@ # # This file is part of translater, a plugin for Dotclear 2. # -# Copyright (c) 2009-2013 Jean-Christian Denis and contributors -# contact@jcdenis.fr +# Copyright (c) 2009-2016 Jean-Christian Denis and contributors # # Licensed under the GPL version 2.0 license. # A copy of this license is available in LICENSE file or at @@ -12,7 +11,6 @@ # # -- END LICENSE BLOCK ------------------------------------ - /** * Translater proposal tool. * @@ -20,106 +18,105 @@ */ abstract class translaterProposalTool { - public $core; - - private $active = false; - private $name = 'unknow'; - private $desc = 'no description'; - - /** - Constructor - */ - final public function __construct($core) - { - $this->core = $core; - $this->setup(); - } - - /** - Set name of this tool - - @param string Tool's name - */ - final protected function setName($name) - { - $this->name = (string) $name; - } - - /** - Get name of this tool - - @return string Tool's name - */ - final public function getName() - { - return $this->name; - } - - /** - Set description of this tool - - @param string Tool's description - */ - final protected function setDesc($desc) - { - $this->desc = (string) $desc; - } - - /** - Get description of this tool - - @return string Tool's description - */ - final public function getDesc() - { - return $this->desc; - } - - /** - Set tool as (un)active - - @param boolean $active True to set it as active - */ - final protected function setActive($active) - { - $this->active = (boolean) $active; - } - - /** - Check if this tool is active - - @return boolean True if it is active - */ - final public function isActive() - { - return $this->active; - } - - /** - Set tool's info - using setName(),setDesc(),setActive() - */ - abstract protected function setup(); - - /** - Get configuration interface - - @return Form field - */ - abstract public function form(); - - /** - Save configuration - */ - abstract public function save(); - - /** - Translate a string from a language to another - - @param string $str Trimed UTF-8 string to translate - @param string $from Source language code - @param string to Destination language code - @return Translated string - */ - abstract public function translate($str,$from,$to); -} -?> \ No newline at end of file + public $core; + + private $active = false; + private $name = 'unknow'; + private $desc = 'no description'; + + /** + Constructor + */ + final public function __construct($core) + { + $this->core = $core; + $this->setup(); + } + + /** + Set name of this tool + + @param string Tool's name + */ + final protected function setName($name) + { + $this->name = (string) $name; + } + + /** + Get name of this tool + + @return string Tool's name + */ + final public function getName() + { + return $this->name; + } + + /** + Set description of this tool + + @param string Tool's description + */ + final protected function setDesc($desc) + { + $this->desc = (string) $desc; + } + + /** + Get description of this tool + + @return string Tool's description + */ + final public function getDesc() + { + return $this->desc; + } + + /** + Set tool as (un)active + + @param boolean $active True to set it as active + */ + final protected function setActive($active) + { + $this->active = (boolean) $active; + } + + /** + Check if this tool is active + + @return boolean True if it is active + */ + final public function isActive() + { + return $this->active; + } + + /** + Set tool's info - using setName(),setDesc(),setActive() + */ + abstract protected function setup(); + + /** + Get configuration interface + + @return Form field + */ + abstract public function form(); + + /** + Save configuration + */ + abstract public function save(); + + /** + Translate a string from a language to another + + @param string $str Trimed UTF-8 string to translate + @param string $from Source language code + @param string to Destination language code + @return Translated string + */ + abstract public function translate($str,$from,$to); +} \ No newline at end of file diff --git a/index.php b/index.php index ee30555..ecda5f3 100644 --- a/index.php +++ b/index.php @@ -3,8 +3,7 @@ # # This file is part of translater, a plugin for Dotclear 2. # -# Copyright (c) 2009-2013 Jean-Christian Denis and contributors -# contact@jcdenis.fr +# Copyright (c) 2009-2016 Jean-Christian Denis and contributors # # Licensed under the GPL version 2.0 license. # A copy of this license is available in LICENSE file or at @@ -12,7 +11,9 @@ # # -- END LICENSE BLOCK ------------------------------------ -if (!defined('DC_CONTEXT_ADMIN')){return;} +if (!defined('DC_CONTEXT_ADMIN')) { + return; +} dcPage::checkSuper(); @@ -22,57 +23,59 @@ dcPage::checkSuper(); $translater = new dcTranslater($core); -$combo_start_page = array( - 'setting' => __('Settings'), - 'modules_plugin' => __('Plugins'), - 'modules_theme' => __('Themes'), - 'pack' => __('Import/Export') -); +$combo_start_page = [ + 'setting' => __('Settings'), + 'modules_plugin' => __('Plugins'), + 'modules_theme' => __('Themes'), + 'pack' => __('Import/Export') +]; -$combo_backup_limit = array( - 5 => 5, - 10 => 10, - 15 => 15, - 20 => 20, - 40 => 40, - 60 => 60 -); +$combo_backup_limit = [ + 5 => 5, + 10 => 10, + 15 => 15, + 20 => 20, + 40 => 40, + 60 => 60 +]; -$combo_backup_folder = array( - 'module' => __('locales folders of each module'), - 'plugin' => __('plugins folder root'), - 'public' => __('public folder root'), - 'cache' => __('cache folder of Dotclear'), - 'translater' =>__('locales folder of translater') -); +$combo_backup_folder = [ + 'module' => __('locales folders of each module'), + 'plugin' => __('plugins folder root'), + 'public' => __('public folder root'), + 'cache' => __('cache folder of Dotclear'), + 'translater' =>__('locales folder of translater') +]; -$succes = array( - 'save_setting' => __('Configuration successfully updated'), - 'update_lang' => __('Translation successfully updated'), - 'add_lang' => __('Translation successfully created'), - 'delete_lang' => __('Translation successfully deleted'), - 'create_backup' => __('Backups successfully create'), - 'restore_backup' => __('Backups successfully restored'), - 'delete_backup' => __('Backups successfully deleted'), - 'import_pack' => __('Package successfully imported'), - 'export_pack' => __('Package successfully exported') -); +$succes = [ + 'save_setting' => __('Configuration successfully updated'), + 'update_lang' => __('Translation successfully updated'), + 'add_lang' => __('Translation successfully created'), + 'delete_lang' => __('Translation successfully deleted'), + 'create_backup' => __('Backups successfully create'), + 'restore_backup' => __('Backups successfully restored'), + 'delete_backup' => __('Backups successfully deleted'), + 'import_pack' => __('Package successfully imported'), + 'export_pack' => __('Package successfully exported') +]; -$errors = array( - 'save_setting' => __('Failed to update settings: %s'), - 'update_lang' => __('Failed to update translation: %s'), - 'add_lang' => __('Failed to create translation: %s'), - 'delete_lang' => __('Failed to delete translation: %s'), - 'create_backup' => __('Failed to create backups: %s'), - 'restore_backup' => __('Failed to restore backups: %s'), - 'delete_backup' => __('Failed to delete backups: %s'), - 'import_pack' => __('Failed to import package: %s'), - 'export_pack' => __('Failed to export package: %s') -); +$errors = [ + 'save_setting' => __('Failed to update settings: %s'), + 'update_lang' => __('Failed to update translation: %s'), + 'add_lang' => __('Failed to create translation: %s'), + 'delete_lang' => __('Failed to delete translation: %s'), + 'create_backup' => __('Failed to create backups: %s'), + 'restore_backup' => __('Failed to restore backups: %s'), + 'delete_backup' => __('Failed to delete backups: %s'), + 'import_pack' => __('Failed to import package: %s'), + 'export_pack' => __('Failed to export package: %s') +]; -$p_url = 'plugin.php?p=translater'; -$start_page = @explode('_',$translater->start_page); -if (count($start_page) < 2) $start_page[1] = ''; +$p_url = 'plugin.php?p=translater'; +$start_page = @explode('_', $translater->start_page); +if (count($start_page) < 2) { + $start_page[1] = ''; +} # # Parse request @@ -86,446 +89,348 @@ $type = isset($_REQUEST['type']) ? $_REQUEST['type'] : $start_page[1]; $module = isset($_REQUEST['module']) ? $_REQUEST['module'] : ''; $from = isset($_POST['from']) && $_POST['from'] != '-' ? $_POST['from'] : ''; $lang = isset($_REQUEST['lang']) && $_REQUEST['lang'] != '-' ? $_REQUEST['lang'] : ''; -if ($type == '-' || $module == '-') -{ - $type = $module = ''; + +if ($type == '-' || $module == '-') { + $type = $module = ''; } # # Manage action # -switch ($action) -{ - case '': - break; - - /** - * Create lang for a module - */ - case 'module_add_lang': +switch ($action) { + case '': + break; - try - { - if (empty($lang)) - { - throw new Exception(__('No lang to create')); - } - $translater->addLang($module,$lang,$from); + /** + * Create lang for a module + */ + case 'module_add_lang': + try { + if (empty($lang)) { + throw new Exception(__('No lang to create')); + } + $translater->addLang($module, $lang, $from); - http::redirect($p_url.'&part=lang&module='.$module.'&type='.$type.'&lang='.$lang.'&msg=add_lang'); - } - catch (Exception $e) - { - $core->error->add(sprintf($errors[$action],$e->getMessage())); - } - - break; + http::redirect($p_url . '&part=lang&module=' . $module . '&type=' . $type . '&lang=' . $lang . '&msg=add_lang'); + } catch (Exception $e) { + $core->error->add(sprintf($errors[$action], $e->getMessage())); + } + break; - /** - * Delete lang for a module - */ - case 'module_delete_lang': + /** + * Delete lang for a module + */ + case 'module_delete_lang': + try { + if (empty($lang)) { + throw new Exception(__('No lang to delete')); + } + $translater->delLang($module, $lang); - try - { - if (empty($lang)) - { - throw new Exception(__('No lang to delete')); - } - $translater->delLang($module,$lang); + http::redirect($p_url . '&part=module&module=' . $module . '&type=' . $type . '&tab=module-lang&msg=delete_lang'); + } catch (Exception $e) { + $core->error->add(sprintf($errors[$action], $e->getMessage())); + } + break; - http::redirect($p_url.'&part=module&module='.$module.'&type='.$type.'&tab=module-lang&msg=delete_lang'); - } - catch (Exception $e) - { - $core->error->add(sprintf($errors[$action],$e->getMessage())); - } - - break; + /** + * Create backup for a module + */ + case 'module_create_backup': + try { + if (empty($_POST['modules']) || empty($_POST['langs'])) { + throw new Exception(__('No lang to backup')); + } - /** - * Create backup for a module - */ - case 'module_create_backup': + foreach($_POST['modules'] as $b_module) { + $b_list = $translater->listLangs($b_module); - try - { - if (empty($_POST['modules']) || empty($_POST['langs'])) - { - throw new Exception(__('No lang to backup')); - } + foreach($_POST['langs'] as $b_lang) { + if (isset($b_list[$b_lang])) { + $translater->createBackup($b_module, $b_lang); + } + } + } - foreach($_POST['modules'] as $b_module) - { - $b_list = $translater->listLangs($b_module); - foreach($_POST['langs'] as $b_lang) - { - if (isset($b_list[$b_lang])) - { - $translater->createBackup($b_module,$b_lang); - } - } - } + http::redirect($p_url . '&part=module&module=' . $module . '&type=' . $type . '&tab=module-backup&msg=creat_backup'); + } catch (Exception $e) { + $core->error->add(sprintf($errors[$action], $e->getMessage())); + } + break; - http::redirect($p_url.'&part=module&module='.$module.'&type='.$type.'&tab=module-backup&msg=creat_backup'); - } - catch (Exception $e) - { - $core->error->add(sprintf($errors[$action],$e->getMessage())); - } - - break; + /** + * Restore backup for a module + */ + case 'module_restore_backup': + try { + if (empty($_POST['modules']) || empty($_POST['files'])) { + throw New Exception(__('No blackup to restore')); + } - /** - * Restore backup for a module - */ - case 'module_restore_backup': + sort($_POST['files']); + $done = false; + foreach($_POST['modules'] as $b_module) { + $b_list = $translater->listBackups($b_module, true); - try - { - if (empty($_POST['modules']) || empty($_POST['files'])) - { - throw New Exception(__('No blackup to restore')); - } + foreach($_POST['files'] as $b_file) { + if (in_array($b_file, $b_list)) { + $translater->restoreBackup($b_module, $b_file); + $done = true; + } + } + } + if (!$done) { + throw new Exception(__('No bakcup to to restore')); + } - sort($_POST['files']); - $done = false; - foreach($_POST['modules'] as $b_module) - { - $b_list = $translater->listBackups($b_module,true); - foreach($_POST['files'] as $b_file) - { - if (in_array($b_file,$b_list)) - { - $translater->restoreBackup($b_module,$b_file); - $done = true; - } - } - } - if (!$done) - { - throw new Exception(__('No bakcup to to restore')); - } + http::redirect($p_url . '&part=module&module=' . $module . '&type=' . $type . '&tab=module-backup&msg=restore_backup'); + } catch (Exception $e) { + $core->error->add(sprintf($errors[$action], $e->getMessage())); + } + break; - http::redirect($p_url.'&part=module&module='.$module.'&type='.$type.'&tab=module-backup&msg=restore_backup'); - } - catch (Exception $e) - { - $core->error->add(sprintf($errors[$action],$e->getMessage())); - } - - break; + /** + * Delete backup for a module + */ + case 'module_delete_backup': + try { + if (empty($_POST['modules']) || empty($_POST['files'])) { + throw New Exception(__('No backup to delete')); + } - /** - * Delete backup for a module - */ - case 'module_delete_backup': + $done = false; + foreach($_POST['modules'] as $b_module) { + $b_list = $translater->listBackups($b_module, true); - try - { - if (empty($_POST['modules']) || empty($_POST['files'])) - { - throw New Exception(__('No backup to delete')); - } + foreach($_POST['files'] as $b_file) { + if (in_array($b_file, $b_list)) { + $translater->deleteBackup($b_module, $b_file); + $done = true; + } + } + } + if (!$done) { + throw new Exception(__('No backup to delete')); + } - $done = false; - foreach($_POST['modules'] as $b_module) - { - $b_list = $translater->listBackups($b_module,true); - foreach($_POST['files'] as $b_file) - { - if (in_array($b_file,$b_list)) - { - $translater->deleteBackup($b_module,$b_file); - $done = true; - } - } - } - if (!$done) - { - throw new Exception(__('No backup to delete')); - } + http::redirect($p_url . '&part=module&module=' . $module . '&type=' . $type . '&tab=module-backup&msg=delete_backup'); + } catch (Exception $e) { + $core->error->add(sprintf($errors[$action],$e->getMessage())); + } + break; - http::redirect($p_url.'&part=module&module='.$module.'&type='.$type.'&tab=module-backup&msg=delete_backup'); - } - catch (Exception $e) - { - $core->error->add(sprintf($errors[$action],$e->getMessage())); - } - - break; + /** + * Import language package for a module + */ + case 'module_import_pack': + try { + if (empty($_FILES['packfile']['name'])) { + throw new Exception(__('Nothing to import')); + } + $translater->importPack($_POST['modules'], $_FILES['packfile']); - /** - * Import language package for a module - */ - case 'module_import_pack': + http::redirect($p_url . '&part=module&module=' . $module . '&type=' . $type . '&tab=module-pack&msg=import_pack'); + } catch (Exception $e) { + $core->error->add(sprintf($errors[$action], $e->getMessage())); + } + break; - try - { - if (empty($_FILES['packfile']['name'])) - { - throw new Exception(__('Nothing to import')); - } - $translater->importPack($_POST['modules'],$_FILES['packfile']); + /** + * Export language package for a module + */ + case 'module_export_pack': + try { + if (empty($_POST['modules']) || empty($_POST['entries'])) { + throw new Exception(__('Nothing to export')); + } + $translater->exportPack($_POST['modules'], $_POST['entries']); - http::redirect($p_url.'&part=module&module='.$module.'&type='.$type.'&tab=module-pack&msg=import_pack'); - } - catch (Exception $e) - { - $core->error->add(sprintf($errors[$action],$e->getMessage())); - } - - break; + http::redirect($p_url . '&part=module&module=' . $module . '&type=' . $type . '&tab=module-pack&msg=export_pack'); + } catch (Exception $e) { + $core->error->add(sprintf($errors[$action], $e->getMessage())); + } + break; - /** - * Export language package for a module - */ - case 'module_export_pack': + /** + * Update language + */ + case 'update_lang': + try { + if (empty($_POST['entries']) || empty($lang) || empty($module)) { + throw new Exception(__('No language to update')); + } + foreach($_POST['entries'] as $i => $entry) { + if (isset($entry['check']) && isset($_POST['multigroup'])) { + $_POST['entries'][$i]['group'] = $_POST['multigroup']; + unset($_POST['entries'][$i]['check']); + } + } + $translater->updLang($module, $lang, $_POST['entries']); - try - { - if (empty($_POST['modules']) || empty($_POST['entries'])) - { - throw new Exception(__('Nothing to export')); - } - $translater->exportPack($_POST['modules'],$_POST['entries']); + http::redirect($p_url . '&part=lang&module=' . $module . '&type=' . $type . '&lang=' . $lang . '&msg=' . $action); + } catch (Exception $e) { + $core->error->add(sprintf($errors[$action], $e->getMessage())); + } + break; - http::redirect($p_url.'&part=module&module='.$module.'&type='.$type.'&tab=module-pack&msg=export_pack'); - } - catch (Exception $e) - { - $core->error->add(sprintf($errors[$action],$e->getMessage())); - } - - break; + /** + * Import language packages + */ + case 'import_pack': + try { + if (empty($_FILES['packfile']['name'])) { + throw new Exception(__('Nothing to import')); + } + $translater->importPack($_POST['modules'], $_FILES['packfile']); + + http::redirect($p_url . '&part=pack&msg=' . $action . '&tab=pack-import'); + } catch (Exception $e) { + $core->error->add(sprintf($errors[$action], $e->getMessage())); + } + break; - /** - * Update language - */ - case 'update_lang': + /** + * Export language packages + */ + case 'export_pack': + try { + if (empty($_POST['modules']) || empty($_POST['entries'])) { + throw new Exception(__('Nothing to export')); + } + $translater->exportPack($_POST['modules'], $_POST['entries']); - try - { - if (empty($_POST['entries']) || empty($lang) || empty($module)) - { - throw new Exception(__('No language to update')); - } - foreach($_POST['entries'] as $i => $entry) - { - if (isset($entry['check']) && isset($_POST['multigroup'])) - { - $_POST['entries'][$i]['group'] = $_POST['multigroup']; - unset($_POST['entries'][$i]['check']); - } - } - $translater->updLang($module,$lang,$_POST['entries']); + http::redirect($p_url . '&part=pack&msg=' . $action . '&tab=pack-export'); + } catch (Exception $e) { + $core->error->add(sprintf($errors[$action], $e->getMessage())); + } + break; - http::redirect($p_url.'&part=lang&module='.$module.'&type='.$type.'&lang='.$lang.'&msg='.$action); - } - catch (Exception $e) - { - $core->error->add(sprintf($errors[$action],$e->getMessage())); - } + /** + * Save settings + */ + case 'save_setting': + try { + if (empty($_POST['translater_write_po']) + && empty($_POST['translater_write_langphp'])) { + throw new Exception('You must choose one file format at least'); + } - break; + foreach($translater->getDefaultSettings() as $k => $v) { + $translater->set($k,(isset($_POST['translater_' . $k]) ? $_POST['translater_' . $k] : '')); + } - /** - * Import language packages - */ - case 'import_pack': + foreach($translater->proposal->getTools() AS $k => $v) { + $v->save(); + } - try - { - if (empty($_FILES['packfile']['name'])) - { - throw new Exception(__('Nothing to import')); - } - $translater->importPack($_POST['modules'],$_FILES['packfile']); - - http::redirect($p_url.'&part=pack&msg='.$action.'&tab=pack-import'); - } - catch (Exception $e) - { - $core->error->add(sprintf($errors[$action],$e->getMessage())); - } + http::redirect($p_url . '&part=setting&msg=' . $action); + } catch (Exception $e) { + $core->error->add(sprintf($errors[$action], $e->getMessage())); + } + break; - break; - - /** - * Export language packages - */ - case 'export_pack': - - try - { - if (empty($_POST['modules']) || empty($_POST['entries'])) - { - throw new Exception(__('Nothing to export')); - } - $translater->exportPack($_POST['modules'],$_POST['entries']); - - http::redirect($p_url.'&part=pack&msg='.$action.'&tab=pack-export'); - } - catch (Exception $e) - { - $core->error->add(sprintf($errors[$action],$e->getMessage())); - } - - break; - - /** - * Save settings - */ - case 'save_setting': - - try - { - if (empty($_POST['translater_write_po']) - && empty($_POST['translater_write_langphp'])) - { - throw new Exception('You must choose one file format at least'); - } - - foreach($translater->getDefaultSettings() as $k => $v) - { - $translater->set($k,(isset($_POST['translater_'.$k]) ? $_POST['translater_'.$k] : '')); - } - - foreach($translater->proposal->getTools() AS $k => $v) - { - $v->save(); - } - - http::redirect($p_url.'&part=setting&msg='.$action); - } - catch (Exception $e) - { - $core->error->add(sprintf($errors[$action],$e->getMessage())); - } - - break; - - /** - * Modules / Unknow / None - */ - default: - break; + /** + * Modules / Unknow / None + */ + default: + break; } # # Fill in title and prepare display # -switch ($part) -{ - /** - * Modules - */ - case 'modules': +switch ($part) { + /** + * Modules + */ + case 'modules': + $title = '' . ($type == 'theme' ? __('Themes') : __('Plugins')) . ''; + break; - $title = ''.($type == 'theme' ? __('Themes') : __('Plugins')).''; + /** + * Module + */ + case 'module': + # Get info about requested module + try { + $M = $translater->getModule($module, $type); + } catch(Exception $e) { + $core->error->add(sprintf(__('Failed to launch translater: %s'), $e->getMessage())); + $action = $module = $type = ''; + $M = false; + } + if (!empty($module) && !empty($type) && !$M) { + $action = $module = $type = ''; + $M = false; + } - break; + $M->langs = $translater->listLangs($module); + $M->backups = $translater->listBackups($module); + $M->unused_langs = array_flip(array_diff($translater->getIsoCodes(), $M->langs)); + $M->used_langs = array_flip(array_diff($M->langs, array_flip($translater->getIsoCodes()))); + $allowed_groups = array_combine( + dcTranslater::$allowed_l10n_groups, + dcTranslater::$allowed_l10n_groups + ); - /** - * Module - */ - case 'module': + $title = + '' . ($type == 'theme' ? __('Themes') : __('Plugins')) . '' . + ' › ' . $module . ''; + break; - # Get info about requested module - try - { - $M = $translater->getModule($module,$type); - } - catch(Exception $e) - { - $core->error->add(sprintf(__('Failed to launch translater: %s'),$e->getMessage())); - $action = $module = $type = ''; - $M = false; - } - if (!empty($module) && !empty($type) && !$M) - { - $action = $module = $type = ''; - $M = false; - } + /** + * Lang + */ + case 'lang': - $M->langs = $translater->listLangs($module); - $M->backups = $translater->listBackups($module); - $M->unused_langs = array_flip(array_diff($translater->getIsoCodes(),$M->langs)); - $M->used_langs = array_flip(array_diff($M->langs,array_flip($translater->getIsoCodes()))); - $allowed_groups = array_combine( - dcTranslater::$allowed_l10n_groups, - dcTranslater::$allowed_l10n_groups - ); + # Get infos on module wanted + try { + $M = $translater->getModule($module, $type); - $title = - ''.($type == 'theme' ? __('Themes') : __('Plugins')).''. - ' › '.$module.''; + # Retrieve some infos + $M->langs = $translater->listLangs($module); + $M->backups = $translater->listBackups($module); + $M->unused_langs = array_flip(array_diff($translater->getIsoCodes(), $M->langs)); + $M->used_langs = array_flip(array_diff($M->langs, array_flip($translater->getIsoCodes()))); + $allowed_groups = array_combine( + dcTranslater::$allowed_l10n_groups, + dcTranslater::$allowed_l10n_groups + ); + } catch(Exception $e) { + $core->error->add(sprintf(__('Failed to launch translater: %s'), $e->getMessage())); + $action = $module = $type = ''; + $M = false; + } + if (!empty($module) && !empty($type) && !$M) { + $action = $module = $type = ''; + $M = false; + } - break; + $title = + '' . ($type == 'theme' ? __('Themes') : __('Plugins')) . '' . + ' › ' . + '' . $module . ''; + if (!empty($M->langs) && isset($M->langs[$lang])) { + $title .= ' › ' . $M->langs[$lang] . ''; + } + break; - /** - * Lang - */ - case 'lang': + /** + * Import/Export (pack) + */ + case 'pack': + $title = '' . __('Import/Export') . ''; + break; - # Get infos on module wanted - try - { - $M = $translater->getModule($module,$type); - - # Retrieve some infos - $M->langs = $translater->listLangs($module); - $M->backups = $translater->listBackups($module); - $M->unused_langs = array_flip(array_diff($translater->getIsoCodes(),$M->langs)); - $M->used_langs = array_flip(array_diff($M->langs,array_flip($translater->getIsoCodes()))); - $allowed_groups = array_combine( - dcTranslater::$allowed_l10n_groups, - dcTranslater::$allowed_l10n_groups - ); - } - catch(Exception $e) - { - $core->error->add(sprintf(__('Failed to launch translater: %s'),$e->getMessage())); - $action = $module = $type = ''; - $M = false; - } - if (!empty($module) && !empty($type) && !$M) - { - $action = $module = $type = ''; - $M = false; - } - - $title = - ''.($type == 'theme' ? __('Themes') : __('Plugins')).''. - ' › '. - ''.$module.''; - if (!empty($M->langs) && isset($M->langs[$lang])) - { - $title .= ' › '.$M->langs[$lang].''; - } - - break; - - /** - * Import/Export (pack) - */ - case 'pack': - - $title = ''.__('Import/Export').''; - - break; - - /** - * Settings - */ - case 'setting': - default: - - $title = ''.__('Settings').''; - - break; + /** + * Settings + */ + case 'setting': + default: + $title = '' . __('Settings') . ''; + break; } # @@ -534,32 +439,31 @@ switch ($part) echo ' -'.__('Translater').''. -dcPage::jsPageTabs($tab). -dcPage::jsLoad('js/_posts_list.js'). +' . __('Translater') . '' . +dcPage::jsPageTabs($tab) . +dcPage::jsLoad('js/_posts_list.js') . dcPage::jsLoad('index.php?pf=translater/js/jquery.translater.js'); -if ('' != $translater->proposal_tool) -{ - echo - '\n". - "\n"; +if ('' != $translater->proposal_tool) { + echo + '\n" . + "\n"; } # --BEHAVIOR-- translaterAdminHeaders @@ -567,820 +471,755 @@ $core->callBehavior('translaterAdminHeaders'); echo ' -

'.__('Translater').' › '.$title. -' - '.__('Plugins').''. -' - '.__('Themes').''. -' - '.__('Import/Export').''. +

' . __('Translater') . ' › ' . $title . +' - ' . __('Plugins') . '' . +' - ' . __('Themes') . '' . +' - ' . __('Import/Export') . '' . '

'; -if (isset($succes[$msg])) -{ - dcPage::message($succes[$msg]); +if (isset($succes[$msg])) { + dcPage::success($succes[$msg]); } -switch ($part) -{ - /** - * Modules - */ - case 'modules': +switch ($part) { + /** + * Modules + */ + case 'modules': + echo '
'; - echo ''; + $res = ''; + foreach ($translater->listModules($type) as $k => $v) { + if ($translater->hide_default && in_array($k, dcTranslater::$default_dotclear_modules[$type])) { + continue; + } - $res = ''; - foreach ($translater->listModules($type) as $k => $v) - { - if ($translater->hide_default && in_array($k,dcTranslater::$default_dotclear_modules[$type])) - { - continue; - } - - if ($v['root_writable']) - { - $res .= - ''. - ''. - ''.$k.''; - } - else - { - $res .= - ''. - ''.$k.''; - } - $res .= - ''.$v['version'].''. - ''; + if ($v['root_writable']) { + $res .= + '' . + '' . + '' . $k . ''; + } else { + $res .= + '' . + '' . $k . ''; + } + $res .= + '' . $v['version'] . '' . + ''; - $array_langs = array(); - foreach ($translater->listLangs($k) as $lang_name => $lang_infos) - { - $array_langs[$lang_name] = - ''. - $lang_name.''; - } - $res .= implode(', ',$array_langs). - ''. - ''; - } - if ($res) - { - echo ' - - - - - - '. - $res. - '
'.__('Id').''.__('Version').''.__('Languages').'
'; + $array_langs = array(); + foreach ($translater->listLangs($k) as $lang_name => $lang_infos) { + $array_langs[$lang_name] = + '' . + $lang_name . ''; + } + $res .= implode(', ', $array_langs) . + '' . + ''; + } + if ($res) { + echo ' + + + + + + ' . + $res . + '
' . __('Id') . '' . __('Version') . '' . __('Languages') . '
'; - } - else - { - echo ''.__('There is no editable modules').''; - } - echo ' -

 

+ } else { + echo '' . __('There is no editable modules') . ''; + } + echo ' +

 

+
'; + break; - '; - - break; - - /** - * Module - */ - case 'module': + /** + * Module + */ + case 'module': + # Summary + echo ' +
+

' . __('Module') . '

+ + + + + + + + + + + + + + + +
' . __('About') . '
' . __('Name') . ' ' . $M->name . '
' . __('Version') . ' ' . $M->version . '
' . __('Author') . ' ' . $M->author . '
' . __('Type') . ' ' . $M->type . '
' . __('Root') . ' ' . $M->root . '
' . __('Backups') . ' ' . + $translater->getBackupFolder($module) . '
+

 

'; - # Summary - echo ' -
-

'.__('Module').'

- - - - - - - - - - - - - - - -
'.__('About').'
'.__('Name').' '.$M->name.'
'.__('Version').' '.$M->version.'
'.__('Author').' '.$M->author.'
'.__('Type').' '.$M->type.'
'.__('Root').' '.$M->root.'
'.__('Backups').' '. - $translater->getBackupFolder($module).'
-

 

'; + if (count($M->langs)) { + echo + '

' . __('l10n') . '

' . + '' . + '' . + '' . + '' . + '' . + '' . + ''; + + foreach($M->langs AS $lang => $name) { + echo + '' . + '' . + ''; + + if (isset($M->backups[$lang])) { + foreach($M->backups[$lang] AS $file => $info) { + $time[$lang] = isset($time[$lang]) && $time[$lang] > $info['time'] ? + $time[$lang] : $info['time']; + } + echo + '' . + ''; + } else { + echo ''; + } + echo ''; + } + echo '
' . __('Languages') . '' . __('Code') . '' . __('Backups') . '' . __('Last backup') . '
' . + '' . $name . '' . + ' ' . $lang . '' . count($M->backups[$lang]) . ' ' . + dt::str('%Y-%m-%d %H:%M', $time[$lang], $core->blog->settings->system->blog_timezone) . + '' . __('no backup') . '
'; + } + echo '
'; - if (count($M->langs)) - { - echo - '

'.__('l10n').'

'. - ''. - ''. - ''. - ''. - ''. - ''. - ''; - - foreach($M->langs AS $lang => $name) - { - echo - ''. - ''. - ''; - - if (isset($M->backups[$lang])) - { - foreach($M->backups[$lang] AS $file => $info) - { - $time[$lang] = isset($time[$lang]) && $time[$lang] > $info['time'] ? - $time[$lang] : $info['time']; - } - echo - ''. - ''; - } - else - { - echo ''; - } - echo ''; - } - echo '
'.__('Languages').''.__('Code').''.__('Backups').''.__('Last backup').'
'. - ''.$name.''. - ' '.$lang.''.count($M->backups[$lang]).' '. - dt::str('%Y-%m-%d %H:%M',$time[$lang],$core->blog->settings->system->blog_timezone). - ''.__('no backup').'
'; - } - echo '
'; + # Add/Remove/Edit lang + echo '
'; - # Add/Remove/Edit lang - echo '
'; + # Edit lang + if (!empty($M->langs)) { + echo ' +

' . __('Edit language') . '

+
+

' . __('Select language:') . ' ' . + form::combo(array('lang'), $M->used_langs,$lang) . '

+

' . + $core->formNonce() . + form::hidden(array('type'), $type) . + form::hidden(array('module'), $module) . + form::hidden(array('action'), '') . + form::hidden(array('part'), 'lang') . + form::hidden(array('p'), 'translater') . ' +

+
+

 

'; + } - # Edit lang - if (!empty($M->langs)) - { - echo ' -

'.__('Edit language').'

-
-

'.__('Select language:').' '. - form::combo(array('lang'),$M->used_langs,$lang).'

-

'. - $core->formNonce(). - form::hidden(array('type'),$type). - form::hidden(array('module'),$module). - form::hidden(array('action'),''). - form::hidden(array('part'),'lang'). - form::hidden(array('p'),'translater').' -

-
-

 

'; - } + # New lang + if (!empty($M->unused_langs)) { + echo ' +

' . __('Add language') . '

+
+

' . __('Select language:') . ' ' . + form::combo(array('lang'), array_merge(array('-'=>'-'), $M->unused_langs), $core->auth->getInfo('user_lang')) . '

'; + if (!empty($M->used_langs)) { + echo + '

' . __('Copy from language:') . ' ' . + form::combo(array('from'),array_merge(array('-'=>'-'), $M->used_langs)) . + ' (' . __('Optionnal') . ')

'; + } else { + echo '

' . form::hidden(array('from'), '') . '

'; + } + echo ' +

' . + $core->formNonce() . + form::hidden(array('type'), $type) . + form::hidden(array('module'), $module) . + form::hidden(array('action'), 'module_add_lang') . + form::hidden(array('part'), 'module') . + form::hidden(array('tab'), 'module-lang') . + form::hidden(array('p'), 'translater') . ' +

+
+

 

'; + } - # New lang - if (!empty($M->unused_langs)) - { - echo ' -

'.__('Add language').'

-
-

'.__('Select language:').' '. - form::combo(array('lang'),array_merge(array('-'=>'-'),$M->unused_langs),$core->auth->getInfo('user_lang')).'

'; - if (!empty($M->used_langs)) - { - echo - '

'.__('Copy from language:').' '. - form::combo(array('from'),array_merge(array('-'=>'-'),$M->used_langs)). - ' ('.__('Optionnal').')

'; - } - else - { - echo '

'.form::hidden(array('from'),'').'

'; - } - echo ' -

'. - $core->formNonce(). - form::hidden(array('type'),$type). - form::hidden(array('module'),$module). - form::hidden(array('action'),'module_add_lang'). - form::hidden(array('part'),'module'). - form::hidden(array('tab'),'module-lang'). - form::hidden(array('p'),'translater').' -

-
-

 

'; - } + # Delete lang + if (!empty($M->used_langs)) { + echo ' +

' . __('Delete language') . '

+
+

' . __('Select language:') . ' ' . + form::combo(array('lang'), array_merge(array('-'=>'-'), $M->used_langs)) . '

+

' . + $core->formNonce() . + form::hidden(array('type'), $type) . + form::hidden(array('module'), $module) . + form::hidden(array('action'), 'module_delete_lang') . + form::hidden(array('part'), 'module') . + form::hidden(array('tab'), 'module-lang') . + form::hidden(array('p'), 'translater') . ' +

+
+

 

'; + } + echo '
'; - # Delete lang - if (!empty($M->used_langs)) - { - echo ' -

'.__('Delete language').'

-
-

'.__('Select language:').' '. - form::combo(array('lang'),array_merge(array('-'=>'-'),$M->used_langs)).'

-

'. - $core->formNonce(). - form::hidden(array('type'),$type). - form::hidden(array('module'),$module). - form::hidden(array('action'),'module_delete_lang'). - form::hidden(array('part'),'module'). - form::hidden(array('tab'),'module-lang'). - form::hidden(array('p'),'translater').' -

-
-

 

'; - } - echo '
'; + # Create/delete/restore backups + if (!empty($M->used_langs) || !empty($M->backups)) { - # Create/delete/restore backups - if (!empty($M->used_langs) || !empty($M->backups)) { + echo '
'; - echo '
'; + if (!empty($M->used_langs)) { + echo ' +

' . __('Create backups') . '

+
+

' . __('Choose languages to backup') . '

+ + '; + $i=0; + foreach($M->used_langs AS $name => $lang) { + $i++; + echo ' + + + + + '; + } + echo ' +
' . form::checkbox(array('langs[]') ,$lang, '', '', '', false) . '' . $name . '' . $lang . '
+
+

 

+

 

+
+

+ ' . + form::hidden(array('modules[]'), $module) . + $core->formNonce() . + form::hidden(array('type'), $type) . + form::hidden(array('module'), $module) . + form::hidden(array('action'), 'module_create_backup') . + form::hidden(array('part'), 'module') . + form::hidden(array('tab'), 'module-backup') . + form::hidden(array('p'), 'translater') . ' +

+
+

 

'; + } - if (!empty($M->used_langs)) - { - echo ' -

'.__('Create backups').'

-
-

'.__('Choose languages to backup').'

- - '; - $i=0; - foreach($M->used_langs AS $name => $lang) - { - $i++; - echo ' - - - - - '; - } - echo ' -
'.form::checkbox(array('langs[]'),$lang,'','','',false).''.$name.''.$lang.'
-
-

 

-

 

-
-

- '. - form::hidden(array('modules[]'),$module). - $core->formNonce(). - form::hidden(array('type'),$type). - form::hidden(array('module'),$module). - form::hidden(array('action'),'module_create_backup'). - form::hidden(array('part'),'module'). - form::hidden(array('tab'),'module-backup'). - form::hidden(array('p'),'translater').' -

-
-

 

'; - } + if (!empty($M->backups)) { + echo + '

' . __('List of backups') . '

' . + '
' . + '' . + '' . + '' . + '' . + '' . + '' . + ''; + $i=0; + foreach($M->backups as $lang => $langs) { + foreach($langs as $file => $infos) { + $i++; + echo + '' . + '' . + '' . + '' . + '' . + '' . + ''; + } + } + echo ' +
' . __('File') . '' . __('Date') . '' . __('Language') . '' . __('Size') . '
' . form::checkbox(array('files[]'), $file, '', '', '', false) . '' . $file . '' . + dt::str(__('%Y-%m-%d %H:%M:%S'), $infos['time'], $core->blog->settings->system->blog_timezone) . + '' . $translater->isIsoCode($lang) . '' . files::size($infos['size']) . '
+
+

 

+

' . __('Selected backups action:') . ' ' . + form::combo('action', array( + __('Restore backups') => 'module_restore_backup', + __('Delete backups') => 'module_delete_backup') + ) . ' + ' . + form::hidden(array('modules[]'), $module) . + $core->formNonce() . + form::hidden(array('type'), $type) . + form::hidden(array('module'), $module) . + form::hidden(array('part'), 'module') . + form::hidden(array('tab'), 'module-backup') . + form::hidden(array('p'), 'translater') . ' +

+
+
+

 

'; + } - if (!empty($M->backups)) - { - echo - '

'.__('List of backups').'

'. - '
'. - ''. - ''. - ''. - ''. - ''. - ''. - ''; - $i=0; - foreach($M->backups as $lang => $langs) - { - foreach($langs as $file => $infos) - { - $i++; - echo - ''. - ''. - ''. - ''. - ''. - ''. - ''; - } - } - echo ' -
'.__('File').''.__('Date').''.__('Language').''.__('Size').'
'.form::checkbox(array('files[]'),$file,'','','',false).''.$file.''. - dt::str(__('%Y-%m-%d %H:%M:%S'),$infos['time'],$core->blog->settings->system->blog_timezone). - ''.$translater->isIsoCode($lang).''.files::size($infos['size']).'
-
-

 

-

'.__('Selected backups action:').' '. - form::combo('action',array( - __('Restore backups') => 'module_restore_backup', - __('Delete backups') => 'module_delete_backup') - ).' - '. - form::hidden(array('modules[]'),$module). - $core->formNonce(). - form::hidden(array('type'),$type). - form::hidden(array('module'),$module). - form::hidden(array('part'),'module'). - form::hidden(array('tab'),'module-backup'). - form::hidden(array('p'),'translater').' -

-
-
-

 

'; - } + echo '
'; + } // end if (!empty($M->used_langs) || !empty($M->backups)) { - echo '
'; - } // end if (!empty($M->used_langs) || !empty($M->backups)) { + # Import/Export pack + echo '
'; - # Import/Export pack - echo '
'; + # Import + echo ' +

' . __('Import') . '

+
+

' . __('Choose language package to import') . '
+

+

+ ' . + form::hidden(array('modules[]'), $module) . + $core->formNonce() . + form::hidden(array('type'), $type) . + form::hidden(array('module'), $module) . + form::hidden(array('action'), 'module_import_pack') . + form::hidden(array('part'), 'module') . + form::hidden(array('tab'), 'module-pack') . + form::hidden(array('p'), 'translater') . ' +

+
+

 

'; - # Import - echo ' -

'.__('Import').'

-
-

'.__('Choose language package to import').'
-

-

- '. - form::hidden(array('modules[]'),$module). - $core->formNonce(). - form::hidden(array('type'),$type). - form::hidden(array('module'),$module). - form::hidden(array('action'),'module_import_pack'). - form::hidden(array('part'),'module'). - form::hidden(array('tab'),'module-pack'). - form::hidden(array('p'),'translater').' -

-
-

 

'; + # Export + if (!empty($M->used_langs)) { + echo + '

' . __('Export') . '

' . + '
' . + '

' . __('Choose languages to export') . '

' . + '' . + ''; + $i=0; + foreach($M->used_langs AS $name => $lang) { + $i++; + echo + '' . + '' . + '' . + '' . + ''; + } + echo + '
' . + form::checkbox(array('entries[]'), $lang, '', '', '', false) . + '' . $name . '' . $lang . '
' . + '
' . + '

 

' . + '

 

' . + '
' . + '

' . + '' . + form::hidden(array('modules[]'), $module) . + $core->formNonce() . + form::hidden(array('type'), $type) . + form::hidden(array('module'), $module) . + form::hidden(array('action'), 'module_export_pack') . + form::hidden(array('part'), 'module') . + form::hidden(array('tab'), 'module-pack') . + form::hidden(array('p'), 'translater') . + '

' . + '
' . + '

 

'; + } + echo '
'; + break; - # Export - if (!empty($M->used_langs)) - { - echo - '

'.__('Export').'

'. - '
'. - '

'.__('Choose languages to export').'

'. - ''. - ''; - $i=0; - foreach($M->used_langs AS $name => $lang) - { - $i++; - echo - ''. - ''. - ''. - ''. - ''; - } - echo - '
'. - form::checkbox(array('entries[]'),$lang,'','','',false). - ''.$name.''.$lang.'
'. - '
'. - '

 

'. - '

 

'. - '
'. - '

'. - ''. - form::hidden(array('modules[]'),$module). - $core->formNonce(). - form::hidden(array('type'),$type). - form::hidden(array('module'),$module). - form::hidden(array('action'),'module_export_pack'). - form::hidden(array('part'),'module'). - form::hidden(array('tab'),'module-pack'). - form::hidden(array('p'),'translater'). - '

'. - '
'. - '

 

'; - } - echo '
'; + /** + * Lang + */ + case 'lang': + # Existing langs + if (empty($M->langs) || !isset($M->langs[$lang])) { + break; + } - break; + $iso = $M->langs[$lang]; - /** - * Lang - */ - case 'lang': + $i = 0; + $sort_order = 'asc'; + $lines = $translater->getMsgs($module, $lang); - # Existing langs - if (empty($M->langs) || !isset($M->langs[$lang])) - { - break; - } + # Sort array + if (isset($_GET['sort']) && !empty($lines)) { + $sort = explode(',', $_GET['sort']); + $sort_by = $sort[0]; + $sort_order = isset($sort[1]) && $sort[1] == 'desc' ? 'asc' : 'desc'; - $iso = $M->langs[$lang]; + switch($sort_by) { + case 'group': + foreach($lines AS $k => $v) { + $sort_list[] = $v['group']; + } + break; - $i = 0; - $sort_order = 'asc'; - $lines = $translater->getMsgs($module,$lang); + case 'msgid': + foreach($lines AS $k => $v) { + $sort_list[] = strtolower($k); + } + break; - # Sort array - if (isset($_GET['sort']) && !empty($lines)) - { - $sort = explode(',',$_GET['sort']); - $sort_by = $sort[0]; - $sort_order = isset($sort[1]) && $sort[1] == 'desc' ? 'asc' : 'desc'; + case 'file': + foreach($lines AS $k => $v) { + $file = array(); + foreach($v['files'] as $fv) { + $file[] = empty($fv[0]) || empty($fv[1]) ? '' : $fv[0] . ($fv[1] /1000); + } + sort($file); + $sort_list[] = $file[0]; + } + break; - switch($sort_by) - { - case 'group': - foreach($lines AS $k => $v) - { - $sort_list[] = $v['group']; - } - break; + case 'msgstr': + foreach($lines AS $k => $v) { + $sort_list[] = strtolower($v['msgstr']); + } + break; - case 'msgid': - foreach($lines AS $k => $v) - { - $sort_list[] = strtolower($k); - } - break; + default: + $sort_list = false; + break; + } + if ($sort_list) { + array_multisort( + $sort_list, + ($sort_order == 'asc' ? SORT_DESC : SORT_ASC), + SORT_STRING, + $lines + ); + } + } - case 'file': - foreach($lines AS $k => $v) - { - $file = array(); - foreach($v['files'] as $fv) - { - $file[] = empty($fv[0]) || empty($fv[1]) ? '' : $fv[0].($fv[1] /1000); - } - sort($file); - $sort_list[] = $file[0]; - } - break; + echo + '
' . + '
' . + '' . + '' . + '' . + '' . + '' . + '' . + '' . + ''; - case 'msgstr': - foreach($lines AS $k => $v) - { - $sort_list[] = strtolower($v['msgstr']); - } - break; + foreach ($lines AS $msgid => $rs) { + $i++; + $in_dc = ($rs['in_dc'] && $translater->parse_nodc); - default: - $sort_list = false; - break; - } - if ($sort_list) - { - array_multisort( - $sort_list, - ($sort_order == 'asc' ? SORT_DESC : SORT_ASC), - SORT_STRING, - $lines - ); - } - } + echo + '' . - echo - '
'. - ''. - '
' . __('Group') . '' . __('String') . '' . __('Translation') . '' . __('Existing') . '' . __('File') . '
'. - ''. - ''. - ''. - ''. - ''. - ''. - ''; + '' . - foreach ($lines AS $msgid => $rs) - { - $i++; - $in_dc = ($rs['in_dc'] && $translater->parse_nodc); + 'proposal_tool ? ' class="translatermsgid"' : '' ) . '>' . + html::escapeHTML($msgid) . '' . - echo - ''. + '' . - ''. + '' . - 'proposal_tool ? ' class="translatermsgid"' : '' ).'>'. - html::escapeHTML($msgid).''. + '' . + ''; + } - ''. + $i++; + echo + '' . + '' . + '' . + '' . + '' . + '' . + '' . + '
'.__('Group').''.__('String').''.__('Translation').''.__('Existing').''.__('File').'
' . + form::checkbox(array('entries[' . $i . '][check]'), 1) . ' ' . + form::combo(array('entries[' . $i . '][group]'), + $allowed_groups,$rs['group'], '', '', $in_dc + ) . + '
' . + form::hidden(array('entries[' . $i . '][msgid]'), html::escapeHTML($msgid)) . + form::field(array('entries[' . $i . '][msgstr]'), + 48, 255, html::escapeHTML($rs['msgstr']), '', '', $in_dc) . + ''. - form::checkbox(array('entries['.$i.'][check]'),1).' '. - form::combo(array('entries['.$i.'][group]'), - $allowed_groups,$rs['group'],'','',$in_dc - ). - ''; + $strin = array(); + foreach($rs['o_msgstrs'] AS $o_msgstr) { + if (!isset($strin[$o_msgstr['msgstr']])) { + $strin[$o_msgstr['msgstr']] = array(); + } + $strin[$o_msgstr['msgstr']][] = array('module' => $o_msgstr['module'], 'file' => $o_msgstr['file']); + } + foreach($strin as $k => $v) { + echo '
' . html::escapeHTML($k) . '
'; + foreach($v as $str) { + echo '' . html::escapeHTML($str['module'] . ' => ' . $str['file']) . '
'; + } + echo '

'; + } + echo + '
'; + if (empty($rs['files'][0])) { + echo ' '; + } elseif (count($rs['files']) == 1) { + echo $rs['files'][0][0] . ' : ' . $rs['files'][0][1]; + } else { + echo + '' . sprintf(__('%s occurrences'), count($rs['files'])) . '' . + '
'; + foreach($rs['files'] as $location) { + echo '' . implode(' : ', $location) . '
'; + } + echo '
'; + } + echo + '
'. - form::hidden(array('entries['.$i.'][msgid]'),html::escapeHTML($msgid)). - form::field(array('entries['.$i.'][msgstr]'), - 75,255,html::escapeHTML($rs['msgstr']),'','',$in_dc). - '
' . + form::checkbox(array('entries[' . $i . '][check]'), 1) . ' ' . + form::combo(array('entries[' . $i . '][group]'), $allowed_groups, 'main') . + '' . form::field(array('entries[' . $i . '][msgid]'), 48, 255, '') . '' . form::field(array('entries[' . $i . '][msgstr]'), 48, 255, '') . '  
' . + '

' . sprintf(__('Total of %s strings . '), $i-1) . '

' . + '

' . + '

' . __('Change the group of the selected entries to:') . ' ' . + form::combo(array('multigroup'), $allowed_groups) . + '

' . + '

' . + '' . + $core->formNonce() . + form::hidden(array('lang'), $lang) . + form::hidden(array('type') ,$type) . + form::hidden(array('module'), $module) . + form::hidden(array('action'), 'update_lang') . + form::hidden(array('part'), 'lang') . + form::hidden(array('p'), 'translater') . + '

' . + '
' . + '

 

' . + '
'; + break; - ''; - $strin = array(); - foreach($rs['o_msgstrs'] AS $o_msgstr) - { - if (!isset($strin[$o_msgstr['msgstr']])) - { - $strin[$o_msgstr['msgstr']] = ''; - } - $strin[$o_msgstr['msgstr']][] = array('module'=>$o_msgstr['module'],'file'=>$o_msgstr['file']); - } - foreach($strin as $k => $v) - { - echo '
'.html::escapeHTML($k).'
'; - foreach($v as $str) - { - echo ''.html::escapeHTML($str['module'].' => '.$str['file']).'
'; - } - echo '

'; - } - echo - ''. + /** + * Import/Export (Pack) + */ + case 'pack': + # Import + echo ' +
+
+

' . __('Choose language package to import') . '
+

+

+ '; + $i=0; + foreach($translater->listModules() AS $k => $v) { + if ($translater->hide_default && ( + in_array($k,dcTranslater::$default_dotclear_modules['plugin']) || + in_array($k,dcTranslater::$default_dotclear_modules['theme']))) { + continue; + } + echo form::hidden(array('modules[]'), $k);$i++; + } + echo + $core->formNonce() . + form::hidden(array('type'), $type) . + form::hidden(array('module'), $module) . + form::hidden(array('action'), 'import_pack') . + form::hidden(array('part'), 'pack') . + form::hidden(array('tab'), 'pack-import') . + form::hidden(array('p'), 'translater') . ' +

+
+
'; - ''; - if (empty($rs['files'][0])) - { - echo ' '; - } - elseif (count($rs['files']) == 1) - { - echo $rs['files'][0][0].' : '.$rs['files'][0][1]; - } - else - { - echo - ''.sprintf(__('%s occurrences'),count($rs['files'])).''. - '
'; - foreach($rs['files'] as $location) - { - echo ''.implode(' : ',$location).'
'; - } - echo '
'; - } - echo - ''. - ''; - } + # Export + echo ' +
+
+

' . __('Choose modules to export') . '

+ + '; + $i=0; + $langs_list = array(); - $i++; - echo - ''. - ''. - ''. - ''. - ''. - ''. - ''. - '
' . __('Modules') . '' . __('Languages') . '
'. - form::checkbox(array('entries['.$i.'][check]'),1).' '. - form::combo(array('entries['.$i.'][group]'),$allowed_groups,'main'). - ''.form::field(array('entries['.$i.'][msgid]'),75,255,'').''.form::field(array('entries['.$i.'][msgstr]'),75,255,'').'  
'. - '

'.sprintf(__('Total of %s strings.'),$i-1).'

'. - '

'. - '

'.__('Change the group of the selected entries to:').' '. - form::combo(array('multigroup'),$allowed_groups). - '

'. - '

'. - ''. - $core->formNonce(). - form::hidden(array('lang'),$lang). - form::hidden(array('type'),$type). - form::hidden(array('module'),$module). - form::hidden(array('action'),'update_lang'). - form::hidden(array('part'),'lang'). - form::hidden(array('p'),'translater'). - '

'. - '
'. - '

 

'. - '
'; + foreach($translater->listModules() AS $k => $v) { + if ($translater->hide_default && ( + in_array($k,dcTranslater::$default_dotclear_modules['plugin']) || + in_array($k,dcTranslater::$default_dotclear_modules['theme']))) { + continue; + } - break; + $info_lang = $translater->listLangs($k); + if (!is_array($info_lang) || 1 > count($info_lang)) { + continue; + } - /** - * Import/Export (Pack) - */ - case 'pack': + $i++; + $langs_list = array_merge($langs_list, $info_lang); - # Import - echo ' -
-
-

'.__('Choose language package to import').'
-

-

- '; - $i=0; - foreach($translater->listModules() AS $k => $v) - { - if ($translater->hide_default && ( - in_array($k,dcTranslater::$default_dotclear_modules['plugin']) || - in_array($k,dcTranslater::$default_dotclear_modules['theme']))) continue; - - echo form::hidden(array('modules[]'),$k);$i++; - } - echo - $core->formNonce(). - form::hidden(array('type'),$type). - form::hidden(array('module'),$module). - form::hidden(array('action'),'import_pack'). - form::hidden(array('part'),'pack'). - form::hidden(array('tab'),'pack-import'). - form::hidden(array('p'),'translater').' -

-
-
'; + echo ' + + ' . form::checkbox(array('modules[]'), $k, '', '', '', false) . ' + ' . $v['name'] . ' + ' . implode(', ', $info_lang) . ' + '; + } - # Export - echo ' -
-
-

'.__('Choose modules to export').'

- - '; - $i=0; - $langs_list = array(); + echo ' +
'.__('Modules').''.__('Languages').'
+

' . __('Choose languages to export') . '

+ + '; + $i=0; + foreach($langs_list AS $k => $v) { + $i++; + echo ' + + + + + '; + } + echo ' +
' . __('Languages') . '' . __('Code') . '
' . form::checkbox(array('entries[]'), $k, '', '', '', false) . '' . $v . '' . $k . '
+
+

+

 

+
+

+ ' . + $core->formNonce() . + form::hidden(array('type'), $type) . + form::hidden(array('module'), $module) . + form::hidden(array('action'), 'export_pack') . + form::hidden(array('part'), 'pack') . + form::hidden(array('tab'), 'pack-export') . + form::hidden(array('p'), 'translater') . ' +

+
+
'; + break; - foreach($translater->listModules() AS $k => $v) - { - if ($translater->hide_default && ( - in_array($k,dcTranslater::$default_dotclear_modules['plugin']) || - in_array($k,dcTranslater::$default_dotclear_modules['theme']))) continue; + /** + * Settings + */ + case 'setting': + default: + echo ' +
- $info_lang = $translater->listLangs($k); - if (!is_array($info_lang) || 1 > count($info_lang)) continue; +
+

+

+

+

+

+

+


+ ' . form::field('translater_parse_userinfo', 65, 255, $translater->parse_userinfo) . '

+
- $i++; - $langs_list = array_merge($langs_list,$info_lang); +
+

- echo ' - - '.form::checkbox(array('modules[]'),$k,'','','',false).' - '.$v['name'].' - '.implode(', ',$info_lang).' - '; - } +

' . __('Select and configure the tool to use to translate strings:') . '

'; - echo ' - -

'.__('Choose languages to export').'

- - '; - $i=0; - foreach($langs_list AS $k => $v) - { - $i++; - echo ' - - - - - '; - } - echo ' -
'.__('Languages').''.__('Code').'
'.form::checkbox(array('entries[]'),$k,'','','',false).''.$v.''.$k.'
-
-

-

 

-
-

- '. - $core->formNonce(). - form::hidden(array('type'),$type). - form::hidden(array('module'),$module). - form::hidden(array('action'),'export_pack'). - form::hidden(array('part'),'pack'). - form::hidden(array('tab'),'pack-export'). - form::hidden(array('p'),'translater').' -

- -
'; + foreach($translater->proposal->getTools() AS $k => $v) { + $form = $v->form(); - break; + echo ' +
+
' . + (empty($form) ? + '

' . sprintf(__('Nothing to configure for %s tool . '), $v->getName()) . '

' : + $form + ) . '
'; + } - /** - * Settings - */ - case 'setting': - default: + echo ' + - echo ' -
+
+

+

+
-
-

-

-

-

-

-

-


- '.form::field('translater_parse_userinfo',65,255,$translater->parse_userinfo).'

-
+
+

+

+

+
-
-

+
+

+

+

+
-

'.__('Select and configure the tool to use to translate strings:').'

'; - - foreach($translater->proposal->getTools() AS $k => $v) - { - $form = $v->form(); - - echo ' -
-
'. - (empty($form) ? - '

'.sprintf(__('Nothing to configure for %s tool.'),$v->getName()).'

' : - $form - ).'
'; - } - - echo ' -
- -
-

-

-
- -
-

-

-

-
- -
-

-

-

-
- -
-

'. - $core->formNonce(). - form::hidden(array('p'),'translater'). - form::hidden(array('part'),'setting'). - form::hidden(array('action'),'save_setting').' -

-
'; - - break; +
+

' . + $core->formNonce() . + form::hidden(array('p'), 'translater') . + form::hidden(array('part'), 'setting') . + form::hidden(array('action'), 'save_setting') . ' +

+ '; + break; } dcPage::helpBlock('translater'); -echo -'

'. -''.__('Settings').' - '. -'translater - '.$core->plugins->moduleInfo('translater','version').'  -'.__('Translater').'

-'; -?> \ No newline at end of file +echo ' +'; \ No newline at end of file diff --git a/locales/fr/help/help.html b/locales/fr/help/translater.html similarity index 77% rename from locales/fr/help/help.html rename to locales/fr/help/translater.html index 643a622..6424d93 100644 --- a/locales/fr/help/help.html +++ b/locales/fr/help/translater.html @@ -1,24 +1,18 @@ - + Translater -

Paramètres

+

Paramètres

Activer l'interface simple
Permet de n'avoir que l'essentiel sous les yeux.
-
Utiliser deux colonnes sur la page d'administrations
+
Utiliser deux colonnes sur la page d'administration
Permet d'avoir un affichage sur deux colonnes.
-
Activer le menu de la page des extensions
-
Ajoute un onglet sur la page de gestion des extensions.
- -
Activer le menu de la page des thèmes
-
Ajoute un lien sur les details du thème sélectionné sur le pages de gestion des thèmes.
-
Ecrire les fichier .po
C'est le format par défaut des fichiers de langue de Dotclear.
@@ -39,13 +33,13 @@
Ecrire les informations à propos de l'auteur
Ajoute aux fichiers de langue (si les commentaires sont actifs) des informations à propos de l'auteur de la traduction. Ces informations peuvent ne pas être présentes pour un auteur elles seront alors ignorées. Il accepte les masques suivants: -
    -
  • displayname : pseudo de l'auteur
  • -
  • firstname : prénom de l'auteur
  • -
  • name : nom de l'auteur
  • -
  • email : email de l'auteur
  • -
  • url : site de l'auteur
  • -
+
    +
  • displayname : pseudo de l'auteur
  • +
  • firstname : prénom de l'auteur
  • +
  • name : nom de l'auteur
  • +
  • email : email de l'auteur
  • +
  • url : site de l'auteur
  • +
Utiliser un outil d'aide à la traduction
@@ -53,7 +47,7 @@ une alerte javascript avec la traduction apparait.
Langue par default des sources l10n
-
Langue des textes présents dans les fonctions:
__('...') et {{tpl:lang ...}.
+
Langue des textes présents dans les fonctions:
__('...') et {{tpl:lang ...}}.
Ecraser les langages existants
Lors de l'import d'un paquetage de langue, si cette option est activé, une langue présente dans l'extension sera remplacé par celle venant du paquetage.
@@ -61,13 +55,13 @@
Nom du paquetage exporté
C'est le nom par défaut du fichier zip lorsque vous exportez des sauvegardes.
Il accepte les masques suivants: -
    -
  • type : plugin ou thème
  • -
  • module : nom du module
  • -
  • version : la version du module
  • -
  • timestamp : le temps unix
  • -
  • %Y%m%D.... : les masques de date Dotclear
  • -
+
    +
  • type : plugin ou thème
  • +
  • module : nom du module
  • +
  • version : la version du module
  • +
  • timestamp : le temps unix
  • +
  • %Y%m%D.... : les masques de date Dotclear
  • +
Faire des sauvegardes lors de modifications
@@ -79,23 +73,23 @@
Stoquer les sauvegardes dans un dossier particulier
Plusieurs choix de lieu de sauvegarde s'offrent: -
    +
    • Repertoires locales de chaque module
    • -
    • Repertoire racine des extensions
    • -
    • Repertoire publique (du blog en cours)
    • -
    • Repertoire cache de Dotclear
    • -
    • Repertoire unique du module translater
    • -
    +
  • Repertoire racine des extensions
  • +
  • Repertoire publique (du blog en cours)
  • +
  • Repertoire cache de Dotclear
  • +
  • Repertoire unique du module translater
  • +
Pour ne pas tous mélanger il est préférable de stoquer les sauvegardes dans chaque module associé.
-

Ajout/Supression/Modification

+

Ajout/Supression/Modification

Cet onglet permet d'ajouter, de supprimer ou d'étider des langues d'une extension. Il est possible de copier la traduction d'une langue à une autre lors de sa création. La supression d'une langue ne supprimera pas les éventuelles sauvegardes associées à cette langue.

-

Edition d'une langue

+

Edition d'une langue

Groupe
Cette option est uniquement présente en mode avancé. @@ -121,7 +115,32 @@ La supression d'une langue ne supprimera pas les éventuelles sauvegardes associ
Indique la traduction et l'extension qui utilise cette chaine le cas échéant.
-

Sauvegardes

+

Import/Export

+
+
Importer
+
Il est possible d'importer des paquetages de langue. + Le format de ces paquetages est le zip et la structure pour chaque fichier doit obligatoirement avoir: +
    +
  • le nom du module
  • +
  • le repertoire locales
  • +
  • le code de la langue
  • +
  • le nom du fichier de langue
  • +
+ Ce qui donne par exemple pour le plugin translater: +
    +
  • translater/locales/fr/main.po
  • +
  • translater/locales/fr/main.lang.php
  • +
  • translater/locales/fr/error.po
  • +
  • ...
  • +
+ Seuls les fichiers .po et .lang.php sont reconnus. + Un paquetage peut contenir plusieurs langues et plusieurs extensions. + Si l'import se fait depuis la page d'une extension, seule cette extension sera importée. + Si l'import se fait depuis la page général, toutes les extensions seront importées. + Si l'option Ecraser les fichier lors de l'import est activée dans les paramètres alors les fichiers exsitant seront remplacés.
+
+ +

Sauvegardes

Créer une sauvegarde
Si des traductions existent, une partie "Créer une sauvegarde" apparait. @@ -133,42 +152,26 @@ La supression d'une langue ne supprimera pas les éventuelles sauvegardes associ Il suffit de selectionner les sauvegardes puis de choisir "Restaurer les sauvegardes". Elles seront restaurées par ordre chronologique. C'est à dire que la plus ancienne sauvegarde sera restaurée en premier puis les plus récentes. Dans cette même liste on peut supprimer des sauvegardes. La date, la langue et la taille de la sauvegarde sont affichées dans cette liste.
-
-

Import/Export

+

Comportements

-
Importer
-
Il est possible d'importer des paquetages de langue. - Le format de ces paquetages est le zip et la structure pour chaque fichier doit obligatoirement avoir: -
    -
  • le nom du module
  • -
  • le repertoire locales
  • -
  • le code de la langue
  • -
  • le nom du fichier de langue
  • -
- Ce qui donne par exemple pour l'extension translater: -
    -
  • translater/locales/fr/main.po
  • -
  • translater/locales/fr/main.lang.php
  • -
  • translater/locales/fr/error.po
  • -
  • ...
  • -
- Seuls les fichiers .po et .lang.php sont reconnus. - Un paquetage peut contenir plusieurs langues et plusieurs extensions. - Si l'import se fait depuis la page d'une extension, seule cette extension sera importée. - Si l'import se fait depuis la page général, toutes les extensions seront importées. - Si l'option Ecraser les fichier lors de l'import est activée dans les paramètres alors les fichiers exsitant seront remplacés.
+
Menu de départ par défaut
+
Permet de choisir quelle page apparaît lors de l'accès au présent plugin.
+
Activer le menu de la page des plugins
+
Ajoute un onglet sur la page de gestion des plugins.
+ +
Activer le menu de la page des thèmes
+
Ajoute un lien sur les details du thème sélectionné sur le pages de gestion des thèmes.
-

Support

-

Si vous souhaitez plus d'aide ou apporter votre contribution à cette extension, voici quelques liens utiles.

+

Support

+

Si vous souhaitez plus d'aide ou apporter votre contribution à ce plugin, voici quelques liens utiles.

- + \ No newline at end of file diff --git a/locales/fr/main.lang.php b/locales/fr/main.lang.php index 5f75960..eab0d78 100644 --- a/locales/fr/main.lang.php +++ b/locales/fr/main.lang.php @@ -1,402 +1,420 @@ \ No newline at end of file diff --git a/locales/fr/main.po b/locales/fr/main.po index 5f6e1fa..b31dd9c 100644 --- a/locales/fr/main.po +++ b/locales/fr/main.po @@ -1,531 +1,556 @@ # Language: Français -# Module: translater - 2013.05.11 -# Date: 2013-05-12 23:35:00 -# Translated with translater 2013.05.11 +# Module: translater - 2018.02.14 +# Date: 2018-10-18 09:43:01 +# Translated with translater 2018.02.14 msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" -"Project-Id-Version: translater 2013.05.11\n" +"Project-Id-Version: translater 2018.02.14\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2013-05-12T23:35:00+00:00\n" -"Last-Translator: Jean-Christian Denis\n" +"PO-Revision-Date: 2018-10-18T09:43:01+00:00\n" +"Last-Translator: brol\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: _admin.php:26 -#: index.php:537 -#: index.php:570 -#: index.php:1384 +#: _admin.php:25 +#: _admin.php:112 +#: index.php:536 +#: index.php:569 +#: index.php:1383 msgid "Translater" msgstr "Traducteur" -#: _admin.php:44 -msgid "Translate extensions" -msgstr "Traduire les extensions" +#: _admin.php:43 +msgid "Translate plugins" +msgstr "Traduire les plugins" -#: _admin.php:48 -#: index.php:670 -msgid "Name" -msgstr "Nom" - -#: _admin.php:62 +#: _admin.php:61 msgid "Translate this plugin" -msgstr "Traduire cette extension" +msgstr "Traduire ce plugin" -#: _admin.php:85 +#: _admin.php:84 msgid "Translate this theme" msgstr "Traduire ce thème" -#: inc/class.dc.translater.php:434 +#: _uninstall.php:20 +msgid "delete all settings" +msgstr "effacer tous les paramètres" + +#: _uninstall.php:27 +msgid "delete plugin files" +msgstr "effacer les fichiers du plugin" + +#: _uninstall.php:34 +msgid "delete the version number" +msgstr "effacer le n° de version" + +#: _uninstall.php:42 +msgid "delete all %s settings" +msgstr "effacer tous les paramètres de %s" + +#: _uninstall.php:49 +msgid "delete %s plugin files" +msgstr "effacer les fichiers du plugin %s" + +#: _uninstall.php:56 +msgid "delete %s version number" +msgstr "effacer la version de %s" + +#: inc/class.dc.translater.php:359 +msgid "Cannot find module %s" +msgstr "Impossible de trouver le module %s" + +#: inc/class.dc.translater.php:437 msgid "Cannot find backups folder for module %s" msgstr "Impossible de trouver le dossier de sauvegarde du module %s" -#: inc/class.dc.translater.php:450 +#: inc/class.dc.translater.php:453 msgid "Cannot find languages folder for module %s" msgstr "Impossible de trouver le dossier de langue du module %s" -#: inc/class.dc.translater.php:470 +#: inc/class.dc.translater.php:473 msgid "Cannot find root folder for module %s" msgstr "Impossible de trouver le dossier racine du module %s" -#: inc/class.dc.translater.php:499 +#: inc/class.dc.translater.php:502 msgid "Limit of %s backups for module %s exceed" msgstr "La limite de %s sauvegardes pour le module % est dépassée" -#: inc/class.dc.translater.php:561 -#: inc/class.dc.translater.php:951 -#: inc/class.dc.translater.php:1028 +#: inc/class.dc.translater.php:564 +#: inc/class.dc.translater.php:954 +#: inc/class.dc.translater.php:1031 msgid "Cannot find language folder %s for module %s" msgstr "Impossible de trouver le dossier de langue %s pour le module %s" -#: inc/class.dc.translater.php:616 +#: inc/class.dc.translater.php:619 msgid "Cannot delete backup file %s" msgstr "Impossible d'effacer le fichier de sauvegarde %s" -#: inc/class.dc.translater.php:634 +#: inc/class.dc.translater.php:637 msgid "Cannot find backup file %s" msgstr "Impossible de trouver le fichier de sauvegarde %s" -#: inc/class.dc.translater.php:660 +#: inc/class.dc.translater.php:663 msgid "Wrong export query" msgstr "Mauvaise requète d'exportation" -#: inc/class.dc.translater.php:671 +#: inc/class.dc.translater.php:674 msgid "Cannot use export mask %s" msgstr "Impossible d'utiliser le masque d'exportation %s" -#: inc/class.dc.translater.php:759 +#: inc/class.dc.translater.php:762 msgid "Wrong import query" msgstr "Mauvaise requète d'importation" -#: inc/class.dc.translater.php:808 +#: inc/class.dc.translater.php:811 msgid "Nothing to import for these modules in pack %s" msgstr "Rien à importer pour ces modules dans le paquetage %s" -#: inc/class.dc.translater.php:837 +#: inc/class.dc.translater.php:840 msgid "Zip file %s is not in translater format" msgstr "Le fichier zip n'est pas au format de translater" -#: inc/class.dc.translater.php:897 +#: inc/class.dc.translater.php:900 msgid "Language %s already exists for module %s" msgstr "La langue %s existe dèjà pour le module %s" -#: inc/class.dc.translater.php:908 +#: inc/class.dc.translater.php:911 msgid "Cannot copy file from language %s for module %s" msgstr "Impossible de copier le fichier depuis le langage %s pour le module %s" -#: inc/class.dc.translater.php:1000 +#: inc/class.dc.translater.php:1003 msgid "No string to write, language %s deleted for module %s" msgstr "Aucune chaine à écrire, la langue %s a été effacée pour le module %s" -#: inc/class.dc.translater.php:1264 +#: inc/class.dc.translater.php:1267 msgid "Cannot grant write acces on lang file %s" msgstr "Impossible d'avoir les droits en écriture sur le fichier de langue %s" -#: inc/class.dc.translater.php:1275 +#: inc/class.dc.translater.php:1278 msgid "Cannot write lang file %s" msgstr "Impossible d'écrire le fichier de langue %s" -#: inc/class.dc.translater.php:1579 +#: inc/class.dc.translater.php:1583 msgid "Cannot find language for code %s" msgstr "Impossible de trouver de langue pour le code %s" -#: inc/class.translater.rest.php:42 +#: inc/class.translater.rest.php:41 msgid "Missing params" msgstr "Paramètres manquants" -#: inc/class.translater.rest.php:51 +#: inc/class.translater.rest.php:50 msgid "Failed to get translation tool" msgstr "Impossible de trouver l'outil de traduction" -#: inc/class.translater.rest.php:55 +#: inc/class.translater.rest.php:54 msgid "Translation tool is not configured" msgstr "L'outil de traduction n'est pas configuré" -#: inc/lib.translater.google.php:44 +#: inc/lib.translater.google.php:43 msgid "You must have on Google API console:" msgstr "Vous devez avoir sur la console des API Google :" -#: inc/lib.translater.google.php:80 -msgid "Failed to query service." -msgstr "Impossible d'interoger le service." +#: inc/lib.translater.google.php:46 +msgid "Activate the \"translate API\" service" +msgstr "Activer le service \"translate API\"" -#: inc/lib.translater.microsoft.php:49 +#: inc/lib.translater.google.php:79 +msgid "Failed to query service." +msgstr "Impossible d'interroger le service." + +#: inc/lib.translater.microsoft.php:48 msgid "You must have:" msgstr "Vous devez avoir :" -#: index.php:26 -#: index.php:526 -#: index.php:1382 +#: index.php:25 +#: index.php:525 +#: index.php:1381 msgid "Settings" msgstr "Paramètres" -#: index.php:42 +#: index.php:27 +#: index.php:426 +#: index.php:462 +#: index.php:500 +#: index.php:571 +msgid "Themes" +msgstr "Thèmes" + +#: index.php:41 msgid "locales folders of each module" msgstr "le répertoire locales de chaque module" -#: index.php:43 +#: index.php:42 msgid "plugins folder root" -msgstr "le répertoire racine des extensions" +msgstr "le répertoire racine des plugins" -#: index.php:44 +#: index.php:43 msgid "public folder root" msgstr "le répertoire public du blog" -#: index.php:45 +#: index.php:44 msgid "cache folder of Dotclear" msgstr "le répertoire cache de Dotclear" -#: index.php:46 +#: index.php:45 msgid "locales folder of translater" -msgstr "le répertoire locales de l'extension translater" +msgstr "le répertoire locales du plugin translater" -#: index.php:51 +#: index.php:50 msgid "Translation successfully updated" msgstr "Traduction mise à jour avec succès" -#: index.php:52 +#: index.php:51 msgid "Translation successfully created" -msgstr "Traduction crée avec succès" +msgstr "Traduction créée avec succès" -#: index.php:53 +#: index.php:52 msgid "Translation successfully deleted" msgstr "Traduction effacée avec succès" -#: index.php:54 +#: index.php:53 msgid "Backups successfully create" -msgstr "Sauvegardes crées avec succès" +msgstr "Sauvegardes créées avec succès" -#: index.php:55 +#: index.php:54 msgid "Backups successfully restored" msgstr "Sauvegardes effectuées avec succès" -#: index.php:56 +#: index.php:55 msgid "Backups successfully deleted" msgstr "Sauvegardes effacées avec succès" -#: index.php:57 +#: index.php:56 msgid "Package successfully imported" msgstr "Paquetage importé avec succès" -#: index.php:58 +#: index.php:57 msgid "Package successfully exported" msgstr "Paquetage exporté avec succès" -#: index.php:62 +#: index.php:61 msgid "Failed to update settings: %s" msgstr "Impossible de mettre à jour les paramètres : %s" -#: index.php:63 +#: index.php:62 msgid "Failed to update translation: %s" msgstr "Impossible de mettre à jour la traduction : %s" -#: index.php:64 +#: index.php:63 msgid "Failed to create translation: %s" msgstr "Impossible de créer la traduction : %s" -#: index.php:65 +#: index.php:64 msgid "Failed to delete translation: %s" msgstr "Impossible d'effacer la traduction : %s" -#: index.php:66 +#: index.php:65 msgid "Failed to create backups: %s" msgstr "Impossible de créer les sauvegardes : %s" -#: index.php:67 +#: index.php:66 msgid "Failed to restore backups: %s" msgstr "Impossible de restaurer les sauvegardes : %s" -#: index.php:68 +#: index.php:67 msgid "Failed to delete backups: %s" msgstr "Impossible d'effacer les sauvegardes : %s" -#: index.php:69 +#: index.php:68 msgid "Failed to import package: %s" msgstr "Impossible d'importer le paquetage : %s" -#: index.php:70 +#: index.php:69 msgid "Failed to export package: %s" msgstr "Impossible d'exporter le paquetage : %s" -#: index.php:112 +#: index.php:111 msgid "No lang to create" msgstr "Pas de langue à créer" -#: index.php:134 +#: index.php:133 msgid "No lang to delete" msgstr "Pas de langue à effacer" -#: index.php:156 +#: index.php:155 msgid "No lang to backup" msgstr "Pas de langue à sauvegarder" -#: index.php:189 +#: index.php:188 msgid "No blackup to restore" msgstr "Pas de langue à restaurer" -#: index.php:208 +#: index.php:207 msgid "No bakcup to to restore" msgstr "Pas de sauvegarde à restaurer" -#: index.php:229 -#: index.php:247 +#: index.php:228 +#: index.php:246 msgid "No backup to delete" msgstr "Pas de sauvegarde à effacer" -#: index.php:290 -#: index.php:364 +#: index.php:289 +#: index.php:363 msgid "Nothing to export" msgstr "Rien à exporter" -#: index.php:312 +#: index.php:311 msgid "No language to update" msgstr "Pas de langue à mettre à jour" -#: index.php:443 -#: index.php:490 +#: index.php:442 +#: index.php:489 msgid "Failed to launch translater: %s" msgstr "Impossible de démarrer translater : %s" -#: index.php:556 +#: index.php:555 msgid "Use this %s translation:" msgstr "Utiliser la traduction de %s :" -#: index.php:557 +#: index.php:556 msgid "Translate this text with %s" msgstr "Traduire ce texte avec %s" -#: index.php:558 +#: index.php:557 msgid "Use this text" msgstr "Utiliser ce texte" -#: index.php:606 +#: index.php:605 msgid "Translate theme \"%s\" (by %s)" msgstr "Traduire le thème \"%s\" (de %s)" -#: index.php:607 +#: index.php:606 msgid "Translate plugin \"%s\" (by %s)" -msgstr "Traduire l'extension \"%s\" (de %s)" +msgstr "Traduire le plugin \"%s\" (de %s)" -#: index.php:627 -#: index.php:741 +#: index.php:626 +#: index.php:740 msgid "Edit translation" msgstr "Modifier la traduction" -#: index.php:639 +#: index.php:638 msgid "Id" msgstr "Id" -#: index.php:649 +#: index.php:648 msgid "There is no editable modules" msgstr "Il n'y a pas de modules modifiables." -#: index.php:665 +#: index.php:664 msgid "Summary" msgstr "Résumé" -#: index.php:666 +#: index.php:665 msgid "Module" msgstr "Module" -#: index.php:668 +#: index.php:667 msgid "About" msgstr "À propos" -#: index.php:678 +#: index.php:677 msgid "Root" msgstr "Racine" -#: index.php:680 -#: index.php:694 -#: index.php:811 -#: index.php:1342 +#: index.php:679 +#: index.php:693 +#: index.php:810 +#: index.php:1341 msgid "Backups" msgstr "Sauvegardes" -#: index.php:695 +#: index.php:694 msgid "Last backup" msgstr "Dernière sauvegarde" -#: index.php:722 +#: index.php:721 msgid "no backup" msgstr "Aucune sauvegarde" -#: index.php:731 -msgid "Translations" -msgstr "Traductions" - -#: index.php:737 +#: index.php:736 msgid "Edit language" msgstr "Modifier une langue" -#: index.php:757 +#: index.php:756 msgid "Add language" msgstr "Ajouter une langue" -#: index.php:764 +#: index.php:763 msgid "Copy from language:" msgstr "Copier depuis la langue :" -#: index.php:766 +#: index.php:765 msgid "Optionnal" msgstr "Optionnel" -#: index.php:773 +#: index.php:772 msgid "Add translation" msgstr "Ajouter la traduction" -#: index.php:790 +#: index.php:789 msgid "Delete language" msgstr "Effacer une langue" -#: index.php:794 +#: index.php:793 msgid "Delete translation" msgstr "Effacer la traduction" -#: index.php:816 +#: index.php:815 msgid "Create backups" msgstr "Créer une sauvegarde" -#: index.php:818 +#: index.php:817 msgid "Choose languages to backup" msgstr "Choisir la langue à sauvegarder" -#: index.php:839 -msgid "Backup" -msgstr "Sauvegarde" - -#: index.php:856 +#: index.php:855 msgid "List of backups" msgstr "Liste des sauvegardes" -#: index.php:860 -#: index.php:1066 +#: index.php:859 +#: index.php:1065 msgid "File" msgstr "Fichier" -#: index.php:863 -msgid "Size" -msgstr "Taille" - -#: index.php:887 +#: index.php:886 msgid "Selected backups action:" msgstr "Action sur les sauvegardes sélectionnées :" -#: index.php:889 +#: index.php:888 msgid "Restore backups" msgstr "Restaurer les sauvegardes" -#: index.php:890 +#: index.php:889 msgid "Delete backups" msgstr "Effacer les sauvegardes" -#: index.php:916 -#: index.php:1183 +#: index.php:915 +#: index.php:1182 msgid "Choose language package to import" msgstr "Choisir le paquetage de langue à importer" -#: index.php:938 -#: index.php:1240 +#: index.php:937 +#: index.php:1239 msgid "Choose languages to export" msgstr "Choisir les langues à exporter" -#: index.php:1059 +#: index.php:1058 msgid "Group" msgstr "Groupe" -#: index.php:1061 +#: index.php:1060 msgid "String" msgstr "Chaîne" -#: index.php:1063 -#: index.php:1284 +#: index.php:1062 +#: index.php:1283 msgid "Translation" msgstr "Traduction" -#: index.php:1064 +#: index.php:1063 msgid "Existing" msgstr "Existant" -#: index.php:1127 +#: index.php:1126 msgid "%s occurrences" msgstr "%s occurrences" -#: index.php:1153 +#: index.php:1152 msgid "Total of %s strings." msgstr "Total de %s chaînes." -#: index.php:1155 +#: index.php:1154 msgid "Change the group of the selected entries to:" msgstr "Changer le groupe des entrées sélectionnées vers :" -#: index.php:1212 +#: index.php:1211 msgid "Choose modules to export" msgstr "Choisir les modules à exporter" -#: index.php:1214 +#: index.php:1213 msgid "Modules" msgstr "Modules" -#: index.php:1287 +#: index.php:1286 msgid "Write .po files" -msgstr "Écrire les fichier .po" +msgstr "Écrire les fichiers .po" -#: index.php:1290 +#: index.php:1289 msgid "Write .lang.php files" -msgstr "Écrire les fichier .lang.php" +msgstr "Écrire les fichiers .lang.php" -#: index.php:1293 +#: index.php:1292 msgid "Translate also strings of template files" msgstr "Traduire également les chaînes des fichiers de template" -#: index.php:1296 +#: index.php:1295 msgid "Translate only unknow strings" msgstr "Traduire uniquement les chaînes inconnues" -#: index.php:1299 +#: index.php:1298 msgid "Hide default modules of Dotclear" msgstr "Cacher les modules d'origine de Dotclear" -#: index.php:1302 +#: index.php:1301 msgid "Write comments in files" msgstr "Écrire les commentaires dans les fichiers" -#: index.php:1305 +#: index.php:1304 msgid "Write informations about author in files" msgstr "Écrire les informations à propos de l'auteur dans les fichiers" -#: index.php:1309 +#: index.php:1308 msgid "Tools" msgstr "Outils" -#: index.php:1310 +#: index.php:1309 msgid "Default language of l10n source:" msgstr "Langue par défaut des sources l10n :" -#: index.php:1314 +#: index.php:1313 msgid "Select and configure the tool to use to translate strings:" msgstr "Sélectionner et configurer un outil de traduction :" -#: index.php:1326 +#: index.php:1325 msgid "Nothing to configure for %s tool." msgstr "Rien à configurer pour l'outil %s." -#: index.php:1337 +#: index.php:1336 msgid "Overwrite existing languages" msgstr "Écraser les langages existants" -#: index.php:1338 +#: index.php:1337 msgid "Name of exported package" msgstr "Nom du paquetage exporté" -#: index.php:1345 +#: index.php:1344 msgid "Make backups when changes are made" msgstr "Faire des sauvegardes lors des modifications" -#: index.php:1346 +#: index.php:1345 msgid "Limit backups to %s files per module" msgstr "Limiter les sauvegardes à %s fichiers par module" -#: index.php:1349 +#: index.php:1348 msgid "Store backups in %s" msgstr "Stocker les sauvegardes dans %s" -#: index.php:1354 +#: index.php:1353 msgid "Behaviors" msgstr "Comportements" -#: index.php:1355 +#: index.php:1354 msgid "Default start menu:" msgstr "Menu de départ par défaut :" -#: index.php:1360 +#: index.php:1359 msgid "Enable menu on extensions page" -msgstr "Activer le menu sur la page des extensions" +msgstr "Activer le menu sur la page des plugins" -#: index.php:1363 +#: index.php:1362 msgid "Enable menu on themes page" msgstr "Activer le menu sur la page des thèmes" @@ -533,5 +558,5 @@ msgid "translater" msgstr "Traducteur" msgid "Translate your Dotclear plugins and themes" -msgstr "Traduire vos extensions et thèmes pour Dotclear" +msgstr "Traduire vos plugins et thèmes pour Dotclear" diff --git a/locales/fr/resources.php b/locales/fr/resources.php index b0da71f..8dbafa9 100644 --- a/locales/fr/resources.php +++ b/locales/fr/resources.php @@ -10,7 +10,8 @@ # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html # -- END LICENSE BLOCK ------------------------------------ -if (!defined('DC_RC_PATH')) { return; } +if (!defined('DC_RC_PATH')) { + return; +} -$__resources['help']['translater'] = dirname(__FILE__).'/help/help.html'; -?> \ No newline at end of file +$__resources['help']['translater'] = dirname(__FILE__) . '/help/translater.html'; \ No newline at end of file