Php 什么';在Laravel中切换语言的最佳逻辑是什么?
我正在使用Laravel本地化来提供两种不同的语言。我已经设置了所有path内容,mydomain.com/en/bla提供英语并存储“en”会话变量,mydomain.com/he/bla提供希伯来语并存储“he”会话变量。然而,我想不出一个合适的方式来提供语言切换链接。这是如何工作的?您可以通过手动语言更改,例如:Php 什么';在Laravel中切换语言的最佳逻辑是什么?,php,localization,laravel,Php,Localization,Laravel,我正在使用Laravel本地化来提供两种不同的语言。我已经设置了所有path内容,mydomain.com/en/bla提供英语并存储“en”会话变量,mydomain.com/he/bla提供希伯来语并存储“he”会话变量。然而,我想不出一个合适的方式来提供语言切换链接。这是如何工作的?您可以通过手动语言更改,例如: Route::get('translate/(:any)'),'translator@set'); 然后在set中,根据通过URL传递的语言代码,translator控制器中的操
Route::get('translate/(:any)'),'translator@set');代码>
然后在set
中,根据通过URL传递的语言代码,translator
控制器中的操作可以更改会话
您还可以通过使用更改配置设置
Config::set('application.language',$url_variable')代码>
控制器示例-translate.php
public function action_set($url_variable)
{
/* Your code Here */
}
尝试使用会话的。像这样的事情:
控制器:
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');
我通过将以下内容添加到routes.php中的before过滤器中,解决了我的问题:
//默认语言($lang)和当前uri语言($lang\u uri)
$lang='he';
$lang_uri=uri::段(1);
//如果未设置任何会话语言,请设置默认会话语言
如果(!Session::has('language'))
{
会话::put('language',$lang);
}
//如果需要,路由语言路径
如果($lang_uri!='en'&&$lang_uri!='he')
{
返回重定向::到($lang./')($lang_uri?uri::current():'');
}
//将会话语言设置为uri
elseif($lang_uri!==Session::get('language'))
{
会话::put('language',$lang_uri);
}
//存储到会话的语言开关链接
$he2en=preg_replace('/he\/','en/',URI::full(),1);
$en2he=preg_replace('/en\/','he/',URI::full(),1);
会话::put('he2en',$he2en);
会话::put('en2he',$en2he);
这是我最初在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。我是这样做的:
在libraries文件夹中创建一个名为chooselang.php的库
public function action_set($url_variable)
{
/* Your code Here */
}
将此代码插入:
在此之后,您就可以准备生成url切换器url:s了。只需添加它们,因为你可以创建任何其他刀片链接
示例如何生成芬兰语、瑞典语和英语的链接(带Blade)
上面将生成始终位于当前页面上的URL:s,并将lang slug更改为您想要的URL:s。这样,语言就会变成您想要的语言,用户自然会停留在同一页面上。默认语言段塞永远不会添加到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>
//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);
注:如果您将链接添加到主模板文件中,则这些链接特别有用。我所做的工作包括两个步骤:
我正在创建一个包含以下字段的语言表:
id | name | slug
其中包含我需要的语言数据,例如
1 |希腊语|希腊语
2 |英语|英语
3 |平手|德
我在下面代码中使用的语言模型引用了该表
因此,在我的routes.php中,我有如下内容:
<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>
//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');
});
这是可行的,但每次我的应用程序中的路由更改时,此代码都会向数据库询问语言。
我不知道我怎样才能,如果我应该的话,找到一种机制来检测路由是否改变为另一种语言
希望对您有所帮助。以备将来的用户使用。如果您想使用该软件包进行本地化,网站上有一个很棒的软件包。这很容易安装,并且有很多助手。我一直这样做:
$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
});
来源:这个问题仍然存在于谷歌搜索中,因此如果您使用的是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>
- {{trans('common.chooselanguage')}:
@foreach(LaravelLocalization::getSupportedLocales()作为$localeCode=>$properties)
-
@endforeach
请注意,此示例显示标志(public/img/flags/{{locale}}}.gif),要使用它,您需要一点.css,但如果需要,可以修改它以显示文本
仅供参考。mcamara/laravellocalization文档中有很多示例和帮助,因此请查看github上的文档。()嗨,本杰明,我正试图为我正在用希伯来语和英语(使用Laravel 3)建立的网站做到这一点。在你的问题中,你说你已经设置好了所有的路径。我想知道你是否可以帮我一点,如何设置正确的路径或指向我的一些网站或论坛帖子。谢谢@Jonathan这里有一个早期版本,我很确定它能工作:。忽略可怕的代码;)我想你为什么要用{{{{{('languagefile.the{language{u string');}}来翻译trans()或Lang::get。是的,我肯定它也能用。这个答案来自Laravel3天,所以我不确定你当时是否是Lang::Facade…对于任何来自谷歌的人来说,在带有Laravel4的Blade文件中,你可以使用@Lang('file.String')速记,这相当于说{{Lang::get('file.String')}最简单的方法。就是这样。我目前的解决方案几乎与相同,只是我使用中间件。我不想用默认语言复制内容,必须向每个控件添加结构