【问题标题】:Lang facade not detecting app lang change朗门面未检测到应用程序语言更改
【发布时间】:2020-04-20 00:33:27
【问题描述】:

我正在尝试使用配置控制器在 Laravel 7 中更改我的应用语言环境:

class ConfigController extends Controller
{
    /**
     *
     * Set the App locale.
     *
     * @param  \SetLocaleRequest  $request
     * @return mixed
     */
    public function set_locale(SetLocaleRequest $request)
    {
        App::setLocale($request->locale);

        return response()->json([
            'message' => trans('config.set'),
        ], 200);
    }
}

此代码确实有效,因为简单的App:getLocale(); 返回提供的语言。无论哪种方式,Lang 外观都会继续使用config/app.php 提供的默认语言环境,即西班牙语。所以,这段代码:

Lang::get('auth.failed')

正在返回文本:"Estas credenciales no coinciden con nuestros registros.",即使当前选择了 en。知道为什么吗?

【问题讨论】:

  • 你尝试过使用 trans 助手吗? trans('auth.failed') 打印什么?
  • 它在我的其他控制器中不起作用。有趣的事情(看看编辑过的问题)。 JSON 响应中发送的消息正在使用 trans 帮助程序检测更改。

标签: php laravel laravel-7


【解决方案1】:

动态更改语言环境只需 2 个步骤。我看到您已经完成了第 1 步。第 2 步是在您的刀片文件(很可能是基本模板)中执行类似的操作:

<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">

请注意,一旦用户导航到另一个页面,它会反转到 config.xml 中设置的区域设置。但是,如果您需要维护当前用户的区域设置,请使用 session.例如,除了我之前的观点,将您的控制器方法更改为:

public function set_locale(SetLocaleRequest $request)
    {
        App::setLocale($request->locale);
        Session::put('locale', $request->locale);

        return response()->json([
            'message' => 'locale.set.success',
        ], 200);
    }

所以,您可以通过以下方式在刀片模板中连续访问它:&lt;html lang="{{ str_replace('_', '-', Session::get('locale')) }}"&gt;

【讨论】:

  • 我忘了说我没有将 Laravel 用作全栈应用程序。这只是我的 API。我正在使用使用该 API 的 Vuejs 客户端。这会影响会话部分吗?
  • 是的。我假设您正在使用 laravel fullstack。会话的想法应该仍然有效,尽管稍作修改。您只需要创建一个中间件,该中间件在验证用户的中间件之后运行。中间件将从会话中获取语言环境并在每个请求中设置它。例如,如果您使用的是 jwt,请在 JWT 身份验证后调用中间件,以便经过身份验证的用户在会话中可用。
  • 如果我想随时更改语言怎么办?假设用户选择了中文语言环境,现在我想从我的 Laravel API 接收中文消息。我是否应该将控制器的逻辑放在中间件中并使用该中间件保护“set-locale”路由,每次我对其执行 POST 请求时更改语言环境?
  • 有两种方法可以解决。您要么有一个接受语言环境作为输入的路由,要么更改语言环境并将语言环境值放入会话中。或者你修改我们讨论的区域设置中间件,使其每次检查请求对象以查看是否发送了区域设置。如果发送,它会更改语言环境并进入会话,以便后续请求可以从会话中获取语言环境
  • 完全按照您在最后一条评论中所说的(选项 2),现在它可以工作了。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
相关资源
最近更新 更多