You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel API中实现带多语言翻译支持的枚举

Laravel API 多语言枚举实现最佳方案

核心思路

用PHP枚举保证类型安全,结合Laravel本地化系统集中管理翻译,同时给枚举封装统一的翻译方法,避免重复代码,完全遵循Laravel约定式开发规范。

步骤1:创建枚举类

定义ConnectionType枚举,每个case关联对应翻译键(复用case值作为键的一部分,减少冗余):

namespace App\Enums;

enum ConnectionType: string
{
    case WIRED = 'wired';
    case WIRELESS = 'wireless';

    // 获取当前语言的翻译标签
    public function label(): string
    {
        return __('enums.connection_type.' . $this->value);
    }

    // 可选:批量获取所有枚举的翻译选项(适合前端下拉框等场景)
    public static function options(): array
    {
        return collect(self::cases())->mapWithKeys(function ($case) {
            return [$case->value => $case->label()];
        })->toArray();
    }
}

步骤2:配置本地化文件

在resources/lang目录下创建对应语言的枚举翻译文件:

英文翻译(resources/lang/en/enums.php)

return [
    'connection_type' => [
        'wired' => 'Wired',
        'wireless' => 'Wireless',
    ],
];

格鲁吉亚文翻译(resources/lang/ka/enums.php)

return [
    'connection_type' => [
        'wired' => 'სადენიანი',
        'wireless' => 'беспроводური',
    ],
];

步骤3:API中使用枚举

在控制器或资源类中直接调用枚举的label()方法,自动返回当前语言的翻译:

示例1:单个枚举值返回

use App\Enums\ConnectionType;

public function show($id)
{
    $device = Device::findOrFail($id);
    $connectionType = ConnectionType::from($device->connection_type);

    return response()->json([
        'id' => $device->id,
        'connection_type' => $connectionType->value,
        'connection_type_label' => $connectionType->label(),
    ]);
}

示例2:返回所有枚举选项

public function connectionTypeOptions()
{
    return response()->json([
        'options' => ConnectionType::options(),
    ]);
}

为什么这是最佳实践?

  • 类型安全:PHP枚举强制限定允许的值,杜绝无效连接类型被传入或存储。
  • 翻译集中管理:所有枚举翻译统一放在本地化文件,便于维护和批量更新,符合Laravel本地化约定。
  • 代码简洁:通过label()方法封装翻译逻辑,避免在业务代码中重复写__('enums.connection_type.wired')这类冗余代码。
  • 灵活扩展:新增枚举值或语言时,只需添加枚举case和对应本地化条目,无需修改业务代码。

额外优化:动态切换语言

可以通过中间件根据请求参数设置当前语言,让API支持动态切换:

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class SetLocale
{
    public function handle(Request $request, Closure $next)
    {
        if ($request->has('locale') && in_array($request->locale, ['en', 'ka'])) {
            app()->setLocale($request->locale);
        }

        return $next($request);
    }
}

在app/Http/Kernel.php中注册该中间件后,API请求可通过?locale=ka参数切换为格鲁吉亚文,枚举的label()方法会自动返回对应语言的翻译。

内容的提问来源于stack exchange,提问作者Giorgi Kalandadze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:33:26