framework/console/controllers/MessageController.php
protected function saveMessagesToPO($messages, $dirName, $overwrite, $removeUnused, $sort, $catalog, $markUnused)
    {
        $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 (!$markUnused || (!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($merged, $todos);
                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);
        }
    }
protected function saveMessagesToPO($messages, $dirName, $overwrite, $removeUnused, $sort, $catalog, $markUnused)
    {
        $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 (!$markUnused || (!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($merged, $todos);
                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);
        }
    }
protected function saveMessagesToPO ( $ messages , $ dirName , $ overwrite , $ removeUnused , $ sort , $ catalog , $ markUnused ) { $ 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 ( ! $ markUnused || ( ! 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 ( $ merged , $ todos ) ; 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 ) ; } }
Writes messages into PO file.

@param array $messages
@param string $dirName name of the directory to write to
@param bool $overwrite if existing file should be overwritten without backup
@param bool $removeUnused if obsolete translations should be removed
@param bool $sort if translations should be sorted
@param string $catalog message catalog
@param bool $markUnused if obsolete translations should be marked
Writes messages into PO file .