New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix email not translated when installing a new language #16294
Changes from all commits
0d98bb3
c43b59f
57bb1b1
37fdf54
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -33,7 +33,6 @@ | |
use PrestaShop\PrestaShop\Core\MailTemplate\MailTemplateGenerator; | ||
use PrestaShop\PrestaShop\Core\MailTemplate\ThemeCatalogInterface; | ||
use PrestaShop\PrestaShop\Core\MailTemplate\ThemeInterface; | ||
use Symfony\Component\Translation\Loader\ArrayLoader; | ||
use Symfony\Component\Translation\TranslatorInterface; | ||
|
||
/** | ||
|
@@ -99,34 +98,9 @@ public function handle(GenerateThemeMailTemplatesCommand $command) | |
/** @var ThemeInterface $theme */ | ||
$theme = $this->themeCatalog->getByName($command->getThemeName()); | ||
|
||
$this->cleanTranslatorLocaleCache($command->getLanguage()); | ||
|
||
$coreMailsFolder = $command->getCoreMailsFolder() ?: $this->defaultCoreMailsFolder; | ||
$modulesMailFolder = $command->getModulesMailFolder() ?: $this->defaultModulesMailFolder; | ||
|
||
$this->generator->generateTemplates($theme, $language, $coreMailsFolder, $modulesMailFolder, $command->overwriteTemplates()); | ||
} | ||
|
||
/** | ||
* When installing a new Language, if it's a new one the Translator component can't manage it because its cache is | ||
* already filled with the default one as fallback. We force the component to update its cache by adding a fake | ||
* resource for this locale (this is the only way clean its local cache) | ||
* | ||
* @param string $locale | ||
*/ | ||
private function cleanTranslatorLocaleCache($locale) | ||
{ | ||
if (!method_exists($this->translator, 'addLoader') | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Be careful, I remember this check was here for a reason because sometimes the injected translator was not There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think it's fixed but it should be tested. FYI you get DataCollectorTranslator when you're in dev mode (it tracks translation hits for the Symfony profiler) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, actually if I check if those methods exists it will return false because I got a |
||
|| !method_exists($this->translator, 'addResource') | ||
) { | ||
return; | ||
} | ||
|
||
$this->translator->addLoader('array', new ArrayLoader()); | ||
$this->translator->addResource( | ||
'array', | ||
['Fake clean cache message' => 'Fake clean cache message'], | ||
$locale | ||
); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
<?php | ||
|
||
/** | ||
* 2007-2019 PrestaShop SA and Contributors | ||
* | ||
* NOTICE OF LICENSE | ||
* | ||
* This source file is subject to the Open Software License (OSL 3.0) | ||
* that is bundled with this package in the file LICENSE.txt. | ||
* It is also available through the world-wide-web at this URL: | ||
* https://opensource.org/licenses/OSL-3.0 | ||
* If you did not receive a copy of the license and are unable to | ||
* obtain it through the world-wide-web, please send an email | ||
* to license@prestashop.com so we can send you a copy immediately. | ||
* | ||
* DISCLAIMER | ||
* | ||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer | ||
* versions in the future. If you wish to customize PrestaShop for your | ||
* needs please refer to https://www.prestashop.com for more information. | ||
* | ||
* @author PrestaShop SA <contact@prestashop.com> | ||
* @copyright 2007-2019 PrestaShop SA and Contributors | ||
* @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) | ||
* International Registered Trademark & Property of PrestaShop SA | ||
*/ | ||
|
||
namespace PrestaShopBundle\Translation; | ||
|
||
use PrestaShop\PrestaShop\Core\Addon\Theme\Theme; | ||
use PrestaShopBundle\Translation\Loader\SqlTranslationLoader; | ||
use Symfony\Component\Finder\Finder; | ||
use Symfony\Component\Translation\Loader\XliffFileLoader; | ||
use Symfony\Component\Translation\TranslatorInterface; | ||
|
||
class TranslatorLanguageLoader | ||
{ | ||
const TRANSLATION_DIR = _PS_ROOT_DIR_ . '/app/Resources/translations'; | ||
/** | ||
* @var bool | ||
*/ | ||
private $isAdminContext; | ||
|
||
/** | ||
* TranslatorLanguageLoader constructor. | ||
* | ||
* @param $isAdminContext | ||
*/ | ||
public function __construct($isAdminContext) | ||
{ | ||
$this->isAdminContext = $isAdminContext; | ||
} | ||
|
||
/** | ||
* Loads a language into a translator | ||
* | ||
* @param TranslatorInterface $translator Translator to modifiy | ||
* @param string $locale Locale code for the language to load | ||
* @param bool $withDB [default=true] Whether to load translations from the database or not | ||
* @param Theme|null $theme [default=false] Currently active theme (Front office only) | ||
*/ | ||
public function loadLanguage(TranslatorInterface $translator, $locale, $withDB = true, Theme $theme = null) | ||
{ | ||
if (!$translator->isLanguageLoaded($locale)) { | ||
$translator->addLoader('xlf', new XliffFileLoader()); | ||
eternoendless marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
if ($withDB) { | ||
$sqlTranslationLoader = new SqlTranslationLoader(); | ||
if (null !== $theme) { | ||
$sqlTranslationLoader->setTheme($theme); | ||
} | ||
$translator->addLoader('db', $sqlTranslationLoader); | ||
} | ||
|
||
$finder = Finder::create() | ||
->files() | ||
->name('*.' . $locale . '.xlf') | ||
->notName($this->isAdminContext ? '^Shop*' : '^Admin*') | ||
->in($this->getTranslationResourcesDirectories($theme)); | ||
|
||
foreach ($finder as $file) { | ||
list($domain, $locale, $format) = explode('.', $file->getBasename(), 3); | ||
$translator->addResource($format, $file, $locale, $domain); | ||
if ($withDB) { | ||
$translator->addResource('db', $domain . '.' . $locale . '.db', $locale, $domain); | ||
} | ||
} | ||
} | ||
} | ||
|
||
/** | ||
* @param Theme|null $theme | ||
* | ||
* @return array | ||
*/ | ||
protected function getTranslationResourcesDirectories(Theme $theme = null) | ||
{ | ||
$locations = [self::TRANSLATION_DIR]; | ||
|
||
if (null !== $theme) { | ||
$activeThemeLocation = $theme->getDirectory() . '/translations'; | ||
if (is_dir($activeThemeLocation)) { | ||
$locations[] = $activeThemeLocation; | ||
} | ||
} | ||
|
||
return $locations; | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't understand this check? In which case don't you want the database to be loaded? Maybe it's worth a comment here
Besides what other type can
$this->language
be?\Language
? So it means you only disable the db loading during install process? Why?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We don't need to load DB translations when
$this->language
in an instance ofPrestashopBundle\Install\Language
because that's only translations for the web installer and when we load the installer language we didn't configured the DB yet...There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
oooookay, this makes sense but maybe you can add a comment explaining that, because it's not that intuitive at first ^^
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🆙