bundle/w3des/AdminBundle/src/Controller/I18nController.php line 30

Open in your IDE?
  1. <?php
  2. namespace w3des\AdminBundle\Controller;
  3. use Symfony\Contracts\Cache\CacheInterface;
  4. use Symfony\Contracts\Cache\ItemInterface;
  5. use Symfony\Contracts\Translation\TranslatorInterface;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use w3des\AdminBundle\Service\I18n;
  9. class I18nController
  10. {
  11. private CacheInterface $cache;
  12. private TranslatorInterface $translator;
  13. private int $expire;
  14. private I18n $i18n;
  15. public function __construct(I18n $i18n, CacheInterface $cache, TranslatorInterface $translator)
  16. {
  17. $this->cache = $cache;
  18. $this->translator = $translator;
  19. $this->expire = 3600 * 24 * 7;
  20. $this->i18n = $i18n;
  21. }
  22. public function __invoke(Request $request, string $domain, bool $simple, string $_locale, string $hash = null)
  23. {
  24. $res = new Response();
  25. $res->setEtag( md5($_locale . ($simple ? 'T' : 'N') . ($hash ?: $this->i18n->getHash())), true);
  26. $res->setLastModified(new \DateTime('@' . $this->i18n->getHash()));
  27. $res->setPublic();
  28. $res->setVary('Authorization,User-Agent');
  29. if ($hash) {
  30. $res->setMaxAge($this->expire);
  31. $res->headers->addCacheControlDirective('must-revalidate', true);
  32. }
  33. if ($res->isNotModified($request)) {
  34. return $res;
  35. }
  36. $res->setContent($this->load($domain, $simple, $_locale));
  37. $res->headers->set('Content-Type', 'text/javascript');
  38. $res->setStatusCode(200);
  39. return $res;
  40. }
  41. private function load(string $domain, bool $simple, string $_locale) {
  42. return $this->cache->get('locale.' . $domain . '.' . $_locale . ($simple ? '.simple' : ''), function (ItemInterface $item) use ($domain, $_locale, $simple) {
  43. /** @var \Symfony\Component\Translation\TranslatorBagInterface $trans */
  44. $item->tag(I18n::CACHE_TAG);
  45. $messages = [];
  46. $prefix = $simple ? '' : ($domain . '.');
  47. $fallback = $this->translator->getCatalogue($_locale)
  48. ->getFallbackCatalogue();
  49. if ($fallback->getFallbackCatalogue()) {
  50. foreach ($fallback->getFallbackCatalogue()
  51. ->all($domain) as $k => $v) {
  52. $messages[$prefix . $k] = $v;
  53. }
  54. }
  55. foreach ($fallback->all($domain) as $k => $v) {
  56. $messages[$prefix . $k] = $v;
  57. }
  58. if ($fallback->getLocale() != $_locale) {
  59. foreach ($this->translator->getCatalogue($_locale)
  60. ->all($domain) as $k => $v) {
  61. $messages[$prefix . $k] = $v;
  62. }
  63. }
  64. return sprintf("window.i18n = window.i18n || { locale : '%s', fallback : '%s', domain: {}, flat: {} };
  65. window.i18n.domain = {...window.i18n.domain, ...%s};
  66. ", $_locale, $fallback->getLocale(), \json_encode($messages, \JSON_UNESCAPED_UNICODE));
  67. });
  68. }
  69. }