在Laravel中切换语言的最佳逻辑是什么?

Ben*_*nRH 30 php localization laravel

我正在使用Laravel本地化来提供两种不同的语言.我已经设置了所有路径,mydomain.com/en/bla提供英语并存储'en'会话变量,mydomain.com/he/bla提供希伯来语并存储'他'会话变量.但是,我无法找到一种提供语言切换链接的好方法.这怎么样?

Ben*_*nRH 14

我已经通过将其添加到routes.php中的before过滤器解决了我的问题:

// 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);
Run Code Online (Sandbox Code Playgroud)


sto*_*pat 12

这是我最初在laravel论坛上发布的帖子,但也许它会帮助其他人,所以我也在这里发布.

我在为我的应用程序构建一个简单的语言切换器时遇到了一些麻烦,而且论坛上的信息有点陈旧(有些帖子),所以我制作了这段简单的代码,这使得它很容易在你的应用程序上更改语言飞.

我在视图中有以下语言字符串:

{{ __('languagefile.the_language_string'); }}
Run Code Online (Sandbox Code Playgroud)

我使用URL获取语言,我认为这是最好的方式,也适用于seo和人们共享的链接.例:

www.myapp.com/fi/support (Finnish)
www.myapp.com/en/support (English)
www.myapp.com/sv/support (Swedish)
Run Code Online (Sandbox Code Playgroud)

好吧,问题是我想要一种简单的方法来动态更改语言,而不必乱搞会话和cookie.继承人我是怎么做到的:

在您的libraries文件夹中创建一个名为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>';
    }

}
Run Code Online (Sandbox Code Playgroud)

在此之后,您就可以获取生成的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')); }}
Run Code Online (Sandbox Code Playgroud)

以上将生成始终在当前页面上的URL:s,并将lang slug更改为您想要的.这样,语言就会变为您想要的语言,并且用户自然会停留在同一页面上.默认语言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>
Run Code Online (Sandbox Code Playgroud)

PS.如果将链接添加到主模板文件中,则链接特别有用.


Pap*_*urf 5

您可以使用Route to hand语言更改,例如:

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 */
}
Run Code Online (Sandbox Code Playgroud)