diff --git a/vendor/magento/module-catalog-import-export/Model/Import/Product.php b/vendor/magento/module-catalog-import-export/Model/Import/Product.php index bec6517e8fb..8b1728135eb 100644 --- a/vendor/magento/module-catalog-import-export/Model/Import/Product.php +++ b/vendor/magento/module-catalog-import-export/Model/Import/Product.php @@ -16,6 +16,7 @@ use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface as Va use Magento\CatalogImportExport\Model\Import\Product\Skip; use Magento\CatalogImportExport\Model\Import\Product\StatusProcessor; use Magento\CatalogImportExport\Model\Import\Product\StockProcessor; +use Magento\CatalogImportExport\Model\Import\Product\Type\AbstractType; use Magento\CatalogImportExport\Model\StockItemImporterInterface; use Magento\CatalogImportExport\Model\StockItemProcessorInterface; use Magento\CatalogInventory\Api\Data\StockItemInterface; @@ -462,7 +463,7 @@ class Product extends AbstractEntity /** * Array of supported product types as keys with appropriate model object as value. * - * @var \Magento\CatalogImportExport\Model\Import\Product\Type\AbstractType[] + * @var AbstractType[] */ protected $_productTypeModels = []; @@ -1223,6 +1224,11 @@ class Product extends AbstractEntity */ protected function _initTypeModels() { + // When multiple imports are processed in a single php process, + // these memory caches may interfere with the import result. + AbstractType::$commonAttributesCache = []; + AbstractType::$invAttributesCache = []; + AbstractType::$attributeCodeToId = []; $productTypes = $this->_importConfig->getEntityTypes($this->getEntityTypeCode()); $fieldsMap = []; $specialAttributes = []; @@ -1234,11 +1240,11 @@ class Product extends AbstractEntity __('Entity type model \'%1\' is not found', $productTypeConfig['model']) ); } - if (!$model instanceof \Magento\CatalogImportExport\Model\Import\Product\Type\AbstractType) { + if (!$model instanceof AbstractType) { throw new LocalizedException( __( 'Entity type model must be an instance of ' - . \Magento\CatalogImportExport\Model\Import\Product\Type\AbstractType::class + . AbstractType::class ) ); } @@ -2681,7 +2687,7 @@ class Product extends AbstractEntity // set attribute set code into row data for followed attribute validation in type model $rowData[self::COL_ATTR_SET] = $newSku['attr_set_code']; - /** @var \Magento\CatalogImportExport\Model\Import\Product\Type\AbstractType $productTypeValidator */ + /** @var AbstractType $productTypeValidator */ // isRowValid can add error to general errors pull if row is invalid $productTypeValidator = $this->_productTypeModels[$newSku['type_id']]; $productTypeValidator->isRowValid( diff --git a/vendor/magento/module-import-export/Controller/Adminhtml/ImportResult.php b/vendor/magento/module-import-export/Controller/Adminhtml/ImportResult.php index 4092879e236..81347ce41a9 100644 --- a/vendor/magento/module-import-export/Controller/Adminhtml/ImportResult.php +++ b/vendor/magento/module-import-export/Controller/Adminhtml/ImportResult.php @@ -5,39 +5,43 @@ */ namespace Magento\ImportExport\Controller\Adminhtml; -use Magento\Backend\App\Action; -use Magento\ImportExport\Model\Import\Entity\AbstractEntity; +use Magento\Backend\App\Action\Context; +use Magento\Framework\View\Element\AbstractBlock; +use Magento\ImportExport\Helper\Report; +use Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingError; use Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingErrorAggregatorInterface; use Magento\ImportExport\Model\History as ModelHistory; use Magento\Framework\Escaper; use Magento\Framework\App\ObjectManager; +use Magento\ImportExport\Model\Import\RenderErrorMessages; +use Magento\ImportExport\Model\Report\ReportProcessorInterface; /** * Import controller */ abstract class ImportResult extends Import { - const IMPORT_HISTORY_FILE_DOWNLOAD_ROUTE = '*/history/download'; + public const IMPORT_HISTORY_FILE_DOWNLOAD_ROUTE = '*/history/download'; /** * Limit view errors */ - const LIMIT_ERRORS_MESSAGE = 100; + public const LIMIT_ERRORS_MESSAGE = 100; /** - * @var \Magento\ImportExport\Model\Report\ReportProcessorInterface + * @var ReportProcessorInterface */ - protected $reportProcessor; + protected ReportProcessorInterface $reportProcessor; /** - * @var \Magento\ImportExport\Model\History + * @var ModelHistory */ - protected $historyModel; + protected ModelHistory $historyModel; /** - * @var \Magento\ImportExport\Helper\Report + * @var Report */ - protected $reportHelper; + protected Report $reportHelper; /** * @var Escaper|null @@ -45,18 +49,25 @@ abstract class ImportResult extends Import protected $escaper; /** - * @param \Magento\Backend\App\Action\Context $context - * @param \Magento\ImportExport\Model\Report\ReportProcessorInterface $reportProcessor - * @param \Magento\ImportExport\Model\History $historyModel - * @param \Magento\ImportExport\Helper\Report $reportHelper + * @var RenderErrorMessages + */ + private RenderErrorMessages $renderErrorMessages; + + /** + * @param Context $context + * @param ReportProcessorInterface $reportProcessor + * @param ModelHistory $historyModel + * @param Report $reportHelper * @param Escaper|null $escaper + * @param RenderErrorMessages|null $renderErrorMessages */ public function __construct( - \Magento\Backend\App\Action\Context $context, - \Magento\ImportExport\Model\Report\ReportProcessorInterface $reportProcessor, - \Magento\ImportExport\Model\History $historyModel, - \Magento\ImportExport\Helper\Report $reportHelper, - Escaper $escaper = null + Context $context, + ReportProcessorInterface $reportProcessor, + ModelHistory $historyModel, + Report $reportHelper, + Escaper $escaper = null, + ?RenderErrorMessages $renderErrorMessages = null ) { parent::__construct($context); $this->reportProcessor = $reportProcessor; @@ -64,46 +75,25 @@ abstract class ImportResult extends Import $this->reportHelper = $reportHelper; $this->escaper = $escaper ?? ObjectManager::getInstance()->get(Escaper::class); + $this->renderErrorMessages = $renderErrorMessages ?? + ObjectManager::getInstance()->get(RenderErrorMessages::class); } /** * Add Error Messages for Import * - * @param \Magento\Framework\View\Element\AbstractBlock $resultBlock + * @param AbstractBlock $resultBlock * @param ProcessingErrorAggregatorInterface $errorAggregator * @return $this */ protected function addErrorMessages( - \Magento\Framework\View\Element\AbstractBlock $resultBlock, + AbstractBlock $resultBlock, ProcessingErrorAggregatorInterface $errorAggregator ) { if ($errorAggregator->getErrorsCount()) { - $message = ''; - $counter = 0; - $escapedMessages = []; - foreach ($this->getErrorMessages($errorAggregator) as $error) { - $escapedMessages[] = (++$counter) . '. ' . $this->escaper->escapeHtml($error); - if ($counter >= self::LIMIT_ERRORS_MESSAGE) { - break; - } - } - if ($errorAggregator->hasFatalExceptions()) { - foreach ($this->getSystemExceptions($errorAggregator) as $error) { - $escapedMessages[] = $this->escaper->escapeHtml($error->getErrorMessage()) - . ' ' - . __('Show more') . '
' . __('Additional data') . ': ' - . $this->escaper->escapeHtml($error->getErrorDescription()) . '
'; - } - } try { - $message .= implode('
', $escapedMessages); $resultBlock->addNotice( - '' . __('Following Error(s) has been occurred during importing process:') . '
' - . '
' . __('Only the first 100 errors are shown. ') - . '' . __('Download full report') . '
' - . '
' . $message . '
' + $this->renderErrorMessages->renderMessages($errorAggregator) ); } catch (\Exception $e) { foreach ($this->getErrorMessages($errorAggregator) as $errorMessage) { @@ -118,28 +108,23 @@ abstract class ImportResult extends Import /** * Get all Error Messages from Import Results * - * @param \Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingErrorAggregatorInterface $errorAggregator + * @param ProcessingErrorAggregatorInterface $errorAggregator * @return array */ protected function getErrorMessages(ProcessingErrorAggregatorInterface $errorAggregator) { - $messages = []; - $rowMessages = $errorAggregator->getRowsGroupedByErrorCode([], [AbstractEntity::ERROR_CODE_SYSTEM_EXCEPTION]); - foreach ($rowMessages as $errorCode => $rows) { - $messages[] = $errorCode . ' ' . __('in row(s):') . ' ' . implode(', ', $rows); - } - return $messages; + return $this->renderErrorMessages->getErrorMessages($errorAggregator); } /** * Get System Generated Exception * * @param ProcessingErrorAggregatorInterface $errorAggregator - * @return \Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingError[] + * @return ProcessingError[] */ protected function getSystemExceptions(ProcessingErrorAggregatorInterface $errorAggregator) { - return $errorAggregator->getErrorsByCode([AbstractEntity::ERROR_CODE_SYSTEM_EXCEPTION]); + return $this->renderErrorMessages->getSystemExceptions($errorAggregator); } /** @@ -150,15 +135,7 @@ abstract class ImportResult extends Import */ protected function createErrorReport(ProcessingErrorAggregatorInterface $errorAggregator) { - $this->historyModel->loadLastInsertItem(); - $sourceFile = $this->reportHelper->getReportAbsolutePath($this->historyModel->getImportedFile()); - $writeOnlyErrorItems = true; - if ($this->historyModel->getData('execution_time') == ModelHistory::IMPORT_VALIDATION) { - $writeOnlyErrorItems = false; - } - $fileName = $this->reportProcessor->createReport($sourceFile, $errorAggregator, $writeOnlyErrorItems); - $this->historyModel->addErrorReportFile($fileName); - return $fileName; + return $this->renderErrorMessages->createErrorReport($errorAggregator); } /** @@ -169,6 +146,6 @@ abstract class ImportResult extends Import */ protected function createDownloadUrlImportHistoryFile($fileName) { - return $this->getUrl(self::IMPORT_HISTORY_FILE_DOWNLOAD_ROUTE, ['filename' => $fileName]); + return $this->renderErrorMessages->createDownloadUrlImportHistoryFile($fileName); } } diff --git a/vendor/magento/module-import-export/Model/Export.php b/vendor/magento/module-import-export/Model/Export.php index 033f9849b73..37f2579b9e9 100644 --- a/vendor/magento/module-import-export/Model/Export.php +++ b/vendor/magento/module-import-export/Model/Export.php @@ -6,6 +6,12 @@ namespace Magento\ImportExport\Model; +use Magento\Framework\App\ObjectManager; +use Magento\Framework\Filesystem; +use Magento\ImportExport\Model\Export\ConfigInterface; +use Magento\ImportExport\Model\Export\Entity\Factory; +use Psr\Log\LoggerInterface; + /** * Export model * @@ -80,12 +86,18 @@ class Export extends \Magento\ImportExport\Model\AbstractModel ]; /** - * @param \Psr\Log\LoggerInterface $logger - * @param \Magento\Framework\Filesystem $filesystem - * @param \Magento\ImportExport\Model\Export\ConfigInterface $exportConfig - * @param \Magento\ImportExport\Model\Export\Entity\Factory $entityFactory + * @var LocaleEmulatorInterface + */ + private $localeEmulator; + + /** + * @param LoggerInterface $logger + * @param Filesystem $filesystem + * @param ConfigInterface $exportConfig + * @param Factory $entityFactory * @param \Magento\ImportExport\Model\Export\Adapter\Factory $exportAdapterFac * @param array $data + * @param LocaleEmulatorInterface|null $localeEmulator */ public function __construct( \Psr\Log\LoggerInterface $logger, @@ -93,12 +105,14 @@ class Export extends \Magento\ImportExport\Model\AbstractModel \Magento\ImportExport\Model\Export\ConfigInterface $exportConfig, \Magento\ImportExport\Model\Export\Entity\Factory $entityFactory, \Magento\ImportExport\Model\Export\Adapter\Factory $exportAdapterFac, - array $data = [] + array $data = [], + ?LocaleEmulatorInterface $localeEmulator = null ) { $this->_exportConfig = $exportConfig; $this->_entityFactory = $entityFactory; $this->_exportAdapterFac = $exportAdapterFac; parent::__construct($logger, $filesystem, $data); + $this->localeEmulator = $localeEmulator ?? ObjectManager::getInstance()->get(LocaleEmulatorInterface::class); } /** @@ -190,6 +204,20 @@ class Export extends \Magento\ImportExport\Model\AbstractModel * @throws \Magento\Framework\Exception\LocalizedException */ public function export() + { + return $this->localeEmulator->emulate( + $this->exportCallback(...), + $this->getData('locale') ?: null + ); + } + + /** + * Export data. + * + * @return string + * @throws \Magento\Framework\Exception\LocalizedException + */ + private function exportCallback() { if (isset($this->_data[self::FILTER_ELEMENT_GROUP])) { $this->addLogComment(__('Begin export of %1', $this->getEntity())); diff --git a/vendor/magento/module-import-export/Model/Export/Consumer.php b/vendor/magento/module-import-export/Model/Export/Consumer.php index e83f508037d..7623677a478 100644 --- a/vendor/magento/module-import-export/Model/Export/Consumer.php +++ b/vendor/magento/module-import-export/Model/Export/Consumer.php @@ -11,7 +11,6 @@ use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\Exception\FileSystemException; use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Filesystem; -use Magento\Framework\Locale\ResolverInterface; use Magento\ImportExport\Api\Data\LocalizedExportInfoInterface; use Magento\ImportExport\Api\ExportManagementInterface; use Magento\Framework\Notification\NotifierInterface; @@ -41,31 +40,23 @@ class Consumer */ private $filesystem; - /** - * @var ResolverInterface - */ - private $localeResolver; - /** * Consumer constructor. * @param \Psr\Log\LoggerInterface $logger * @param ExportManagementInterface $exportManager * @param Filesystem $filesystem * @param NotifierInterface $notifier - * @param ResolverInterface $localeResolver */ public function __construct( \Psr\Log\LoggerInterface $logger, ExportManagementInterface $exportManager, Filesystem $filesystem, - NotifierInterface $notifier, - ResolverInterface $localeResolver + NotifierInterface $notifier ) { $this->logger = $logger; $this->exportManager = $exportManager; $this->filesystem = $filesystem; $this->notifier = $notifier; - $this->localeResolver = $localeResolver; } /** @@ -76,11 +67,6 @@ class Consumer */ public function process(LocalizedExportInfoInterface $exportInfo) { - $currentLocale = $this->localeResolver->getLocale(); - if ($exportInfo->getLocale()) { - $this->localeResolver->setLocale($exportInfo->getLocale()); - } - try { $data = $this->exportManager->export($exportInfo); $fileName = $exportInfo->getFileName(); @@ -97,8 +83,6 @@ class Consumer __('Error during export process occurred. Please check logs for detail') ); $this->logger->critical('Something went wrong while export process. ' . $exception->getMessage()); - } finally { - $this->localeResolver->setLocale($currentLocale); } } } diff --git a/vendor/magento/module-import-export/Model/Import.php b/vendor/magento/module-import-export/Model/Import.php index 013128c7df6..19cca075d4d 100644 --- a/vendor/magento/module-import-export/Model/Import.php +++ b/vendor/magento/module-import-export/Model/Import.php @@ -210,18 +210,23 @@ class Import extends AbstractModel */ private $upload; + /** + * @var LocaleEmulatorInterface + */ + private $localeEmulator; + /** * @param LoggerInterface $logger * @param Filesystem $filesystem * @param DataHelper $importExportData * @param ScopeConfigInterface $coreConfig - * @param Import\ConfigInterface $importConfig - * @param Import\Entity\Factory $entityFactory + * @param ConfigInterface $importConfig + * @param Factory $entityFactory * @param Data $importData - * @param Export\Adapter\CsvFactory $csvFactory + * @param CsvFactory $csvFactory * @param FileTransferFactory $httpFactory * @param UploaderFactory $uploaderFactory - * @param Source\Import\Behavior\Factory $behaviorFactory + * @param Factory $behaviorFactory * @param IndexerRegistry $indexerRegistry * @param History $importHistoryModel * @param DateTime $localeDate @@ -229,6 +234,7 @@ class Import extends AbstractModel * @param ManagerInterface|null $messageManager * @param Random|null $random * @param Upload|null $upload + * @param LocaleEmulatorInterface|null $localeEmulator * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( @@ -249,7 +255,8 @@ class Import extends AbstractModel array $data = [], ManagerInterface $messageManager = null, Random $random = null, - Upload $upload = null + Upload $upload = null, + LocaleEmulatorInterface $localeEmulator = null ) { $this->_importExportData = $importExportData; $this->_coreConfig = $coreConfig; @@ -270,16 +277,36 @@ class Import extends AbstractModel ->get(Random::class); $this->upload = $upload ?: ObjectManager::getInstance() ->get(Upload::class); + $this->localeEmulator = $localeEmulator ?: ObjectManager::getInstance() + ->get(LocaleEmulatorInterface::class); parent::__construct($logger, $filesystem, $data); } /** - * Create instance of entity adapter and return it + * Returns or create existing instance of entity adapter * * @throws LocalizedException * @return EntityInterface */ protected function _getEntityAdapter() + { + if (!$this->_entityAdapter) { + $this->_entityAdapter = $this->localeEmulator->emulate( + $this->createEntityAdapter(...), + $this->getData('locale') ?: null + ); + } + + return $this->_entityAdapter; + } + + /** + * Create instance of entity adapter and return it + * + * @throws LocalizedException + * @return EntityInterface + */ + private function createEntityAdapter() { if (!$this->_entityAdapter) { $entities = $this->_importConfig->getEntities(); @@ -479,6 +506,20 @@ class Import extends AbstractModel * @throws LocalizedException */ public function importSource() + { + return $this->localeEmulator->emulate( + $this->importSourceCallback(...), + $this->getData('locale') ?: null + ); + } + + /** + * Import source file structure to DB. + * + * @return bool + * @throws LocalizedException + */ + private function importSourceCallback() { $ids = $this->_getEntityAdapter()->getIds(); if (empty($ids)) { @@ -629,6 +670,21 @@ class Import extends AbstractModel return $this; } + /** + * Validates source file and returns validation result + * + * @param AbstractSource $source + * @return bool + * @throws LocalizedException + */ + public function validateSource(AbstractSource $source) + { + return $this->localeEmulator->emulate( + fn () => $this->validateSourceCallback($source), + $this->getData('locale') ?: null + ); + } + /** * Validates source file and returns validation result * @@ -639,7 +695,7 @@ class Import extends AbstractModel * @return bool * @throws LocalizedException */ - public function validateSource(AbstractSource $source) + private function validateSourceCallback(AbstractSource $source) { $this->addLogComment(__('Begin data validation')); @@ -795,7 +851,15 @@ class Import extends AbstractModel } else { $result = $this->_getEntityAdapter()->isNeedToLogInHistory(); } - return $result; + + if ($this->getProcessedRowsCount() <= $errorAggregator->getInvalidRowsCount()) { + $this->addLogComment(__('There are no valid rows to import.')); + return false; + } + + $this->addLogComment(__('Import data validation is complete.')); + + return true; } /** diff --git a/vendor/magento/module-import-export/Model/Import/RenderErrorMessages.php b/vendor/magento/module-import-export/Model/Import/RenderErrorMessages.php new file mode 100644 index 00000000000..cb163edb55c --- /dev/null +++ b/vendor/magento/module-import-export/Model/Import/RenderErrorMessages.php @@ -0,0 +1,165 @@ +reportProcessor = $reportProcessor; + $this->historyModel = $historyModel; + $this->reportHelper = $reportHelper; + $this->escaper = $escaper + ?? ObjectManager::getInstance()->get(Escaper::class); + $this->backendUrl = $backendUrl + ?? ObjectManager::getInstance()->get(UrlInterface::class); + } + + /** + * Add Error Messages for Import + * + * @param ProcessingErrorAggregatorInterface $errorAggregator + * @return string + */ + public function renderMessages( + ProcessingErrorAggregatorInterface $errorAggregator + ): string { + $message = ''; + $counter = 0; + $escapedMessages = []; + foreach ($this->getErrorMessages($errorAggregator) as $error) { + $escapedMessages[] = (++$counter) . '. ' . $this->escaper->escapeHtml($error); + if ($counter >= ImportResult::LIMIT_ERRORS_MESSAGE) { + break; + } + } + if ($errorAggregator->hasFatalExceptions()) { + foreach ($this->getSystemExceptions($errorAggregator) as $error) { + $escapedMessages[] = $this->escaper->escapeHtml($error->getErrorMessage()) + . ' ' + . __('Show more') . '
' . __('Additional data') . ': ' + . $this->escaper->escapeHtml($error->getErrorDescription()) . '
'; + } + } + $message .= implode('
', $escapedMessages); + return '' . __('Following Error(s) has been occurred during importing process:') . '
' + . '
' . __('Only the first 100 errors are shown. ') + . '' . __('Download full report') . '
' + . '
' . $message . '
'; + } + + /** + * Get all Error Messages from Import Results + * + * @param ProcessingErrorAggregatorInterface $errorAggregator + * @return array + */ + public function getErrorMessages(ProcessingErrorAggregatorInterface $errorAggregator): array + { + $messages = []; + $rowMessages = $errorAggregator->getRowsGroupedByErrorCode([], [AbstractEntity::ERROR_CODE_SYSTEM_EXCEPTION]); + foreach ($rowMessages as $errorCode => $rows) { + $messages[] = $errorCode . ' ' . __('in row(s):') . ' ' . implode(', ', $rows); + } + return $messages; + } + + /** + * Get System Generated Exception + * + * @param ProcessingErrorAggregatorInterface $errorAggregator + * @return ProcessingError[] + */ + public function getSystemExceptions(ProcessingErrorAggregatorInterface $errorAggregator): array + { + return $errorAggregator->getErrorsByCode([AbstractEntity::ERROR_CODE_SYSTEM_EXCEPTION]); + } + + /** + * Generate Error Report File + * + * @param ProcessingErrorAggregatorInterface $errorAggregator + * @return string + */ + public function createErrorReport(ProcessingErrorAggregatorInterface $errorAggregator): string + { + $this->historyModel->loadLastInsertItem(); + $sourceFile = $this->reportHelper->getReportAbsolutePath($this->historyModel->getImportedFile()); + $writeOnlyErrorItems = true; + if ($this->historyModel->getData('execution_time') == ModelHistory::IMPORT_VALIDATION) { + $writeOnlyErrorItems = false; + } + $fileName = $this->reportProcessor->createReport($sourceFile, $errorAggregator, $writeOnlyErrorItems); + $this->historyModel->addErrorReportFile($fileName); + return $fileName; + } + + /** + * Get Import History Url + * + * @param string $fileName + * @return string + */ + public function createDownloadUrlImportHistoryFile($fileName): string + { + return $this->backendUrl->getUrl(ImportResult::IMPORT_HISTORY_FILE_DOWNLOAD_ROUTE, ['filename' => $fileName]); + } +} diff --git a/vendor/magento/module-import-export/Model/LocaleEmulator.php b/vendor/magento/module-import-export/Model/LocaleEmulator.php new file mode 100644 index 00000000000..48e781c505d --- /dev/null +++ b/vendor/magento/module-import-export/Model/LocaleEmulator.php @@ -0,0 +1,63 @@ +isEmulating) { + return $callback(); + } + $this->isEmulating = true; + $locale ??= $this->defaultLocaleResolver->getLocale(); + $initialLocale = $this->localeResolver->getLocale(); + $initialPhraseRenderer = Phrase::getRenderer(); + Phrase::setRenderer($this->phraseRenderer); + $this->localeResolver->setLocale($locale); + $this->translate->setLocale($locale); + $this->translate->loadData(); + try { + $result = $callback(); + } finally { + Phrase::setRenderer($initialPhraseRenderer); + $this->localeResolver->setLocale($initialLocale); + $this->translate->setLocale($initialLocale); + $this->translate->loadData(); + $this->isEmulating = false; + } + return $result; + } +} diff --git a/vendor/magento/module-import-export/Model/LocaleEmulatorInterface.php b/vendor/magento/module-import-export/Model/LocaleEmulatorInterface.php new file mode 100644 index 00000000000..ab0743230e6 --- /dev/null +++ b/vendor/magento/module-import-export/Model/LocaleEmulatorInterface.php @@ -0,0 +1,23 @@ +Magento\Framework\Filesystem\Driver\File + + + Magento\Backend\Model\Locale\Resolver + + diff --git a/vendor/magento/module-import-export/etc/di.xml b/vendor/magento/module-import-export/etc/di.xml index b4c65aaf5ef..76c06d38225 100644 --- a/vendor/magento/module-import-export/etc/di.xml +++ b/vendor/magento/module-import-export/etc/di.xml @@ -13,6 +13,7 @@ + @@ -39,4 +40,15 @@ + + + Magento\Directory\Helper\Data::XML_PATH_DEFAULT_LOCALE + Magento\Framework\App\Config\ScopeConfigInterface::SCOPE_TYPE_DEFAULT + + + + + Magento\ImportExport\Model\DefaultLocaleResolver + +