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

Laravel模型属性翻译优化:无需在控制器重复编写__()代码

在Laravel模型中自动翻译属性,避免重复代码

嘿,这个需求太贴合实际了——谁也不想在每个控制器、每个视图里重复写__()来翻译模型属性对吧?咱们直接在模型层面把这个逻辑封装好,一劳永逸!下面给你几个实用的方案,按需选就行:

方案1:使用Laravel访问器(Accessor)

这是最直接的方式,针对单个属性定义访问器,当你获取该属性时自动返回翻译后的内容。

比如你有个Product模型,其中status字段存储的是active/inactive这类英文标识,想要自动翻译为对应语言:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    // 定义status属性的访问器
    public function getStatusAttribute($value)
    {
        // 这里的翻译键可以根据你的项目结构调整,比如绑定到product模块下的status节点
        return __("product.status.$value");
    }
}

这样一来,无论你在控制器还是视图里调用$product->status,拿到的直接就是翻译后的文本,完全不用再额外写翻译逻辑!

方案2:批量处理多个需翻译的属性

如果你的模型有多个属性需要翻译,一个个写访问器太麻烦,可以重写getAttribute方法,批量处理指定属性:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    // 在这里列出所有需要自动翻译的属性
    protected $translatableAttributes = ['status', 'type', 'category'];

    public function getAttribute($key)
    {
        // 先获取原始属性值
        $value = parent::getAttribute($key);
        
        // 如果当前属性在翻译列表里,就返回翻译后的值
        if (in_array($key, $this->translatableAttributes)) {
            return __("product.$key.$value");
        }
        
        // 其他属性返回原始值
        return $value;
    }
}

以后要新增翻译属性,只需要往$translatableAttributes数组里加就行,非常省心。

方案3:保留原始值,同时提供翻译后的属性

有时候你可能既需要原始值(比如做逻辑判断),又需要翻译后的值(比如页面展示),这种情况可以定义带后缀的访问器:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    // 定义翻译后的status属性
    public function getTranslatedStatusAttribute()
    {
        return __("product.status.$this->status");
    }

    // 同理可以给其他属性加翻译访问器
    public function getTranslatedTypeAttribute()
    {
        return __("product.type.$this->type");
    }
}

使用的时候,$product->status还是原始的标识值,$product->translated_status就是翻译后的文本,兼顾了两种需求。

最后别忘了配置翻译文件

要让翻译生效,你需要在resources/lang目录下的对应语言文件夹里创建翻译文件,比如resources/lang/zh-CN/product.php:

return [
    'status' => [
        'active' => '活跃',
        'inactive' => '停用',
        'draft' => '草稿'
    ],
    'type' => [
        'physical' => '实物商品',
        'digital' => '虚拟商品'
    ]
];

这样整个流程就通了,所有使用该模型的地方都不用重复写翻译代码,逻辑完全封装在模型里~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:56:58