diff --git a/config/packages/security.yaml b/config/packages/security.yaml index ab03ff47..ee69e4f1 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -28,6 +28,7 @@ security: check_path: login csrf_token_generator: security.csrf.token_manager use_referer: true + default_target_path: '/' logout: path: logout diff --git a/config/routes.yaml b/config/routes.yaml index c3283aa2..b77701d3 100644 --- a/config/routes.yaml +++ b/config/routes.yaml @@ -1,3 +1,10 @@ #index: # path: / # controller: App\Controller\DefaultController::index + +# Redirect every url without an locale to the locale of the user/the global base locale +redirector: + path: /{url} + requirements: + url: ".*" + controller: App\Controller\RedirectController:addLocalePart \ No newline at end of file diff --git a/config/routes/annotations.yaml b/config/routes/annotations.yaml index d2f9e09d..836fcabc 100644 --- a/config/routes/annotations.yaml +++ b/config/routes/annotations.yaml @@ -2,7 +2,4 @@ controllers: resource: ../../src/Controller/ type: annotation - prefix: - en: '/en' - de: '/de' - '%locale%': '/' + prefix: '{_locale}' diff --git a/config/services.yaml b/config/services.yaml index 6d5ee3bf..6e0451d1 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -49,6 +49,10 @@ services: - name: doctrine.orm.entity_listener + App\Controller\RedirectController: + arguments: + $default_locale: '%locale%' + App\Command\UpdateExchangeRatesCommand: arguments: $base_current: '%default_currency%' diff --git a/src/Controller/RedirectController.php b/src/Controller/RedirectController.php new file mode 100644 index 00000000..11176cea --- /dev/null +++ b/src/Controller/RedirectController.php @@ -0,0 +1,64 @@ +default_locale = $default_locale; + } + + public function addLocalePart(Request $request) + { + //By default we use the global default locale + $locale = $this->default_locale; + + //Check if a user has set a preferred language setting: + $user = $this->getUser(); + if ($user instanceof User) { + if(!empty($user->getLanguage())) { + $locale = $user->getLanguage(); + } + } + + $new_url = str_replace($request->getPathInfo(), '/' . $locale . $request->getPathInfo(), $request->getUri()); + + return $this->redirect($new_url); + } +} \ No newline at end of file diff --git a/src/Entity/UserSystem/User.php b/src/Entity/UserSystem/User.php index 78b1e983..044c7fd6 100644 --- a/src/Entity/UserSystem/User.php +++ b/src/Entity/UserSystem/User.php @@ -141,7 +141,7 @@ class User extends NamedDBElement implements UserInterface, HasPermissionsInterf /** * @var string|null The language/locale the user prefers * @ORM\Column(type="string", name="config_language", nullable=true) - * @Assert\Locale(canonicalize=true) + * @Assert\Language() */ protected $language = ''; diff --git a/src/Form/UserSettingsType.php b/src/Form/UserSettingsType.php index d065a34d..f6be1899 100644 --- a/src/Form/UserSettingsType.php +++ b/src/Form/UserSettingsType.php @@ -6,6 +6,7 @@ use App\Entity\UserSystem\User; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\EmailType; +use Symfony\Component\Form\Extension\Core\Type\LanguageType; use Symfony\Component\Form\Extension\Core\Type\LocaleType; use Symfony\Component\Form\Extension\Core\Type\ResetType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; @@ -55,11 +56,12 @@ class UserSettingsType extends AbstractType 'label' => $this->trans->trans('user.email.label'), 'disabled' => !$this->security->isGranted('edit_infos', $options['data']), ]) - ->add('language', LocaleType::class, [ + ->add('language', LanguageType::class, [ 'required' => false, 'attr' => ['class' => 'selectpicker', 'data-live-search' => true], 'placeholder' => $this->trans->trans('user_settings.language.placeholder'), 'label' => $this->trans->trans('user.language_select'), + 'preferred_choices' => ['en', 'de'] ]) ->add('timezone', TimezoneType::class, [ 'required' => false, diff --git a/src/Twig/AppExtension.php b/src/Twig/AppExtension.php index ff92f8ef..9af2a8e8 100644 --- a/src/Twig/AppExtension.php +++ b/src/Twig/AppExtension.php @@ -78,7 +78,8 @@ class AppExtension extends AbstractExtension new TwigFilter('bbCode', [$this, 'parseBBCode'], ['pre_escape' => 'html', 'is_safe' => ['html']]), new TwigFilter('moneyFormat', [$this, 'formatCurrency']), new TwigFilter('siFormat', [$this, 'siFormat']), - new TwigFilter('amountFormat', [$this, 'amountFormat']) + new TwigFilter('amountFormat', [$this, 'amountFormat']), + new TwigFilter('loginPath', [$this, 'loginPath']) ]; } @@ -104,6 +105,19 @@ class AppExtension extends AbstractExtension return $this->serializer->serialize($tree, 'json', ['skip_null_values' => true]); } + /** + * This function/filter generates an path + * @param string $path + * @return string + */ + public function loginPath(string $path) : string + { + $parts = explode("/" ,$path); + //Remove the part with + unset($parts[1]); + return implode("/", $parts); + } + public function generateEntityURL(DBElement $entity, string $method = 'info'): string { return $this->entityURLGenerator->getURL($entity, $method); diff --git a/templates/_navbar.html.twig b/templates/_navbar.html.twig index 5e09de66..ce648b4d 100644 --- a/templates/_navbar.html.twig +++ b/templates/_navbar.html.twig @@ -77,7 +77,7 @@ {% trans %}user.logout{% endtrans %} {% else %} - {% trans %}user.login{% endtrans %} + {% trans %}user.login{% endtrans %} {% endif %} {% trans %}user.language_select{% endtrans %}