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 的优雅语法,又提供了足够的灵活性应对复杂的多语言场景。