2016-11-04 1 views
0

Я решил префикс всех моих маршрутов переменной $ locale. Это Найден код от прибегая к помощи:Создание языковых сменных URL-адресов в laravel

$locale = Request::segment(1); 

if (in_array($locale, Config::get('app.available_locales'))) { 
    App::setLocale($locale); 
} else { 
    $locale = null; 
} 

Route::group(array('prefix' => $locale), function() { 

    //All my routes 

}); 

Теперь я хотел бы генерировать URL: S динамически для прыжков между локалями. Мне нужен способ генерации текущего URL-адреса или маршрута, но замените параметр locale $. Вы должны быть в состоянии написать что-то похожее на этот псевдокод:

route(Route::Current(), [$locale => 'foo']) 

Вопрос:

Я хочу, чтобы взять мой текущий URL и заменить один аргумент в нем. Как мне это сделать?

Update 1:

Давать мой маршрут имя, я могу это сделать:

route('index', 'foo') //Gives mywebsite.com?foo 

Это, однако, не дает желаемого результата, mywebsite.com/foo , Вместо этого он генерирует mywebsite.com?foo. Я предполагаю, что маршрут не понимает, что этот маршрут вложен и имеет префикс фрагмента, поэтому он обрабатывает мой аргумент как параметр. Определение того, что это локаль я хочу изменить не поможет:

route('index', ['locale' => 'foo']) //Gives mywebsite.com?locale=foo 

Update 2:

Изменение префикса вместо сказать:

Route::group(array('prefix' => '{locale?}'), function() { 

делает маршрут() работы:

route('index', ['locale' => 'foo']) //Gives mywebsite.com/foo 

Однако он разрушает некоторый url: s внутри группы , так как некоторые из них начинаются с переменных. Следующий маршрут внутри маршрутной группы перестает работать:

Route::get('/{id}', '[email protected]'); 

Как routes.php интерпретирует URL-адрес mywebsite.com/foo как «Foo» теперь язык. Если есть какой-то способ установить значение по умолчанию в routes.php для локали, чтобы вы могли написать его как {route} вместо {route?} И перенаправить его к языку по умолчанию, если он отсутствует, проблема будет решена ,

Update 3:

Двигаясь в направлении, имеющий «префикс» => «{? Локали}» вместо этого приводит к слишком много подзадач, стоит добиваться. Проблема возвращается к созданию URL-адресов из текущего URL-адреса, но вставляет язык в URL-адрес. В настоящее время я рассматриваю возможность делать это только с заменой регулярных выражений, потому что это самое прямое решение.

+0

Вы хотите «префикс всех [моих] маршрутов», но затем вы хотите сделать его необязательным? Так чего же вы действительно хотите? Я думаю, что лучше префикс ALL или NONE ваших маршрутов. – Yannici

+0

Я хочу иметь рабочую локальную систему с языковой версией в URL-адресе. Если локаль отсутствует в URL-адресе url/request, следует использовать локаль по умолчанию. – Rkey

+0

Я не думаю, что это так просто, потому что Laravel не знает, когда он должен интерпретировать первый параметр как локаль, а когда нет. – Yannici

ответ

0

Я не тестировал это, но вы могли бы попытаться сделать это так. Если параметр не задан, вы можете легко перенаправить на локальный маршрут по умолчанию. Если задан первый параметр, вам нужно проверить, является ли он правильной локалью.

use Illuminate\Support\Facades\Request; 

$defaultLocale = 'en'; 

Route::get('/', function() use ($defaultLocale) { 
    return redirect('/' . $defaultLocale); 
}); 

Route::group(array('prefix' => '{locale}'), function($locale) use ($defaultLocale) { 

    if(!in_array($locale, Config::get('app.available_locales'))) { 
      return redirect('/' . $defaultLocale . '/' . Request::path()); 
    } 

    // All your routes 

}); 
+0

Это работает для индекса, но не для всех сайтов. Если кто-то отправится прямо на mywebsite.com/about, он будет перенаправлен на mywebsite.com/en вместо mywebsite.com/en/about. Это близко! – Rkey

+0

Вы должны перенаправить (в группе префикса) URL-адрес со следующими компонентами: базовый URL-адрес/локаль/текущий запрос. –

+0

Как вы получаете доступ к «текущему запросу»? – Rkey

0

Так что я не решил этого с помощью магии ларавелла, я написал свой собственный код.

Маршрут :: Группа остается тем же самым, код я использую для создания URL: s на разных языках выглядит следующим образом:

<a href="{{ change_locale_url('en') }}"</a> 

change_locale_url-функция просто функция, которая использует регулярное выражение URL :: Текущий, чтобы получить текущий url, а затем либо вставляет, либо заменяет входную строку в качестве параметра языка в URL-адресе.

  • Когда я на mywebsite.com/about, функция выходов mywebsite.com/en/about
  • Когда я на www.mywebsite.com/de/about, функция выводит WWW. mywebsite.com/en/about
  • когда я на http://mywebsite.com, функция выходов http://mywebsite.com/en

в качестве напоминания, при использовании этого маршрута группы необходимо создавать ссылки с помощью действия («HomeController @ индекс») чтобы локаль последовала за вами по следующей ссылке. Связывание с/будет удалять любой выбранный язык.

 Смежные вопросы

  • Нет связанных вопросов^_^