.
QQ扫一扫联系
在 Laravel 中优雅实现 API 多语言支持,可以通过以下步骤实现:
创建语言文件
# 默认在 resources/lang 目录下创建语言目录 resources/ └── lang/ ├── en/ │ └── api.php └── zh/ └── api.php
文件内容示例 (api.php
):
return [ 'welcome' => 'Welcome to our API', 'error' => [ 'not_found' => 'Resource not found' ] ];
发布语言文件(可选)
php artisan lang:publish
Accept-Language
自动检测创建中间件
php artisan make:middleware SetLanguage
// app/Http/Middleware/SetLanguage.php public function handle($request, Closure $next) { $lang = $request->getPreferredLanguage(['en', 'zh']); app()->setLocale($lang); return $next($request); }
注册中间件
// app/Http/Kernel.php protected $middlewareGroups = [ 'api' => [ // ... \App\Http\Middleware\SetLanguage::class, ], ];
// 在控制器或路由中 Route::get('posts', function (Request $request) { $lang = $request->query('lang', 'en'); app()->setLocale($lang); // ... });
使用翻译函数
// 控制器中 return response()->json([ 'message' => __('api.welcome'), 'error' => __('api.error.not_found') ]);
自动加载语言文件Laravel 会自动根据当前语言环境加载对应的语言文件,无需额外配置。
缓存翻译文件
php artisan lang:cache
动态加载语言包
// 临时添加自定义语言包 app()->setLocale('es'); app()->booted(function () { app()->translator->addJsonPath(resource_path('lang/es')); });
异常消息多语言
// 自定义异常处理器 public function render($request, Throwable $e) { if ($e instanceof ModelNotFoundException) { return response()->json([ 'error' => __('api.error.not_found') ], 404); } return parent::render($request, $e); }
请求头携带语言偏好
GET /api/posts HTTP/1.1 Accept-Language: zh-CN,zh;q=0.9
中间件自动设置语言
// SetLanguage 中间件自动检测并设置 app()->setLocale('zh')
返回对应语言的响应
{ "message": "欢迎来到我们的API", "error": "资源未找到" }
保持语言键命名规范
使用点分隔命名(如 api.user.create_success
)
避免重复键名
分离前后端语言文件
resources/ └── lang/ ├── en/ │ ├── api.php # API专用 │ └── frontend.php # 前端专用 └── zh/ ├── api.php └── frontend.php
版本控制语言文件
// 根据 API 版本加载不同语言包 app()->setLocale($request->version() . '.' . $lang);
使用翻译管理工具
推荐工具:LingoHub、Transifex
自动化同步翻译文件
通过以上方案,您可以实现:
自动检测客户端语言偏好
灵活的手动语言覆盖机制
结构化的语言文件管理
高性能的语言加载(配合缓存)
完整的异常消息国际化
这种设计既保持了 Laravel 的优雅语法,又提供了足够的灵活性应对复杂的多语言场景。
.