如何在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
相关产品推荐
相关产品推荐

