00001 <?php
00002
00016 class TranslatorAction {
00021 function export($locale) {
00022
00023 $tarBinary = Config::getVar('cli', 'tar');
00024 if (empty($tarBinary) || !file_exists($tarBinary)) {
00025
00026
00027
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
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');
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
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
00186
00187 foreach ($emails as $emailKey => $email) {
00188
00189 if (!isset($referenceEmails[$emailKey])) {
00190 $errors[EMAIL_ERROR_EXTRA_EMAIL][] = array(
00191 'key' => $emailKey
00192 );
00193 continue;
00194 }
00195
00196
00197
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
00226 foreach ($referenceEmails as $emailKey => $email) {
00227
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 ?>