From 048f327bfca7ba71c451d11ba5a3378d470c2ea4 Mon Sep 17 00:00:00 2001 From: Dion Hulse Date: Fri, 20 Nov 2015 04:34:25 +0000 Subject: [PATCH] Merge the changes to GlotPress's POMO from upstream to WordPress's copy. Fixes #34748 Built from https://develop.svn.wordpress.org/trunk@35714 git-svn-id: http://core.svn.wordpress.org/trunk@35678 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/pomo/entry.php | 8 ++--- wp-includes/pomo/mo.php | 6 ++-- wp-includes/pomo/po.php | 59 +++++++++++++++++++++++++------ wp-includes/pomo/streams.php | 2 +- wp-includes/pomo/translations.php | 2 +- wp-includes/version.php | 2 +- 6 files changed, 58 insertions(+), 21 deletions(-) diff --git a/wp-includes/pomo/entry.php b/wp-includes/pomo/entry.php index 3e4bc3bdd5..788092ba4b 100644 --- a/wp-includes/pomo/entry.php +++ b/wp-includes/pomo/entry.php @@ -2,7 +2,7 @@ /** * Contains Translation_Entry class * - * @version $Id: entry.php 718 2012-10-31 00:32:02Z nbachiyski $ + * @version $Id: entry.php 1157 2015-11-20 04:30:11Z dd32 $ * @package pomo * @subpackage entry */ @@ -49,7 +49,7 @@ class Translation_Entry { foreach ($args as $varname => $value) { $this->$varname = $value; } - if (isset($args['plural'])) $this->is_plural = true; + if (isset($args['plural']) && $args['plural']) $this->is_plural = true; if (!is_array($this->translations)) $this->translations = array(); if (!is_array($this->references)) $this->references = array(); if (!is_array($this->flags)) $this->flags = array(); @@ -68,10 +68,10 @@ class Translation_Entry { * @return string|bool the key or false if the entry is empty */ function key() { - if (is_null($this->singular)) return false; + if ( null === $this->singular || '' === $this->singular ) return false; // Prepend context and EOT, like in MO files - $key = is_null($this->context)? $this->singular : $this->context.chr(4).$this->singular; + $key = !$this->context? $this->singular : $this->context.chr(4).$this->singular; // Standardize on \n line endings $key = str_replace( array( "\r\n", "\r" ), "\n", $key ); diff --git a/wp-includes/pomo/mo.php b/wp-includes/pomo/mo.php index 164c6c9ccd..6bc44d614d 100644 --- a/wp-includes/pomo/mo.php +++ b/wp-includes/pomo/mo.php @@ -2,7 +2,7 @@ /** * Class for working with MO files * - * @version $Id: mo.php 718 2012-10-31 00:32:02Z nbachiyski $ + * @version $Id: mo.php 1157 2015-11-20 04:30:11Z dd32 $ * @package pomo * @subpackage mo */ @@ -124,7 +124,7 @@ class MO extends Gettext_Translations { //TODO: warnings for control characters $exported = $entry->singular; if ($entry->is_plural) $exported .= chr(0).$entry->plural; - if (!is_null($entry->context)) $exported = $entry->context . chr(4) . $exported; + if ($entry->context) $exported = $entry->context . chr(4) . $exported; return $exported; } @@ -134,7 +134,7 @@ class MO extends Gettext_Translations { */ function export_translations($entry) { //TODO: warnings for control characters - return implode(chr(0), $entry->translations); + return $entry->is_plural ? implode(chr(0), $entry->translations) : $entry->translations[0]; } /** diff --git a/wp-includes/pomo/po.php b/wp-includes/pomo/po.php index f8933d2cd8..65d65ff39e 100644 --- a/wp-includes/pomo/po.php +++ b/wp-includes/pomo/po.php @@ -2,14 +2,16 @@ /** * Class for working with PO files * - * @version $Id: po.php 718 2012-10-31 00:32:02Z nbachiyski $ + * @version $Id: po.php 1158 2015-11-20 04:31:23Z dd32 $ * @package pomo * @subpackage po */ require_once dirname(__FILE__) . '/translations.php'; -define('PO_MAX_LINE_LEN', 79); +if ( ! defined( 'PO_MAX_LINE_LEN' ) ) { + define('PO_MAX_LINE_LEN', 79); +} ini_set('auto_detect_line_endings', 1); @@ -97,7 +99,7 @@ class PO extends Gettext_Translations { * @param string $string the string to format * @return string the poified string */ - function poify($string) { + public static function poify($string) { $quote = '"'; $slash = '\\'; $newline = "\n"; @@ -128,8 +130,8 @@ class PO extends Gettext_Translations { * @param string $string PO-formatted string * @return string enascaped string */ - function unpoify($string) { - $escapes = array('t' => "\t", 'n' => "\n", '\\' => '\\'); + public static function unpoify($string) { + $escapes = array('t' => "\t", 'n' => "\n", 'r' => "\r", '\\' => '\\'); $lines = array_map('trim', explode("\n", $string)); $lines = array_map(array('PO', 'trim_quotes'), $lines); $unpoified = ''; @@ -149,6 +151,10 @@ class PO extends Gettext_Translations { } } } + + // Standardise the line endings on imported content, technically PO files shouldn't contain \r + $unpoified = str_replace( array( "\r\n", "\r" ), "\n", $unpoified ); + return $unpoified; } @@ -160,7 +166,7 @@ class PO extends Gettext_Translations { * @param string $string prepend lines in this string * @param string $with prepend lines with this string */ - function prepend_each_line($string, $with) { + public static function prepend_each_line($string, $with) { $php_with = var_export($with, true); $lines = explode("\n", $string); // do not prepend the string on the last empty line, artefact by explode @@ -180,7 +186,7 @@ class PO extends Gettext_Translations { * @param string $char character to denote a special PO comment, * like :, default is a space */ - function comment_block($text, $char=' ') { + public static function comment_block($text, $char=' ') { $text = wordwrap($text, PO_MAX_LINE_LEN - 3); return PO::prepend_each_line($text, "#$char "); } @@ -193,28 +199,59 @@ class PO extends Gettext_Translations { * @return false|string PO-style formatted string for the entry or * false if the entry is empty */ - function export_entry(&$entry) { - if (is_null($entry->singular)) return false; + public static function export_entry(&$entry) { + if ( null === $entry->singular || '' === $entry->singular ) return false; $po = array(); if (!empty($entry->translator_comments)) $po[] = PO::comment_block($entry->translator_comments); if (!empty($entry->extracted_comments)) $po[] = PO::comment_block($entry->extracted_comments, '.'); if (!empty($entry->references)) $po[] = PO::comment_block(implode(' ', $entry->references), ':'); if (!empty($entry->flags)) $po[] = PO::comment_block(implode(", ", $entry->flags), ','); - if (!is_null($entry->context)) $po[] = 'msgctxt '.PO::poify($entry->context); + if ($entry->context) $po[] = 'msgctxt '.PO::poify($entry->context); $po[] = 'msgid '.PO::poify($entry->singular); if (!$entry->is_plural) { $translation = empty($entry->translations)? '' : $entry->translations[0]; + $translation = PO::match_begin_and_end_newlines( $translation, $entry->singular ); $po[] = 'msgstr '.PO::poify($translation); } else { $po[] = 'msgid_plural '.PO::poify($entry->plural); $translations = empty($entry->translations)? array('', '') : $entry->translations; foreach($translations as $i => $translation) { + $translation = PO::match_begin_and_end_newlines( $translation, $entry->plural ); $po[] = "msgstr[$i] ".PO::poify($translation); } } return implode("\n", $po); } + public static function match_begin_and_end_newlines( $translation, $original ) { + if ( '' === $translation ) { + return $translation; + } + + $original_begin = "\n" === substr( $original, 0, 1 ); + $original_end = "\n" === substr( $original, -1 ); + $translation_begin = "\n" === substr( $translation, 0, 1 ); + $translation_end = "\n" === substr( $translation, -1 ); + + if ( $original_begin ) { + if ( ! $translation_begin ) { + $translation = "\n" . $translation; + } + } elseif ( $translation_begin ) { + $translation = ltrim( $translation, "\n" ); + } + + if ( $original_end ) { + if ( ! $translation_end ) { + $translation .= "\n"; + } + } elseif ( $translation_end ) { + $translation = rtrim( $translation, "\n" ); + } + + return $translation; + } + /** * @param string $filename * @return boolean @@ -400,7 +437,7 @@ class PO extends Gettext_Translations { * @param string $s * @return sring */ - function trim_quotes($s) { + public static function trim_quotes($s) { if ( substr($s, 0, 1) == '"') $s = substr($s, 1); if ( substr($s, -1, 1) == '"') $s = substr($s, 0, -1); return $s; diff --git a/wp-includes/pomo/streams.php b/wp-includes/pomo/streams.php index 8373295feb..5e37c9c412 100644 --- a/wp-includes/pomo/streams.php +++ b/wp-includes/pomo/streams.php @@ -3,7 +3,7 @@ * Classes, which help reading streams of data from files. * Based on the classes from Danilo Segan * - * @version $Id: streams.php 718 2012-10-31 00:32:02Z nbachiyski $ + * @version $Id: streams.php 1157 2015-11-20 04:30:11Z dd32 $ * @package pomo * @subpackage streams */ diff --git a/wp-includes/pomo/translations.php b/wp-includes/pomo/translations.php index 6008f4aa18..66971d9595 100644 --- a/wp-includes/pomo/translations.php +++ b/wp-includes/pomo/translations.php @@ -2,7 +2,7 @@ /** * Class for a set of entries for translation and their associated headers * - * @version $Id: translations.php 718 2012-10-31 00:32:02Z nbachiyski $ + * @version $Id: translations.php 1157 2015-11-20 04:30:11Z dd32 $ * @package pomo * @subpackage translations */ diff --git a/wp-includes/version.php b/wp-includes/version.php index 758306afdd..267946701f 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -4,7 +4,7 @@ * * @global string $wp_version */ -$wp_version = '4.4-beta4-35713'; +$wp_version = '4.4-beta4-35714'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.