Skip to content

Commit a6f40e5

Browse files
86 fire event when adding translations (#107)
* Add basic event class to fire later * Clean up controller, move logic to abstract class * Rename event and pass all relevant data * Add tests that event is fired with right data * Auto fix formatting issues with php-cs-fixer Use laravel shift preset
1 parent 5e1fed5 commit a6f40e5

File tree

5 files changed

+129
-11
lines changed

5 files changed

+129
-11
lines changed

src/Drivers/Translation.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
namespace JoeDixon\Translation\Drivers;
44

5+
use Illuminate\Http\Request;
56
use Illuminate\Support\Collection;
7+
use Illuminate\Support\Facades\Event;
68
use Illuminate\Support\Str;
9+
use JoeDixon\Translation\Events\TranslationAdded;
710

811
abstract class Translation
912
{
@@ -98,4 +101,20 @@ public function filterTranslationsFor($language, $filter)
98101
});
99102
});
100103
}
104+
105+
public function add(Request $request, $language, $isGroupTranslation)
106+
{
107+
$namespace = $request->has('namespace') && $request->get('namespace') ? "{$request->get('namespace')}::" : '';
108+
$group = $namespace.$request->get('group');
109+
$key = $request->get('key');
110+
$value = $request->get('value') ?: '';
111+
112+
if ($isGroupTranslation) {
113+
$this->addGroupTranslation($language, $group, $key, $value);
114+
} else {
115+
$this->addSingleTranslation($language, 'single', $key, $value);
116+
}
117+
118+
Event::dispatch(new TranslationAdded($language, $group ?: 'single', $key, $value));
119+
}
101120
}

src/Events/TranslationAdded.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace JoeDixon\Translation\Events;
4+
5+
use Illuminate\Foundation\Events\Dispatchable;
6+
7+
class TranslationAdded
8+
{
9+
use Dispatchable;
10+
11+
public $key;
12+
public $group;
13+
public $value;
14+
public $language;
15+
16+
/**
17+
* Create a new event instance.
18+
*
19+
* @return void
20+
*/
21+
public function __construct(string $language, string $group, string $key, string $value)
22+
{
23+
$this->language = $language;
24+
$this->group = $group;
25+
$this->key = $key;
26+
$this->value = $value;
27+
}
28+
}

src/Http/Controllers/LanguageTranslationController.php

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,9 @@ public function create(Request $request, $language)
5353

5454
public function store(TranslationRequest $request, $language)
5555
{
56-
if ($request->filled('group')) {
57-
$namespace = $request->has('namespace') && $request->get('namespace') ? "{$request->get('namespace')}::" : '';
58-
$this->translation->addGroupTranslation($language, "{$namespace}{$request->get('group')}", $request->get('key'), $request->get('value') ?: '');
59-
} else {
60-
$this->translation->addSingleTranslation($language, 'single', $request->get('key'), $request->get('value') ?: '');
61-
}
56+
$isGroupTranslation = $request->filled('group');
57+
58+
$this->translation->add($request, $language, $isGroupTranslation);
6259

6360
return redirect()
6461
->route('languages.translations.index', $language)
@@ -67,11 +64,9 @@ public function store(TranslationRequest $request, $language)
6764

6865
public function update(Request $request, $language)
6966
{
70-
if (! Str::contains($request->get('group'), 'single')) {
71-
$this->translation->addGroupTranslation($language, $request->get('group'), $request->get('key'), $request->get('value') ?: '');
72-
} else {
73-
$this->translation->addSingleTranslation($language, $request->get('group'), $request->get('key'), $request->get('value') ?: '');
74-
}
67+
$isGroupTranslation = ! Str::contains($request->get('group'), 'single');
68+
69+
$this->translation->add($request, $language, $isGroupTranslation);
7570

7671
return ['success' => true];
7772
}

tests/DatabaseDriverTest.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
namespace JoeDixon\Translation\Tests;
44

55
use Illuminate\Foundation\Testing\DatabaseMigrations;
6+
use Illuminate\Support\Facades\Event;
67
use JoeDixon\Translation\Drivers\Translation;
8+
use JoeDixon\Translation\Events\TranslationAdded;
79
use JoeDixon\Translation\Exceptions\LanguageExistsException;
810
use JoeDixon\Translation\Language;
911
use JoeDixon\Translation\Translation as TranslationModel;
@@ -339,4 +341,36 @@ public function a_translation_can_be_updated()
339341

340342
$this->assertDatabaseHas('translations', ['language_id' => 1, 'group' => 'test', 'key' => 'hello', 'value' => 'Hello there!']);
341343
}
344+
345+
/** @test */
346+
public function adding_a_translation_fires_an_event_with_the_expected_data()
347+
{
348+
Event::fake();
349+
350+
$data = ['key' => 'joe', 'value' => 'is cool'];
351+
$this->post(config('translation.ui_url').'/en/translations', $data);
352+
353+
Event::assertDispatched(TranslationAdded::class, function ($event) use ($data) {
354+
return $event->language === 'en' &&
355+
$event->group === 'single' &&
356+
$event->value === $data['value'] &&
357+
$event->key === $data['key'];
358+
});
359+
}
360+
361+
/** @test */
362+
public function updating_a_translation_fires_an_event_with_the_expected_data()
363+
{
364+
Event::fake();
365+
366+
$data = ['group' => 'test', 'key' => 'hello', 'value' => 'Hello there!'];
367+
$this->post(config('translation.ui_url').'/en/translations', $data);
368+
369+
Event::assertDispatched(TranslationAdded::class, function ($event) use ($data) {
370+
return $event->language === 'en' &&
371+
$event->group === $data['group'] &&
372+
$event->value === $data['value'] &&
373+
$event->key === $data['key'];
374+
});
375+
}
342376
}

tests/FileDriverTest.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
namespace JoeDixon\Translation\Tests;
44

5+
use Illuminate\Support\Facades\Event;
56
use JoeDixon\Translation\Drivers\Translation;
7+
use JoeDixon\Translation\Events\TranslationAdded;
68
use JoeDixon\Translation\Exceptions\LanguageExistsException;
79
use JoeDixon\Translation\TranslationBindingsServiceProvider;
810
use JoeDixon\Translation\TranslationServiceProvider;
@@ -335,4 +337,44 @@ public function a_translation_can_be_updated()
335337
"<?php\n\nreturn ".var_export(['hello' => 'Hello', 'whats_up' => 'What\'s up!'], true).';'.\PHP_EOL
336338
);
337339
}
340+
341+
/** @test */
342+
public function adding_a_translation_fires_an_event_with_the_expected_data()
343+
{
344+
Event::fake();
345+
346+
$data = ['key' => 'joe', 'value' => 'is cool'];
347+
$this->post(config('translation.ui_url').'/en/translations', $data);
348+
349+
Event::assertDispatched(TranslationAdded::class, function ($event) use ($data) {
350+
return $event->language === 'en' &&
351+
$event->group === 'single' &&
352+
$event->value === $data['value'] &&
353+
$event->key === $data['key'];
354+
});
355+
file_put_contents(
356+
app()['path.lang'].'/en.json',
357+
json_encode((object) ['Hello' => 'Hello', 'What\'s up' => 'What\'s up!'], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)
358+
);
359+
}
360+
361+
/** @test */
362+
public function updating_a_translation_fires_an_event_with_the_expected_data()
363+
{
364+
Event::fake();
365+
366+
$data = ['group' => 'test', 'key' => 'hello', 'value' => 'Hello there!'];
367+
$this->post(config('translation.ui_url').'/en/translations', $data);
368+
369+
Event::assertDispatched(TranslationAdded::class, function ($event) use ($data) {
370+
return $event->language === 'en' &&
371+
$event->group === $data['group'] &&
372+
$event->value === $data['value'] &&
373+
$event->key === $data['key'];
374+
});
375+
file_put_contents(
376+
app()['path.lang'].'/en/test.php',
377+
"<?php\n\nreturn ".var_export(['hello' => 'Hello', 'whats_up' => 'What\'s up!'], true).';'.\PHP_EOL
378+
);
379+
}
338380
}

0 commit comments

Comments
 (0)