wiki.techinc.nl/includes/Message/TextFormatter.php
Tim Starling 09cd8eb080 MessageFormatterFactory
An injectable service interface for message formatting, somewhat
narrowed compared to Message.

Only the text format is implemented in this framework so far, with
getTextFormatter() returning a formatter that converts to the text
format. Other formatters could be added to MessageFormatterFactory.

Bug: T226598
Change-Id: Id053074c1dbcb692e8309fdca602f94a385bca0c
2019-08-28 12:28:05 +10:00

74 lines
1.9 KiB
PHP

<?php
namespace MediaWiki\Message;
use Wikimedia\Message\ITextFormatter;
use Wikimedia\Message\ListParam;
use Wikimedia\Message\MessageParam;
use Wikimedia\Message\MessageValue;
use Wikimedia\Message\ParamType;
use Message;
/**
* The MediaWiki-specific implementation of ITextFormatter
*/
class TextFormatter implements ITextFormatter {
/** @var string */
private $langCode;
/**
* Construct a TextFormatter.
*
* The type signature may change without notice as dependencies are added
* to the constructor. External callers should use
* MediaWikiServices::getMessageFormatterFactory()
*
* @internal
*/
public function __construct( $langCode ) {
$this->langCode = $langCode;
}
/**
* Allow the Message class to be mocked in tests by constructing objects in
* a protected method.
*
* @internal
* @param string $key
* @return Message
*/
protected function createMessage( $key ) {
return new Message( $key );
}
public function getLangCode() {
return $this->langCode;
}
private static function convertParam( MessageParam $param ) {
if ( $param instanceof ListParam ) {
$convertedElements = [];
foreach ( $param->getValue() as $element ) {
$convertedElements[] = self::convertParam( $element );
}
return Message::listParam( $convertedElements, $param->getListType() );
} elseif ( $param instanceof MessageParam ) {
if ( $param->getType() === ParamType::TEXT ) {
return $param->getValue();
} else {
return [ $param->getType() => $param->getValue() ];
}
} else {
throw new \InvalidArgumentException( 'Invalid message parameter type' );
}
}
public function format( MessageValue $mv ) {
$message = $this->createMessage( $mv->getKey() );
foreach ( $mv->getParams() as $param ) {
$message->params( self::convertParam( $param ) );
}
$message->inLanguage( $this->langCode );
return $message->text();
}
}