Example #1
0
 public function testSave()
 {
     // initial data
     $s = chr(4);
     $messages = ['Hello!' => 'Привет!', "context1{$s}Hello?" => 'Привет?', 'Hello!?' => '', "context1{$s}Hello!?!" => '', "context2{$s}\"Quotes\"" => '"Кавычки"', "context2{$s}\nNew lines\n" => "\nПереносы строк\n", "context2{$s}\tTabs\t" => "\tТабы\t", "context2{$s}\rCarriage returns\r" => "\rВозвраты кареток\r"];
     // create temporary directory and dump messages
     $poFileDirectory = __DIR__ . '/../../runtime/i18n';
     if (!is_dir($poFileDirectory)) {
         mkdir($poFileDirectory);
     }
     if (is_file($poFileDirectory . '/test.po')) {
         unlink($poFileDirectory . '/test.po');
     }
     $poFile = new GettextPoFile();
     $poFile->save($poFileDirectory . '/test.po', $messages);
     // load messages
     $context1 = $poFile->load($poFileDirectory . '/test.po', 'context1');
     $context2 = $poFile->load($poFileDirectory . '/test.po', 'context2');
     // context1
     $this->assertCount(2, $context1);
     $this->assertArrayHasKey('Hello?', $context1);
     $this->assertTrue(in_array('Привет?', $context1));
     $this->assertArrayHasKey('Hello!?!', $context1);
     $this->assertTrue(in_array('', $context1));
     // context2
     $this->assertCount(4, $context2);
     $this->assertArrayHasKey("\"Quotes\"", $context2);
     $this->assertTrue(in_array('"Кавычки"', $context2));
     $this->assertArrayHasKey("\nNew lines\n", $context2);
     $this->assertTrue(in_array("\nПереносы строк\n", $context2));
     $this->assertArrayHasKey("\tTabs\t", $context2);
     $this->assertTrue(in_array("\tТабы\t", $context2));
     $this->assertArrayHasKey("\rCarriage returns\r", $context2);
     $this->assertTrue(in_array("\rВозвраты кареток\r", $context2));
 }
Example #2
0
 /**
  * @inheritdoc
  */
 protected function loadMessages($category)
 {
     $messageFilePath = $this->getMessageFilePath();
     $this->assertTrue(file_exists($messageFilePath), "There's no message file {$messageFilePath}!");
     $gettext = new GettextPoFile();
     return $gettext->load($messageFilePath, $category);
 }
Example #3
0
 /**
  * @inheritdoc
  */
 protected function loadMessages($category)
 {
     $messageFilePath = $this->getMessageFilePath();
     if (!file_exists($messageFilePath)) {
         return [];
     }
     $gettext = new GettextPoFile();
     return $gettext->load($messageFilePath, $category);
 }
 /**
  * Loads the message translation for the specified language and category.
  * Child classes should override this method to return the message translations of
  * the specified language and category.
  * @param string $category the message category
  * @param string $language the target language
  * @return array the loaded messages. The keys are original messages, and the values
  * are translated messages.
  */
 protected function loadMessages($category, $language)
 {
     $messageFile = Yii::getAlias($this->basePath) . '/' . $language . '/' . $this->catalog;
     if ($this->useMoFile) {
         $messageFile .= static::MO_FILE_EXT;
     } else {
         $messageFile .= static::PO_FILE_EXT;
     }
     if (is_file($messageFile)) {
         if ($this->useMoFile) {
             $gettextFile = new GettextMoFile(['useBigEndian' => $this->useBigEndian]);
         } else {
             $gettextFile = new GettextPoFile();
         }
         $messages = $gettextFile->load($messageFile, $category);
         if (!is_array($messages)) {
             $messages = [];
         }
         return $messages;
     } else {
         Yii::error("The message file for category '{$category}' does not exist: {$messageFile}", __METHOD__);
         return [];
     }
 }
Example #5
0
 /**
  * Writes messages into PO file
  *
  * @param array $messages
  * @param string $dirName name of the directory to write to
  * @param boolean $overwrite if existing file should be overwritten without backup
  * @param boolean $removeUnused if obsolete translations should be removed
  * @param boolean $sort if translations should be sorted
  * @param string $catalog message catalog
  */
 protected function saveMessagesToPO($messages, $dirName, $overwrite, $removeUnused, $sort, $catalog)
 {
     $file = str_replace("\\", '/', "{$dirName}/{$catalog}.po");
     FileHelper::createDirectory(dirname($file));
     $this->stdout("Saving messages to {$file}...\n");
     $poFile = new GettextPoFile();
     $merged = [];
     $todos = [];
     $hasSomethingToWrite = false;
     foreach ($messages as $category => $msgs) {
         $notTranslatedYet = [];
         $msgs = array_values(array_unique($msgs));
         if (is_file($file)) {
             $existingMessages = $poFile->load($file, $category);
             sort($msgs);
             ksort($existingMessages);
             if (array_keys($existingMessages) == $msgs) {
                 $this->stdout("Nothing new in \"{$category}\" category...\n");
                 sort($msgs);
                 foreach ($msgs as $message) {
                     $merged[$category . chr(4) . $message] = $existingMessages[$message];
                 }
                 ksort($merged);
                 continue;
             }
             // merge existing message translations with new message translations
             foreach ($msgs as $message) {
                 if (array_key_exists($message, $existingMessages) && $existingMessages[$message] !== '') {
                     $merged[$category . chr(4) . $message] = $existingMessages[$message];
                 } else {
                     $notTranslatedYet[] = $message;
                 }
             }
             ksort($merged);
             sort($notTranslatedYet);
             // collect not yet translated messages
             foreach ($notTranslatedYet as $message) {
                 $todos[$category . chr(4) . $message] = '';
             }
             // add obsolete unused messages
             foreach ($existingMessages as $message => $translation) {
                 if (!$removeUnused && !isset($merged[$category . chr(4) . $message]) && !isset($todos[$category . chr(4) . $message])) {
                     if (!empty($translation) && substr($translation, 0, 2) === '@@' && substr($translation, -2) === '@@') {
                         $todos[$category . chr(4) . $message] = $translation;
                     } else {
                         $todos[$category . chr(4) . $message] = '@@' . $translation . '@@';
                     }
                 }
             }
             $merged = array_merge($todos, $merged);
             if ($sort) {
                 ksort($merged);
             }
             if ($overwrite === false) {
                 $file .= '.merged';
             }
         } else {
             sort($msgs);
             foreach ($msgs as $message) {
                 $merged[$category . chr(4) . $message] = '';
             }
             ksort($merged);
         }
         $this->stdout("Category \"{$category}\" merged.\n");
         $hasSomethingToWrite = true;
     }
     if ($hasSomethingToWrite) {
         $poFile->save($file, $merged);
         $this->stdout("Translation saved.\n", Console::FG_GREEN);
     } else {
         $this->stdout("Nothing to save.\n", Console::FG_GREEN);
     }
 }
Example #6
0
 /**
  * Writes messages into POT file
  *
  * @param array $messages
  * @param string $dirName name of the directory to write to
  * @param string $catalog message catalog
  * @since 2.0.6
  */
 protected function saveMessagesToPOT($messages, $dirName, $catalog)
 {
     $file = str_replace("\\", '/', "{$dirName}/{$catalog}.pot");
     FileHelper::createDirectory(dirname($file));
     $this->stdout("Saving messages to {$file}...\n");
     $poFile = new GettextPoFile();
     $merged = [];
     $hasSomethingToWrite = false;
     foreach ($messages as $category => $msgs) {
         $msgs = array_values(array_unique($msgs));
         sort($msgs);
         foreach ($msgs as $message) {
             $merged[$category . chr(4) . $message] = '';
         }
         ksort($merged);
         $this->stdout("Category \"{$category}\" merged.\n");
         $hasSomethingToWrite = true;
     }
     if ($hasSomethingToWrite) {
         $poFile->save($file, $merged);
         $this->stdout("Translation saved.\n", Console::FG_GREEN);
     } else {
         $this->stdout("Nothing to save.\n", Console::FG_GREEN);
     }
 }
 /**
  * Loads the message translation for the specified language and category or returns null if file doesn't exist.
  *
  * @param string $messageFile path to message file
  * @param string $category the message category
  * @return array|null array of messages or null if file not found
  */
 protected function loadMessagesFromFile($messageFile, $category)
 {
     if (is_file($messageFile)) {
         if ($this->useMoFile) {
             $gettextFile = new GettextMoFile(['useBigEndian' => $this->useBigEndian]);
         } else {
             $gettextFile = new GettextPoFile();
         }
         $messages = $gettextFile->load($messageFile, $category);
         if (!is_array($messages)) {
             $messages = [];
         }
         return $messages;
     } else {
         return null;
     }
 }