Skip to content

Commit 34bf817

Browse files
ENGCOM-6557: Fix #7065 - page.main.title is translating title #26269
- Merge Pull Request #26269 from Bartlomiejsz/magento2:feature/fix_7065_page_main_title_is_translating - Merged commits: 1. 8fe06ff
2 parents 01ab2cd + 8fe06ff commit 34bf817

File tree

5 files changed

+172
-24
lines changed

5 files changed

+172
-24
lines changed

app/code/Magento/Theme/Block/Html/Title.php

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
*/
66
namespace Magento\Theme\Block\Html;
77

8+
use Magento\Framework\App\Config\ScopeConfigInterface;
89
use Magento\Framework\View\Element\Template;
10+
use Magento\Store\Model\ScopeInterface;
911

1012
/**
1113
* Html page title block
@@ -19,13 +21,39 @@
1921
*/
2022
class Title extends Template
2123
{
24+
/**
25+
* Config path to 'Translate Title' header settings
26+
*/
27+
private const XML_PATH_HEADER_TRANSLATE_TITLE = 'design/header/translate_title';
28+
29+
/**
30+
* @var ScopeConfigInterface
31+
*/
32+
private $scopeConfig;
33+
2234
/**
2335
* Own page title to display on the page
2436
*
2537
* @var string
2638
*/
2739
protected $pageTitle;
2840

41+
/**
42+
* Constructor
43+
*
44+
* @param Template\Context $context
45+
* @param ScopeConfigInterface $scopeConfig
46+
* @param array $data
47+
*/
48+
public function __construct(
49+
Template\Context $context,
50+
ScopeConfigInterface $scopeConfig,
51+
array $data = []
52+
) {
53+
parent::__construct($context, $data);
54+
$this->scopeConfig = $scopeConfig;
55+
}
56+
2957
/**
3058
* Provide own page title or pick it from Head Block
3159
*
@@ -36,7 +64,10 @@ public function getPageTitle()
3664
if (!empty($this->pageTitle)) {
3765
return $this->pageTitle;
3866
}
39-
return __($this->pageConfig->getTitle()->getShort());
67+
68+
$pageTitle = $this->pageConfig->getTitle()->getShort();
69+
70+
return $this->shouldTranslateTitle() ? __($pageTitle) : $pageTitle;
4071
}
4172

4273
/**
@@ -46,10 +77,9 @@ public function getPageTitle()
4677
*/
4778
public function getPageHeading()
4879
{
49-
if (!empty($this->pageTitle)) {
50-
return __($this->pageTitle);
51-
}
52-
return __($this->pageConfig->getTitle()->getShortHeading());
80+
$pageTitle = !empty($this->pageTitle) ? $this->pageTitle : $this->pageConfig->getTitle()->getShortHeading();
81+
82+
return $this->shouldTranslateTitle() ? __($pageTitle) : $pageTitle;
5383
}
5484

5585
/**
@@ -62,4 +92,17 @@ public function setPageTitle($pageTitle)
6292
{
6393
$this->pageTitle = $pageTitle;
6494
}
95+
96+
/**
97+
* Check if page title should be translated
98+
*
99+
* @return bool
100+
*/
101+
private function shouldTranslateTitle(): bool
102+
{
103+
return $this->scopeConfig->isSetFlag(
104+
static::XML_PATH_HEADER_TRANSLATE_TITLE,
105+
ScopeInterface::SCOPE_STORE
106+
);
107+
}
65108
}

app/code/Magento/Theme/Test/Unit/Block/Html/TitleTest.php

Lines changed: 105 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,47 +5,74 @@
55
*/
66
namespace Magento\Theme\Test\Unit\Block\Html;
77

8+
use Magento\Framework\App\Config\ScopeConfigInterface;
9+
use Magento\Framework\Phrase;
810
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
11+
use Magento\Framework\View\Element\Template\Context;
12+
use Magento\Framework\View\Page\Config;
13+
use Magento\Framework\View\Page\Title as PageTitle;
14+
use Magento\Store\Model\ScopeInterface;
15+
use Magento\Theme\Block\Html\Title;
16+
use PHPUnit\Framework\MockObject\MockObject;
17+
use PHPUnit\Framework\TestCase;
918

10-
class TitleTest extends \PHPUnit\Framework\TestCase
19+
/**
20+
* Test class for \Magento\Theme\Block\Html\Title
21+
*/
22+
class TitleTest extends TestCase
1123
{
24+
/**
25+
* Config path to 'Translate Title' header settings
26+
*/
27+
private const XML_PATH_HEADER_TRANSLATE_TITLE = 'design/header/translate_title';
28+
1229
/**
1330
* @var ObjectManagerHelper
1431
*/
15-
protected $objectManagerHelper;
32+
private $objectManagerHelper;
33+
34+
/**
35+
* @var Config|MockObject
36+
*/
37+
private $pageConfigMock;
1638

1739
/**
18-
* @var \Magento\Framework\View\Page\Config|\PHPUnit_Framework_MockObject_MockObject
40+
* @var PageTitle|MockObject
1941
*/
20-
protected $pageConfigMock;
42+
private $pageTitleMock;
2143

2244
/**
23-
* @var \Magento\Framework\View\Page\Title|\PHPUnit_Framework_MockObject_MockObject
45+
* @var ScopeConfigInterface|MockObject
2446
*/
25-
protected $pageTitleMock;
47+
private $scopeConfigMock;
2648

2749
/**
28-
* @var \Magento\Theme\Block\Html\Title
50+
* @var Title
2951
*/
30-
protected $htmlTitle;
52+
private $htmlTitle;
3153

3254
/**
3355
* @return void
3456
*/
3557
protected function setUp()
3658
{
3759
$this->objectManagerHelper = new ObjectManagerHelper($this);
38-
$this->pageConfigMock = $this->createMock(\Magento\Framework\View\Page\Config::class);
39-
$this->pageTitleMock = $this->createMock(\Magento\Framework\View\Page\Title::class);
60+
$this->pageConfigMock = $this->createMock(Config::class);
61+
$this->pageTitleMock = $this->createMock(PageTitle::class);
4062

4163
$context = $this->objectManagerHelper->getObject(
42-
\Magento\Framework\View\Element\Template\Context::class,
64+
Context::class,
4365
['pageConfig' => $this->pageConfigMock]
4466
);
4567

68+
$this->scopeConfigMock = $this->getMockForAbstractClass(ScopeConfigInterface::class);
69+
4670
$this->htmlTitle = $this->objectManagerHelper->getObject(
47-
\Magento\Theme\Block\Html\Title::class,
48-
['context' => $context]
71+
Title::class,
72+
[
73+
'context' => $context,
74+
'scopeConfig' => $this->scopeConfigMock
75+
]
4976
);
5077
}
5178

@@ -64,10 +91,16 @@ public function testGetPageTitleWithSetPageTitle()
6491
}
6592

6693
/**
94+
* @param bool $shouldTranslateTitle
95+
*
6796
* @return void
97+
* @dataProvider dataProviderShouldTranslateTitle
6898
*/
69-
public function testGetPageTitle()
99+
public function testGetPageTitle($shouldTranslateTitle)
70100
{
101+
$this->scopeConfigMock->method('isSetFlag')
102+
->with(static::XML_PATH_HEADER_TRANSLATE_TITLE, ScopeInterface::SCOPE_STORE)
103+
->willReturn($shouldTranslateTitle);
71104
$title = 'some title';
72105

73106
$this->pageTitleMock->expects($this->once())
@@ -77,28 +110,58 @@ public function testGetPageTitle()
77110
->method('getTitle')
78111
->willReturn($this->pageTitleMock);
79112

80-
$this->assertEquals($title, $this->htmlTitle->getPageTitle());
113+
$result = $this->htmlTitle->getPageTitle();
114+
115+
if ($shouldTranslateTitle) {
116+
$this->assertInstanceOf(Phrase::class, $result);
117+
} else {
118+
$this->assertInternalType('string', $result);
119+
}
120+
121+
$this->assertEquals($title, $result);
81122
}
82123

83124
/**
125+
* @param bool $shouldTranslateTitle
126+
*
84127
* @return void
128+
* @dataProvider dataProviderShouldTranslateTitle
85129
*/
86-
public function testGetPageHeadingWithSetPageTitle()
130+
public function testGetPageHeadingWithSetPageTitle($shouldTranslateTitle)
87131
{
132+
$this->scopeConfigMock->method('isSetFlag')
133+
->with(static::XML_PATH_HEADER_TRANSLATE_TITLE, ScopeInterface::SCOPE_STORE)
134+
->willReturn($shouldTranslateTitle);
135+
88136
$title = 'some title';
89137

90138
$this->htmlTitle->setPageTitle($title);
91139
$this->pageConfigMock->expects($this->never())
92140
->method('getTitle');
93141

94-
$this->assertEquals($title, $this->htmlTitle->getPageHeading());
142+
$result = $this->htmlTitle->getPageHeading();
143+
144+
if ($shouldTranslateTitle) {
145+
$this->assertInstanceOf(Phrase::class, $result);
146+
} else {
147+
$this->assertInternalType('string', $result);
148+
}
149+
150+
$this->assertEquals($title, $result);
95151
}
96152

97153
/**
154+
* @param bool $shouldTranslateTitle
155+
*
98156
* @return void
157+
* @dataProvider dataProviderShouldTranslateTitle
99158
*/
100-
public function testGetPageHeading()
159+
public function testGetPageHeading($shouldTranslateTitle)
101160
{
161+
$this->scopeConfigMock->method('isSetFlag')
162+
->with(static::XML_PATH_HEADER_TRANSLATE_TITLE, ScopeInterface::SCOPE_STORE)
163+
->willReturn($shouldTranslateTitle);
164+
102165
$title = 'some title';
103166

104167
$this->pageTitleMock->expects($this->once())
@@ -108,6 +171,29 @@ public function testGetPageHeading()
108171
->method('getTitle')
109172
->willReturn($this->pageTitleMock);
110173

111-
$this->assertEquals($title, $this->htmlTitle->getPageHeading());
174+
$result = $this->htmlTitle->getPageHeading();
175+
176+
if ($shouldTranslateTitle) {
177+
$this->assertInstanceOf(Phrase::class, $result);
178+
} else {
179+
$this->assertInternalType('string', $result);
180+
}
181+
182+
$this->assertEquals($title, $result);
183+
}
184+
185+
/**
186+
* @return array
187+
*/
188+
public function dataProviderShouldTranslateTitle(): array
189+
{
190+
return [
191+
[
192+
true
193+
],
194+
[
195+
false
196+
]
197+
];
112198
}
113199
}

app/code/Magento/Theme/etc/config.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ Disallow: /*SID=
4343
</search_engine_robots>
4444
<header translate="welcome">
4545
<welcome>Default welcome msg!</welcome>
46+
<translate_title>1</translate_title>
4647
</header>
4748
<footer translate="copyright">
4849
<copyright>Copyright &#169; 2013-present Magento, Inc. All rights reserved.</copyright>

app/code/Magento/Theme/etc/di.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,10 @@
206206
<item name="path" xsi:type="string">design/header/welcome</item>
207207
<item name="fieldset" xsi:type="string">other_settings/header</item>
208208
</item>
209+
<item name="header_translate_title" xsi:type="array">
210+
<item name="path" xsi:type="string">design/header/translate_title</item>
211+
<item name="fieldset" xsi:type="string">other_settings/header</item>
212+
</item>
209213
<item name="footer_copyright" xsi:type="array">
210214
<item name="path" xsi:type="string">design/footer/copyright</item>
211215
<item name="fieldset" xsi:type="string">other_settings/footer</item>

app/code/Magento/Theme/view/adminhtml/ui_component/design_config_form.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,20 @@
208208
<dataScope>header_logo_alt</dataScope>
209209
</settings>
210210
</field>
211+
<field name="header_translate_title" formElement="select">
212+
<settings>
213+
<dataType>text</dataType>
214+
<label translate="true">Translate Title</label>
215+
<dataScope>header_translate_title</dataScope>
216+
</settings>
217+
<formElements>
218+
<select>
219+
<settings>
220+
<options class="Magento\Config\Model\Config\Source\Yesno"/>
221+
</settings>
222+
</select>
223+
</formElements>
224+
</field>
211225
</fieldset>
212226
<fieldset name="footer">
213227
<settings>

0 commit comments

Comments
 (0)