function read_entry($f, $lineno = 0) { $entry = new Translation_Entry(); // where were we in the last step // can be: comment, msgctxt, msgid, msgid_plural, msgstr, msgstr_plural $context = ''; $msgstr_index = 0; $is_final = create_function('$context', 'return $context == "msgstr" || $context == "msgstr_plural";'); while (true) { $lineno++; $line = PO::read_line($f); if (!$line) { if (feof($f)) { if ($is_final($context)) { break; } elseif (!$context) { // we haven't read a line and eof came return null; } else { return false; } } else { return false; } } if ($line == "\n") { continue; } $line = trim($line); if (preg_match('/^#/', $line, $m)) { // the comment is the start of a new entry if ($is_final($context)) { PO::read_line($f, 'put-back'); $lineno--; break; } // comments have to be at the beginning if ($context && $context != 'comment') { return false; } // add comment $this->add_comment_to_entry($entry, $line); } elseif (preg_match('/^msgctxt\\s+(".*")/', $line, $m)) { if ($is_final($context)) { PO::read_line($f, 'put-back'); $lineno--; break; } if ($context && $context != 'comment') { return false; } $context = 'msgctxt'; $entry->context .= PO::unpoify($m[1]); } elseif (preg_match('/^msgid\\s+(".*")/', $line, $m)) { if ($is_final($context)) { PO::read_line($f, 'put-back'); $lineno--; break; } if ($context && $context != 'msgctxt' && $context != 'comment') { return false; } $context = 'msgid'; $entry->singular .= PO::unpoify($m[1]); } elseif (preg_match('/^msgid_plural\\s+(".*")/', $line, $m)) { if ($context != 'msgid') { return false; } $context = 'msgid_plural'; $entry->is_plural = true; $entry->plural .= PO::unpoify($m[1]); } elseif (preg_match('/^msgstr\\s+(".*")/', $line, $m)) { if ($context != 'msgid') { return false; } $context = 'msgstr'; $entry->translations = array(PO::unpoify($m[1])); } elseif (preg_match('/^msgstr\\[(\\d+)\\]\\s+(".*")/', $line, $m)) { if ($context != 'msgid_plural' && $context != 'msgstr_plural') { return false; } $context = 'msgstr_plural'; $msgstr_index = $m[1]; $entry->translations[$m[1]] = PO::unpoify($m[2]); } elseif (preg_match('/^".*"$/', $line)) { $unpoified = PO::unpoify($line); switch ($context) { case 'msgid': $entry->singular .= $unpoified; break; case 'msgctxt': $entry->context .= $unpoified; break; case 'msgid_plural': $entry->plural .= $unpoified; break; case 'msgstr': $entry->translations[0] .= $unpoified; break; case 'msgstr_plural': $entry->translations[$msgstr_index] .= $unpoified; break; default: return false; } } else { return false; } } if (array() == array_filter($entry->translations, create_function('$t', 'return $t || "0" === $t;'))) { $entry->translations = array(); } return array('entry' => $entry, 'lineno' => $lineno); }
function read_entry($f, $lineno = 0) { $entry = new Translation_Entry(); $context = ''; $msgstr_index = 0; $is_final = create_function('$context', 'return $context == "msgstr" || $context == "msgstr_plural";'); while (true) { $lineno++; $line = PO::read_line($f); if (!$line) { if (feof($f)) { if ($is_final($context)) break; elseif (!$context) return null; else return false; } else { return false; } } if ($line == "\n") continue; $line = trim($line); if (preg_match('/^#/', $line, $m)) { if ($is_final($context)) { PO::read_line($f, 'put-back'); $lineno--; break; } if ($context && $context != 'comment') { return false; } $this->add_comment_to_entry($entry, $line); } elseif (preg_match('/^msgctxt\s+(".*")/', $line, $m)) { if ($is_final($context)) { PO::read_line($f, 'put-back'); $lineno--; break; } if ($context && $context != 'comment') { return false; } $context = 'msgctxt'; $entry->context .= PO::unpoify($m[1]); } elseif (preg_match('/^msgid\s+(".*")/', $line, $m)) { if ($is_final($context)) { PO::read_line($f, 'put-back'); $lineno--; break; } if ($context && $context != 'msgctxt' && $context != 'comment') { return false; } $context = 'msgid'; $entry->singular .= PO::unpoify($m[1]); } elseif (preg_match('/^msgid_plural\s+(".*")/', $line, $m)) { if ($context != 'msgid') { return false; } $context = 'msgid_plural'; $entry->is_plural = true; $entry->plural .= PO::unpoify($m[1]); } elseif (preg_match('/^msgstr\s+(".*")/', $line, $m)) { if ($context != 'msgid') { return false; } $context = 'msgstr'; $entry->translations = array(PO::unpoify($m[1])); } elseif (preg_match('/^msgstr\[(\d+)\]\s+(".*")/', $line, $m)) { if ($context != 'msgid_plural' && $context != 'msgstr_plural') { return false; } $context = 'msgstr_plural'; $msgstr_index = $m[1]; $entry->translations[$m[1]] = PO::unpoify($m[2]); } elseif (preg_match('/^".*"$/', $line)) { $unpoified = PO::unpoify($line); switch ($context) { case 'msgid': $entry->singular .= $unpoified; break; case 'msgctxt': $entry->context .= $unpoified; break; case 'msgid_plural': $entry->plural .= $unpoified; break; case 'msgstr': $entry->translations[0] .= $unpoified; break; case 'msgstr_plural': $entry->translations[$msgstr_index] .= $unpoified; break; default: return false; } } else { return false; } } if (array() == array_filter($entry->translations, create_function('$t', 'return $t || "0" === $t;'))) { $entry->translations = array(); } return array('entry' => $entry, 'lineno' => $lineno); }