diff --git a/app/code/Magento/Translation/Block/Js.php b/app/code/Magento/Translation/Block/Js.php index 316c136666cc0..d4d627d19393a 100644 --- a/app/code/Magento/Translation/Block/Js.php +++ b/app/code/Magento/Translation/Block/Js.php @@ -68,4 +68,14 @@ public function getTranslationFilePath() { return $this->fileManager->getTranslationFilePath(); } + + /** + * Gets current version of the translation file. + * + * @return string + */ + public function getTranslationFileVersion() + { + return $this->fileManager->getTranslationFileVersion(); + } } diff --git a/app/code/Magento/Translation/Model/FileManager.php b/app/code/Magento/Translation/Model/FileManager.php index fb989fc6b4518..b4a541f2579c0 100644 --- a/app/code/Magento/Translation/Model/FileManager.php +++ b/app/code/Magento/Translation/Model/FileManager.php @@ -6,6 +6,8 @@ namespace Magento\Translation\Model; use Magento\Framework\App\Filesystem\DirectoryList; +use Magento\Framework\App\ObjectManager; +use Magento\Translation\Model\Inline\File as TranslationFile; /** * A service for handling Translation config files @@ -32,19 +34,27 @@ class FileManager */ private $driverFile; + /** + * @var TranslationFile + */ + private $translationFile; + /** * @param \Magento\Framework\View\Asset\Repository $assetRepo - * @param \Magento\Framework\App\Filesystem\DirectoryList $directoryList, - * @param \Magento\Framework\Filesystem\Driver\File $driverFile, + * @param \Magento\Framework\App\Filesystem\DirectoryList $directoryList + * @param \Magento\Framework\Filesystem\Driver\File $driverFile + * @param TranslationFile $translationFile */ public function __construct( \Magento\Framework\View\Asset\Repository $assetRepo, \Magento\Framework\App\Filesystem\DirectoryList $directoryList, - \Magento\Framework\Filesystem\Driver\File $driverFile + \Magento\Framework\Filesystem\Driver\File $driverFile, + \Magento\Translation\Model\Inline\File $translationFile = null ) { $this->assetRepo = $assetRepo; $this->directoryList = $directoryList; $this->driverFile = $driverFile; + $this->translationFile = $translationFile ?: ObjectManager::getInstance()->get(TranslationFile::class); } /** @@ -110,4 +120,20 @@ public function updateTranslationFileContent($content) } $this->driverFile->filePutContents($this->getTranslationFileFullPath(), $content); } + + /** + * Calculate translation file version hash. + * + * @return string + */ + public function getTranslationFileVersion() + { + $translationFile = $this->getTranslationFileFullPath(); + if (!$this->driverFile->isExists($translationFile)) { + $this->updateTranslationFileContent($this->translationFile->getTranslationFileContent()); + } + + $translationFileHash = sha1_file($translationFile); + return sha1($translationFileHash . $this->getTranslationFilePath()); + } } diff --git a/app/code/Magento/Translation/Model/Inline/File.php b/app/code/Magento/Translation/Model/Inline/File.php new file mode 100644 index 0000000000000..678ceeb1aeec2 --- /dev/null +++ b/app/code/Magento/Translation/Model/Inline/File.php @@ -0,0 +1,60 @@ +translateResource = $translateResource; + $this->localeResolver = $localeResolver; + $this->jsonSerializer = $jsonSerializer; + } + + /** + * Generate translation file content for the current locale. + * + * @return string + */ + public function getTranslationFileContent() + { + $translations = $this->translateResource->getTranslationArray(null, $this->localeResolver->getLocale()); + $translations = $this->jsonSerializer->serialize($translations); + return $translations; + } +} diff --git a/app/code/Magento/Translation/Test/Unit/Block/JsTest.php b/app/code/Magento/Translation/Test/Unit/Block/JsTest.php index aa6587c75b6a4..5dc0e6fe5dcaa 100644 --- a/app/code/Magento/Translation/Test/Unit/Block/JsTest.php +++ b/app/code/Magento/Translation/Test/Unit/Block/JsTest.php @@ -65,4 +65,14 @@ public function testGetTranslationFilePath() ->willReturn('frontend/Magento/luma/en_EN'); $this->assertEquals('frontend/Magento/luma/en_EN', $this->model->getTranslationFilePath()); } + + public function testGetTranslationFileVersion() + { + $version = sha1('translationFile'); + + $this->fileManagerMock->expects($this->once()) + ->method('getTranslationFileVersion') + ->willReturn($version); + $this->assertEquals($version, $this->model->getTranslationFileVersion()); + } } diff --git a/app/code/Magento/Translation/Test/Unit/Model/Inline/FileTest.php b/app/code/Magento/Translation/Test/Unit/Model/Inline/FileTest.php new file mode 100644 index 0000000000000..5af8fbdb01f39 --- /dev/null +++ b/app/code/Magento/Translation/Test/Unit/Model/Inline/FileTest.php @@ -0,0 +1,60 @@ +translateResourceMock = $this->getMockBuilder(\Magento\Framework\Translate\ResourceInterface::class) + ->disableOriginalConstructor() + ->getMock(); + $this->localeResolverMock = $this->getMockBuilder(\Magento\Framework\Locale\ResolverInterface::class) + ->disableOriginalConstructor() + ->getMock(); + $this->jsonSerializer = new \Magento\Framework\Serialize\Serializer\Json(); + + $this->model = new \Magento\Translation\Model\Inline\File( + $this->translateResourceMock, + $this->localeResolverMock, + $this->jsonSerializer + ); + } + + public function testGetTranslationFileContent() + { + $translations = ['string' => 'translatedString']; + + $this->localeResolverMock->expects($this->atLeastOnce())->method('getLocale')->willReturn('en_US'); + $this->translateResourceMock->expects($this->atLeastOnce())->method('getTranslationArray') + ->willReturn($translations); + + $this->assertEquals( + $this->jsonSerializer->serialize($translations), + $this->model->getTranslationFileContent() + ); + } +} diff --git a/app/code/Magento/Translation/view/base/templates/translate.phtml b/app/code/Magento/Translation/view/base/templates/translate.phtml index 9e1021022d876..7007cd7fd55a9 100644 --- a/app/code/Magento/Translation/view/base/templates/translate.phtml +++ b/app/code/Magento/Translation/view/base/templates/translate.phtml @@ -26,7 +26,7 @@ $.initNamespaceStorage('mage-translation-file-version'); versionObj = $.localStorage.get('mage-translation-file-version'); - getTranslationFileTimestamp() . $block->getTranslationFilePath()); ?> + getTranslationFileVersion(); ?> if (versionObj.version !== '') { dependencies.push(