Settings language handled in SettingsController

This commit is contained in:
frischler 2022-06-20 19:03:47 +02:00 committed by Igor Scheller
parent 5d489fec20
commit 8380536055
9 changed files with 182 additions and 60 deletions

View File

@ -24,6 +24,8 @@ $route->get('/settings/password', 'SettingsController@password');
$route->post('/settings/password', 'SettingsController@savePassword'); $route->post('/settings/password', 'SettingsController@savePassword');
$route->get('/settings/theme', 'SettingsController@theme'); $route->get('/settings/theme', 'SettingsController@theme');
$route->post('/settings/theme', 'SettingsController@saveTheme'); $route->post('/settings/theme', 'SettingsController@saveTheme');
$route->get('/settings/language', 'SettingsController@language');
$route->post('/settings/language', 'SettingsController@saveLanguage');
$route->get('/settings/oauth', 'SettingsController@oauth'); $route->get('/settings/oauth', 'SettingsController@oauth');
// Password recovery // Password recovery

View File

@ -105,36 +105,6 @@ function user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes)
return $user_source; return $user_source;
} }
/**
* Change use locale
*
* @param User $user_source The user
* @param array $locales List of available locales
* @return User
*/
function user_settings_locale($user_source, $locales)
{
$valid = true;
$request = request();
$session = session();
if ($request->has('language') && isset($locales[$request->input('language')])) {
$user_source->settings->language = $request->input('language');
} else {
$valid = false;
}
if ($valid) {
$user_source->settings->save();
$session->set('locale', $user_source->settings->language);
success('Language changed.');
throw_redirect(page_link_to('user_settings'));
}
return $user_source;
}
/** /**
* Main user settings page/controller * Main user settings page/controller
* *
@ -147,7 +117,6 @@ function user_settings()
$enable_tshirt_size = config('enable_tshirt_size'); $enable_tshirt_size = config('enable_tshirt_size');
$tshirt_sizes = config('tshirt_sizes'); $tshirt_sizes = config('tshirt_sizes');
$locales = config('locales');
$buildup_start_date = null; $buildup_start_date = null;
$teardown_end_date = null; $teardown_end_date = null;
@ -165,13 +134,10 @@ function user_settings()
$user_source = auth()->user(); $user_source = auth()->user();
if ($request->hasPostData('submit')) { if ($request->hasPostData('submit')) {
$user_source = user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes); $user_source = user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes);
} elseif ($request->hasPostData('submit_language')) {
$user_source = user_settings_locale($user_source, $locales);
} }
return User_settings_view( return User_settings_view(
$user_source, $user_source,
$locales,
$buildup_start_date, $buildup_start_date,
$teardown_end_date, $teardown_end_date,
$enable_tshirt_size, $enable_tshirt_size,

View File

@ -13,7 +13,6 @@ use Engelsystem\Controllers\SettingsController;
* Renders user settings page * Renders user settings page
* *
* @param User $user_source The user * @param User $user_source The user
* @param array $locales Available languages
* @param int $buildup_start_date Unix timestamp * @param int $buildup_start_date Unix timestamp
* @param int $teardown_end_date Unix timestamp * @param int $teardown_end_date Unix timestamp
* @param bool $enable_tshirt_size * @param bool $enable_tshirt_size
@ -23,7 +22,6 @@ use Engelsystem\Controllers\SettingsController;
*/ */
function User_settings_view( function User_settings_view(
$user_source, $user_source,
$locales,
$buildup_start_date, $buildup_start_date,
$teardown_end_date, $teardown_end_date,
$enable_tshirt_size, $enable_tshirt_size,
@ -116,11 +114,6 @@ function User_settings_view(
form_info('', __('Please visit the angeltypes page to manage your angeltypes.')), form_info('', __('Please visit the angeltypes page to manage your angeltypes.')),
form_submit('submit', __('Save')) form_submit('submit', __('Save'))
]), ]),
form([
form_info(__('Here you can choose your language:')),
form_select('language', __('Language:'), $locales, $user_source->settings->language),
form_submit('submit_language', __('Save'))
]),
]) ])
]) ])
] ]

View File

@ -2521,14 +2521,6 @@ msgstr "Geplanter Abreisetag"
msgid "Please visit the angeltypes page to manage your angeltypes." msgid "Please visit the angeltypes page to manage your angeltypes."
msgstr "Bitte benutze die Engeltypen-Seite um deine Engeltypen zu verwalten." msgstr "Bitte benutze die Engeltypen-Seite um deine Engeltypen zu verwalten."
#: includes/view/User_view.php:101
msgid "Here you can choose your language:"
msgstr "Hier kannst Du Deine Sprache auswählen:"
#: includes/view/User_view.php:102
msgid "Language:"
msgstr "Sprache:"
#: includes/view/User_view.php:124 #: includes/view/User_view.php:124
msgid "" msgid ""
"Do you really want to delete the user including all his shifts and every " "Do you really want to delete the user including all his shifts and every "
@ -2965,6 +2957,15 @@ msgstr "Hier kannst Du Dein Theme ändern."
msgid "settings.theme.success" msgid "settings.theme.success"
msgstr "Theme wurde erfolgreich geändert." msgstr "Theme wurde erfolgreich geändert."
msgid "settings.language"
msgstr "Sprache"
msgid "settings.language.info"
msgstr "Hier kannst Du Deine Sprache ändern."
msgid "settings.language.success"
msgstr "Sprache wurde erfolgreich geändert."
msgid "settings.oauth" msgid "settings.oauth"
msgstr "Single Sign-On" msgstr "Single Sign-On"

View File

@ -235,6 +235,15 @@ msgstr "Here you can change your theme."
msgid "settings.theme.success" msgid "settings.theme.success"
msgstr "Theme was changed successfully." msgstr "Theme was changed successfully."
msgid "settings.language"
msgstr "Language"
msgid "settings.language.info"
msgstr "Here you can change your language."
msgid "settings.language.success"
msgstr "Language was changed successfully."
msgid "settings.oauth" msgid "settings.oauth"
msgstr "Single Sign-On" msgstr "Single Sign-On"

View File

@ -2207,14 +2207,6 @@ msgstr "Nova senha:"
msgid "Password confirmation:" msgid "Password confirmation:"
msgstr "Confirmação de senha:" msgstr "Confirmação de senha:"
#: includes/view/User_view.php:73
msgid "Here you can choose your language:"
msgstr "Aqui você pode selecionar seu idioma:"
#: includes/view/User_view.php:74
msgid "Language:"
msgstr "Idioma:"
#: includes/view/User_view.php:88 #: includes/view/User_view.php:88
msgid "Registration successful" msgid "Registration successful"
msgstr "Registrado com sucesso" msgstr "Registrado com sucesso"

View File

@ -0,0 +1,19 @@
{% extends 'pages/settings/settings.twig' %}
{% import 'macros/form.twig' as f %}
{% import 'macros/base.twig' as m %}
{% block title %}{{ __('settings.language') }}{% endblock %}
{% block row_content %}
<form action="" enctype="multipart/form-data" method="post">
{{ csrf() }}
<div class="row">
<div class="col-md-12">
{{ m.info(__('settings.language.info')) }}
{{ f.select('select_language', languages, __('settings.language'), current_language) }}
{{ f.submit() }}
</div>
</div>
</form>
{% endblock %}

View File

@ -139,6 +139,49 @@ class SettingsController extends BaseController
return $this->redirect->to('/settings/theme'); return $this->redirect->to('/settings/theme');
} }
/**
* @return Response
*/
public function language(): Response
{
$languages = config('locales');
$currentLanguage = $this->auth->user()->settings->language;
return $this->response->withView(
'pages/settings/language',
[
'settings_menu' => $this->settingsMenu(),
'languages' => $languages,
'current_language' => $currentLanguage
] + $this->getNotifications()
);
}
/**
* @param Request $request
* @return Response
*/
public function saveLanguage(Request $request): Response
{
$user = $this->auth->user();
$data = $this->validate($request, ['select_language' => 'required']);
$selectLanguage = $data['select_language'];
if (!isset(config('locales')[$selectLanguage])) {
throw new HttpNotFound('Language ' . $selectLanguage . ' does not exist.');
}
$user->settings->language = $selectLanguage;
$user->settings->save();
session()->set('locale', $selectLanguage);
$this->addNotification('settings.language.success');
return $this->redirect->to('/settings/language');
}
/** /**
* @return Response * @return Response
*/ */
@ -166,6 +209,7 @@ class SettingsController extends BaseController
$menu = [ $menu = [
url('/user-settings') => 'settings.profile', url('/user-settings') => 'settings.profile',
url('/settings/password') => 'settings.password', url('/settings/password') => 'settings.password',
url('/settings/language') => 'settings.language',
url('/settings/theme') => 'settings.theme' url('/settings/theme') => 'settings.theme'
]; ];

View File

@ -45,6 +45,9 @@ class SettingsControllerTest extends TestCase
/** @var User */ /** @var User */
protected $user; protected $user;
/** @var Session */
protected $session;
/** /**
* @covers \Engelsystem\Controllers\SettingsController::password * @covers \Engelsystem\Controllers\SettingsController::password
*/ */
@ -323,6 +326,91 @@ class SettingsControllerTest extends TestCase
$this->assertEquals(0, $this->user->settings->theme); $this->assertEquals(0, $this->user->settings->theme);
} }
/**
* @testdox language: underNormalConditions -> returnsCorrectViewAndData
* @covers \Engelsystem\Controllers\SettingsController::language
*/
public function testLanguageUnderNormalConditionReturnsCorrectViewAndData()
{
$this->setExpects($this->auth, 'user', null, $this->user, $this->once());
/** @var Response|MockObject $response */
$this->response->expects($this->once())
->method('withView')
->willReturnCallback(function ($view, $data) {
$this->assertEquals('pages/settings/language', $view);
$this->assertArrayHasKey('settings_menu', $data);
$this->assertArrayHasKey('languages', $data);
$this->assertArrayHasKey('current_language', $data);
$this->assertEquals(['en_US' => 'English', 'de_DE' => 'Deutsch'], $data['languages']);
$this->assertEquals('en_US', $data['current_language']);
return $this->response;
});
/** @var SettingsController $controller */
$controller = $this->app->make(SettingsController::class);
$controller->language();
}
/**
* @testdox saveLanguage: withNoSelectedLanguageGiven -> throwsException
* @covers \Engelsystem\Controllers\SettingsController::saveLanguage
*/
public function testSaveLanguageWithNoSelectedLanguageGivenThrowsException()
{
$this->setExpects($this->auth, 'user', null, $this->user, $this->once());
$this->expectException(ValidationException::class);
/** @var SettingsController $controller */
$controller = $this->app->make(SettingsController::class);
$controller->setValidator(new Validator());
$controller->saveLanguage($this->request);
}
/**
* @testdox saveLanguage: withUnknownSelectedLanguageGiven -> throwsException
* @covers \Engelsystem\Controllers\SettingsController::saveLanguage
*/
public function testSaveLanguageWithUnknownSelectedLanguageGivenThrowsException()
{
$this->request = $this->request->withParsedBody(['select_language' => 'unknown']);
$this->setExpects($this->auth, 'user', null, $this->user, $this->once());
$this->expectException(HttpNotFound::class);
/** @var SettingsController $controller */
$controller = $this->app->make(SettingsController::class);
$controller->setValidator(new Validator());
$controller->saveLanguage($this->request);
}
/**
* @testdox saveLanguage: withKnownSelectedLanguageGiven -> savesLanguageAndUpdatesSessionAndRedirect
* @covers \Engelsystem\Controllers\SettingsController::saveLanguage
*/
public function testSaveLanguageWithKnownSelectedLanguageGivenSavesLanguageAndUpdatesSessionAndRedirect()
{
$this->assertEquals('en_US', $this->user->settings->language);
$this->session->set('locale', 'en_US');
$this->setExpects($this->auth, 'user', null, $this->user, $this->once());
$this->response->expects($this->once())
->method('redirectTo')
->with('http://localhost/settings/language')
->willReturn($this->response);
$this->request = $this->request->withParsedBody(['select_language' => 'de_DE']);
/** @var SettingsController $controller */
$controller = $this->app->make(SettingsController::class);
$controller->setValidator(new Validator());
$controller->saveLanguage($this->request);
$this->assertEquals('de_DE', $this->user->settings->language);
$this->assertEquals('de_DE', $this->session->get('locale'));
}
/** /**
* @covers \Engelsystem\Controllers\SettingsController::__construct * @covers \Engelsystem\Controllers\SettingsController::__construct
* @covers \Engelsystem\Controllers\SettingsController::oauth * @covers \Engelsystem\Controllers\SettingsController::oauth
@ -377,6 +465,7 @@ class SettingsControllerTest extends TestCase
$this->assertEquals([ $this->assertEquals([
'http://localhost/user-settings' => 'settings.profile', 'http://localhost/user-settings' => 'settings.profile',
'http://localhost/settings/password' => 'settings.password', 'http://localhost/settings/password' => 'settings.password',
'http://localhost/settings/language' => 'settings.language',
'http://localhost/settings/theme' => 'settings.theme', 'http://localhost/settings/theme' => 'settings.theme',
'http://localhost/settings/oauth' => ['title' => 'settings.oauth', 'hidden' => false] 'http://localhost/settings/oauth' => ['title' => 'settings.oauth', 'hidden' => false]
], $controller->settingsMenu()); ], $controller->settingsMenu());
@ -385,6 +474,7 @@ class SettingsControllerTest extends TestCase
$this->assertEquals([ $this->assertEquals([
'http://localhost/user-settings' => 'settings.profile', 'http://localhost/user-settings' => 'settings.profile',
'http://localhost/settings/password' => 'settings.password', 'http://localhost/settings/password' => 'settings.password',
'http://localhost/settings/language' => 'settings.language',
'http://localhost/settings/theme' => 'settings.theme', 'http://localhost/settings/theme' => 'settings.theme',
'http://localhost/settings/oauth' => ['title' => 'settings.oauth', 'hidden' => true] 'http://localhost/settings/oauth' => ['title' => 'settings.oauth', 'hidden' => true]
], $controller->settingsMenu()); ], $controller->settingsMenu());
@ -403,6 +493,7 @@ class SettingsControllerTest extends TestCase
$this->assertEquals([ $this->assertEquals([
'http://localhost/user-settings' => 'settings.profile', 'http://localhost/user-settings' => 'settings.profile',
'http://localhost/settings/password' => 'settings.password', 'http://localhost/settings/password' => 'settings.password',
'http://localhost/settings/language' => 'settings.language',
'http://localhost/settings/theme' => 'settings.theme' 'http://localhost/settings/theme' => 'settings.theme'
], $controller->settingsMenu()); ], $controller->settingsMenu());
} }
@ -419,7 +510,11 @@ class SettingsControllerTest extends TestCase
0 => ['name' => 'Engelsystem light'], 0 => ['name' => 'Engelsystem light'],
1 => ['name' => 'Engelsystem dark'] 1 => ['name' => 'Engelsystem dark']
]; ];
$this->config = new Config(['min_password_length' => 6, 'themes' => $themes]); $languages = [
'en_US' => 'English',
'de_DE' => 'Deutsch'
];
$this->config = new Config(['min_password_length' => 6, 'themes' => $themes, 'locales' => $languages]);
$this->app->instance('config', $this->config); $this->app->instance('config', $this->config);
$this->app->instance(Config::class, $this->config); $this->app->instance(Config::class, $this->config);
@ -437,13 +532,14 @@ class SettingsControllerTest extends TestCase
$this->log = new TestLogger(); $this->log = new TestLogger();
$this->app->instance(LoggerInterface::class, $this->log); $this->app->instance(LoggerInterface::class, $this->log);
$this->app->instance('session', new Session(new MockArraySessionStorage())); $this->session = new Session(new MockArraySessionStorage());
$this->app->instance('session', $this->session);
$this->auth = $this->createMock(Authenticator::class); $this->auth = $this->createMock(Authenticator::class);
$this->app->instance(Authenticator::class, $this->auth); $this->app->instance(Authenticator::class, $this->auth);
$this->user = User::factory() $this->user = User::factory()
->has(Settings::factory(['theme' => 1])) ->has(Settings::factory(['theme' => 1, 'language' => 'en_US']))
->create(); ->create();
} }
} }