在Laravel开发中,应用默认语言由config/app.php里的locale决定,但用户往往希望在页面上随时切换语言。Laravel提供了运行时修改语言环境的能力,核心就是使用App::setLocale()或者app()->setLocale()来动态设置当前请求的语言。

一、基础切换方式
最简单的方法是在控制器中直接调用setLocale。假设我们支持zh_CN和en两种语言,并且语言包已经配置好。
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesApp;
use IlluminateHttpRequest;
class LanguageController extends Controller
{
// 切换语言接口
public function switch(Request $request)
{
$lang = $request->input('lang', 'zh_CN');
// 动态设置语言环境
App::setLocale($lang);
return redirect()->back();
}
}
二、通过中间件实现全局切换
如果希望每个请求都自动应用用户选择的语言,可以把切换逻辑放到中间件里,并从session读取语言偏好。
<?php
namespace AppHttpMiddleware;
use Closure;
use IlluminateSupportFacadesApp;
use IlluminateSupportFacadesSession;
class SetLocale
{
public function handle($request, Closure $next)
{
// 如果session中有语言设置则应用
if (Session::has('locale')) {
App::setLocale(Session::get('locale'));
}
return $next($request);
}
}
注册该中间件后,在控制器切换语言时写入session即可:
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesSession;
use IlluminateHttpRequest;
class LanguageController extends Controller
{
public function switch(Request $request)
{
$lang = $request->input('lang', 'en');
Session::put('locale', $lang);
return redirect()->back();
}
}
三、语言包与配置文件
确保在resources/lang目录下有对应语言文件夹,例如resources/lang/zh_CN/messages.php:
<?php
// resources/lang/zh_CN/messages.php
return [
'welcome' => '欢迎使用我们的网站',
];
在视图中使用__()函数获取翻译:
<p>{{ __('messages.welcome') }}</p>
四、注意事项
- 运行时切换只影响当前请求,若要持久化必须存session、cookie或数据库。
- 语言代码要和文件夹名称一致,例如zh_CN对应resources/lang/zh_CN。
- 如果用了缓存路由或配置,修改后记得清理缓存。
动态切换locale是Laravel本地化模块很实用的特性,合理配合中间件和会话管理,就能轻松实现多语言无缝切换。