2015-03-20 23:12:36 +00:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\Translation ;
2019-04-06 18:05:56 +01:00
use Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface ;
2016-09-21 18:16:29 +01:00
use Symfony\Component\Translation\Exception\InvalidArgumentException ;
2018-08-16 14:45:57 +01:00
use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface ;
2018-12-05 07:43:42 +00:00
use Symfony\Contracts\Translation\LocaleAwareInterface ;
2018-08-16 14:45:57 +01:00
use Symfony\Contracts\Translation\TranslatorInterface ;
2016-09-21 18:16:29 +01:00
2015-03-20 23:12:36 +00:00
/**
* @ author Abdellatif Ait boudad < a . aitboudad @ gmail . com >
*/
2019-04-07 10:56:43 +01:00
class DataCollectorTranslator implements LegacyTranslatorInterface , TranslatorInterface , TranslatorBagInterface , WarmableInterface
2015-03-20 23:12:36 +00:00
{
const MESSAGE_DEFINED = 0 ;
const MESSAGE_MISSING = 1 ;
const MESSAGE_EQUALS_FALLBACK = 2 ;
/**
2015-04-14 19:42:21 +01:00
* @ var TranslatorInterface | TranslatorBagInterface
2015-03-20 23:12:36 +00:00
*/
private $translator ;
2019-01-16 20:35:37 +00:00
private $messages = [];
2015-03-20 23:12:36 +00:00
/**
2015-04-14 19:42:21 +01:00
* @ param TranslatorInterface $translator The translator must implement TranslatorBagInterface
2015-03-20 23:12:36 +00:00
*/
2018-10-01 12:27:53 +01:00
public function __construct ( $translator )
2015-03-20 23:12:36 +00:00
{
2018-10-01 12:27:53 +01:00
if ( ! $translator instanceof LegacyTranslatorInterface && ! $translator instanceof TranslatorInterface ) {
throw new \TypeError ( sprintf ( 'Argument 1 passed to %s() must be an instance of %s, %s given.' , __METHOD__ , TranslatorInterface :: class , \is_object ( $translator ) ? \get_class ( $translator ) : \gettype ( $translator )));
}
2018-12-05 07:43:42 +00:00
if ( ! $translator instanceof TranslatorBagInterface || ! $translator instanceof LocaleAwareInterface ) {
throw new InvalidArgumentException ( sprintf ( 'The Translator "%s" must implement TranslatorInterface, TranslatorBagInterface and LocaleAwareInterface.' , \get_class ( $translator )));
2015-03-20 23:12:36 +00:00
}
$this -> translator = $translator ;
}
/**
* { @ inheritdoc }
*/
2019-01-16 20:35:37 +00:00
public function trans ( $id , array $parameters = [], $domain = null , $locale = null )
2015-03-20 23:12:36 +00:00
{
$trans = $this -> translator -> trans ( $id , $parameters , $domain , $locale );
2015-06-28 22:42:39 +01:00
$this -> collectMessage ( $locale , $domain , $id , $trans , $parameters );
2015-03-20 23:12:36 +00:00
return $trans ;
}
/**
* { @ inheritdoc }
2018-10-01 12:27:53 +01:00
*
* @ deprecated since Symfony 4.2 , use the trans () method instead with a % count % parameter
2015-03-20 23:12:36 +00:00
*/
2019-01-16 20:35:37 +00:00
public function transChoice ( $id , $number , array $parameters = [], $domain = null , $locale = null )
2015-03-20 23:12:36 +00:00
{
2018-10-01 12:27:53 +01:00
if ( $this -> translator instanceof TranslatorInterface ) {
2019-01-16 20:35:37 +00:00
$trans = $this -> translator -> trans ( $id , [ '%count%' => $number ] + $parameters , $domain , $locale );
2019-05-23 14:37:34 +01:00
} else {
$trans = $this -> translator -> transChoice ( $id , $number , $parameters , $domain , $locale );
2018-09-05 20:29:06 +01:00
}
2019-01-16 20:35:37 +00:00
$this -> collectMessage ( $locale , $domain , $id , $trans , [ '%count%' => $number ] + $parameters );
2015-03-20 23:12:36 +00:00
return $trans ;
}
/**
* { @ inheritdoc }
*/
public function setLocale ( $locale )
{
$this -> translator -> setLocale ( $locale );
}
/**
* { @ inheritdoc }
*/
public function getLocale ()
{
return $this -> translator -> getLocale ();
}
/**
* { @ inheritdoc }
*/
public function getCatalogue ( $locale = null )
{
return $this -> translator -> getCatalogue ( $locale );
}
2019-04-06 18:05:56 +01:00
/**
* { @ inheritdoc }
*/
public function warmUp ( $cacheDir )
{
2019-04-06 19:39:34 +01:00
if ( $this -> translator instanceof WarmableInterface ) {
$this -> translator -> warmUp ( $cacheDir );
}
2019-04-06 18:05:56 +01:00
}
2016-11-09 20:23:10 +00:00
/**
* Gets the fallback locales .
*
2018-11-18 21:25:02 +00:00
* @ return array The fallback locales
2016-11-09 20:23:10 +00:00
*/
public function getFallbackLocales ()
{
2017-06-21 12:02:23 +01:00
if ( $this -> translator instanceof Translator || method_exists ( $this -> translator , 'getFallbackLocales' )) {
2016-11-09 20:23:10 +00:00
return $this -> translator -> getFallbackLocales ();
}
2019-01-16 20:35:37 +00:00
return [];
2016-11-09 20:23:10 +00:00
}
2015-03-20 23:12:36 +00:00
/**
* Passes through all unknown calls onto the translator object .
*/
public function __call ( $method , $args )
{
2018-09-11 08:26:54 +01:00
return $this -> translator -> { $method }( ... $args );
2015-03-20 23:12:36 +00:00
}
/**
* @ return array
*/
public function getCollectedMessages ()
{
return $this -> messages ;
}
/**
* @ param string | null $locale
* @ param string | null $domain
* @ param string $id
2015-06-28 22:42:39 +01:00
* @ param string $translation
* @ param array | null $parameters
2015-03-20 23:12:36 +00:00
*/
2019-01-16 20:35:37 +00:00
private function collectMessage ( $locale , $domain , $id , $translation , $parameters = [])
2015-03-20 23:12:36 +00:00
{
if ( null === $domain ) {
$domain = 'messages' ;
}
$id = ( string ) $id ;
$catalogue = $this -> translator -> getCatalogue ( $locale );
2015-04-16 11:20:34 +01:00
$locale = $catalogue -> getLocale ();
2015-03-20 23:12:36 +00:00
if ( $catalogue -> defines ( $id , $domain )) {
$state = self :: MESSAGE_DEFINED ;
} elseif ( $catalogue -> has ( $id , $domain )) {
$state = self :: MESSAGE_EQUALS_FALLBACK ;
2016-07-22 15:17:18 +01:00
$fallbackCatalogue = $catalogue -> getFallbackCatalogue ();
2015-03-20 23:12:36 +00:00
while ( $fallbackCatalogue ) {
if ( $fallbackCatalogue -> defines ( $id , $domain )) {
$locale = $fallbackCatalogue -> getLocale ();
break ;
}
2015-04-03 08:53:14 +01:00
2016-07-22 15:17:18 +01:00
$fallbackCatalogue = $fallbackCatalogue -> getFallbackCatalogue ();
2015-03-20 23:12:36 +00:00
}
} else {
$state = self :: MESSAGE_MISSING ;
}
2019-01-16 20:35:37 +00:00
$this -> messages [] = [
2015-03-20 23:12:36 +00:00
'locale' => $locale ,
'domain' => $domain ,
'id' => $id ,
'translation' => $translation ,
2015-06-28 22:42:39 +01:00
'parameters' => $parameters ,
2015-03-20 23:12:36 +00:00
'state' => $state ,
2018-10-01 12:27:53 +01:00
'transChoiceNumber' => isset ( $parameters [ '%count%' ]) && is_numeric ( $parameters [ '%count%' ]) ? $parameters [ '%count%' ] : null ,
2019-01-16 20:35:37 +00:00
];
2015-03-20 23:12:36 +00:00
}
}