• Main Page
  • Modules
  • Classes
  • Files
  • File List

plugins/generic/translator/TranslatorAction.inc.php

00001 <?php
00002 
00016 class TranslatorAction {
00021    function export($locale) {
00022       // Construct the tar command
00023       $tarBinary = Config::getVar('cli', 'tar');
00024       if (empty($tarBinary) || !file_exists($tarBinary)) {
00025          // We can use fatalError() here as we already have a user
00026          // friendly way of dealing with the missing tar on the
00027          // index page.
00028          fatalError('The tar binary must be configured in config.inc.php\'s cli section to use the export function of this plugin!');
00029       }
00030       $command = $tarBinary.' cz';
00031 
00032       $localeFilesList = TranslatorAction::getLocaleFiles($locale);
00033       $localeFilesList = array_merge($localeFilesList, TranslatorAction::getMiscLocaleFiles($locale));
00034       $emailTemplateDao =& DAORegistry::getDAO('EmailTemplateDAO');
00035       $localeFilesList[] = $emailTemplateDao->getMainEmailTemplateDataFilename($locale);
00036       foreach (array_values(TranslatorAction::getEmailFileMap($locale)) as $emailFile) {
00037       }
00038 
00039       // Include locale files (main file and plugin files)
00040       foreach ($localeFilesList as $file) {
00041          if (file_exists($file)) $command .= ' ' . escapeshellarg($file);
00042       }
00043 
00044       header('Content-Type: application/x-gtar');
00045       header("Content-Disposition: attachment; filename=\"$locale.tar.gz\"");
00046       header('Cache-Control: private'); // Workarounds for IE weirdness
00047       passthru($command);
00048    }
00049 
00050    function getLocaleFiles($locale) {
00051       if (!AppLocale::isLocaleValid($locale)) return null;
00052 
00053       $localeFiles = AppLocale::getFilenameComponentMap($locale);
00054       $plugins =& PluginRegistry::loadAllPlugins();
00055       foreach (array_keys($plugins) as $key) {
00056          $plugin =& $plugins[$key];
00057          $localeFile = $plugin->getLocaleFilename($locale);
00058          if (!empty($localeFile)) {
00059             if (is_scalar($localeFile)) $localeFiles[] = $localeFile;
00060             if (is_array($localeFile)) $localeFiles = array_merge($localeFiles, $localeFile);
00061          }
00062          unset($plugin);
00063       }
00064       return $localeFiles;
00065    }
00066 
00067    function getMiscLocaleFiles($locale) {
00068       $countryDao =& DAORegistry::getDAO('CountryDAO');
00069       $currencyDao =& DAORegistry::getDAO('CurrencyDAO');
00070       return array(
00071          $countryDao->getFilename($locale),
00072          $currencyDao->getCurrencyFilename($locale)
00073       );
00074    }
00075 
00076    function getEmailFileMap($locale) {
00077       $emailTemplateDao =& DAORegistry::getDAO('EmailTemplateDAO');
00078       $files = array($emailTemplateDao->getMainEmailTemplatesFilename() => $emailTemplateDao->getMainEmailTemplateDataFilename($locale));
00079       $categories = PluginRegistry::getCategories();
00080       foreach ($categories as $category) {
00081          $plugins =& PluginRegistry::loadCategory($category);
00082          foreach (array_keys($plugins) as $name) {
00083             $plugin =& $plugins[$name];
00084             $templatesFile = $plugin->getInstallEmailTemplatesFile();
00085             if ($templatesFile) {
00086                $files[$templatesFile] = str_replace('{$installedLocale}', $locale, $plugin->getInstallEmailTemplateDataFile());
00087             }
00088             unset($plugin);
00089          }
00090          unset($plugins);
00091       }
00092       return $files;
00093    }
00094 
00095    function getEmailTemplates($locale) {
00096       $files = TranslatorAction::getEmailFileMap($locale);
00097       $returner = array();
00098       foreach ($files as $templateFile => $templateDataFile) {
00099          $xmlParser = new XMLParser();
00100          $data =& $xmlParser->parse($templateDataFile, array('email'));
00101          if ($data) foreach ($data->getChildren() as $emailNode) {
00102             $returner[$emailNode->getAttribute('key')] = array(
00103                'subject' => $emailNode->getChildValue('subject'),
00104                'body' => $emailNode->getChildValue('body'),
00105                'description' => $emailNode->getChildValue('description'),
00106                'templateFile' => $templateFile,
00107                'templateDataFile' => $templateDataFile
00108             );
00109          }
00110          unset($xmlParser, $data);
00111       }
00112       return $returner;
00113    }
00114 
00115    function isLocaleFile($locale, $filename) {
00116       if (in_array($filename, TranslatorAction::getLocaleFiles($locale))) return true;
00117       if (in_array($filename, TranslatorAction::getMiscLocaleFiles($locale))) return true;
00118       $emailTemplateDao =& DAORegistry::getDAO('EmailTemplateDAO');
00119       if ($filename == $emailTemplateDao->getMainEmailTemplateDataFilename($locale)) return true;
00120       return false;
00121    }
00122 
00123    function determineReferenceFilename($locale, $filename) {
00124       // FIXME: This is ugly.
00125       return str_replace($locale, MASTER_LOCALE, $filename);
00126    }
00127 
00135    function testLocale($locale, $referenceLocale) {
00136       $localeFileNames = AppLocale::getFilenameComponentMap($locale);
00137 
00138       $errors = array();
00139       foreach ($localeFileNames as $localeFileName) {
00140          $referenceLocaleFileName = str_replace($locale, $referenceLocale, $localeFileName);
00141          $localeFile = new LocaleFile($locale, $localeFileName);
00142          $referenceLocaleFile = new LocaleFile($referenceLocale, $referenceLocaleFileName);
00143          $errors = array_merge_recursive($errors, $localeFile->testLocale($referenceLocaleFile));
00144          unset($localeFile);
00145          unset($referenceLocaleFile);
00146       }
00147 
00148       $plugins =& PluginRegistry::loadAllPlugins();
00149       foreach (array_keys($plugins) as $key) {
00150          $plugin =& $plugins[$key];
00151          $referenceLocaleFilenames = $plugin->getLocaleFilename($referenceLocale);
00152          if ($referenceLocaleFilenames) {
00153             if (is_scalar($referenceLocaleFilenames)) $referenceLocaleFilenames = array($referenceLocaleFilenames);
00154             $localeFilenames = $plugin->getLocaleFilename($locale);
00155             if (is_scalar($localeFilenames)) $localeFilenames = array($localeFilenames);
00156             assert(count($localeFilenames) == count($referenceLocaleFilenames));
00157             foreach($referenceLocaleFilenames as $index => $referenceLocaleFilename) {
00158                assert(isset($localeFilenames[$index]));
00159                $localeFile = new LocaleFile($locale, $localeFilenames[$index]);
00160                $referenceLocaleFile = new LocaleFile($referenceLocale, $referenceLocaleFilename);
00161                $errors = array_merge_recursive($errors, $localeFile->testLocale($referenceLocaleFile));
00162                unset($localeFile);
00163                unset($referenceLocaleFile);
00164             }
00165          }
00166          unset($plugin);
00167       }
00168       return $errors;
00169    }
00170 
00178    function testEmails($locale, $referenceLocale) {
00179       $errors = array(
00180       );
00181 
00182       $emails = TranslatorAction::getEmailTemplates($locale);
00183       $referenceEmails = TranslatorAction::getEmailTemplates($referenceLocale);
00184 
00185       // Pass 1: For all translated emails, check that they match
00186       // against reference translations.
00187       foreach ($emails as $emailKey => $email) {
00188          // Check if a matching reference email was found.
00189          if (!isset($referenceEmails[$emailKey])) {
00190             $errors[EMAIL_ERROR_EXTRA_EMAIL][] = array(
00191                'key' => $emailKey
00192             );
00193             continue;
00194          }
00195 
00196          // We've successfully found a matching reference email.
00197          // Compare it against the translation.
00198          $bodyParams = AppLocale::getParameterNames($email['body']);
00199          $referenceBodyParams = AppLocale::getParameterNames($referenceEmails[$emailKey]['body']);
00200          $diff = array_diff($bodyParams, $referenceBodyParams);
00201          if (!empty($diff)) {
00202             $errors[EMAIL_ERROR_DIFFERING_PARAMS][] = array(
00203                'key' => $emailKey,
00204                'mismatch' => $diff
00205             );
00206          }
00207 
00208          $subjectParams = AppLocale::getParameterNames($email['subject']);
00209          $referenceSubjectParams = AppLocale::getParameterNames($referenceEmails[$emailKey]['subject']);
00210 
00211          $diff = array_diff($subjectParams, $referenceSubjectParams);
00212          if (!empty($diff)) {
00213             $errors[EMAIL_ERROR_DIFFERING_PARAMS][] = array(
00214                'key' => $emailKey,
00215                'mismatch' => $diff
00216             );
00217          }
00218 
00219          $matchedReferenceEmails[] = $emailKey;
00220 
00221          unset($email);
00222          unset($referenceEmail);
00223       }
00224 
00225       // Pass 2: Make sure that there are no missing translations.
00226       foreach ($referenceEmails as $emailKey => $email) {
00227          // Extract the fields from the email to be tested.
00228          if (!isset($emails[$emailKey])) {
00229             $errors[EMAIL_ERROR_MISSING_EMAIL][] = array(
00230                'key' => $emailKey
00231             );
00232          }
00233       }
00234 
00235       return $errors;
00236    }
00237 }
00238 
00239 ?>

Generated on Mon Sep 17 2012 13:58:56 for Open Monograph Press by  doxygen 1.7.1