mcamara / laravel-localization

Easy localization for Laravel
MIT License
3.37k stars 516 forks source link

LaravelLocalizationRedirectFilter ignores config.laravellocalization.localesMapping #781

Open j0eii opened 3 years ago

j0eii commented 3 years ago

Describe the bug The LaravelLocalizationRedirectFilter::class middleware ignores config.laravellocalization.localesMapping if the mapping exists.

To Reproduce Steps to reproduce the behavior:

  1. Add localesMapping with default value of each languages
  2. Add LaravelLocalizationRedirectFilter
  3. Goto default language url.
  4. You should see the url doesnt redirect to empty default langauge url.

Expected behavior The locale in url should be extracted.

More info:

    'en' => ['name' => 'English', 'script' => 'Latn', 'native' => 'English', 'regional' => 'en_GB'],
    'zh_HK' => ['name' => 'Chinese (Traditional)', 'script' => 'Hant', 'native' => '繁體中文', 'regional' => 'zh_HK'],
],
  'useAcceptLanguageHeader' => false,
  'hideDefaultLocaleInURL' => true,
  'localesMapping' => [
    'zh_HK' => 'tc'
  ],

Additional context

src/vendor/mcamara/laravel-localization/src/Mcamara/LaravelLocalization/Middleware/LaravelLocalizationRedirectFilter.php:31

Add the following Code:

if (count(config('laravellocalization.localesMapping'))){
foreach(config('laravellocalization.localesMapping') as $orgLocale => $shortFormLocale){
if ($orgLocale ==  $shortFormLocale){
$locale = $orgLocale;
break;
}
}

It should be fixed after that.

lcharrie commented 3 years ago

I encountered the same problem. Parameter hideDefaultLocaleInURLdoes not work if a localeMapping list is used. Also your fix doesn't work. $orgLocale will never equal $shortFormLocale.

I modified the isHiddenDefaultfunction to take into account localeMapping

# src/vendor/mcamara/laravel-localization/src/Mcamara/LaravelLocalization/LaravelLocalization.php:217

public function isHiddenDefault($locale)
{
  return  ($this->getDefaultLocale() === $this->getInversedLocaleFromMapping($locale) && $this->hideDefaultLocaleInURL());
}

It works for me now.

kilianweisl commented 1 year ago

I encountered the same issue. As far as I can tell this is not fixed yet. Have you considered opening a PR with your fix @lcharrie?