如何在Laravel视图中找到当前语言?

时间:2012-10-03 10:20:34

标签: localization laravel

我正在使用Laravel Lang类来定位我的网络应用程序。我在application/config/application.php中的语言数组中添加了两种语言。这会将用于本地化的默认语言更改为URI的第一部分所指示的内容(例如bla.com/en/bla和bla.com/co/bla)。现在我需要能够检查我视图中当前的默认语言。但是,由于Lang::$language变量受到保护,所以Lang类没有办法检查这个,因为我已经能够弄清楚了。除了手动解析URI之外,有没有办法检查这个?

11 个答案:

答案 0 :(得分:22)

了解Laravel网站当前语言的最简洁方法似乎是:

Lang::locale();

https://laravel.com/api/5.8/Illuminate/Translation/Translator.html#method_locale

与此命令不同,它将返回您网站的默认语言:

Config::get('app.locale');

答案 1 :(得分:9)

BenjaminRH的答案非常好,他的建议方法非常有效。我已经改进了一些片段。现在它检测浏览器语言并根据应用程序的配置文件检查是否支持该语言。

这是一个快速的黑客,但它适用于我的应用程序。请注意,现在还设置了应用程序语言。随意使用矿石改善它。

Route::filter('before', function()
{
    // current uri language ($lang_uri)
    $lang_uri = URI::segment(1);

    // Set default session language if none is set
    if(!Session::has('language'))
    {
        // use lang in uri, if provided
        if(in_array($lang_uri, Config::get('application.languages')))
        {
            $lang = $lang_uri;  
        }
        // detect browser language
        elseif(isset(Request::server('http_accept_language')))
        {
            $headerlang = substr(Request::server('http_accept_language'), 0, 2);

            if(in_array($headerlang, Config::get('application.languages')))
            {
                // browser lang is supported, use it
                $lang = $headerlang;
            }
            // use default application lang
            else
            {
                $lang = Config::get('application.language');
            }
        }
        // no lang in uri nor in browser. use default
        else 
        {
                // use default application lang
                $lang = Config::get('application.language');            
        }

        // set application language for that user
        Session::put('language', $lang);
        Config::set('application.language',  $lang);
    }
    // session is available
    else
    {
        // set application to session lang
        Config::set('application.language', Session::get('language'));
    }

    // prefix is missing? add it
    if(!in_array($lang_uri, Config::get('application.languages'))) 
    {
        return Redirect::to(URI::current());
    }
    // a valid prefix is there, but not the correct lang? change app lang
    elseif(in_array($lang_uri, Config::get('application.languages')) AND $lang_uri != Config::get('application.language'))
    {
        Session::put('language', $lang_uri);
        Config::set('application.language',  $lang_uri);    
    }
});

答案 2 :(得分:6)

在较新的Laravel版本中,您可以使用以下语言获取当前语言:

Config::get('app.locale');

答案 3 :(得分:4)

我已经找到了语言问题的解决方案(感谢IRC上的nickstr和这个问题的接受答案)。它涉及将当前语言存储为会话变量,该变量在语言uri段被更改时更新。

Route::filter('before', function()
{
    // Do stuff before every request to your application...

    // 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.'/'.URI::current());
    }
    // Set session language to uri
    elseif($lang_uri !== Session::get('language'))
    {
        Session::put('language', $lang_uri);
    }
});

答案 4 :(得分:3)

这可能会有所帮助。     配置::得到( 'application.language')

答案 5 :(得分:3)

另一种方法,可以使用类似的东西:

app()->getLocale()

这样做的好处是像PH​​PStorm这样的IDE可以识别这个功能,并且可以帮助你更快地开发。

答案 6 :(得分:3)

这样可以正常使用

lang="{{ app()->getLocale() }}"

答案 7 :(得分:2)

您可以使用

https://github.com/mcamara/laravel-localization

Laravel Localization使用为请求指定的URL。为了达到这个目的,应该在routes.php文件中添加一个组。它将过滤所有必须本地化的页面。

    // app/routes.php

    Route::group(array('prefix' => LaravelLocalization::setLanguage()), function()
    {
        /** ADD ALL LOCALIZED ROUTES INSIDE THIS GROUP **/
        Route::get('/', function()
        {
            return View::make('hello');
        });

        Route::get('test',function(){
            return View::make('test');
        });
    });

    /** OTHER PAGES THAT SHOULD NOT BE LOCALIZED **/

将此组添加到路径文件后,用户可以访问添加到'languagesAllowed'中的所有语言(默认情况下为'en'和'es',请查看config部分以更改该选项)。例如,用户现在可以使用以下地址访问两种不同的语言:

http://laravel.com/en

http://laravel.com/es

http://laravel.com

答案 8 :(得分:1)

我使用的App::getLocale()可能是最受支持的方式,因为documentation中使用了App::setLocale('EN')方法。

您可以随处使用此方法。如果它在某处出现错误,您可以使用\App::...使其正常工作。

我正在使用Laravel 5.0。

答案 9 :(得分:0)

Lang类专门用于输出正确的语言,正如您所说,在内部管理语言。

通过API查看,没有任何方法可以帮助您直接解决这个问题,解析URI以获取语言似乎是适当的行动方案。

您可以随时执行此操作以检索URI中的语言字符串:

$language = URI::segment(1);

Examining Laravel Requests

答案 10 :(得分:0)

您可以通过以下方式获得laravel刀片中的当前语言:

{{Lang :: locale()}}