diff options
Diffstat (limited to 'cli')
| -rw-r--r-- | cli/check.translation.php | 7 | ||||
| -rw-r--r-- | cli/i18n/I18nData.php | 159 | ||||
| -rw-r--r-- | cli/i18n/I18nFile.php | 14 | ||||
| -rw-r--r-- | cli/i18n/I18nFileInterface.php | 2 | ||||
| -rw-r--r-- | cli/i18n/I18nIgnoreFile.php | 7 | ||||
| -rw-r--r-- | cli/i18n/ignore/en.php | 20 | ||||
| -rw-r--r-- | cli/i18n/ignore/fr.php | 8 | ||||
| -rw-r--r-- | cli/i18n/ignore/kr.php | 4 | ||||
| -rw-r--r-- | cli/i18n/ignore/nl.php | 12 | ||||
| -rw-r--r-- | cli/i18n/ignore/oc.php | 8 | ||||
| -rw-r--r-- | cli/i18n/ignore/sk.php | 18 | ||||
| -rw-r--r-- | cli/i18n/ignore/zh-cn.php | 4 | ||||
| -rw-r--r-- | cli/manipulate.translation.php | 47 |
13 files changed, 186 insertions, 124 deletions
diff --git a/cli/check.translation.php b/cli/check.translation.php index 6ebd12973..12655fc8e 100644 --- a/cli/check.translation.php +++ b/cli/check.translation.php @@ -1,11 +1,14 @@ <?php -require_once __DIR__ . '/i18n/I18nFile.php'; require_once __DIR__ . '/i18n/I18nCompletionValidator.php'; +require_once __DIR__ . '/i18n/I18nData.php'; +require_once __DIR__ . '/i18n/I18nFile.php'; +require_once __DIR__ . '/i18n/I18nIgnoreFile.php'; require_once __DIR__ . '/i18n/I18nUsageValidator.php'; $i18nFile = new I18nFile(); -$i18nData = $i18nFile->load(); +$i18nIgnoreFile = new I18nIgnoreFile(); +$i18nData = new I18nData($i18nFile->load(), $i18nIgnoreFile->load()); $options = getopt("dhl:r"); diff --git a/cli/i18n/I18nData.php b/cli/i18n/I18nData.php index 2178d330d..a6d260a8f 100644 --- a/cli/i18n/I18nData.php +++ b/cli/i18n/I18nData.php @@ -5,15 +5,95 @@ class I18nData { const REFERENCE_LANGUAGE = 'en'; private $data = array(); - private $originalData = array(); + private $ignore = array(); - public function __construct($data) { + public function __construct($data, $ignore) { $this->data = $data; - $this->originalData = $data; + $this->ignore = $ignore; + + $this->synchonizeKeys(); } public function getData() { - return $this->data; + $output = array(); + $reference = $this->getReferenceLanguage(); + $languages = $this->getNonReferenceLanguages(); + + foreach ($reference as $file => $values) { + foreach ($values as $key => $value) { + $output[static::REFERENCE_LANGUAGE][$file][$key] = $value; + foreach ($languages as $language) { + if ($this->data[$language][$file][$key] !== $value) { + // This value is translated, there is no need to flag it. + $output[$language][$file][$key] = $this->data[$language][$file][$key]; + } elseif (array_key_exists($language, $this->ignore) && in_array($key, $this->ignore[$language])) { + // This value is ignored, there is no need to flag it. + $output[$language][$file][$key] = $this->data[$language][$file][$key]; + } else { + // This value is not translated nor ignored, it must be flagged. + $output[$language][$file][$key] = "{$value} -> todo"; + } + } + } + } + + return $output; + } + + public function getIgnore() { + $ignore = array(); + + foreach ($this->ignore as $language => $keys) { + sort($keys); + $ignore[$language] = $keys; + } + + return $ignore; + } + + private function synchonizeKeys() { + $this->addMissingKeysFromReference(); + $this->removeExtraKeysFromOtherLanguages(); + $this->removeUnknownIgnoreKeys(); + } + + private function addMissingKeysFromReference() { + $reference = $this->getReferenceLanguage(); + $languages = $this->getNonReferenceLanguages(); + + foreach ($reference as $file => $values) { + foreach ($values as $key => $value) { + foreach ($languages as $language) { + if (!array_key_exists($key, $this->data[$language][$file])) { + $this->data[$language][$file][$key] = $value; + } + } + } + } + } + + private function removeExtraKeysFromOtherLanguages() { + $reference = $this->getReferenceLanguage(); + foreach ($this->getNonReferenceLanguages() as $language) { + foreach ($this->getLanguage($language) as $file => $values) { + foreach ($values as $key => $value) { + if (!array_key_exists($key, $reference[$file])) { + unset($this->data[$language][$file][$key]); + } + } + } + } + } + + private function removeUnknownIgnoreKeys() { + $reference = $this->getReferenceLanguage(); + foreach ($this->ignore as $language => $keys) { + foreach ($keys as $index => $key) { + if (!array_key_exists($this->getFilenamePrefix($key), $reference) || !array_key_exists($key, $reference[$this->getFilenamePrefix($key)])) { + unset($this->ignore[$language][$index]); + } + } + } } /** @@ -29,6 +109,17 @@ class I18nData { } /** + * Return all available languages without the reference language + * + * @return array + */ + public function getNonReferenceLanguages() { + return array_filter(array_keys($this->data), function ($value) { + return static::REFERENCE_LANGUAGE !== $value; + }); + } + + /** * Add a new language. It's a copy of the reference language. * * @param string $language @@ -42,7 +133,7 @@ class I18nData { } /** - * Add a key in the reference language + * Add a new key to all languages. * * @param string $key * @param string $value @@ -53,7 +144,12 @@ class I18nData { array_key_exists($key, $this->data[static::REFERENCE_LANGUAGE][$this->getFilenamePrefix($key)])) { throw new Exception('The selected key already exist.'); } - $this->data[static::REFERENCE_LANGUAGE][$this->getFilenamePrefix($key)][$key] = $value; + + foreach ($this->getAvailableLanguages() as $language) { + if (!array_key_exists($key, $this->data[$language][$this->getFilenamePrefix($key)])) { + $this->data[$language][$this->getFilenamePrefix($key)][$key] = $value; + } + } } /** @@ -76,29 +172,6 @@ class I18nData { } /** - * Duplicate a key from the reference language to all other languages - * - * @param string $key - * @throws Exception - */ - public function duplicateKey($key) { - if (!array_key_exists($this->getFilenamePrefix($key), $this->data[static::REFERENCE_LANGUAGE]) || - !array_key_exists($key, $this->data[static::REFERENCE_LANGUAGE][$this->getFilenamePrefix($key)])) { - throw new Exception('The selected key does not exist.'); - } - $value = $this->data[static::REFERENCE_LANGUAGE][$this->getFilenamePrefix($key)][$key]; - foreach ($this->getAvailableLanguages() as $language) { - if (static::REFERENCE_LANGUAGE === $language) { - continue; - } - if (array_key_exists($key, $this->data[$language][$this->getFilenamePrefix($key)])) { - continue; - } - $this->data[$language][$this->getFilenamePrefix($key)][$key] = $value; - } - } - - /** * Remove a key in all languages * * @param string $key @@ -113,14 +186,13 @@ class I18nData { if (array_key_exists($key, $this->data[$language][$this->getFilenamePrefix($key)])) { unset($this->data[$language][$this->getFilenamePrefix($key)][$key]); } + if (array_key_exists($language, $this->ignore) && $position = array_search($key, $this->ignore[$language])) { + unset($this->ignore[$language][$position]); + } } } /** - * WARNING! This is valid only for ignore files. It's not the best way to - * handle that but as it's meant to be used only for the cli tool, there - * is no point of spending time on making it better than that. - * * Ignore a key from a language, or reverse it. * * @param string $key @@ -128,25 +200,20 @@ class I18nData { * @param boolean $reverse */ public function ignore($key, $language, $reverse = false) { - $index = array_search($key, $this->data[$language]); + if (!array_key_exists($language, $this->ignore)) { + $this->ignore[$language] = array(); + } - if ($index && $reverse) { - unset($this->data[$language][$index]); + $index = array_search($key, $this->ignore[$language]); + if (false !== $index && $reverse) { + unset($this->ignore[$language][$index]); return; } - if ($index && !$reverse) { + if (false !== $index && !$reverse) { return; } - $this->data[$language][] = $key; - } - /** - * Check if the data has changed - * - * @return bool - */ - public function hasChanged() { - return $this->data !== $this->originalData; + $this->ignore[$language][] = $key; } public function getLanguage($language) { diff --git a/cli/i18n/I18nFile.php b/cli/i18n/I18nFile.php index 56459ce8b..c97520862 100644 --- a/cli/i18n/I18nFile.php +++ b/cli/i18n/I18nFile.php @@ -1,6 +1,5 @@ <?php -require_once __DIR__ . '/I18nData.php'; require_once __DIR__ . '/I18nFileInterface.php'; class I18nFile implements I18nFileInterface{ @@ -27,11 +26,11 @@ class I18nFile implements I18nFileInterface{ } } - return new I18nData($i18n); + return $i18n; } - public function dump(I18nData $i18n) { - foreach ($i18n->getData() as $language => $file) { + public function dump(array $i18n) { + foreach ($i18n as $language => $file) { $dir = $this->i18nPath . DIRECTORY_SEPARATOR . $language; if (!file_exists($dir)) { mkdir($dir); @@ -80,7 +79,7 @@ class I18nFile implements I18nFileInterface{ private function unflatten($translation) { $a = array(); - ksort($translation); + ksort($translation, SORT_NATURAL | SORT_FLAG_CASE); foreach ($translation as $compoundKey => $value) { $keys = explode('.', $compoundKey); array_shift($keys); @@ -105,17 +104,20 @@ class I18nFile implements I18nFileInterface{ $patterns = array( '/array \(/', '/=>\s*array/', + '/(\w) {2}/', '/ {2}/', + '/ -> todo\',/', ); $replacements = array( 'array(', '=> array', + '$1 ', "\t", // Double quoting is mandatory to have a tab instead of the \t string + "',\t// TODO - Translation", // Double quoting is mandatory to have a tab instead of the \t string ); $translation = preg_replace($patterns, $replacements, $translation); // Double quoting is mandatory to have new lines instead of \n strings return sprintf("<?php\n\nreturn %s;\n", $translation); } - } diff --git a/cli/i18n/I18nFileInterface.php b/cli/i18n/I18nFileInterface.php index c5aaf9fcd..9e7c41200 100644 --- a/cli/i18n/I18nFileInterface.php +++ b/cli/i18n/I18nFileInterface.php @@ -6,5 +6,5 @@ interface I18nFileInterface { public function load(); - public function dump(I18nData $i18n); + public function dump(array $i18n); } diff --git a/cli/i18n/I18nIgnoreFile.php b/cli/i18n/I18nIgnoreFile.php index 714e000ca..a05a3d5e8 100644 --- a/cli/i18n/I18nIgnoreFile.php +++ b/cli/i18n/I18nIgnoreFile.php @@ -1,6 +1,5 @@ <?php -require_once __DIR__ . '/I18nData.php'; require_once __DIR__ . '/I18nFileInterface.php'; class I18nIgnoreFile implements I18nFileInterface { @@ -11,8 +10,8 @@ class I18nIgnoreFile implements I18nFileInterface { $this->i18nPath = __DIR__ . '/ignore'; } - public function dump(I18nData $i18n) { - foreach ($i18n->getData() as $language => $content) { + public function dump(array $i18n) { + foreach ($i18n as $language => $content) { $filename = $this->i18nPath . DIRECTORY_SEPARATOR . $language . '.php'; file_put_contents($filename, $this->format($content)); } @@ -28,7 +27,7 @@ class I18nIgnoreFile implements I18nFileInterface { $i18n[$file->getBasename('.php')] = (include $file->getPathname()); } - return new I18nData($i18n); + return $i18n; } /** diff --git a/cli/i18n/ignore/en.php b/cli/i18n/ignore/en.php index db5a06a5e..78018bea1 100644 --- a/cli/i18n/ignore/en.php +++ b/cli/i18n/ignore/en.php @@ -49,6 +49,12 @@ return array( 'conf.query.order_desc', 'conf.query.state_0', 'conf.query.state_1', + 'conf.query.state_10', + 'conf.query.state_11', + 'conf.query.state_12', + 'conf.query.state_13', + 'conf.query.state_14', + 'conf.query.state_15', 'conf.query.state_2', 'conf.query.state_3', 'conf.query.state_4', @@ -57,12 +63,6 @@ return array( 'conf.query.state_7', 'conf.query.state_8', 'conf.query.state_9', - 'conf.query.state_10', - 'conf.query.state_11', - 'conf.query.state_12', - 'conf.query.state_13', - 'conf.query.state_14', - 'conf.query.state_15', 'conf.sharing.blogotext', 'conf.sharing.diaspora', 'conf.sharing.email', @@ -83,20 +83,20 @@ return array( 'gen.lang.ru', 'gen.lang.tr', 'gen.lang.zh-cn', + 'gen.share.Known', 'gen.share.blogotext', 'gen.share.diaspora', 'gen.share.email', 'gen.share.facebook', + 'gen.share.gnusocial', + 'gen.share.jdh', + 'gen.share.lemmy', 'gen.share.movim', 'gen.share.print', 'gen.share.shaarli', 'gen.share.twitter', 'gen.share.wallabag', 'gen.share.wallabagv2', - 'gen.share.jdh', - 'gen.share.Known', - 'gen.share.gnusocial', - 'gen.share.lemmy', 'index.menu.non-starred', 'index.menu.read', 'index.menu.starred', diff --git a/cli/i18n/ignore/fr.php b/cli/i18n/ignore/fr.php index 8ed8ffff1..a121e5502 100644 --- a/cli/i18n/ignore/fr.php +++ b/cli/i18n/ignore/fr.php @@ -34,20 +34,20 @@ return array( 'gen.share.blogotext', 'gen.share.diaspora', 'gen.share.facebook', + 'gen.share.gnusocial', + 'gen.share.jdh', + 'gen.share.lemmy', 'gen.share.movim', 'gen.share.shaarli', 'gen.share.twitter', 'gen.share.wallabag', 'gen.share.wallabagv2', - 'gen.share.jdh', - 'gen.share.gnusocial', - 'gen.share.lemmy', 'index.about.agpl3', 'index.about.version', 'index.log._', 'index.log.title', - 'install.title', 'install.this_is_the_end', + 'install.title', 'sub.bookmarklet.title', 'sub.feed.description', 'sub.feed.number_entries', diff --git a/cli/i18n/ignore/kr.php b/cli/i18n/ignore/kr.php index 2fa867cbe..9fd7a6ff0 100644 --- a/cli/i18n/ignore/kr.php +++ b/cli/i18n/ignore/kr.php @@ -19,6 +19,7 @@ return array( 'gen.date.Nov', 'gen.date.Oct', 'gen.date.Sep', + 'gen.freshrss._', 'gen.lang.cz', 'gen.lang.de', 'gen.lang.en', @@ -33,13 +34,13 @@ return array( 'gen.lang.ru', 'gen.lang.tr', 'gen.lang.zh-cn', - 'gen.freshrss._', 'gen.share.Known', 'gen.share.blogotext', 'gen.share.diaspora', 'gen.share.facebook', 'gen.share.gnusocial', 'gen.share.jdh', + 'gen.share.lemmy', 'gen.share.linkedin', 'gen.share.mastodon', 'gen.share.movim', @@ -49,7 +50,6 @@ return array( 'gen.share.twitter', 'gen.share.wallabag', 'gen.share.wallabagv2', - 'gen.share.lemmy', 'index.about.agpl3', 'sub.api.title', ); diff --git a/cli/i18n/ignore/nl.php b/cli/i18n/ignore/nl.php index dc4dd9356..1a3221003 100644 --- a/cli/i18n/ignore/nl.php +++ b/cli/i18n/ignore/nl.php @@ -11,8 +11,6 @@ return array( 'conf.sharing.shaarli', 'conf.sharing.twitter', 'conf.sharing.wallabag', - 'install.bdd._', - 'install.bdd.host', 'gen.date.Apr', 'gen.date.Dec', 'gen.date.Nov', @@ -35,8 +33,10 @@ return array( 'gen.lang.zh-cn', 'gen.share.blogotext', 'gen.share.diaspora', - 'gen.share.facebook', 'gen.share.email', + 'gen.share.facebook', + 'gen.share.gnusocial', + 'gen.share.jdh', 'gen.share.lemmy', 'gen.share.linkedin', 'gen.share.mastodon', @@ -48,12 +48,12 @@ return array( 'gen.share.twitter', 'gen.share.wallabag', 'gen.share.wallabagv2', - 'gen.share.jdh', - 'gen.share.gnusocial', 'gen.short.ok', 'index.about.agpl3', - 'index.about.website', 'index.about.version', + 'index.about.website', + 'install.bdd._', + 'install.bdd.host', 'sub.api.title', 'sub.bookmarklet.title', ); diff --git a/cli/i18n/ignore/oc.php b/cli/i18n/ignore/oc.php index b67b277fe..fed73078e 100644 --- a/cli/i18n/ignore/oc.php +++ b/cli/i18n/ignore/oc.php @@ -35,20 +35,20 @@ return array( 'gen.share.blogotext', 'gen.share.diaspora', 'gen.share.facebook', + 'gen.share.gnusocial', + 'gen.share.jdh', + 'gen.share.lemmy', 'gen.share.movim', 'gen.share.shaarli', 'gen.share.twitter', 'gen.share.wallabag', 'gen.share.wallabagv2', - 'gen.share.jdh', - 'gen.share.gnusocial', - 'gen.share.lemmy', 'index.about.agpl3', 'index.about.version', 'index.log._', 'index.log.title', - 'install.title', 'install.this_is_the_end', + 'install.title', 'sub.bookmarklet.title', 'sub.feed.description', 'sub.feed.number_entries', diff --git a/cli/i18n/ignore/sk.php b/cli/i18n/ignore/sk.php index 47d20f81f..244c22dbe 100644 --- a/cli/i18n/ignore/sk.php +++ b/cli/i18n/ignore/sk.php @@ -9,12 +9,13 @@ return array( 'conf.sharing.shaarli', 'conf.sharing.twitter', 'conf.sharing.wallabag', - 'gen.freshrss._', - 'gen.date.apr', 'gen.date.Aug', + 'gen.date.Dec', + 'gen.date.Nov', + 'gen.date.Sep', + 'gen.date.apr', 'gen.date.aug', 'gen.date.august', - 'gen.date.Dec', 'gen.date.dec', 'gen.date.december', 'gen.date.feb', @@ -22,12 +23,11 @@ return array( 'gen.date.format_date_hour', 'gen.date.jan', 'gen.date.mar', - 'gen.date.Nov', 'gen.date.nov', 'gen.date.november', - 'gen.date.Sep', 'gen.date.sep', 'gen.date.september', + 'gen.freshrss._', 'gen.lang.cz', 'gen.lang.de', 'gen.lang.en', @@ -40,13 +40,15 @@ return array( 'gen.lang.oc', 'gen.lang.pt-br', 'gen.lang.ru', - 'gen.lang.tr', 'gen.lang.sk', + 'gen.lang.tr', 'gen.lang.zh-cn', 'gen.share.blogotext', 'gen.share.diaspora', - 'gen.share.facebook', 'gen.share.email', + 'gen.share.facebook', + 'gen.share.gnusocial', + 'gen.share.jdh', 'gen.share.linkedin', 'gen.share.mastodon', 'gen.share.movim', @@ -57,8 +59,6 @@ return array( 'gen.share.twitter', 'gen.share.wallabag', 'gen.share.wallabagv2', - 'gen.share.jdh', - 'gen.share.gnusocial', 'index.about.agpl3', 'sub.api.title', 'sub.import_export.title', diff --git a/cli/i18n/ignore/zh-cn.php b/cli/i18n/ignore/zh-cn.php index e0209d475..382bb7303 100644 --- a/cli/i18n/ignore/zh-cn.php +++ b/cli/i18n/ignore/zh-cn.php @@ -8,6 +8,7 @@ return array( 'conf.sharing.shaarli', 'conf.sharing.twitter', 'conf.sharing.wallabag', + 'gen.freshrss._', 'gen.lang.cz', 'gen.lang.de', 'gen.lang.en', @@ -28,6 +29,7 @@ return array( 'gen.share.facebook', 'gen.share.gnusocial', 'gen.share.jdh', + 'gen.share.lemmy', 'gen.share.linkedin', 'gen.share.mastodon', 'gen.share.movim', @@ -37,8 +39,6 @@ return array( 'gen.share.twitter', 'gen.share.wallabag', 'gen.share.wallabagv2', - 'gen.share.lemmy', 'index.about.agpl3', 'sub.api.title', - 'gen.freshrss._', ); diff --git a/cli/manipulate.translation.php b/cli/manipulate.translation.php index 35405bb89..c6aa328d9 100644 --- a/cli/manipulate.translation.php +++ b/cli/manipulate.translation.php @@ -1,5 +1,9 @@ <?php +require_once __DIR__ . '/i18n/I18nData.php'; +require_once __DIR__ . '/i18n/I18nFile.php'; +require_once __DIR__ . '/i18n/I18nIgnoreFile.php'; + $options = getopt("a:hk:l:rv:"); if (array_key_exists('h', $options)) { @@ -10,14 +14,9 @@ if (!array_key_exists('a', $options)) { error('You need to specify the action to perform.'); } -if ('ignore' === $options['a']) { - require_once __DIR__ . '/i18n/I18nIgnoreFile.php'; - $i18nFile = new I18nIgnoreFile(); -} else { - require_once __DIR__ . '/i18n/I18nFile.php'; - $i18nFile = new I18nFile(); -} -$i18nData = $i18nFile->load(); +$data = new I18nFile(); +$ignore = new I18nIgnoreFile(); +$i18nData = new I18nData($data->load(), $ignore->load()); switch ($options['a']) { case 'add' : @@ -29,6 +28,7 @@ switch ($options['a']) { $i18nData->addLanguage($options['l']); } else { error('You need to specify a valid set of options.'); + exit; } break; case 'delete' : @@ -36,32 +36,26 @@ switch ($options['a']) { $i18nData->removeKey($options['k']); } else { error('You need to specify the key to delete.'); - } - break; - case 'duplicate' : - if (array_key_exists('k', $options)) { - $i18nData->duplicateKey($options['k']); - } else { - error('You need to specify the key to duplicate'); + exit; } break; case 'format' : - $i18nFile->dump($i18nData); break; case 'ignore' : if (array_key_exists('l', $options) && array_key_exists('k', $options)) { $i18nData->ignore($options['k'], $options['l'], array_key_exists('r', $options)); } else { error('You need to specify a valid set of options.'); + exit; } break; default : help(); + exit; } -if ($i18nData->hasChanged()) { - $i18nFile->dump($i18nData); -} +$data->dump($i18nData->getData()); +$ignore->dump($i18nData->getIgnore()); /** * Output error message. @@ -91,7 +85,7 @@ DESCRIPTION -a=ACTION select the action to perform. Available actions are add, delete, - duplicate, format, and ignore. This option is mandatory. + format, and ignore. This option is mandatory. -k=KEY select the key to work on. -v=VAL select the value to set. -l=LANG select the language to work on. @@ -101,25 +95,22 @@ EXEMPLE Exemple 1: add a language. It adds a new language by duplicating the referential. php %1\$s -a add -l my_lang -Exemple 2: add a new key. It adds the key in the referential. +Exemple 2: add a new key. It adds the key for all supported languages. php %1\$s -a add -k my_key -v my_value Exemple 3: add a new value. It adds a new value for the selected key in the selected language. php %1\$s -a add -k my_key -v my_value -l my_lang -Exemple 4: delete a key. It deletes the selected key in every languages. +Exemple 4: delete a key. It deletes the selected key from all supported languages. php %1\$s -a delete -k my_key -Exemple 5: duplicate a key. It duplicates the key from the referential in every languages. - php %1\$s -a duplicate -k my_key - -Exemple 6: format i18n files. +Exemple 5: format i18n files. php %1\$s -a format -Exemple 7: ignore a key. It adds the key in the ignore file to mark it as translated. +Exemple 6: ignore a key. It adds the key in the ignore file to mark it as translated. php %1\$s -a ignore -k my_key -l my_lang -Exemple 8: revert ignore a key. It removes the key from the ignore file. +Exemple 7: revert ignore a key. It removes the key from the ignore file. php %1\$s -a ignore -r -k my_key -l my_lang\n\n HELP; $file = str_replace(__DIR__ . '/', '', __FILE__); |
