public function execute() { // Prevent the script from timing out set_time_limit(0); ini_set("max_execution_time", 0); ini_set('memory_limit', -1); global $wgExtensionMessagesFiles, $IP; global $wgLocalisationUpdateRepositories; global $wgLocalisationUpdateRepository; $dir = LocalisationUpdate::getDirectory(); if (!$dir) { $this->error("No cache directory configured", true); return; } $lc = Language::getLocalisationCache(); if (is_callable(array($lc, 'getMessagesDirs'))) { // Introduced in 1.25 $messagesDirs = $lc->getMessagesDirs(); } else { global $wgMessagesDirs; $messagesDirs = $wgMessagesDirs; } $finder = new LU_Finder($wgExtensionMessagesFiles, $messagesDirs, $IP); $readerFactory = new LU_ReaderFactory(); $fetcherFactory = new LU_FetcherFactory(); $repoid = $this->getOption('repoid', $wgLocalisationUpdateRepository); if (!isset($wgLocalisationUpdateRepositories[$repoid])) { $known = implode(', ', array_keys($wgLocalisationUpdateRepositories)); $this->error("Unknown repoid {$repoid}; known: {$known}", true); return; } $repos = $wgLocalisationUpdateRepositories[$repoid]; // Do it ;) $updater = new LU_Updater(); $updatedMessages = $updater->execute($finder, $readerFactory, $fetcherFactory, $repos); // Store it ;) $count = array_sum(array_map('count', $updatedMessages)); if (!$count) { $this->output("Found no new translations\n"); return; } foreach ($updatedMessages as $language => $messages) { $filename = "{$dir}/" . LocalisationUpdate::getFilename($language); file_put_contents($filename, FormatJson::encode($messages, true)); } $this->output("Saved {$count} new translations\n"); }
/** * Hook: LocalisationCacheRecache */ public static function onRecache(LocalisationCache $lc, $code, array &$cache) { $dir = LocalisationUpdate::getDirectory(); if (!$dir) { return true; } $codeSequence = array_merge(array($code), $cache['fallbackSequence']); foreach ($codeSequence as $csCode) { $fileName = "{$dir}/" . self::getFilename($csCode); if (is_readable($fileName)) { $data = FormatJson::decode(file_get_contents($fileName), true); $cache['messages'] = array_merge($cache['messages'], $data); } $cache['deps'][] = new FileDependency($fileName); } return true; }
/** * Hook: LocalisationCacheRecache */ public static function onRecache(LocalisationCache $lc, $code, array &$cache) { $dir = LocalisationUpdate::getDirectory(); if (!$dir) { return true; } $codeSequence = array_merge(array($code), $cache['fallbackSequence']); foreach ($codeSequence as $csCode) { $fileName = "{$dir}/" . self::getFilename($csCode); if (!self::$onRecacheFallbackCalled && is_readable($fileName)) { // We're on an old version of MW that doesn't have the hook // needed to do things correctly. L10n will be broken here in // certain reasonably-common situations (see bug 68781), but // there's nothing we can do about it. $data = FormatJson::decode(file_get_contents($fileName), true); $cache['messages'] = array_merge($cache['messages'], $data); } $cache['deps'][] = new FileDependency($fileName); } return true; }