Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 32 additions & 16 deletions Controller/WebUIController.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
use Symfony\Component\Intl\Intl;
use Symfony\Component\Translation\MessageCatalogue;
use Translation\Bundle\Exception\MessageValidationException;
use Translation\Bundle\Model\WebUiMessage;
use Translation\Bundle\Service\StorageService;
use Translation\Common\Exception\StorageException;
use Translation\Bundle\Model\CatalogueMessage;
Expand Down Expand Up @@ -140,13 +139,16 @@ public function createAction(Request $request, $configName, $locale, $domain)
$storage = $this->get('php_translation.storage.'.$configName);

try {
$message = $this->getMessage($request, ['Create']);
$message = $this->getMessageFromRequest($request);
$message->setDomain($domain);
$message->setLocale($locale);
$this->validateMessage($message, ['Create']);
} catch (MessageValidationException $e) {
return new Response($e->getMessage(), 400);
}

try {
$storage->create(new Message($message->getKey(), $domain, $locale, $message->getMessage()));
$storage->create($message);
} catch (StorageException $e) {
throw new BadRequestHttpException(sprintf(
'Key "%s" does already exist for "%s" on domain "%s".',
Expand Down Expand Up @@ -176,14 +178,17 @@ public function editAction(Request $request, $configName, $locale, $domain)
}

try {
$message = $this->getMessage($request, ['Edit']);
$message = $this->getMessageFromRequest($request);
$message->setDomain($domain);
$message->setLocale($locale);
$this->validateMessage($message, ['Edit']);
} catch (MessageValidationException $e) {
return new Response($e->getMessage(), 400);
}

/** @var StorageService $storage */
$storage = $this->get('php_translation.storage.'.$configName);
$storage->update(new Message($message->getKey(), $domain, $locale, $message->getMessage()));
$storage->update($message);

return new Response('Translation updated');
}
Expand All @@ -203,7 +208,10 @@ public function deleteAction(Request $request, $configName, $locale, $domain)
}

try {
$message = $this->getMessage($request, ['Delete']);
$message = $this->getMessageFromRequest($request);
$message->setLocale($locale);
$message->setDomain($domain);
$this->validateMessage($message, ['Delete']);
} catch (MessageValidationException $e) {
return new Response($e->getMessage(), 400);
}
Expand All @@ -217,25 +225,19 @@ public function deleteAction(Request $request, $configName, $locale, $domain)

/**
* @param Request $request
* @param array $validationGroups
*
* @return WebUiMessage
* @return Message
*/
private function getMessage(Request $request, array $validationGroups = [])
private function getMessageFromRequest(Request $request)
{
$json = $request->getContent();
$data = json_decode($json, true);
$message = new WebUiMessage();
$message = new Message();
if (isset($data['key'])) {
$message->setKey($data['key']);
}
if (isset($data['message'])) {
$message->setMessage($data['message']);
}

$errors = $this->get('validator')->validate($message, null, $validationGroups);
if (count($errors) > 0) {
throw MessageValidationException::create();
$message->setTranslation($data['message']);
}

return $message;
Expand All @@ -257,4 +259,18 @@ private function getLocale2LanguageMap()

return $map;
}

/**
* @param Message $message
* @param array $validationGroups
*
* @throws MessageValidationException
*/
private function validateMessage(Message $message, array $validationGroups)
{
$errors = $this->get('validator')->validate($message, null, $validationGroups);
if (count($errors) > 0) {
throw MessageValidationException::create();
}
}
}
72 changes: 0 additions & 72 deletions Model/WebUiMessage.php

This file was deleted.

13 changes: 13 additions & 0 deletions Resources/config/validation.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
Translation\Common\Model\Message:
properties:
key:
- NotBlank:
groups: ["Create", "Edit", "Delete"]

translation:
- NotBlank:
groups: ["Create", "Edit"]

domain:
- NotBlank:
groups: ["Create", "Edit", "Delete"]
2 changes: 1 addition & 1 deletion Resources/views/WebUI/base.html.twig
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
{% for c in configNames %}
<li class="nav-item{% if configName == c %} active{% endif %}">
<a class="nav-link" href="{{ path('translation_index', {configName: c}) }}">
{{ c|humanize }}
{{ c }}
</a>
</li>
{% endfor %}
Expand Down
2 changes: 1 addition & 1 deletion Resources/views/WebUI/create.html.twig
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
class="message-textarea"
data-key="{{ message.key }}"
onchange="editTranslation(this)"
>{{ message.message }}</textarea>
>{{ message.translation }}</textarea>
<div class="ajax-result"></div>
</div>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@
* file that was distributed with this source code.
*/

namespace Translation\Bundle\Tests\Functional;
namespace Translation\Bundle\Tests\Functional\Controller;

use Symfony\Component\HttpFoundation\Request;
use Translation\Bundle\Tests\Functional\BaseTestCase;

/**
* @author Damien Alexandre <dalexandre@jolicode.com>
Expand Down Expand Up @@ -51,7 +52,7 @@ public function testActivatedTest()

public function testIfUntranslatableLabelGetsDisabled()
{
$this->kernel->addConfigFile(__DIR__.'/app/config/disabled_label.yml');
$this->kernel->addConfigFile(__DIR__.'/../app/config/disabled_label.yml');
$request = Request::create('/foobar');

// Activate the feature
Expand Down
117 changes: 117 additions & 0 deletions Tests/Functional/Controller/WebUIControllerTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
<?php

/*
* This file is part of the PHP Translation package.
*
* (c) PHP Translation team <tobias.nyholm@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Translation\Bundle\Tests\Functional\Controller;

use Symfony\Component\HttpFoundation\Request;
use Translation\Bundle\Tests\Functional\BaseTestCase;

class WebUIControllerTest extends BaseTestCase
{
public static function setUpBeforeClass()
{
parent::setUpBeforeClass();

file_put_contents(__DIR__.'/../app/Resources/translations/messages.sv.xlf', <<<'XML'
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="fr-FR" trgLang="en-US">
<file id="messages.en_US">
<unit id="LCa0a2j">
<segment>
<source>key0</source>
<target>trans0</target>
</segment>
</unit>
<unit id="LCa0a2b">
<segment>
<source>key1</source>
<target>trans1</target>
</segment>
</unit>
</file>
</xliff>

XML
);
}

protected function setUp()
{
parent::setUp();
$this->kernel->addConfigFile(__DIR__.'/../app/config/normal_config.yml');
}

public function testIndexAction()
{
$request = Request::create('/_trans', 'GET');
$response = $this->kernel->handle($request);
$this->assertEquals(200, $response->getStatusCode());

$request = Request::create('/_trans/app', 'GET');
$response = $this->kernel->handle($request);
$this->assertEquals(200, $response->getStatusCode());
}

public function testShowAction()
{
$request = Request::create('/_trans/app/en/messages', 'GET');
$response = $this->kernel->handle($request);
$this->assertEquals(200, $response->getStatusCode());
}

public function testCreateAction()
{
$request = Request::create('/_trans/app/sv/messages/new', 'POST', [], [], [], [], json_encode([
'key' => 'foo',
]));
$response = $this->kernel->handle($request);
$this->assertEquals(400, $response->getStatusCode());

$request = Request::create('/_trans/app/sv/messages/new', 'POST', [], [], [], [], json_encode([
'key' => 'foo',
'message' => 'bar',
]));
$response = $this->kernel->handle($request);
$this->assertEquals(200, $response->getStatusCode());
}

public function testEditAction()
{
$request = Request::create('/_trans/app/sv/messages', 'POST', [], [], [], [], json_encode([
'key' => 'foo',
]));
$response = $this->kernel->handle($request);
$this->assertEquals(400, $response->getStatusCode());

$request = Request::create('/_trans/app/sv/messages', 'POST', [], [], [], [], json_encode([
'key' => 'key1',
'message' => 'bar',
]));
$response = $this->kernel->handle($request);
$this->assertEquals(200, $response->getStatusCode());
}

public function testDeleteAction()
{
// Removing something that does not exists is okey.
$request = Request::create('/_trans/app/sv/messages', 'DELETE', [], [], [], [], json_encode([
'key' => 'empty',
]));
$response = $this->kernel->handle($request);
$this->assertEquals(200, $response->getStatusCode());

$request = Request::create('/_trans/app/sv/messages', 'DELETE', [], [], [], [], json_encode([
'key' => 'foo',
]));
$response = $this->kernel->handle($request);
$this->assertEquals(200, $response->getStatusCode());
}
}
1 change: 1 addition & 0 deletions Tests/Functional/app/Resources/translations/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
messages.sv.xlf
22 changes: 22 additions & 0 deletions Tests/Functional/app/Resources/translations/messages.en.xlf
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="fr-FR" trgLang="en-US">
<file id="messages.en_US">
<unit id="LCa0a2j">
<notes>
<note category="state">new</note>
<note category="approved">true</note>
<note category="section" priority="1">user login</note>
</notes>
<segment>
<source>key0</source>
<target>trans0</target>
</segment>
</unit>
<unit id="LCa0a2b">
<segment>
<source>key1</source>
<target>trans1</target>
</segment>
</unit>
</file>
</xliff>
2 changes: 1 addition & 1 deletion Tests/Functional/app/config/framework.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ framework:
form: false
csrf_protection: false
validation:
enabled: false
enabled: true
router:
resource: "%test.root_dir%/config/routing.yml"
type: 'yaml'
Expand Down
10 changes: 10 additions & 0 deletions Tests/Functional/app/config/normal_config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
translation:
locales: ["en", "sv"]
webui:
enabled: true
edit_in_place:
enabled: true
configs:
app:
dirs: ["%test.root_dir%/Resources/views"]
output_dir: "%test.root_dir%/Resources/translations"
Loading