Skip to content

Commit a6ff645

Browse files
MAGETWO-71201: Improved calculating version hash for the js-translation.json file. #10378
2 parents 45e8b94 + 8cf3eec commit a6ff645

File tree

6 files changed

+170
-4
lines changed

6 files changed

+170
-4
lines changed

app/code/Magento/Translation/Block/Js.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,14 @@ public function getTranslationFilePath()
6868
{
6969
return $this->fileManager->getTranslationFilePath();
7070
}
71+
72+
/**
73+
* Gets current version of the translation file.
74+
*
75+
* @return string
76+
*/
77+
public function getTranslationFileVersion()
78+
{
79+
return $this->fileManager->getTranslationFileVersion();
80+
}
7181
}

app/code/Magento/Translation/Model/FileManager.php

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
namespace Magento\Translation\Model;
77

88
use Magento\Framework\App\Filesystem\DirectoryList;
9+
use Magento\Framework\App\ObjectManager;
10+
use Magento\Translation\Model\Inline\File as TranslationFile;
911

1012
/**
1113
* A service for handling Translation config files
@@ -32,19 +34,27 @@ class FileManager
3234
*/
3335
private $driverFile;
3436

37+
/**
38+
* @var TranslationFile
39+
*/
40+
private $translationFile;
41+
3542
/**
3643
* @param \Magento\Framework\View\Asset\Repository $assetRepo
37-
* @param \Magento\Framework\App\Filesystem\DirectoryList $directoryList,
38-
* @param \Magento\Framework\Filesystem\Driver\File $driverFile,
44+
* @param \Magento\Framework\App\Filesystem\DirectoryList $directoryList
45+
* @param \Magento\Framework\Filesystem\Driver\File $driverFile
46+
* @param TranslationFile $translationFile
3947
*/
4048
public function __construct(
4149
\Magento\Framework\View\Asset\Repository $assetRepo,
4250
\Magento\Framework\App\Filesystem\DirectoryList $directoryList,
43-
\Magento\Framework\Filesystem\Driver\File $driverFile
51+
\Magento\Framework\Filesystem\Driver\File $driverFile,
52+
\Magento\Translation\Model\Inline\File $translationFile = null
4453
) {
4554
$this->assetRepo = $assetRepo;
4655
$this->directoryList = $directoryList;
4756
$this->driverFile = $driverFile;
57+
$this->translationFile = $translationFile ?: ObjectManager::getInstance()->get(TranslationFile::class);
4858
}
4959

5060
/**
@@ -110,4 +120,20 @@ public function updateTranslationFileContent($content)
110120
}
111121
$this->driverFile->filePutContents($this->getTranslationFileFullPath(), $content);
112122
}
123+
124+
/**
125+
* Calculate translation file version hash.
126+
*
127+
* @return string
128+
*/
129+
public function getTranslationFileVersion()
130+
{
131+
$translationFile = $this->getTranslationFileFullPath();
132+
if (!$this->driverFile->isExists($translationFile)) {
133+
$this->updateTranslationFileContent($this->translationFile->getTranslationFileContent());
134+
}
135+
136+
$translationFileHash = sha1_file($translationFile);
137+
return sha1($translationFileHash . $this->getTranslationFilePath());
138+
}
113139
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Translation\Model\Inline;
7+
8+
use Magento\Framework\Translate\ResourceInterface;
9+
use Magento\Framework\Locale\ResolverInterface;
10+
use Magento\Framework\Serialize\Serializer\Json;
11+
12+
/**
13+
* Prepares content of inline translations file.
14+
*/
15+
class File
16+
{
17+
/**
18+
* @var ResourceInterface
19+
*/
20+
private $translateResource;
21+
22+
/**
23+
* @var ResolverInterface
24+
*/
25+
private $localeResolver;
26+
27+
/**
28+
* @var Json
29+
*/
30+
private $jsonSerializer;
31+
32+
/**
33+
* Initialize dependencies
34+
*
35+
* @param ResourceInterface $translateResource
36+
* @param ResolverInterface $localeResolver
37+
* @param Json $jsonSerializer
38+
*/
39+
public function __construct(
40+
ResourceInterface $translateResource,
41+
ResolverInterface $localeResolver,
42+
Json $jsonSerializer
43+
) {
44+
$this->translateResource = $translateResource;
45+
$this->localeResolver = $localeResolver;
46+
$this->jsonSerializer = $jsonSerializer;
47+
}
48+
49+
/**
50+
* Generate translation file content for the current locale.
51+
*
52+
* @return string
53+
*/
54+
public function getTranslationFileContent()
55+
{
56+
$translations = $this->translateResource->getTranslationArray(null, $this->localeResolver->getLocale());
57+
$translations = $this->jsonSerializer->serialize($translations);
58+
return $translations;
59+
}
60+
}

app/code/Magento/Translation/Test/Unit/Block/JsTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,14 @@ public function testGetTranslationFilePath()
6565
->willReturn('frontend/Magento/luma/en_EN');
6666
$this->assertEquals('frontend/Magento/luma/en_EN', $this->model->getTranslationFilePath());
6767
}
68+
69+
public function testGetTranslationFileVersion()
70+
{
71+
$version = sha1('translationFile');
72+
73+
$this->fileManagerMock->expects($this->once())
74+
->method('getTranslationFileVersion')
75+
->willReturn($version);
76+
$this->assertEquals($version, $this->model->getTranslationFileVersion());
77+
}
6878
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Translation\Test\Unit\Model\Inline;
7+
8+
class FileTest extends \PHPUnit\Framework\TestCase
9+
{
10+
/**
11+
* @var \Magento\Translation\Model\Inline\File
12+
*/
13+
private $model;
14+
15+
/**
16+
* @var \Magento\Framework\Translate\ResourceInterface|\PHPUnit_Framework_MockObject_MockObject
17+
*/
18+
private $translateResourceMock;
19+
20+
/**
21+
* @var \Magento\Framework\Locale\ResolverInterface|\PHPUnit_Framework_MockObject_MockObject
22+
*/
23+
private $localeResolverMock;
24+
25+
/**
26+
* @var \Magento\Framework\Serialize\Serializer\Json
27+
*/
28+
private $jsonSerializer;
29+
30+
protected function setUp()
31+
{
32+
$this->translateResourceMock = $this->getMockBuilder(\Magento\Framework\Translate\ResourceInterface::class)
33+
->disableOriginalConstructor()
34+
->getMock();
35+
$this->localeResolverMock = $this->getMockBuilder(\Magento\Framework\Locale\ResolverInterface::class)
36+
->disableOriginalConstructor()
37+
->getMock();
38+
$this->jsonSerializer = new \Magento\Framework\Serialize\Serializer\Json();
39+
40+
$this->model = new \Magento\Translation\Model\Inline\File(
41+
$this->translateResourceMock,
42+
$this->localeResolverMock,
43+
$this->jsonSerializer
44+
);
45+
}
46+
47+
public function testGetTranslationFileContent()
48+
{
49+
$translations = ['string' => 'translatedString'];
50+
51+
$this->localeResolverMock->expects($this->atLeastOnce())->method('getLocale')->willReturn('en_US');
52+
$this->translateResourceMock->expects($this->atLeastOnce())->method('getTranslationArray')
53+
->willReturn($translations);
54+
55+
$this->assertEquals(
56+
$this->jsonSerializer->serialize($translations),
57+
$this->model->getTranslationFileContent()
58+
);
59+
}
60+
}

app/code/Magento/Translation/view/base/templates/translate.phtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
$.initNamespaceStorage('mage-translation-file-version');
2727
versionObj = $.localStorage.get('mage-translation-file-version');
2828

29-
<?php $version = sha1($block->getTranslationFileTimestamp() . $block->getTranslationFilePath()); ?>
29+
<?php $version = $block->getTranslationFileVersion(); ?>
3030

3131
if (versionObj.version !== '<?= /* @noEscape */ $version ?>') {
3232
dependencies.push(

0 commit comments

Comments
 (0)