2015-08-17 17:00:26 -07:00
< ? php
namespace Drupal\Component\Gettext ;
/**
* PoItem handles one translation .
*
* @ todo : This class contains some really old legacy code .
* @ see https :// www . drupal . org / node / 1637662
*/
class PoItem {
/**
* The language code this translation is in .
*
* @ car string
*/
private $_langcode ;
/**
* The context this translation belongs to .
*
* @ var string
*/
private $_context = '' ;
/**
* The source string or array of strings if it has plurals .
*
* @ var string or array
* @ see $_plural
*/
private $_source ;
/**
* Flag indicating if this translation has plurals .
*
* @ var bool
*/
private $_plural ;
/**
* The comment of this translation .
*
* @ var string
*/
private $_comment ;
/**
* The translation string or array of strings if it has plurals .
*
* @ var string or array
* @ see $_plural
*/
private $_translation ;
/**
* Gets the language code of the currently used language .
*
* @ return string with langcode
*/
function getLangcode () {
return $this -> _langcode ;
}
/**
* Set the language code of the current language .
*
* @ param string $langcode
*/
function setLangcode ( $langcode ) {
$this -> _langcode = $langcode ;
}
/**
* Gets the context this translation belongs to .
*
* @ return string $context
*/
function getContext () {
return $this -> _context ;
}
/**
* Set the context this translation belongs to .
*
* @ param string $context
*/
function setContext ( $context ) {
$this -> _context = $context ;
}
/**
* Gets the source string or the array of strings if the translation has
* plurals .
*
* @ return string or array $translation
*/
function getSource () {
return $this -> _source ;
}
/**
* Set the source string or the array of strings if the translation has
* plurals .
*
* @ param string or array $source
*/
function setSource ( $source ) {
$this -> _source = $source ;
}
/**
* Gets the translation string or the array of strings if the translation has
* plurals .
*
* @ return string or array $translation
*/
function getTranslation () {
return $this -> _translation ;
}
/**
* Set the translation string or the array of strings if the translation has
* plurals .
*
* @ param string or array $translation
*/
function setTranslation ( $translation ) {
$this -> _translation = $translation ;
}
/**
* Set if the translation has plural values .
*
* @ param bool $plural
*/
function setPlural ( $plural ) {
$this -> _plural = $plural ;
}
/**
* Get if the translation has plural values .
*
2015-08-27 12:03:05 -07:00
* @ return bool
2015-08-17 17:00:26 -07:00
*/
function isPlural () {
return $this -> _plural ;
}
/**
* Gets the comment of this translation .
*
* @ return String $comment
*/
function getComment () {
return $this -> _comment ;
}
/**
* Set the comment of this translation .
*
2016-06-02 15:56:09 -07:00
* @ param string $comment
2015-08-17 17:00:26 -07:00
*/
function setComment ( $comment ) {
$this -> _comment = $comment ;
}
/**
* Create the PoItem from a structured array .
*
* @ param array values
*/
public function setFromArray ( array $values = array ()) {
if ( isset ( $values [ 'context' ])) {
$this -> setContext ( $values [ 'context' ]);
}
if ( isset ( $values [ 'source' ])) {
$this -> setSource ( $values [ 'source' ]);
}
if ( isset ( $values [ 'translation' ])) {
$this -> setTranslation ( $values [ 'translation' ]);
}
2016-06-02 15:56:09 -07:00
if ( isset ( $values [ 'comment' ])) {
2015-08-17 17:00:26 -07:00
$this -> setComment ( $values [ 'comment' ]);
}
if ( isset ( $this -> _source ) &&
strpos ( $this -> _source , LOCALE_PLURAL_DELIMITER ) !== FALSE ) {
$this -> setSource ( explode ( LOCALE_PLURAL_DELIMITER , $this -> _source ));
$this -> setTranslation ( explode ( LOCALE_PLURAL_DELIMITER , $this -> _translation ));
2015-10-08 11:40:12 -07:00
$this -> setPlural ( count ( $this -> _source ) > 1 );
2015-08-17 17:00:26 -07:00
}
}
/**
* Output the PoItem as a string .
*/
public function __toString () {
return $this -> formatItem ();
}
/**
* Format the POItem as a string .
*/
private function formatItem () {
$output = '' ;
// Format string context.
if ( ! empty ( $this -> _context )) {
$output .= 'msgctxt ' . $this -> formatString ( $this -> _context );
}
// Format translation.
if ( $this -> _plural ) {
$output .= $this -> formatPlural ();
}
else {
$output .= $this -> formatSingular ();
}
// Add one empty line to separate the translations.
$output .= " \n " ;
return $output ;
}
/**
* Formats a plural translation .
*/
private function formatPlural () {
$output = '' ;
// Format source strings.
$output .= 'msgid ' . $this -> formatString ( $this -> _source [ 0 ]);
$output .= 'msgid_plural ' . $this -> formatString ( $this -> _source [ 1 ]);
foreach ( $this -> _translation as $i => $trans ) {
if ( isset ( $this -> _translation [ $i ])) {
$output .= 'msgstr[' . $i . '] ' . $this -> formatString ( $trans );
}
else {
$output .= 'msgstr[' . $i . '] ""' . " \n " ;
}
}
return $output ;
}
/**
* Formats a singular translation .
*/
private function formatSingular () {
$output = '' ;
$output .= 'msgid ' . $this -> formatString ( $this -> _source );
$output .= 'msgstr ' . ( isset ( $this -> _translation ) ? $this -> formatString ( $this -> _translation ) : '""' );
return $output ;
}
/**
* Formats a string for output on multiple lines .
*/
private function formatString ( $string ) {
// Escape characters for processing.
$string = addcslashes ( $string , " \0 .. \37 \\ \" " );
// Always include a line break after the explicit \n line breaks from
// the source string. Otherwise wrap at 70 chars to accommodate the extra
// format overhead too.
$parts = explode ( " \n " , wordwrap ( str_replace ( '\n' , " \\ n \n " , $string ), 70 , " \n " ));
// Multiline string should be exported starting with a "" and newline to
// have all lines aligned on the same column.
if ( count ( $parts ) > 1 ) {
return " \" \" \n \" " . implode ( " \" \n \" " , $parts ) . " \" \n " ;
}
// Single line strings are output on the same line.
else {
return " \" $parts[0] \" \n " ;
}
}
}