Какая лучшая логика для переключения языка в Laravel?

Я использую локализацию Laravel для предоставления двух разных языков. У меня есть все настройки пути, и mydomain.com/en/bla предоставляет английский язык и сохраняет переменную сеанса «en», а mydomain.com/he/bla предоставляет иврит и сохраняет переменную сеанса «he». Тем не менее, я не могу найти достойный способ предоставления языковой коммутации. Как это будет работать?

Это сообщение, которое я опубликовал первоначально на форумах laravel, но, возможно, это поможет кому-то другому, поэтому я также разместил его здесь.

У меня возникли проблемы с созданием удобного языкового коммутатора для моего приложения и информации на форумах, где немного старых (некоторые сообщения), поэтому я сделал этот простой кусок кода, что делает его сверхзадачей для изменения языка в вашем приложении на летать.

У меня есть языковые строки в моих представлениях:

{{ __('languagefile.the_language_string'); }} 

И я получаю языки с URL-адресом, я думаю, что это лучший способ, также это хорошо для SEO и для ссылок, которые люди разделяют. Пример:

 www.myapp.com/fi/support (Finnish) www.myapp.com/en/support (English) www.myapp.com/sv/support (Swedish) 

Итак, проблема в том, что мне нужен простой способ изменить язык «на лету», без необходимости возиться с сеансами и куки. Вот как я это сделал:

Создайте библиотеку в папке с вашими библиотеками: chooselang.php

Вставьте этот код внутри:

 class Chooselang extends HTML { /** * Generate a Language changer link. * * <code> * // Generate a link to the current location, * // but still change the site langauge on the fly * // Change $langcode to desired language, also change the Config::set('application.language', 'YOUR-LANG-HERE')); to desired language * // Example * echo Chooselang::langslug(URI::current() , $langcode = 'Finnish' . Config::set('application.language', 'fi')); * </code> * * @param string $url * @param string $langcode * @param array $attributes * @param bool $https * @return string */ public static function langslug($url, $langcode = null, $attributes = array(), $https = null) { $url = URL::to($url, $https); if (is_null($langcode)) $langcode = $url; return '<a href="'.$url.'"'.static::attributes($attributes).'>'.static::entities($langcode).'</a>'; } } 

После этого вы готовы для получения URL-адреса URL-адреса URL-адреса. Просто добавьте их, как и любые другие ссылки Blade.

Пример создания ссылок для финского, шведского и английского языков (с Blade)

  {{ Chooselang::langslug(URI::current() , $langcode = 'Fin' . Config::set('application.language', 'fi')); }} {{ Chooselang::langslug(URI::current() , $langcode = 'Swe' . Config::set('application.language', 'sv')); }} {{ Chooselang::langslug(URI::current() , $langcode = 'Eng' . Config::set('application.language', 'en')); }} 

Вышеизложенное будет генерировать URL: s, которые всегда находятся на текущей странице, и изменить lang slug на тот, который вы хотите. Таким образом, язык изменяется на тот, который вы хотите, и пользователь, естественно, остается на одной странице. По умолчанию языковой пул никогда не добавляется в URL.

Сгенерированные URL-адреса выглядят примерно так:

 <a href="http://localhost/laravel/public/support">Fin</a> <a href="http://localhost/laravel/public/sv/support">Swe</a> <a href="http://localhost/laravel/public/en/support">Eng</a> 

PS. Ссылки особенно полезны, если вы добавляете их в файл основного шаблона.

Я решил проблему, добавив ее в фильтр before before: route.php:

 // Default language ($lang) & current uri language ($lang_uri) $lang = 'he'; $lang_uri = URI::segment(1); // Set default session language if none is set if(!Session::has('language')) { Session::put('language', $lang); } // Route language path if needed if($lang_uri !== 'en' && $lang_uri !== 'he') { return Redirect::to($lang.'/'.($lang_uri ? URI::current() : '')); } // Set session language to uri elseif($lang_uri !== Session::get('language')) { Session::put('language', $lang_uri); } // Store the language switch links to the session $he2en = preg_replace('/he\//', 'en/', URI::full(), 1); $en2he = preg_replace('/en\//', 'he/', URI::full(), 1); Session::put('he2en', $he2en); Session::put('en2he', $en2he); 

У вас может быть маршрут для изменения языка, например:

Route::get('translate/(:any)', 'translator@set');

Затем в set действии в контроллере translator можно изменить сеанс, в зависимости от кода языка, переданного через URL.

Вы также можете изменить настройку конфигурации, используя

Config::set('application.language', $url_variable');

Пример контроллера – translate.php

 public function action_set($url_variable) { /* Your code Here */ } 

На всякий случай для будущих пользователей, если вы хотите использовать пакет для локализации. На https://github.com/mcamara/laravel-localization есть отличный пакет. который прост в установке и имеет много помощников.

Попробуйте использовать Session. Что-то вроде этого:

контроллер:

  class Language_Controller extends Base_Controller { function __construct(){ $this->action_set(); parent::__construct(); } private function checkLang($lang = null){ if(isset($lang)){ foreach($this->_Langs as $k => $v){ if(strcmp($lang, $k) == 0) $Check = true; } } return isset($Check) ? $Check : false; } public function action_set($lang = null){ if(isset($lang) && $this->checkLang($lang)){ Session::put('lang', $lang); $this->_Langs['current'] = $lang; Config::set('application.language', $lang); } else { if(Session::has('lang')){ Config::set('application.language', Session::get('lang')); $this->_Langs['current'] = Session::get('lang'); } else { $this->_Langs['current'] = $this->_Default; } } return Redirect::to('/'); } } 

В Route.php:

 Route::get('lang/(:any)', 'language@set'); 

Я делал это так:

 $languages = Config::get('lang.languages'); //returns array('hrv', 'eng') $locale = Request::segment(1); //fetches first URI segment //for default language ('hrv') set $locale prefix to "", otherwise set it to lang prefix if (in_array($locale, $languages) && $locale != 'hrv') { App::setLocale($locale); } else { App::setLocale('hrv'); $locale = null; } // "/" routes will be default language routes, and "/$prefix" routes will be routes for all other languages Route::group(array('prefix' => $locale), function() { //my routes here }); 

Источник: http://forumsarchive.laravel.io/viewtopic.php?pid=35185#p35185

Этот вопрос по-прежнему приходит в поиске Google, поэтому вот ответ, если вы используете Laravel 4 или 5, и mcamara / laravellocalization.

 <ul> <li class="h5"><strong><span class="ee-text-dark">{{ trans('common.chooselanguage') }}:</span></strong> </li> @foreach(LaravelLocalization::getSupportedLocales() as $localeCode => $properties) <li> <a rel="alternate" hreflang="{{$localeCode}}" href="{{LaravelLocalization::getLocalizedURL($localeCode) }}"> <img src="/img/flags/{{$localeCode}}.gif" /> {{{ $properties['native'] }}} </a> </li> @endforeach </ul> 

Обратите внимание, что этот пример показывает флаги (в public / img / flags / {{locale}}. Gif), и для его использования вам понадобится немного .css, но вы можете изменить его, чтобы отобразить текст, если хотите. ,

FYI. В документации mcamara / laravellocalization есть примеры и много помощников, поэтому просмотрите документацию по github. ( https://github.com/mcamara/laravel-localization )

То, что я делаю, состоит из двух шагов: я создаю таблицу языков, которая состоит из этих полей:

id | имя | слизень

которые содержат данные, которые понадобятся для языков, например

1 | греческий | гр

2 | английский | ан

3 | | де

Модель языка, которую я использую в приведенном ниже кодексе, относится к этой таблице.

Итак, на моих маршрутах.php у меня есть что-то вроде:

 //get the first segment of the url $slug = Request::segment(1); $requested_slug = ""; //I retrieve the recordset from the languages table that has as a slug the first url segment of request $lang = Language::where('slug', '=', $slug)->first(); //if it's null, the language I will retrieve a new recordset with my default language $lang ? $requested_slug = $slug : $lang = Language::where('slug', '=', **mydefaultlanguage**')->first(); //I'm preparing the $routePrefix variable, which will help me with my forms $requested_slug == ""? $routePrefix = "" : $routePrefix = $requested_slug."."; //and I'm putting the data in the in the session Session::put('lang_id', $lang->id); Session::put('slug', $requested_slug); Session::put('routePrefix', $routePrefix ); Session::put('lang', $lang->name); 

И тогда я могу написать мне маршруты, используя запрошенный slug как префикс …

 Route::group(array('prefix' => $requested_slug), function() { Route::get('/', function () { return "the language here is gonna be: ".Session::get('lang'); }); Route::resource('posts', 'PostsController'); Route::resource('albums', 'AlbumsController'); }); 

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

Надеюсь, что это помогло.