如何使用 SESSION 向 Laravel 5.3 添加多语言

问题描述 投票:0回答:2

我想为我的网站添加多语言支持,但我不知道如何最好地实现它。 Laravel 文档 (https://laravel.com/docs/5.3/localization) 非常罕见,所以我做了一些研究,但每个人似乎都使用不同的解决方案,并且使用包含其中语言的 URL - 例如像

example.com/en/pagename

我想要一个没有语言标签的 URL 架构。像这样的:

example.com/pagename

现在,根据用户的语言,应该翻译 URL:

example.com/pagename (english)
example.com/seitenname (german)

初始语言应由浏览器设置/语言检测。用户还应该可以选择在提供的语言之间进行切换。

在我的网站上,用户可以注册帐户。他将能够将他喜欢的语言保存在数据库中 - 假设在表

users
字段中
pref_lang
中。为了在这种情况下保持简单,它只是一个像“en”(英语)或“de”(德语)这样的字符串。

通过创建如下语言文件可以轻松翻译路线:

// resources/lang/de/routes.php

return array(
    'contact'   => 'kontakt',
    'pagename'   => 'seitenname'
);

...还有一个用于 EN:

// resources/lang/en/routes.php

return array(
    'contact'   => 'contact',
    'pagename'   => 'pagename'
);

...结合此类路线例如:

// routes/web.php

Route::get('/', function () {
    return view('pages.dashboard');
});

Route::get('/{contact}', function () {
    return view('pages.contact');
});

Route::get('/{pay2gether-system}', function () {
    return view('pages.pagename');
});

现在的问题是,我如何创建这样一个“语言切换”按钮,从浏览器设置/切换操作或会话中的数据库存储语言,以及如何将其重新用于路由和 URL HTML

<a href="#">
标签?

php laravel laravel-5 multilingual laravel-routing
2个回答
3
投票

我已经这样做过几次了,而且很容易完成。请按照以下步骤操作,如果您有任何其他问题,请随时询问。

  1. language
    表中创建一个
    users
    列。我以前就是这样设置的,
    $table->string('language')->default('en');
  2. 创建一个新的中间件来检测语言更改,例如:
    SetLanguage
  3. 将中间件添加到
    web
    app\Http\Kernel.php
    中间件组的底部。
  4. 将以下内容粘贴到

    handle
    方法中。

    if ($request->has('language')) {
        if (auth()->user()) {
            auth()->user()->language = $request->language;
            auth()->user()->save();
        }
        App::setLocale($request->language);
    } elseif (auth()->user()) {
        App::setLocale(auth()->user()->language);
    }
    return $next($request);
    
  5. 创建一个服务提供者并将其注册到您的

    config/app.php
    中,然后在启动方法中粘贴以下代码。

    view()->composer('template.name', function($view) {
        $languages = [];
        $folders = File::directories(base_path('resources/lang/'));
        foreach ($folders as $folder) {
            $languages[] = str_replace('\\', '', last(explode('/',$folder)));
        }
        $view->with('languages', $languages);
    });
    
  6. 现在,在您的

    template.name.blade.php
    中,您可以循环浏览应用程序中可用的语言。

在下拉列表中,循环时应使用

{{ url('/') . '?language=' . $language }}
作为链接。您可以将
language
键更改为其他内容,但如果这样做,您还必须在中间件中更改它。


1
投票

我会在中间件中做一些事情:

public function handle($request, Closure $next)
{
    if ($request->has('language')) {
        $path   = $request->path();
        $locale = $request->get('language'); 

        # save locale 
        Cookie::queue(Cookie::make(
            'language', $locale, 1440 // 24h
        ));

        # set locale
        \App::setLocale($locale);  

        return redirect($path)->withCookie(cookie('language'));
    }

    if ($locale = $request->cookie('language')) {
       \App::setLocale($locale);  
    }

    return $next($request);
}

现在在提供商中:

public function boot()
{
    View::composer('template.name', function($view) {
        $directory = base_path('resources/lang/');
        $languages = \File::directories($directory);
        $view->with('languages', array_map('basename', $languages));
    });
}

在视图中:

<ul class="dropdown-menu" role="menu">
    @foreach ($languages as $lang)
        <li>
            <a href="{{ url()->current() . '/?language=' . $lang }}" title="">{{ $lang }}</a>
        </li>
    @endforeach
</ul>

我不太确定这是否是最好的解决方案...也许在 Laravel 方面有更多经验的人可以向我们展示另一个解决方案

© www.soinside.com 2019 - 2024. All rights reserved.