yii\i18n\GettextMoFile::save PHP Method

save() public method

Saves messages to an MO file.
public save ( string $filePath, array $messages )
$filePath string file path
$messages array message translations. Array keys are source messages and array values are translated messages: source message => translated message. Note if the message has a context, the message ID must be prefixed with the context with chr(4) as the separator.
    public function save($filePath, $messages)
    {
        if (false === ($fileHandle = @fopen($filePath, 'wb'))) {
            throw new Exception('Unable to write file "' . $filePath . '".');
        }
        if (false === @flock($fileHandle, LOCK_EX)) {
            throw new Exception('Unable to lock file "' . $filePath . '" for reading.');
        }
        // magic
        if ($this->useBigEndian) {
            $this->writeBytes($fileHandle, pack('c*', 0x95, 0x4, 0x12, 0xde));
            // -107
        } else {
            $this->writeBytes($fileHandle, pack('c*', 0xde, 0x12, 0x4, 0x95));
            // -34
        }
        // revision
        $this->writeInteger($fileHandle, 0);
        // message count
        $messageCount = count($messages);
        $this->writeInteger($fileHandle, $messageCount);
        // offset of source message table
        $offset = 28;
        $this->writeInteger($fileHandle, $offset);
        $offset += $messageCount * 8;
        $this->writeInteger($fileHandle, $offset);
        // hashtable size, omitted
        $this->writeInteger($fileHandle, 0);
        $offset += $messageCount * 8;
        $this->writeInteger($fileHandle, $offset);
        // length and offsets for source messages
        foreach (array_keys($messages) as $id) {
            $length = strlen($id);
            $this->writeInteger($fileHandle, $length);
            $this->writeInteger($fileHandle, $offset);
            $offset += $length + 1;
        }
        // length and offsets for target messages
        foreach ($messages as $message) {
            $length = strlen($message);
            $this->writeInteger($fileHandle, $length);
            $this->writeInteger($fileHandle, $offset);
            $offset += $length + 1;
        }
        // source messages
        foreach (array_keys($messages) as $id) {
            $this->writeString($fileHandle, $id);
        }
        // target messages
        foreach ($messages as $message) {
            $this->writeString($fileHandle, $message);
        }
        @flock($fileHandle, LOCK_UN);
        @fclose($fileHandle);
    }

Usage Example

Beispiel #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.mo')) {
         unlink($poFileDirectory . '/test.mo');
     }
     $moFile = new GettextMoFile();
     $moFile->save($poFileDirectory . '/test.mo', $messages);
     // load messages
     $context1 = $moFile->load($poFileDirectory . '/test.mo', 'context1');
     $context2 = $moFile->load($poFileDirectory . '/test.mo', '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));
 }