/**
  * @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;
	}
Ejemplo n.º 6
0
 /**
  * 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');
 }