lithium\g11n\catalog\adapter\Gettext::_parsePo PHP Method

_parsePo() protected method

This parser sacrifices some features of the reference implementation the differences to that implementation are as follows. - No support for comments spanning multiple lines. - Translator and extracted comments are treated as being the same type. - Message IDs are allowed to have other encodings as just US-ASCII. Items with an empty id are ignored. For more information see _merge().
protected _parsePo ( resource $stream ) : array
$stream resource
return array
    protected function _parsePo($stream)
    {
        $defaults = array('ids' => array(), 'translated' => null, 'flags' => array(), 'comments' => array(), 'occurrences' => array(), 'context' => null);
        $data = array();
        $item = $defaults;
        while ($line = fgets($stream)) {
            $line = trim($line);
            if ($line === '') {
                $data = $this->_merge($data, $item);
                $item = $defaults;
            } elseif (substr($line, 0, 3) === '#~ ') {
                $item['flags']['obsolete'] = true;
            } elseif (substr($line, 0, 3) === '#, ') {
                $item['flags'][substr($line, 3)] = true;
            } elseif (substr($line, 0, 3) === '#: ') {
                $item['occurrences'][] = array('file' => strtok(substr($line, 3), ':'), 'line' => strtok(':'));
            } elseif (substr($line, 0, 3) === '#. ') {
                $item['comments'][] = substr($line, 3);
            } elseif ($line[0] === '#') {
                $item['comments'][] = ltrim(substr($line, 1));
            } elseif (substr($line, 0, 7) === 'msgid "') {
                $item['ids']['singular'] = substr($line, 7, -1);
            } elseif (substr($line, 0, 9) === 'msgctxt "') {
                $item['context'] = substr($line, 9, -1);
            } elseif (substr($line, 0, 8) === 'msgstr "') {
                $item['translated'] = substr($line, 8, -1);
            } elseif ($line[0] === '"') {
                $continues = isset($item['translated']) ? 'translated' : 'ids';
                if (is_array($item[$continues])) {
                    end($item[$continues]);
                    $item[$continues][key($item[$continues])] .= substr($line, 1, -1);
                } else {
                    $item[$continues] .= substr($line, 1, -1);
                }
            } elseif (substr($line, 0, 14) === 'msgid_plural "') {
                $item['ids']['plural'] = substr($line, 14, -1);
            } elseif (substr($line, 0, 7) === 'msgstr[') {
                $item['translated'][(int) substr($line, 7, 1)] = substr($line, 11, -1);
            }
        }
        return $this->_merge($data, $item);
    }