From 775e6d66e0a1a6073935087689a60a1b050ef557 Mon Sep 17 00:00:00 2001 From: Bozhidar Hristov Date: Fri, 23 Dec 2016 12:13:16 +0200 Subject: [PATCH] Fix bug with fallback locales --- src/Repository/Translation.php | 9 +++++++++ src/Translator.php | 35 +++++++++++++++++++++++----------- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/Repository/Translation.php b/src/Repository/Translation.php index 4fc3173..b7a114f 100644 --- a/src/Repository/Translation.php +++ b/src/Repository/Translation.php @@ -22,4 +22,13 @@ public function getTranslations(LanguageEntity $language, $catalogue = "messages $r = $query->getResult(); return $r; } + + public function getTranslationsByLocale($locale, $catalogue = "messages") + { + $query = $this->getEntityManager()->createQuery("SELECT t,token,language FROM ObjectBGTranslationBundle:Translation t JOIN t.translationToken token JOIN t.language language WHERE language.locale = :locale AND t.catalogue = :catalogue"); + $query->setParameter("locale", $locale); + $query->setParameter("catalogue", $catalogue); + $r = $query->getResult(); + return $r; + } } diff --git a/src/Translator.php b/src/Translator.php index ed42ae4..cbd02f3 100644 --- a/src/Translator.php +++ b/src/Translator.php @@ -19,22 +19,35 @@ protected function loadCatalogue($locale) $em = $this->container->get('doctrine.orm.entity_manager'); /* @var $translationRepository \ObjectBG\TranslationBundle\Repository\Translation */ $translationRepository = $em->getRepository("ObjectBGTranslationBundle:Translation"); - /* @var $languageRepository \ObjectBG\TranslationBundle\Repository\Language */ - $languageRepository = $em->getRepository("ObjectBGTranslationBundle:Language"); - - $language = $languageRepository->findOneByLocale($locale); - $domain = 'messages'; - $catalogue = new MessageCatalogue($locale); - if ($language) { - $translations = $translationRepository->getTranslations($language, $domain); - foreach ($translations as $translation) { - $catalogue->set($translation->getTranslationToken()->getToken(), $translation->getTranslation(), $domain); - } + + $translations = $translationRepository->getTranslationsByLocale($locale, $domain); + foreach ($translations as $translation) { + $catalogue->set($translation->getTranslationToken()->getToken(), $translation->getTranslation(), $domain); } $this->catalogues[$locale]->addCatalogue($catalogue); + + $this->loadFallbackCatalogues($locale); + } + + private function loadFallbackCatalogues($locale) + { + $current = $this->catalogues[$locale]; + + foreach ($this->computeFallbackLocales($locale) as $fallback) { + if (!isset($this->catalogues[$fallback])) { + $this->loadCatalogue($fallback); + } + + $fallbackCatalogue = new MessageCatalogue($fallback, $this->catalogues[$fallback]->all()); + foreach ($this->catalogues[$fallback]->getResources() as $resource) { + $fallbackCatalogue->addResource($resource); + } + $current->addFallbackCatalogue($fallbackCatalogue); + $current = $fallbackCatalogue; + } } }