QQ扫一扫联系
在 Laravel 中实现 API 的多语言支持,可以通过以下步骤优雅地实现:
安装语言包
composer require overtrue/laravel-lang
这会提供 127 种语言的翻译文件。
发布语言文件
php artisan lang:publish --all
生成 resources/lang 目录下的多语言文件模板。
设置默认语言在 config/app.php 中配置:
'locale' => 'en', // 默认语言 'fallback_locale' => 'en', // 备选语言
在 API 中间件中解析 Accept-Language 头:
// app/Http/Middleware/LanguageMiddleware.php
public function handle($request, $next)
{
$locale = $request->header('Accept-Language', config('app.locale'));
app()->setLocale($locale);
return $next($request);
}
定义路由时允许通过 URL 指定语言:
// routes/api.php
Route::prefix('{locale}')->group(function () {
Route::get('users', [UserController::class, 'index']);
});
模块化拆分将 resources/lang/en 下的文件按功能拆分:
resources/ └── lang/ └── en/ ├── auth.php # 认证相关翻译 ├── products.php # 产品相关翻译 └── validation.php # 验证消息翻译
使用 JSON 格式(推荐)对 API 响应,使用 JSON 翻译文件支持动态键名:
// resources/lang/en/products.json
{
"product_not_found": "Product :name not found.",
"price": "Price: :amount"
}
// app/Http/Resources/UserResource.php
public function toArray($request)
{
return [
'id' => $this->id,
'name' => __('users.name', ['name' => $this->name]),
'email' => $this->email,
];
}
自定义异常处理器:
// app/Exceptions/Handler.php
public function register()
{
$this->renderable(function (ValidationException $e) {
return response()->json([
'errors' => $e->errors()->getMessages(),
'message' => __('validation.error_header')
], 422);
});
}
使用 spatie/laravel-translatable 包:
composer require spatie/laravel-translatable
在模型中定义翻译字段:
// app/Models/Product.php
use Spatie\Translatable\HasTranslations;
class Product extends Model
{
use HasTranslations;
public $translatable = ['name', 'description'];
}
使用 Laravel 的本地化工具:
// 日期格式化
$date = now()->locale(app()->getLocale())->formatLocalized('%Y年%m月%d日');
// 数字格式化
$price = number_format(1234.56, 2, '.', ' '); // 根据语言环境自动适配
缓存翻译文件
use Illuminate\Support\Facades\Cache;
$translated = Cache::remember("users.{$this->id}", 60, function () {
return __('users.name', ['name' => $this->name]);
});
自动化测试使用 Artisan 命令检测缺失翻译:
php artisan lang:missing en
请求进入
GET /api/zh-CN/users Accept-Language: zh-CN,zh;q=0.9
中间件处理
解析到 zh-CN,设置 App::setLocale('zh-CN')
控制器响应
return UserResource::collection(User::all());
资源类输出
[
{
"id": 1,
"name": "张三", // 从 zh-CN/users.json 获取翻译
"email": "zhangsan@example.com"
}
]
通过以上步骤,你可以实现:
无缝多语言切换:通过请求头或 URL 参数动态切换
代码可维护性:翻译文件模块化,避免臃肿
高性能:缓存和延迟加载优化
扩展性:支持数据库内容翻译和复杂格式化需求