Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
33.33% |
1 / 3 |
CRAP | |
80.00% |
20 / 25 |
| PluralTranslatableMarkup | |
0.00% |
0 / 1 |
|
50.00% |
2 / 4 |
11.97 | |
80.00% |
20 / 25 |
| __construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
4 / 4 |
|||
| createFromTranslatedString | |
100.00% |
1 / 1 |
1 | |
100.00% |
0 / 0 |
|||
| render | |
0.00% |
0 / 1 |
6.24 | |
81.25% |
13 / 16 |
|||
| getPluralIndex | |
0.00% |
0 / 1 |
3.58 | |
60.00% |
3 / 5 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\Core\StringTranslation\PluralTranslatableMarkup. | |
| */ | |
| namespace Drupal\Core\StringTranslation; | |
| /** | |
| * A class to hold plural translatable markup. | |
| */ | |
| class PluralTranslatableMarkup extends TranslatableMarkup { | |
| /** | |
| * The delimiter used to split plural strings. | |
| * | |
| * This is the ETX (End of text) character and is used as a minimal means to | |
| * separate singular and plural variants in source and translation text. It | |
| * was found to be the most compatible delimiter for the supported databases. | |
| */ | |
| const DELIMITER = "\03"; | |
| /** | |
| * The item count to display. | |
| * | |
| * @var int | |
| */ | |
| protected $count; | |
| /** | |
| * The already translated string. | |
| * | |
| * @var string | |
| */ | |
| protected $translatedString; | |
| /** | |
| * A bool that statically caches whether locale_get_plural() exists. | |
| * | |
| * @var bool | |
| */ | |
| protected static $localeEnabled; | |
| /** | |
| * Constructs a new PluralTranslatableMarkup object. | |
| * | |
| * Parses values passed into this class through the format_plural() function | |
| * in Drupal and handles an optional context for the string. | |
| * | |
| * @param int $count | |
| * The item count to display. | |
| * @param string $singular | |
| * The string for the singular case. Make sure it is clear this is singular, | |
| * to ease translation (e.g. use "1 new comment" instead of "1 new"). Do not | |
| * use @count in the singular string. | |
| * @param string $plural | |
| * The string for the plural case. Make sure it is clear this is plural, to | |
| * ease translation. Use @count in place of the item count, as in | |
| * "@count new comments". | |
| * @param array $args | |
| * (optional) An array with placeholder replacements, keyed by placeholder. | |
| * See \Drupal\Component\Render\FormattableMarkup::placeholderFormat() for | |
| * additional information about placeholders. Note that you do not need to | |
| * include @count in this array; this replacement is done automatically | |
| * for the plural cases. | |
| * @param array $options | |
| * (optional) An associative array of additional options. See t() for | |
| * allowed keys. | |
| * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation | |
| * (optional) The string translation service. | |
| * | |
| * @see \Drupal\Component\Render\FormattableMarkup::placeholderFormat() | |
| */ | |
| public function __construct($count, $singular, $plural, array $args = [], array $options = [], TranslationInterface $string_translation = NULL) { | |
| $this->count = $count; | |
| $translatable_string = implode(static::DELIMITER, array($singular, $plural)); | |
| parent::__construct($translatable_string, $args, $options, $string_translation); | |
| } | |
| /** | |
| * Constructs a new class instance from already translated markup. | |
| * | |
| * This method ensures that the string is pluralized correctly. As opposed | |
| * to the __construct() method, this method is designed to be invoked with | |
| * a string already translated (such as with configuration translation). | |
| * | |
| * @param int $count | |
| * The item count to display. | |
| * @param string $translated_string | |
| * The already translated string. | |
| * @param array $args | |
| * An associative array of replacements to make after translation. Instances | |
| * of any key in this array are replaced with the corresponding value. | |
| * Based on the first character of the key, the value is escaped and/or | |
| * themed. See \Drupal\Component\Utility\SafeMarkup::format(). Note that you | |
| * do not need to include @count in this array; this replacement is done | |
| * automatically for the plural cases. | |
| * @param array $options | |
| * An associative array of additional options. See t() for allowed keys. | |
| * | |
| * @return \Drupal\Core\StringTranslation\PluralTranslatableMarkup | |
| * A PluralTranslatableMarkup object. | |
| */ | |
| public static function createFromTranslatedString($count, $translated_string, array $args = [], array $options = []) { | |
| $plural = new static($count, '', '', $args, $options); | |
| $plural->translatedString = $translated_string; | |
| return $plural; | |
| } | |
| /** | |
| * Renders the object as a string. | |
| * | |
| * @return string | |
| * The translated string. | |
| */ | |
| public function render() { | |
| if (!$this->translatedString) { | |
| $this->translatedString = $this->getStringTranslation()->translateString($this); | |
| } | |
| if ($this->translatedString === '') { | |
| return ''; | |
| } | |
| $arguments = $this->getArguments(); | |
| $arguments['@count'] = $this->count; | |
| $translated_array = explode(static::DELIMITER, $this->translatedString); | |
| if ($this->count == 1) { | |
| return $this->placeholderFormat($translated_array[0], $arguments); | |
| } | |
| $index = $this->getPluralIndex(); | |
| if ($index == 0) { | |
| // Singular form. | |
| $return = $translated_array[0]; | |
| } | |
| else { | |
| if (isset($translated_array[$index])) { | |
| // N-th plural form. | |
| $return = $translated_array[$index]; | |
| } | |
| else { | |
| // If the index cannot be computed or there's no translation, use the | |
| // second plural form as a fallback (which allows for most flexibility | |
| // with the replaceable @count value). | |
| $return = $translated_array[1]; | |
| } | |
| } | |
| return $this->placeholderFormat($return, $arguments); | |
| } | |
| /** | |
| * Gets the plural index through the gettext formula. | |
| * | |
| * @return int | |
| */ | |
| protected function getPluralIndex() { | |
| if (!isset(static::$localeEnabled)) { | |
| static::$localeEnabled = function_exists('locale_get_plural'); | |
| } | |
| if (function_exists('locale_get_plural')) { | |
| return locale_get_plural($this->count, $this->getOption('langcode')); | |
| } | |
| return -1; | |
| } | |
| } |