2018-02-01 20:01:12 +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 ;
use Psr\Log\LoggerInterface ;
use Symfony\Component\Translation\Exception\InvalidArgumentException ;
2019-01-18 18:33:28 +00:00
use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface ;
use Symfony\Contracts\Translation\LocaleAwareInterface ;
use Symfony\Contracts\Translation\TranslatorInterface ;
2018-02-01 20:01:12 +00:00
/**
* @ author Abdellatif Ait boudad < a . aitboudad @ gmail . com >
*/
2019-01-18 18:33:28 +00:00
class LoggingTranslator implements TranslatorInterface , LegacyTranslatorInterface , TranslatorBagInterface
2018-02-01 20:01:12 +00:00
{
/**
* @ var TranslatorInterface | TranslatorBagInterface
*/
private $translator ;
private $logger ;
/**
* @ param TranslatorInterface $translator The translator must implement TranslatorBagInterface
* @ param LoggerInterface $logger
*/
2019-01-18 18:33:28 +00:00
public function __construct ( $translator , LoggerInterface $logger )
2018-02-01 20:01:12 +00:00
{
2019-01-18 18:33:28 +00: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 )));
}
if ( ! $translator instanceof TranslatorBagInterface || ! $translator instanceof LocaleAwareInterface ) {
throw new InvalidArgumentException ( sprintf ( 'The Translator "%s" must implement TranslatorInterface, TranslatorBagInterface and LocaleAwareInterface.' , \get_class ( $translator )));
2018-02-01 20:01:12 +00:00
}
$this -> translator = $translator ;
$this -> logger = $logger ;
}
/**
* { @ inheritdoc }
*/
public function trans ( $id , array $parameters = array (), $domain = null , $locale = null )
{
$trans = $this -> translator -> trans ( $id , $parameters , $domain , $locale );
$this -> log ( $id , $domain , $locale );
return $trans ;
}
/**
* { @ inheritdoc }
2019-01-18 18:33:28 +00:00
*
* @ deprecated since Symfony 4.2 , use the trans () method instead with a % count % parameter
2018-02-01 20:01:12 +00:00
*/
public function transChoice ( $id , $number , array $parameters = array (), $domain = null , $locale = null )
{
2019-01-18 18:33:28 +00:00
@ trigger_error ( sprintf ( 'The "%s()" method is deprecated since Symfony 4.2, use the trans() one instead with a "%count%" parameter.' , __METHOD__ ), E_USER_DEPRECATED );
if ( $this -> translator instanceof TranslatorInterface ) {
$trans = $this -> translator -> trans ( $id , array ( '%count%' => $number ) + $parameters , $domain , $locale );
} else {
$trans = $this -> translator -> transChoice ( $id , $number , $parameters , $domain , $locale );
}
2018-02-01 20:01:12 +00:00
$this -> log ( $id , $domain , $locale );
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 );
}
/**
* Gets the fallback locales .
*
2019-01-18 18:33:28 +00:00
* @ return array The fallback locales
2018-02-01 20:01:12 +00:00
*/
public function getFallbackLocales ()
{
if ( $this -> translator instanceof Translator || method_exists ( $this -> translator , 'getFallbackLocales' )) {
return $this -> translator -> getFallbackLocales ();
}
return array ();
}
/**
* Passes through all unknown calls onto the translator object .
*/
public function __call ( $method , $args )
{
2019-01-18 18:33:28 +00:00
return $this -> translator -> { $method }( ... $args );
2018-02-01 20:01:12 +00:00
}
/**
* Logs for missing translations .
*
* @ param string $id
* @ param string | null $domain
* @ param string | null $locale
*/
private function log ( $id , $domain , $locale )
{
if ( null === $domain ) {
$domain = 'messages' ;
}
$id = ( string ) $id ;
$catalogue = $this -> translator -> getCatalogue ( $locale );
if ( $catalogue -> defines ( $id , $domain )) {
return ;
}
if ( $catalogue -> has ( $id , $domain )) {
$this -> logger -> debug ( 'Translation use fallback catalogue.' , array ( 'id' => $id , 'domain' => $domain , 'locale' => $catalogue -> getLocale ()));
} else {
$this -> logger -> warning ( 'Translation not found.' , array ( 'id' => $id , 'domain' => $domain , 'locale' => $catalogue -> getLocale ()));
}
}
}