Skip to content

Commit 99f88a7

Browse files
damienalexandreNyholm
authored andcommitted
[EditInPlace] Fix bad HTML generation when there is HTML in the translation (#259)
* [EditInPlace] Do not replace HTML translation with <x-trans> tag * Fix the Coding Style as suggested by StyleCi (too bad phpcsfixer is not part of the project) * Instead of disabling HTML translations, just generate valid HTML
1 parent 0cd3663 commit 99f88a7

File tree

2 files changed

+108
-2
lines changed

2 files changed

+108
-2
lines changed
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the PHP Translation package.
5+
*
6+
* (c) PHP Translation team <tobias.nyholm@gmail.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Translation\Bundle\Tests\Unit\Translator;
13+
14+
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\HttpFoundation\Request;
16+
use Symfony\Component\HttpFoundation\RequestStack;
17+
use Symfony\Component\Translation\Loader\ArrayLoader;
18+
use Symfony\Component\Translation\TranslatorInterface;
19+
use Translation\Bundle\EditInPlace\ActivatorInterface;
20+
use Translation\Bundle\Translator\EditInPlaceTranslator;
21+
22+
/**
23+
* @author Damien Alexandre <dalexandre@jolicode.com>
24+
*/
25+
final class EditInPlaceTranslatorTest extends TestCase
26+
{
27+
public function testEnabled()
28+
{
29+
$symfonyTranslator = $this->getMockBuilder(TranslatorInterface::class)->getMock();
30+
31+
$request = new Request();
32+
$requestStack = new RequestStack();
33+
$requestStack->push($request);
34+
35+
$activator = new FakeActivator(true);
36+
$service = new EditInPlaceTranslator($symfonyTranslator, $activator, $requestStack);
37+
38+
$this->assertSame(
39+
'<x-trans data-key="messages|key" data-value="" data-plain="" data-domain="messages" data-locale=""></x-trans>',
40+
$service->trans('key', [])
41+
);
42+
}
43+
44+
public function testDisabled()
45+
{
46+
$symfonyTranslator = $this->getMockBuilder(TranslatorInterface::class)->getMock();
47+
48+
$request = new Request();
49+
$requestStack = new RequestStack();
50+
$requestStack->push($request);
51+
52+
$activator = new FakeActivator(false);
53+
$service = new EditInPlaceTranslator($symfonyTranslator, $activator, $requestStack);
54+
55+
$this->assertSame(
56+
null,
57+
$service->trans('key', [])
58+
);
59+
}
60+
61+
public function testHtmlTranslation()
62+
{
63+
$symfonyTranslator = new \Symfony\Component\Translation\Translator('en', null, null, true);
64+
$symfonyTranslator->addLoader('array', new ArrayLoader());
65+
$symfonyTranslator->addResource('array', ['foo' => 'Normal content.'], 'en');
66+
$symfonyTranslator->addResource('array', ['bar' => 'Content with <b>HTML</b> in it.'], 'en');
67+
$symfonyTranslator->addResource('array', ['bar.attr' => 'Content with <b class="alert">HTML</b> in it.'], 'en');
68+
69+
$request = new Request();
70+
$requestStack = new RequestStack();
71+
$requestStack->push($request);
72+
73+
$activator = new FakeActivator(true);
74+
$service = new EditInPlaceTranslator($symfonyTranslator, $activator, $requestStack);
75+
76+
$this->assertSame(
77+
'<x-trans data-key="messages|foo" data-value="Normal content." data-plain="Normal content." data-domain="messages" data-locale="en">Normal content.</x-trans>',
78+
$service->trans('foo', [])
79+
);
80+
81+
$this->assertSame(
82+
'<x-trans data-key="messages|bar" data-value="Content with &lt;b&gt;HTML&lt;/b&gt; in it." data-plain="Content with &lt;b&gt;HTML&lt;/b&gt; in it." data-domain="messages" data-locale="en">Content with <b>HTML</b> in it.</x-trans>',
83+
$service->trans('bar', [])
84+
);
85+
86+
$this->assertSame(
87+
'<x-trans data-key="messages|bar.attr" data-value="Content with &lt;b class=&quot;alert&quot;&gt;HTML&lt;/b&gt; in it." data-plain="Content with &lt;b class=&quot;alert&quot;&gt;HTML&lt;/b&gt; in it." data-domain="messages" data-locale="en">Content with <b class="alert">HTML</b> in it.</x-trans>',
88+
$service->trans('bar.attr', [])
89+
);
90+
}
91+
}
92+
93+
class FakeActivator implements ActivatorInterface
94+
{
95+
private $enabled;
96+
97+
public function __construct($enabled = true)
98+
{
99+
$this->enabled = $enabled;
100+
}
101+
102+
public function checkRequest(Request $request = null)
103+
{
104+
return $this->enabled;
105+
}
106+
}

Translator/EditInPlaceTranslator.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ public function trans($id, array $parameters = [], $domain = null, $locale = nul
7676
return sprintf('<x-trans data-key="%s|%s" data-value="%s" data-plain="%s" data-domain="%s" data-locale="%s">%s</x-trans>',
7777
$domain,
7878
$id,
79-
$original,
80-
$plain,
79+
htmlspecialchars($original),
80+
htmlspecialchars($plain),
8181
$domain,
8282
$locale,
8383
$original

0 commit comments

Comments
 (0)