From 6277dbc7cebe04cec6565ef328e56936d3077891 Mon Sep 17 00:00:00 2001 From: Jean-Christian Denis Date: Thu, 2 Sep 2021 23:44:01 +0200 Subject: [PATCH] clean up and release --- CHANGELOG.md | 156 ++++++------ README.md | 38 +++ _admin.php | 40 +-- _config.php | 22 +- _define.php | 27 +- _install.php | 22 +- _prepend.php | 22 +- _uninstall.php | 23 +- dcstore.xml | 11 + inc/class.dc.translater.php | 380 ++++++++++++++--------------- inc/class.translater.proposals.php | 22 +- inc/class.translater.rest.php | 22 +- inc/lib.translater.google.php | 22 +- inc/lib.translater.microsoft.php | 26 +- inc/lib.translater.proposal.php | 38 +-- index.php | 28 +-- js/jquery.translater.js | 10 +- locales/fr/main.lang.php | 3 +- 18 files changed, 483 insertions(+), 429 deletions(-) create mode 100644 README.md create mode 100644 dcstore.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index 739c4c3..43d1fe0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,109 +1,115 @@ -x.x xxxxxxxx - - help translation - - source translation +2021.09.02.1 - dev +- [ ] help translation +- [ ] source translation +- [ ] fix constante for official modules +- [ ] fix third-party API (all are broken) +- [ ] add dashboard icon + +2021.09.02 +- clean up code and fix typo 2021.08.18 - * Fixed PSR-2 Coding Style - * Move settings to _config file +- Fixed PSR-2 Coding Style +- Move settings to config file 2018.10.26 - Pierre Van Glabeke - * Bug avec php 7.2 (https://forum.dotclear.org/viewtopic.php?pid=342810#p342810) +- Bug avec php 7.2 (https://forum.dotclear.org/viewtopic.php?pid=342810#p342810) 2018.10.18 - Pierre Van Glabeke - * Modifs localisation +- Modifs localisation 2018.02.14 - Pierre Van Glabeke - * Suppression ?> en fin de lang.php +- Suppression ?> en fin de lang.php 2017.05.10 - Pierre Van Glabeke - * Suppression ligne 614 de "continue" dans \inc\class.dc.translater.php +- Suppression ligne 614 de "continue" dans \inc\class.dc.translater.php 2016.08.20 - Pierre Van Glabeke - * Ajout Pluriel dans po - * Ajout favori +- Ajout Pluriel dans po +- Ajout favori 2016.07.08 - Pierre Van Glabeke - * Modifs localisation +- Modifs localisation 2013.05.11 - * Rewrited proposal tools - * Added Microsoft translation tool - * Updated Google translation tool - * Removed permissions, now required superadmin - * Fixed page title and messages and contents - * Moved all sub-pages into one page +- Rewrited proposal tools +- Added Microsoft translation tool +- Updated Google translation tool +- Removed permissions, now required superadmin +- Fixed page title and messages and contents +- Moved all sub-pages into one page -1.5 20100901 - * Added option to set defaut tab (closes #552) - * Fixed occurrences count (closes #551) - * Fixed regxep (closes #550) - * Cleaned design (thanks to osku) +1.5 - 2010.09.01 +- Added option to set defaut tab (closes #552) +- Fixed occurrences count (closes #551) +- Fixed regxep (closes #550) +- Cleaned design (thanks to osku) -1.4.2 20100901 - * Tried to fix crash with regexp on parsing .po file +1.4.2 - 2010.09.01 +- Tried to fix crash with regexp on parsing .po file -1.4.1 20100626 - * Fixed crash on .po files - * Fixed toggle function - * Fixed admin crash on non 2.2 - * Fixed minor bugs - * Added option to hide default modules of Dotclear +1.4.1 - 2010.06.26 +- Fixed crash on .po files +- Fixed toggle function +- Fixed admin crash on non 2.2 +- Fixed minor bugs +- Added option to hide default modules of Dotclear -1.4 20100605 - * Switched to DC 2.2 - * Added toogle list of existing translation - * Fixed google translate (now uses Google ajax API) - * Removed "simple mode" - * Changed admin interface (easy, light, fast) +1.4 - 2010.06.05 +- Switched to DC 2.2 +- Added toogle list of existing translation +- Fixed google translate (now uses Google ajax API) +- Removed "simple mode" +- Changed admin interface (easy, light, fast) -1.3 20091025 - * Added babelfish help - * Added behaviors on files writing - * Fixed regexp again - * Changed priority to .po files instead of .lang.php files +1.3 - 2009.10.25 +- Added babelfish help +- Added behaviors on files writing +- Fixed regexp again +- Changed priority to .po files instead of .lang.php files -1.2 20091010 - * Added direct text copy and paste - * Added grouping file change - * Fixed some typo +1.2 - 2009.10.10 +- Added direct text copy and paste +- Added grouping file change +- Fixed some typo -1.1 20091002 - * Added the proposed translation - * Rewrited settings system - * Speed up expert mode +1.1 - 2009.10.02 +- Added the proposed translation +- Rewrited settings system +- Speed up expert mode -1.0 20090928 - * Added translation of template files. closes #250 +1.0 - 2009.09.28 +- Added translation of template files. closes #250 -0.9 20090923 - * Fixed bug on translate escape string - * Added _uninstall.php support +0.9 - 2009.09.23 +- Fixed bug on translate escape string +- Added _uninstall.php support -0.8 20090816 - * Fixed php 5.3 compatibility +0.8 - 2009.08.16 +- Fixed php 5.3 compatibility 0.7 - * Fixed some l10n - * Fixed ''xhtml strict'' validation +- Fixed some l10n +- Fixed ''xhtml strict'' validation 0.6 - * Added ''author'' to langs files - * Added ''two-cols'' option - * Added ''sort option'' on array of translations - * Fixed ''bugs'' with no theme - * Fixed ''bugs'' with folder perms - * Fixed ''nothing to update" in simple mode - * Fixed ''bugs'' in Import/export - * Fixed ''html >'' like DC changset 2385 - * Fixed ''xhtml strict'' validation +- Added ''author'' to langs files +- Added ''two-cols'' option +- Added ''sort option'' on array of translations +- Fixed ''bugs'' with no theme +- Fixed ''bugs'' with folder perms +- Fixed ''nothing to update" in simple mode +- Fixed ''bugs'' in Import/export +- Fixed ''html >'' like DC changset 2385 +- Fixed ''xhtml strict'' validation 0.5 - * Fixed ''admin url'' - * Added user perm check - * Fixed ''bugs'' with bad strings (close #166) +- Fixed ''admin url'' +- Added user perm check +- Fixed ''bugs'' with bad strings (close #166) 0.4 - * Changed default tab to plugin - * Replaced list of modules in select box rather than in help - * Fixed wrong message when nothing to export - * Added help in helpBlock \ No newline at end of file +- Changed default tab to plugin +- Replaced list of modules in select box rather than in help +- Fixed wrong message when nothing to export +- Added help in helpBlock \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..70c6b77 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# README + +## WHAT IS TRANSLATER ? + +_translater_ is a plugins for the open-source +web publishing software called Dotclear. + +It helps dev to translate plugin and theme. + +## REQUIREMENTS + +_translater_ requires: + + * administrator permissions + * Dotclear 2.19 + * Custom templates if default theme is not used. + +## USAGE + +First install _translater_, mannualy from a zip package or from +Dotaddict repository. (See Dotclear's documentation to know how do this) + +Go to ''plugins manager'', expand _translater_ information then +go to ''configure plugin'', fill in form. + +Once it's done you can manage your plugins and themes languages from menu +''Translater'' on sidebar menu. + +## MORE + + * License : GNU GPL v2 + * Source & contribution : [GitHub Page](https://github.com/JcDenis/saba) + * Packages & details: [Dotaddict Page](https://plugins.dotaddict.org/dc2/details/saba) + +## CONTRIBUTORS + + * Jean-Chritian Denis + * Pierre Van Glabeke \ No newline at end of file diff --git a/_admin.php b/_admin.php index 6379934..dbca7af 100644 --- a/_admin.php +++ b/_admin.php @@ -1,15 +1,15 @@ blog->settings->translater->translater_plugin_menu || !$core->auth->isSuperAdmin()) { return; } - + echo '
' . __('Details') . '' . '' . __('Author') . '' . ''; - + $modules = $core->plugins->getModules(); - + foreach ($modules as $name => $plugin) { echo '' . @@ -69,35 +69,35 @@ class translaterAdminBehaviors echo '
'; } - + # 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) { diff --git a/_config.php b/_config.php index c8d3452..ef32457 100644 --- a/_config.php +++ b/_config.php @@ -1,15 +1,15 @@ registerModule( 'Jean-Christian Denis & contributors', '2021.08.18', [ + 'requires' => [['core', '2.19']], 'permissions' => 'usage,contentadmin,admin', 'type' => 'plugin', - 'dc_min' => '2.18', 'support' => 'http://forum.dotclear.org/viewtopic.php?id=39220', - 'details' => 'https://plugins.dotaddict.org/dc2/details/translater' + 'details' => 'https://plugins.dotaddict.org/dc2/details/translater', + 'repository' => 'https://raw.githubusercontent.com/JcDenis/translater/master/dcstore.xml' ] ); \ No newline at end of file diff --git a/_install.php b/_install.php index 16bb131..97bc18d 100644 --- a/_install.php +++ b/_install.php @@ -1,15 +1,15 @@ addUserAction( /* description */ __('delete the version number') ); - $this->addDirectAction( /* type */ 'settings', /* action */ 'delete_all', diff --git a/dcstore.xml b/dcstore.xml new file mode 100644 index 0000000..325b3f0 --- /dev/null +++ b/dcstore.xml @@ -0,0 +1,11 @@ + + +Traducteur +2021.08.18 +Jean-Christian Denis & contributors +Translate your Dotclear plugins and themes +https://github.com/JcDenis/translater/releases/download/v2021.08.18/plugin-translater.zip +https://plugins.dotaddict.org/dc2/details/translater +http://forum.dotclear.org/viewtopic.php?id=39220 + + \ No newline at end of file diff --git a/inc/class.dc.translater.php b/inc/class.dc.translater.php index bc02630..3294ce3 100644 --- a/inc/class.dc.translater.php +++ b/inc/class.dc.translater.php @@ -1,15 +1,15 @@ 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) { @@ -230,7 +230,7 @@ class dcTranslater } return $res; } - + # Get a setting according to default settings list public function get($id) { @@ -242,13 +242,13 @@ class dcTranslater } 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) { @@ -267,19 +267,19 @@ class dcTranslater ); 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) { @@ -290,21 +290,21 @@ class dcTranslater } 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']) { @@ -314,7 +314,7 @@ class dcTranslater $this->modules['theme'][$k]['id'] = $k; $this->modules['theme'][$k]['type'] = 'theme'; } - + $m = $this->core->plugins->getModules(); foreach($m AS $k => $v) { @@ -334,24 +334,24 @@ class dcTranslater $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( @@ -359,7 +359,7 @@ class dcTranslater )); return false; } - + # Module info foreach($modules[$module] as $a => $b) { $o->{$a} = $b; @@ -372,10 +372,10 @@ class dcTranslater # Module Basename $i = path::info($o->root); $o->basename = $i['basename']; - + return $o; } - + public function getBackupFolder($module, $throw = false) { $dir = false; @@ -428,22 +428,22 @@ class dcTranslater __('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'; } @@ -461,7 +461,7 @@ class dcTranslater __('Cannot find root folder for module %s'), $module )); } - + return $dir; } @@ -469,7 +469,7 @@ class dcTranslater { # Find folder of backups $backup = self::getBackupFolder($module, true); - + # Count backup files $count = 0; foreach(self::scandir($backup) AS $file) { @@ -478,7 +478,7 @@ class dcTranslater $count++; } } - + # Limite exceed if ($count >= $this->backup_limit) { if ($throw) { @@ -497,13 +497,13 @@ class dcTranslater { # 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); @@ -512,13 +512,13 @@ class dcTranslater $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; @@ -531,22 +531,22 @@ class dcTranslater } 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); @@ -559,11 +559,11 @@ class dcTranslater $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); @@ -575,63 +575,63 @@ class dcTranslater 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 @@ -641,17 +641,17 @@ class dcTranslater __('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(); @@ -661,14 +661,14 @@ class dcTranslater 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) { @@ -678,21 +678,21 @@ class dcTranslater && !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'); @@ -700,7 +700,7 @@ class dcTranslater foreach($res as $from => $to) { $zip->addFile($from,$to); } - + # Set filename $file_infos = 1 < count($count) ? array(time(), 'modules', 'multi', self::$dcTranslaterVersion) : @@ -720,7 +720,7 @@ class dcTranslater ) ) ); - + # Send Zip header('Content-Disposition: attachment;filename=' . $filename . '.zip'); header('Content-Type: application/x-zip'); @@ -728,46 +728,46 @@ class dcTranslater 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'], @@ -785,7 +785,7 @@ class dcTranslater } $zip->close(); unlink($zip_file['tmp_name']); - + # No file unzip if (!$done) { throw new Exception(sprintf( @@ -794,14 +794,14 @@ class dcTranslater )); } } - + 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') ? @@ -829,17 +829,17 @@ class dcTranslater '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) { @@ -848,11 +848,11 @@ class dcTranslater $prefix . $file, $m)) { continue; } - + if (!self::isIsoCode($m[3])) { continue; } - + if ($return_path) { $res[$m[3]][] = $file; # Path } else { @@ -861,28 +861,28 @@ class dcTranslater } 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( @@ -890,7 +890,7 @@ class dcTranslater $from_lang, $module )); } - + # Copy files from other lang if (!empty($from_lang) && isset($langs[$from_lang])) { @@ -901,7 +901,7 @@ class dcTranslater && !self::isPoFile($file)) { continue; } - + files::putContent($locales . '/' . $lang . '/' . $file, file_get_contents($locales . '/' . $from_lang . '/' . $file) ); @@ -912,25 +912,25 @@ class dcTranslater 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) { @@ -945,24 +945,24 @@ class dcTranslater */ 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); } @@ -970,7 +970,7 @@ class dcTranslater unlink($langphp_file); } } - + # No msgstr to write if (empty($rs)) { throw new Exception(sprintf( @@ -978,76 +978,76 @@ class dcTranslater $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 @@ -1077,22 +1077,22 @@ class dcTranslater } 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) { @@ -1101,17 +1101,17 @@ class dcTranslater } $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), @@ -1144,32 +1144,32 @@ class dcTranslater } 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']); @@ -1178,13 +1178,13 @@ class dcTranslater $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; @@ -1194,18 +1194,18 @@ class dcTranslater $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, @@ -1219,7 +1219,7 @@ class dcTranslater } return '' == $requested_lang ? $res : $res[$requested_lang]; } - + /* Write a lang file */ private function writeLangFile($dir, $content, $throw) { @@ -1230,48 +1230,48 @@ class dcTranslater __('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; } @@ -1281,27 +1281,27 @@ class dcTranslater } 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) { @@ -1325,25 +1325,25 @@ class dcTranslater } } } - + 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) { @@ -1357,38 +1357,38 @@ class dcTranslater 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)); } @@ -1400,20 +1400,20 @@ class dcTranslater 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) { @@ -1440,7 +1440,7 @@ class dcTranslater '"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) { @@ -1451,7 +1451,7 @@ class dcTranslater } } } - + foreach($fields as $id => $str) { if ($this->parse_comment && isset($comments[$id])) { $l .= $comments[$id]; @@ -1460,10 +1460,10 @@ class dcTranslater '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) { @@ -1477,7 +1477,7 @@ class dcTranslater 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()) { @@ -1485,14 +1485,14 @@ class dcTranslater 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); @@ -1502,7 +1502,7 @@ class dcTranslater } return $res; } - + /* Return array of langs like in clearbreaks l10n */ public static function getIsoCodes($flip = false, $name_with_code = false) { @@ -1511,7 +1511,7 @@ class dcTranslater } return self::$iso; } - + /* Find if lang code exists or lang name */ public static function isIsoCode($iso, $throw = false) { diff --git a/inc/class.translater.proposals.php b/inc/class.translater.proposals.php index 3af9164..4e38b17 100644 --- a/inc/class.translater.proposals.php +++ b/inc/class.translater.proposals.php @@ -1,15 +1,15 @@ 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)); @@ -61,7 +61,7 @@ class microsoftProposalTool extends translaterProposalTool '' : $_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); } diff --git a/inc/lib.translater.proposal.php b/inc/lib.translater.proposal.php index a9a9068..ccd1564 100644 --- a/inc/lib.translater.proposal.php +++ b/inc/lib.translater.proposal.php @@ -1,15 +1,15 @@ 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())); @@ -533,7 +533,7 @@ switch ($part) { '' . __('Backups') . '' . '' . __('Last backup') . '' . ''; - + foreach($M->langs AS $lang => $name) { echo '' . @@ -541,7 +541,7 @@ switch ($part) { '' . $name . '' . '' . ' ' . $lang . ''; - + if (isset($M->backups[$lang])) { foreach($M->backups[$lang] AS $file => $info) { $time[$lang] = isset($time[$lang]) && $time[$lang] > $info['time'] ? diff --git a/js/jquery.translater.js b/js/jquery.translater.js index a0766a8..896c0b0 100644 --- a/js/jquery.translater.js +++ b/js/jquery.translater.js @@ -15,7 +15,7 @@ $.fn.translater = function(options){ var opts = $.extend({}, $.fn.translater.defaults, options); return this.each(function(){ - + var img = ''; var tog = ''; var line = this; @@ -23,7 +23,7 @@ var msgfile = $(line).children('.translatermsgfile'); var msgstr = $(line).children('.translatermsgstr'); var target = $(line).children('.translatertarget'); - + $('.strlist').hide(); var img_go = $(''+img+'').css('cursor','pointer'); @@ -48,7 +48,7 @@ } }); }); - + $(msgstr).children('.subtranslatermsgstr').each(function(){ var img_str = $(''+tog+'').css('cursor','pointer'); $(this).children('strong').each(function(){ @@ -56,14 +56,14 @@ var img_add = $(''+img+'').css('cursor','pointer'); $(this).prepend(' ').prepend(img_add); $(img_add).click(function(){addText(target,txt);}); - + $(this).append(' ').append(img_str); var strlist=$(this).siblings('.strlist'); $(strlist).click(function(){$(strlist).toggle();}); $(img_str).click(function(){$(strlist).toggle();}); }); }); - + var img_file = $(''+tog+'').css('cursor','pointer'); $(msgfile).children('strong').each(function(){ $(this).append(' ').append(img_file); diff --git a/locales/fr/main.lang.php b/locales/fr/main.lang.php index eab0d78..a1836c2 100644 --- a/locales/fr/main.lang.php +++ b/locales/fr/main.lang.php @@ -416,5 +416,4 @@ $GLOBALS['__l10n']['Enable menu on themes page'] = 'Activer le menu sur la page $GLOBALS['__l10n']['translater'] = 'Traducteur'; -$GLOBALS['__l10n']['Translate your Dotclear plugins and themes'] = 'Traduire vos plugins et thèmes pour Dotclear'; - +$GLOBALS['__l10n']['Translate your Dotclear plugins and themes'] = 'Traduire vos plugins et thèmes pour Dotclear'; \ No newline at end of file