Я использую локализацию Laravel для предоставления двух разных языков. У меня есть все настройки пути, и mydomain.com/en/bla поставляет английский язык и сохраняет переменную сеанса en, а mydomain.com/he/bla предоставляет иврит и сохраняет переменную сеанса "he". Тем не менее, я не могу найти достойный способ предоставления языковой коммутации. Как это работает?
Какая лучшая логика для переключения языка в Laravel?
Ответ 1
Я решил проблему, добавив ее в фильтр before.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);
Ответ 2
Это сообщение, которое я опубликовал первоначально на форумах 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)
Хорошо, поэтому проблема заключалась в том, что мне нужен простой способ изменить язык "на лету", без необходимости вмешиваться в сеансы и файлы cookie. Вот как я это сделал:
Сделайте библиотеку в папке с вашими библиотеками 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. Ссылки особенно полезны, если вы добавите их в файл основного шаблона.
Ответ 3
У вас может быть маршрут для изменения языка, например:
Route::get('translate/(:any)', '[email protected]');
Тогда в действии set
в контроллере translator
можно изменить сеанс, в зависимости от кода языка, переданного через URL.
Вы также можете изменить настройку конфигурации, используя
Config::set('application.language', $url_variable');
Пример контроллера - translate.php
public function action_set($url_variable)
{
/* Your code Here */
}
Ответ 4
На всякий случай для будущих пользователей, если вы хотите использовать пакет для локализации. Отличный пакет на https://github.com/mcamara/laravel-localization. который прост в установке и имеет много помощников.
Ответ 5
Попробуйте использовать 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)', '[email protected]');
Ответ 6
Я делал это так:
$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
Ответ 7
Этот вопрос по-прежнему приходит в поиске 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)
Ответ 8
То, что я делаю, состоит из двух шагов: Я создаю таблицу языков, которая состоит из этих полей:
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 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');
});
Это работает, но этот код будет запрашивать базу данных для языков при каждом изменении маршрута в моем приложении. Я не знаю, как я мог, и если нужно, выяснить механизм, который определяет, изменится ли маршрут на другой язык.
Надеюсь, что это помогло.