Created translator and used inside one of the commands

This commit is contained in:
Alejandro Celaya 2016-07-21 15:08:46 +02:00
parent b413b16c86
commit cb99130c1e
11 changed files with 219 additions and 16 deletions

View file

@ -3,6 +3,7 @@ APP_ENV=
SHORTENED_URL_SCHEMA= SHORTENED_URL_SCHEMA=
SHORTENED_URL_HOSTNAME= SHORTENED_URL_HOSTNAME=
SHORTCODE_CHARS= SHORTCODE_CHARS=
DEFAULT_LOCALE=
# Database # Database
DB_USER= DB_USER=

View file

@ -21,10 +21,11 @@
"zendframework/zend-servicemanager": "^3.0", "zendframework/zend-servicemanager": "^3.0",
"zendframework/zend-paginator": "^2.6", "zendframework/zend-paginator": "^2.6",
"zendframework/zend-config": "^2.6", "zendframework/zend-config": "^2.6",
"zendframework/zend-i18n": "^2.7",
"mtymek/expressive-config-manager": "^0.4", "mtymek/expressive-config-manager": "^0.4",
"acelaya/zsm-annotated-services": "^0.2.0",
"doctrine/orm": "^2.5", "doctrine/orm": "^2.5",
"guzzlehttp/guzzle": "^6.2", "guzzlehttp/guzzle": "^6.2",
"acelaya/zsm-annotated-services": "^0.2.0",
"symfony/console": "^3.0" "symfony/console": "^3.0"
}, },
"require-dev": { "require-dev": {

View file

@ -0,0 +1,8 @@
<?php
return [
'translator' => [
'locale' => getenv('DEFAULT_LOCALE') ?: 'en',
],
];

View file

@ -0,0 +1,14 @@
<?php
return [
'translator' => [
'translation_file_patterns' => [
[
'type' => 'gettext',
'base_dir' => __DIR__ . '/../lang',
'pattern' => '%s.mo',
],
],
],
];

BIN
module/CLI/lang/es.mo Normal file

Binary file not shown.

40
module/CLI/lang/es.po Normal file
View file

@ -0,0 +1,40 @@
msgid ""
msgstr ""
"Project-Id-Version: Shlink 1.0\n"
"POT-Creation-Date: 2016-07-21 15:05+0200\n"
"PO-Revision-Date: 2016-07-21 15:08+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: es_ES\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.8.7.1\n"
"X-Poedit-Basepath: ..\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: translate;translatePlural\n"
"X-Poedit-SearchPath-0: src\n"
"X-Poedit-SearchPath-1: config\n"
msgid "Generates a shortcode for provided URL and returns the short URL"
msgstr "Genera un código corto para la URL proporcionada y devuelve la URL acortada"
msgid "The long URL to parse"
msgstr "La URL larga a procesar"
msgid "A long URL was not provided. Which URL do you want to shorten?:"
msgstr "No se ha proporcionado una URL larga. ¿Qué URL deseas acortar?"
msgid "A URL was not provided!"
msgstr "¡No se ha proporcionado una URL!"
msgid "Processed URL:"
msgstr "URL procesada:"
msgid "Generated URL:"
msgstr "URL generada:"
#, php-format
msgid "Provided URL \"%s\" is invalid. Try with a different one."
msgstr "La URL proporcionada \"%s\" e inválida. Prueba con una diferente."

View file

@ -12,6 +12,7 @@ use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question\Question; use Symfony\Component\Console\Question\Question;
use Zend\Diactoros\Uri; use Zend\Diactoros\Uri;
use Zend\I18n\Translator\TranslatorInterface;
class GenerateShortcodeCommand extends Command class GenerateShortcodeCommand extends Command
{ {
@ -23,26 +24,37 @@ class GenerateShortcodeCommand extends Command
* @var array * @var array
*/ */
private $domainConfig; private $domainConfig;
/**
* @var TranslatorInterface
*/
private $translator;
/** /**
* GenerateShortcodeCommand constructor. * GenerateShortcodeCommand constructor.
* @param UrlShortenerInterface|UrlShortener $urlShortener * @param UrlShortenerInterface|UrlShortener $urlShortener
* @param TranslatorInterface $translator
* @param array $domainConfig * @param array $domainConfig
* *
* @Inject({UrlShortener::class, "config.url_shortener.domain"}) * @Inject({UrlShortener::class, "translator", "config.url_shortener.domain"})
*/ */
public function __construct(UrlShortenerInterface $urlShortener, array $domainConfig) public function __construct(
{ UrlShortenerInterface $urlShortener,
parent::__construct(null); TranslatorInterface $translator,
array $domainConfig
) {
$this->urlShortener = $urlShortener; $this->urlShortener = $urlShortener;
$this->translator = $translator;
$this->domainConfig = $domainConfig; $this->domainConfig = $domainConfig;
parent::__construct(null);
} }
public function configure() public function configure()
{ {
$this->setName('shortcode:generate') $this->setName('shortcode:generate')
->setDescription('Generates a shortcode for provided URL and returns the short URL') ->setDescription(
->addArgument('longUrl', InputArgument::REQUIRED, 'The long URL to parse'); $this->translator->translate('Generates a shortcode for provided URL and returns the short URL')
)
->addArgument('longUrl', InputArgument::REQUIRED, $this->translator->translate('The long URL to parse'));
} }
public function interact(InputInterface $input, OutputInterface $output) public function interact(InputInterface $input, OutputInterface $output)
@ -54,9 +66,10 @@ class GenerateShortcodeCommand extends Command
/** @var QuestionHelper $helper */ /** @var QuestionHelper $helper */
$helper = $this->getHelper('question'); $helper = $this->getHelper('question');
$question = new Question( $question = new Question(sprintf(
'<question>A long URL was not provided. Which URL do you want to shorten?:</question> ' '<question>%s</question> ',
); $this->translator->translate('A long URL was not provided. Which URL do you want to shorten?:')
));
$longUrl = $helper->ask($input, $output, $question); $longUrl = $helper->ask($input, $output, $question);
if (! empty($longUrl)) { if (! empty($longUrl)) {
@ -70,7 +83,7 @@ class GenerateShortcodeCommand extends Command
try { try {
if (! isset($longUrl)) { if (! isset($longUrl)) {
$output->writeln('<error>A URL was not provided!</error>'); $output->writeln(sprintf('<error>%s</error>', $this->translator->translate('A URL was not provided!')));
return; return;
} }
@ -80,13 +93,16 @@ class GenerateShortcodeCommand extends Command
->withHost($this->domainConfig['hostname']); ->withHost($this->domainConfig['hostname']);
$output->writeln([ $output->writeln([
sprintf('Processed URL <info>%s</info>', $longUrl), sprintf('%s <info>%s</info>', $this->translator->translate('Processed URL:'), $longUrl),
sprintf('Generated URL <info>%s</info>', $shortUrl), sprintf('%s <info>%s</info>', $this->translator->translate('Generated URL:'), $shortUrl),
]); ]);
} catch (InvalidUrlException $e) { } catch (InvalidUrlException $e) {
$output->writeln( $output->writeln(sprintf(
sprintf('<error>Provided URL "%s" is invalid. Try with a different one.</error>', $longUrl) '<error>' . $this->translator->translate(
); 'Provided URL "%s" is invalid. Try with a different one.'
) . '</error>',
$longUrl
));
} }
} }
} }

View file

@ -4,7 +4,10 @@ use Doctrine\Common\Cache\Cache;
use Doctrine\ORM\EntityManager; use Doctrine\ORM\EntityManager;
use Shlinkio\Shlink\Common\Factory\CacheFactory; use Shlinkio\Shlink\Common\Factory\CacheFactory;
use Shlinkio\Shlink\Common\Factory\EntityManagerFactory; use Shlinkio\Shlink\Common\Factory\EntityManagerFactory;
use Shlinkio\Shlink\Common\Factory\TranslatorFactory;
use Shlinkio\Shlink\Common\Service\IpLocationResolver; use Shlinkio\Shlink\Common\Service\IpLocationResolver;
use Shlinkio\Shlink\Common\Twig\Extension\TranslatorExtension;
use Zend\I18n\Translator\Translator;
use Zend\ServiceManager\Factory\InvokableFactory; use Zend\ServiceManager\Factory\InvokableFactory;
return [ return [
@ -15,10 +18,13 @@ return [
GuzzleHttp\Client::class => InvokableFactory::class, GuzzleHttp\Client::class => InvokableFactory::class,
Cache::class => CacheFactory::class, Cache::class => CacheFactory::class,
IpLocationResolver::class => AnnotatedFactory::class, IpLocationResolver::class => AnnotatedFactory::class,
Translator::class => TranslatorFactory::class,
TranslatorExtension::class => AnnotatedFactory::class,
], ],
'aliases' => [ 'aliases' => [
'em' => EntityManager::class, 'em' => EntityManager::class,
'httpClient' => GuzzleHttp\Client::class, 'httpClient' => GuzzleHttp\Client::class,
'translator' => Translator::class,
AnnotatedFactory::CACHE_SERVICE => Cache::class, AnnotatedFactory::CACHE_SERVICE => Cache::class,
], ],
], ],

View file

@ -0,0 +1,12 @@
<?php
use Shlinkio\Shlink\Common\Twig\Extension\TranslatorExtension;
return [
'twig' => [
'extensions' => [
TranslatorExtension::class,
],
],
];

View file

@ -0,0 +1,30 @@
<?php
namespace Shlinkio\Shlink\Common\Factory;
use Interop\Container\ContainerInterface;
use Interop\Container\Exception\ContainerException;
use Zend\I18n\Translator\Translator;
use Zend\ServiceManager\Exception\ServiceNotCreatedException;
use Zend\ServiceManager\Exception\ServiceNotFoundException;
use Zend\ServiceManager\Factory\FactoryInterface;
class TranslatorFactory implements FactoryInterface
{
/**
* Create an object
*
* @param ContainerInterface $container
* @param string $requestedName
* @param null|array $options
* @return object
* @throws ServiceNotFoundException if unable to resolve the service.
* @throws ServiceNotCreatedException if an exception is raised when
* creating a service.
* @throws ContainerException if any other error occurs
*/
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$config = $container->get('config');
return Translator::factory(isset($config['translator']) ? $config['translator'] : []);
}
}

View file

@ -0,0 +1,75 @@
<?php
namespace Shlinkio\Shlink\Common\Twig\Extension;
use Acelaya\ZsmAnnotatedServices\Annotation\Inject;
use Zend\I18n\Translator\TranslatorInterface;
class TranslatorExtension extends \Twig_Extension implements TranslatorInterface
{
/**
* @var TranslatorInterface
*/
private $translator;
/**
* TranslatorExtension constructor.
* @param TranslatorInterface $translator
*
* @Inject({"translator"})
*/
public function __construct(TranslatorInterface $translator)
{
$this->translator = $translator;
}
/**
* Returns the name of the extension.
*
* @return string The extension name
*/
public function getName()
{
return __CLASS__;
}
public function getFunctions()
{
return [
new \Twig_SimpleFunction('translate', [$this, 'translate']),
new \Twig_SimpleFunction('translate_plural', [$this, 'translatePlural']),
];
}
/**
* Translate a message.
*
* @param string $message
* @param string $textDomain
* @param string $locale
* @return string
*/
public function translate($message, $textDomain = 'default', $locale = null)
{
return $this->translator->translate($message, $textDomain, $locale);
}
/**
* Translate a plural message.
*
* @param string $singular
* @param string $plural
* @param int $number
* @param string $textDomain
* @param string|null $locale
* @return string
*/
public function translatePlural(
$singular,
$plural,
$number,
$textDomain = 'default',
$locale = null
) {
$this->translator->translatePlural($singular, $plural, $number, $textDomain, $locale);
}
}