最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Laravel 本地化 i18n 多语言方案国际化
时间:2026-07-28 07:01:49 编辑:袖梨 来源:一聚教程网
Laravel多语言需用Route::prefix('{locale}')->middleware('setlocale')确保locale早期生效,中间件校验白名单并调用App::setLocale(),命名路由必须用route('name', ['locale'=>'xx'])生成URL。
__('key') 返回原始字符串?不是没配好,是 locale 没在请求早期生效。路由前缀必须用 Route::prefix('{locale}') + 中间件
不加前缀、不走中间件,app()->setLocale() 就算手动调了也晚——视图渲染和验证消息已按默认语言生成。
-
routes/web.php顶部写Route::prefix('{locale}')->middleware('setlocale'),别漏掉{locale}占位符 -
app/Http/Middleware/SetLocale.php里必须验证$request->locale是否在config('app.locales')白名单中,否则直接 404 或 fallback 到config('app.fallback_locale') - 命名路由生成 URL 时,必须用
route('home', ['locale' => 'ja']),硬拼/ja/home会绕过路由匹配,导致 404 - Laravel 11 要求所有本地化路由包裹在
Route::localized()(需mcamara/laravel-localizationv2.0+)
resources/lang/{locale}/ 目录结构不能错
文件放错位置,__('auth.failed') 就永远返回 auth.failed 字符串本身。
- 必须是
resources/lang/en/auth.php,不是resources/lang/en/messages.php—— 后者只管__('welcome')这类通用键 - JSON 格式成 Laravel 11 首选:
resources/lang/zh.json直接存扁平键值对,但禁止 BOM,否则 500 - PHP 文件必须以
<?php return [...];开头,且不能有输出或注释在<?php前 -
php artisan lang:publish只复制框架内置en文件,新增语言如ja得手动建目录、复制改写
Blade 里变量插值要用 __(),不是 @lang
@lang('validation.custom.password.min') 不支持传参,它只是原样输出字符串;占位符替换必须靠 __() 的第二个参数。
- 语言文件里写
'custom_message' => 'The :attribute must be at least :min characters.' - 模板里用
{{ __('custom_message', ['attribute' => 'password', 'min' => 8]) }} - 验证规则自动注入的
:attribute是框架行为,自定义提示仍要显式传参,__('validation.custom.password.min', ['min' => 8])才生效
缓存开启后改语言文件必须清缓存
APP_DEBUG=false 时,Laravel 会缓存翻译和视图,改了 resources/lang/zh/validation.php 也看不到效果。
- 运行
php artisan view:clear清视图缓存 - 运行
php artisan config:clear清配置缓存(语言加载路径依赖 config) - 别只清
cache:clear,它不包含翻译缓存 - 开发阶段建议保持
APP_DEBUG=true,避免反复清缓存打断节奏
__() 静默回退到原始键名。
相关文章
- AI也唤不醒“乏力”的618 08-16
- Kimi Work 迎重大升级:推出“目标模式”并打通外部应用插件 08-16
- 起跑线还没过呢,香槟就开了 08-16
- 出海短剧大洗牌:8成消耗流向AI短剧,实拍项目锐减50% 08-16
- 基于多Agent系统自动发现科学假设 08-16
- 一个合格的AI面试官,需要解决企业招聘哪些问题? 08-16