/** * @param $collection MessageCollection * @return string */ protected function writeReal(MessageCollection $collection) { $output = $this->doHeader($collection); $output .= $this->doAuthors($collection); $mangler = $this->group->getMangler(); $messages = array(); /** * @var $m TMessage */ foreach ($collection as $key => $m) { $key = $mangler->unmangle($key); $value = $m->translation(); $value = str_replace(TRANSLATE_FUZZY, '', $value); if ($value === '') { continue; } $messages[$key] = $value; } if (!count($messages)) { return false; } $messages = $this->unflatten($messages); // Some groups have messages under language code. if (isset($this->extra['codeAsRoot'])) { $code = $this->group->mapCode($collection->code); $messages = array($code => $messages); } $output .= TranslateYaml::dump($messages); return $output; }
public function execute() { $outRulesets = array(); $outLocales = array(); $doc = new DOMDocument(); $doc->load( 'plurals.xml' ); $rulesets = $doc->getElementsByTagName( "pluralRules" ); foreach ( $rulesets as $ruleset ) { $codes = $ruleset->getAttribute( 'locales' ); $parsed = array(); $rules = $ruleset->getElementsByTagName( "pluralRule" ); foreach ( $rules as $rule ) { $parsed[$rule->getAttribute( 'count' )] = $rule->nodeValue; } $name = "Rule " . chr( count( $outRulesets ) + 65 ); // Special names for some rules... might not be useful at all if ( count( $parsed ) === 0 ) { $name = "Zero"; } elseif ( $codes === 'ar' ) { $name = "Arabic"; } elseif ( count( $parsed ) === 1 ) { if ( isset( $parsed['one'] ) && $parsed['one'] === 'n is 1' ) { $name = "Default"; } elseif ( isset( $parsed['one'] ) && $parsed['one'] === 'n in 0..1' ) { $name = "One-zero"; } } elseif ( count( $parsed ) === 2 ) { if ( isset( $parsed['one'] ) && isset( $parsed['two'] ) ) { $name = "Has-dual"; } } $outRulesets[$name] = $parsed; foreach ( explode( ' ', $codes ) as $code ) { $outLocales[$code] = $name; } } file_put_contents( 'plural-cldr.yaml', TranslateYaml::dump( array( 'locales' => $outLocales, 'rulesets' => $outRulesets, ) ) ); }
public function testParsing() { $defs = __DIR__ . '/data/mediawiki-extensions.txt'; $path = '%GROUPROOT%/mediawiki-extensions/extensions'; $foo = new PremadeMediawikiExtensionGroups($defs, $path); $list = $deps = $autoload = array(); $foo->register($list, $deps, $autoload); $this->assertEquals(1, count($deps), 'A dependency to definition file was added'); $this->assertEquals(4, count($list), 'Four groups were created'); $this->assertArrayHasKey('ext-exampleextension', $list); $expected = TranslateYaml::load(__DIR__ . '/data/MediaWikiExtensionTest-conf1.yaml'); $this->assertEquals($expected, $list['ext-exampleextension']->getConfiguration()); $this->assertArrayHasKey('ext-wikimediamessages', $list); $expected = TranslateYaml::load(__DIR__ . '/data/MediaWikiExtensionTest-conf2.yaml'); $this->assertEquals($expected, $list['ext-wikimediamessages']->getConfiguration()); $this->assertArrayHasKey('ext-examplejsonextension', $list); $expected = TranslateYaml::load(__DIR__ . '/data/MediaWikiExtensionTest-conf3.yaml'); $this->assertEquals($expected, $list['ext-examplejsonextension']->getConfiguration()); $this->assertArrayHasKey('ext-exampleextension2', $list); $expected = TranslateYaml::load(__DIR__ . '/data/MediaWikiExtensionTest-conf4.yaml'); $this->assertEquals($expected, $list['ext-exampleextension2']->getConfiguration()); }
public static function parseGroupFile($filename) { $data = file_get_contents($filename); $documents = preg_split("/^---\$/m", $data, -1, PREG_SPLIT_NO_EMPTY); $groups = array(); $template = false; foreach ($documents as $document) { $document = TranslateYaml::loadString($document); if (isset($document['TEMPLATE'])) { $template = $document['TEMPLATE']; } else { if (!isset($document['BASIC']['id'])) { trigger_error("No path ./BASIC/id (group id not defined) " . "in yaml document located in {$filename}"); continue; } $groups[$document['BASIC']['id']] = $document; } } foreach ($groups as $i => $group) { $groups[$i] = TranslateYaml::mergeTemplate($template, $group); } return $groups; }
public function loadCLDR() { $filename = dirname( __FILE__ ) . '/../data/plural-cldr.yaml'; $data = TranslateYaml::load( $filename ); $languages = array(); $ruleExps = array(); foreach ( $data['rulesets'] as $name => $rules ) { $ruleExps[$name] = array(); foreach ( $rules as $rulename => $rule ) { $ruleExps[$name][$rulename] = $this->parseCLDRRule( $rule ); } } foreach ( $data['locales'] as $code => $rulename ) { $languages[$code] = array( $rulename, $ruleExps[$rulename] ); } return $languages; }
/** * This constructs the list of all groups from multiple different * sources. When possible, a cache dependency is created to automatically * recreate the cache when configuration changes. * @todo Reduce the ways of which messages can be added. Target is just * to have three ways: Yaml files, translatable pages and with the hook. * @todo In conjuction with the above, reduce the number of global * variables like wgTranslate#C and have the message groups specify * their own cache dependencies. */ protected static function loadGroupDefinitions() { global $wgTranslateAddMWExtensionGroups; global $wgEnablePageTranslation, $wgTranslateGroupFiles; global $wgTranslateAC, $wgTranslateEC, $wgTranslateCC; global $wgAutoloadClasses; global $wgTranslateWorkflowStates; $deps = array(); $deps[] = new GlobalDependency('wgTranslateAddMWExtensionGroups'); $deps[] = new GlobalDependency('wgEnablePageTranslation'); $deps[] = new GlobalDependency('wgTranslateGroupFiles'); $deps[] = new GlobalDependency('wgTranslateAC'); $deps[] = new GlobalDependency('wgTranslateEC'); $deps[] = new GlobalDependency('wgTranslateCC'); $deps[] = new GlobalDependency('wgTranslateExtensionDirectory'); $deps[] = new GlobalDependency('wgTranslateWorkflowStates'); $deps[] = new FileDependency(dirname(__FILE__) . '/groups/mediawiki-defines.txt'); $deps[] = new FileDependency(dirname(__FILE__) . '/groups/Wikia/extensions.txt'); $deps[] = new FileDependency(dirname(__FILE__) . '/groups/Toolserver/toolserver-textdomains.txt'); if ($wgTranslateAddMWExtensionGroups) { $a = new PremadeMediawikiExtensionGroups(); $a->addAll(); } if ($wgEnablePageTranslation) { $dbr = wfGetDB(DB_MASTER); $tables = array('page', 'revtag'); $vars = array('page_id', 'page_namespace', 'page_title'); $conds = array('page_id=rt_page', 'rt_type' => RevTag::getType('tp:mark')); $options = array('GROUP BY' => 'rt_page'); $res = $dbr->select($tables, $vars, $conds, __METHOD__, $options); foreach ($res as $r) { $title = Title::makeTitle($r->page_namespace, $r->page_title); $id = TranslatablePage::getMessageGroupIdFromTitle($title); $wgTranslateCC[$id] = new WikiPageMessageGroup($id, $title); $wgTranslateCC[$id]->setLabel($title->getPrefixedText()); } } if ($wgTranslateWorkflowStates) { $wgTranslateCC['translate-workflow-states'] = new WorkflowStatesMessageGroup(); } $autoload = array(); wfRunHooks('TranslatePostInitGroups', array(&$wgTranslateCC, &$deps, &$autoload)); foreach ($wgTranslateGroupFiles as $configFile) { wfDebug($configFile . "\n"); $deps[] = new FileDependency(realpath($configFile)); $fgroups = TranslateYaml::parseGroupFile($configFile); foreach ($fgroups as $id => $conf) { if (!empty($conf['AUTOLOAD']) && is_array($conf['AUTOLOAD'])) { $dir = dirname($configFile); foreach ($conf['AUTOLOAD'] as $class => $file) { // For this request and for caching. $wgAutoloadClasses[$class] = "{$dir}/{$file}"; $autoload[$class] = "{$dir}/{$file}"; } } $group = MessageGroupBase::factory($conf); $wgTranslateCC[$id] = $group; } } $key = wfMemckey('translate-groups'); $value = array('ac' => $wgTranslateAC, 'ec' => $wgTranslateEC, 'cc' => $wgTranslateCC, 'autoload' => $autoload); $wrapper = new DependencyWrapper($value, $deps); $wrapper->storeToCache(self::getCache(), $key, 60 * 60 * 2); wfDebug(__METHOD__ . "-end\n"); }
public function getBaseSchema() { return TranslateYaml::load(__DIR__ . '/data/group-yaml-schema.yaml'); }