Пример #1
0
 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);
 }
Пример #2
0
	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);
	}