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

如何在Astrotomic/laravel-translatable中动态添加新语言?

解决Astrotomic/laravel-translatable动态添加语言的问题

直接修改config()不会生效,是因为包在服务启动时就已将初始的locales值注入到核心的Translator实例中,后续修改配置不会自动更新这个实例。以下是几种可行的解决方案:

方案1:让模型动态读取语言列表

在你的可翻译模型中,覆盖包提供的getTranslatableLocales()方法,让它始终读取最新的配置值:

use Astrotomic\Translatable\Contracts\Translatable as TranslatableContract;
use Astrotomic\Translatable\Translatable;

class YourModel extends Model implements TranslatableContract
{
    use Translatable;

    // 不要在这里硬写固定的locales数组
    // public $translatable = ['name', ...];

    public function getTranslatableLocales(): array
    {
        return config('translatable.locales');
    }
}

这样模型每次处理翻译时,都会使用当前配置中的最新语言列表,无需重启服务。

方案2:重新绑定核心Translator实例

修改配置后,手动重新绑定容器中的Translator实例,让后续操作使用新的语言配置:

// 先更新配置
$newLocales = [...]; // 你的新语言数组
config([
    'translatable.locales'         => $newLocales,
    'translatable.locale'          => $data['default_language'],
    'translatable.fallback_locale' => $data['default_language'],
]);

// 重新绑定Translator实例
app()->singleton(\Astrotomic\Translatable\Translator::class, function ($app) {
    return new \Astrotomic\Translatable\Translator(
        config('translatable.locale'),
        config('translatable.fallback_locale'),
        config('translatable.locales')
    );
});

这个方法适用于单次请求内需要临时切换语言列表的场景。

方案3:从数据库加载永久语言列表

如果你的语言需要长期动态维护,建议将语言列表存储到数据库(比如创建一个languages表),然后在AppServiceProvider的boot方法中加载配置:

// app/Providers/AppServiceProvider.php
public function boot()
{
    // 假设Language模型有code字段存储语言标识(如en、fr)
    $locales = \App\Models\Language::pluck('code')->toArray();
    
    // 覆盖translatable的locales配置
    config(['translatable.locales' => $locales]);
}

这样每次请求都会自动读取数据库中的最新语言列表,无需手动修改配置文件或动态更新。

注意:如果使用方案3,确保在数据库迁移时初始化默认语言,避免首次启动时出现空数组的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 20:52:41