Spaces:
No application file
No application file
| namespace Mautic\CoreBundle\Loader; | |
| use Mautic\CoreBundle\Helper\BundleHelper; | |
| use Mautic\CoreBundle\Helper\PathsHelper; | |
| use Symfony\Component\Finder\Finder; | |
| use Symfony\Component\Translation\Loader\ArrayLoader; | |
| use Symfony\Component\Translation\Loader\LoaderInterface; | |
| use Symfony\Component\Translation\MessageCatalogue; | |
| class TranslationLoader extends ArrayLoader implements LoaderInterface | |
| { | |
| public function __construct( | |
| private BundleHelper $bundleHelper, | |
| private PathsHelper $pathsHelper | |
| ) { | |
| } | |
| public function load($resource, $locale, $domain = 'messages') | |
| { | |
| $bundles = $this->bundleHelper->getMauticBundles(true); | |
| $catalogue = new MessageCatalogue($locale); | |
| // Bundle translations | |
| foreach ($bundles as $bundle) { | |
| // load translations | |
| $translations = $bundle['directory'].'/Translations/'.$locale; | |
| if (file_exists($translations)) { | |
| $iniFiles = new Finder(); | |
| $iniFiles->files()->in($translations)->name('*.ini'); | |
| foreach ($iniFiles as $file) { | |
| $this->loadTranslations($catalogue, $locale, $file); | |
| } | |
| } | |
| } | |
| // Theme translations | |
| $themeDir = $this->pathsHelper->getSystemPath('current_theme', true); | |
| if (file_exists($themeTranslation = $themeDir.'/translations/'.$locale)) { | |
| $iniFiles = new Finder(); | |
| $iniFiles->files()->in($themeTranslation)->name('*.ini'); | |
| foreach ($iniFiles as $file) { | |
| $this->loadTranslations($catalogue, $locale, $file); | |
| } | |
| } | |
| // 3rd Party translations | |
| $translationsDir = $this->pathsHelper->getSystemPath('translations', true).'/'.$locale; | |
| if (file_exists($translationsDir)) { | |
| $iniFiles = new Finder(); | |
| $iniFiles->files()->in($translationsDir)->name('*.ini'); | |
| foreach ($iniFiles as $file) { | |
| $this->loadTranslations($catalogue, $locale, $file); | |
| } | |
| } | |
| // Overrides | |
| $overridesDir = $this->pathsHelper->getSystemPath('translations', true).'/overrides/'.$locale; | |
| if (file_exists($overridesDir)) { | |
| $iniFiles = new Finder(); | |
| $iniFiles->files()->in($overridesDir)->name('*.ini'); | |
| foreach ($iniFiles as $file) { | |
| $this->loadTranslations($catalogue, $locale, $file); | |
| } | |
| } | |
| return $catalogue; | |
| } | |
| /** | |
| * Load the translation into the catalogue. | |
| * | |
| * @throws \Exception | |
| */ | |
| private function loadTranslations($catalogue, $locale, $file): void | |
| { | |
| $iniFile = $file->getRealpath(); | |
| $content = file_get_contents($iniFile); | |
| $messages = parse_ini_string($content, true); | |
| if (false === $messages) { | |
| // The translation file is corrupt | |
| if ('dev' === MAUTIC_ENV) { | |
| throw new \Exception($iniFile.' is corrupted'); | |
| } | |
| return; | |
| } | |
| $domain = substr($file->getFilename(), 0, -4); | |
| $thisCatalogue = parent::load($messages, $locale, $domain); | |
| $catalogue->addCatalogue($thisCatalogue); | |
| } | |
| } | |