Commit b416e848e710013edc5ab4ece571dd934f3dbed4
1 parent
1cad081d
Fix a problem dealing with PO files when the msgstr contains an escape
quote - it previously prematurely ended the msgstr. git-svn-id: https://kt-dms.svn.sourceforge.net/svnroot/kt-dms/trunk@5350 c91229c3-7414-0410-bfa2-8a42b809f60b
Showing
1 changed file
with
26 additions
and
20 deletions
thirdparty/pear/File/Gettext/PO.php
| ... | ... | @@ -60,29 +60,35 @@ class File_Gettext_PO extends File_Gettext |
| 60 | 60 | if (!$contents = @file($file)) { |
| 61 | 61 | return parent::raiseError($php_errormsg . ' ' . $file); |
| 62 | 62 | } |
| 63 | - $contents = implode('', $contents); | |
| 64 | - | |
| 65 | - // match all msgid/msgstr entries | |
| 66 | - $matched = preg_match_all( | |
| 67 | - '/(msgid\s+("([^"]|\\\\")*?"\s*)+)\s+' . | |
| 68 | - '(msgstr\s+("([^"]|\\\\")*?"\s*)+)/', | |
| 69 | - $contents, $matches | |
| 70 | - ); | |
| 71 | - unset($contents); | |
| 72 | - | |
| 73 | - if (!$matched) { | |
| 74 | - return parent::raiseError('No msgid/msgstr entries found'); | |
| 63 | + | |
| 64 | + $msgid = null; | |
| 65 | + $aMatches = array(); | |
| 66 | + | |
| 67 | + foreach ($contents as $line) { | |
| 68 | + if (preg_match('#^msgid "(.*)"$#', $line, $aMatches)) { | |
| 69 | + if ($msgid) { | |
| 70 | + $this->strings[parent::prepare($msgid)] = parent::prepare($msgstr); | |
| 71 | + } | |
| 72 | + $msgid = $aMatches[1]; | |
| 73 | + $msgstr = ""; | |
| 74 | + $msgstr_started = false; | |
| 75 | + } | |
| 76 | + if (preg_match('#^msgstr "(.*)"$#', $line, $aMatches)) { | |
| 77 | + $msgstr = $aMatches[1]; | |
| 78 | + $msgstr_started = true; | |
| 79 | + } | |
| 80 | + if (preg_match('#^"(.*)"$#', $line, $aMatches)) { | |
| 81 | + if ($msgstr_started) { | |
| 82 | + $msgstr .= $aMatches[1]; | |
| 83 | + } else { | |
| 84 | + $msgid .= $aMatches[1]; | |
| 85 | + } | |
| 86 | + } | |
| 75 | 87 | } |
| 76 | - | |
| 77 | - // get all msgids and msgtrs | |
| 78 | - for ($i = 0; $i < $matched; $i++) { | |
| 79 | - $msgid = preg_replace( | |
| 80 | - '/\s*msgid\s*"(.*)"\s*/s', '\\1', $matches[1][$i]); | |
| 81 | - $msgstr= preg_replace( | |
| 82 | - '/\s*msgstr\s*"(.*)"\s*/s', '\\1', $matches[4][$i]); | |
| 88 | + if ($msgid) { | |
| 83 | 89 | $this->strings[parent::prepare($msgid)] = parent::prepare($msgstr); |
| 84 | 90 | } |
| 85 | - | |
| 91 | + | |
| 86 | 92 | // check for meta info |
| 87 | 93 | if (isset($this->strings[''])) { |
| 88 | 94 | $this->meta = parent::meta2array($this->strings['']); | ... | ... |