【问题标题】:Multilingual ui using Laravel 5.3使用 Laravel 5.3 的多语言用户界面
【发布时间】:2016-10-29 02:44:29
【问题描述】:

我正在开发一种适用于不同国家/地区的 CRM

这是我第一次使用 Laravel,所以我有点困惑

我的数据库如下所示:

语言

  • 身份证
  • 姓名
  • short_name(en、ru 等)

字典

  • 身份证
  • 标签(登录、忘记密码等)
  • 值(“登录”、“Вход”等)
  • language_id

我想过这样工作:

http://domain.com/en

http://domain.com/ru

http://domain.com/en/users

http://domain.com/ru/users

如果用户转到http://domain.com,它将通过以下步骤重定向他:

  1. 如果用户过去登录并拥有使用他的语言的 cookie
  2. 如果没有cookie,则通过IP获取用户所在的国家/地区
  3. 如果该国家/地区的语言在 Languages 表中无法识别,则将用户重定向到在 config/app.php => 'locale' => 'default language' 中设置的默认语言

我想知道是否有任何方法可以做到这一点,而无需在控制器的每个函数中发送语言变量, 什么意思?

我的意思是我不会让我的路由和控制器看起来像这样:

路线

Route::get('/{locale}', 'Auth\LoginController@showLoginForm');  
Route::get('/{locale}/users/', 'UsersController@index');
Route::get('/{locale}/users/view/{id}', 'UsersController@viewUser');

控制器

public function showLoginForm($locale)
{
    App::setLocale($locale);
    return view('auth.login');
}
...
public function index($locale)
{
    App::setLocale($locale);
    return view('users.index');
}
...

我希望它在后台运行,而无需我每次都设置语言和设置路线,

谢谢!

【问题讨论】:

    标签: php laravel laravel-5 multilingual


    【解决方案1】:

    中间件可能是解决这个问题的方法。由于您已经计划使用 cookie 来存储用户的区域设置,因此您可以创建注册到 web 路由组的中间件(默认情况下应用于所有路由)。

    然后在您的中间件类中调用 App 上的 setLocale 方法并传递 cookie。

    public function handle($request, Closure $next) {
        App::setLocale($request->cookie('locale'));
    
        return $next($request);
    }
    

    如果您以前没有使用过中间件,那么 Laravel 文档总是很棒:https://laravel.com/docs/5.3/middleware

    【讨论】:

    • alex 谢谢你,我想我会从 url 中删除语言变量并只使用 cookie
    • 很高兴我能帮上忙,如果将来您还想使用语言变量,您可以将您的路由包装在一个以语言环境为前缀的路由组中:Route::group(['prefix' => '{locale}'], function() { // Routes here }); 您可以只包含任何路由需要该组中的语言环境,因此您不必在每种方法中都分配它并忽略它。我确信有更好的方法可以做到这一点,但我现在想不出。
    • 亚历克斯你是最棒的! ;)
    猜你喜欢
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    相关资源
    最近更新 更多