Laravel多语言本地化需配置locale与fallback_locale、组织lang目录下按语言分组的PHP/JSON翻译文件、使用__()/@lang()等函数调用、通过中间件动态设语言、并支持带locale前缀的路由。

如果您在Laravel项目中需要为不同地区用户提供对应语言的界面内容,则需通过框架内置的本地化机制组织语言资源、动态设置语言上下文,并在视图与逻辑中统一调用翻译键。以下是实现多语言本地化的多种方法:
一、配置默认语言与回退语言
应用的语言行为由config/app.php中的locale和fallback_locale决定。前者指定当前生效的主语言,后者在某条翻译缺失时提供兜底保障,确保用户始终看到可用文本而非空值或原始键名。
1、打开config/app.php文件,定位到'locale'和'fallback_locale'配置项
2、将'locale' => 'en'修改为所需默认语言代码,例如'locale' => 'zh'
3、设置'fallback_locale' => 'en',保证中文缺失时自动降级至英文
4、同步更新.env文件中的APP_LOCALE变量,如APP_LOCALE=zh,使部署环境保持一致
二、组织语言文件结构
所有翻译内容必须按语言代码存放在resources/lang目录下的对应子目录中,支持PHP数组与JSON两种格式。PHP文件适合模块化管理(如auth.php、validation.php),JSON文件便于前后端共享且利于CI/CD流程处理。
1、在resources/lang目录下创建语言子目录,例如zh、en、ja
2、在每个子目录中新建messages.php文件,返回关联数组:return ['welcome' => '欢迎'];
3、也可使用JSON格式,在resources/lang/en.json中写入{"welcome": "Welcome", "hello": "Hello, :name"}
4、按功能拆分文件,如创建resources/lang/zh/auth.php用于认证相关文案,避免单文件膨胀
三、使用翻译辅助函数输出内容
Laravel提供__(), trans(), @lang等开箱即用的翻译调用方式,它们会自动读取当前App::getLocale()所设语言环境,并从对应目录加载匹配键值。占位符支持变量注入,复数规则可通过trans_choice()处理。
1、在控制器中使用__('messages.welcome')获取翻译字符串并传入视图
2、在Blade模板中使用@lang('messages.welcome')或{{ __('messages.hello', ['name' => '李四']) }}
3、对带复数的语句,在语言文件中定义'comment' => '没有评论|有一条评论|[2,*]有 :count 条评论'
4、在代码中调用trans_choice('messages.comment', $count, ['count' => $count])实现智能复数选择
四、通过中间件动态设置请求语言
为实现用户级语言偏好持久化,需在每次HTTP请求生命周期早期识别并设定语言环境。中间件是最佳切入点,可统一检查Session、Cookie、URL参数或Accept-Language头,避免各处重复逻辑。
1、执行php artisan make:middleware SetLocale生成中间件类
2、在handle方法中依次检查:$locale = $request->session()->get('locale') ?: $request->cookie('locale') ?: substr($request->server('HTTP_ACCEPT_LANGUAGE', 'en'), 0, 2)
3、验证$locale是否在白名单内(如in_array($locale, ['zh', 'en', 'ja']))
4、确认后调用\Illuminate\Support\Facades\App::setLocale($locale)
5、将该中间件注册至app/Http/Kernel.php的$middlewareGroups['web']中
五、实现带语言前缀的多语言路由
URL路径显式携带语言标识(如/zh/login)有助于SEO、缓存策略制定及用户直观识别当前语言版本。配合路由参数约束与中间件,可将语言切换无缝集成至导航体系中。
1、定义带locale参数的路由组:Route::prefix('{locale}')->where('locale', 'zh|en|ja')->middleware('set.locale')
2、在该组内注册所有Web路由,例如Route::get('/login', [LoginController::class, 'showLoginForm'])
3、在布局模板中为语言切换链接生成对应前缀URL:url($locale . '/login')
4、添加跳转路由供前端调用:Route::get('/switch-lang/{locale}', function ($locale) {session(['locale' => $locale]); return redirect()->back();})


















