esign / laravel-translation-loader
从数据库或其他来源加载翻译。
Requires
- php: ^8.0
- esign/laravel-underscore-translatable: ^1.1
- illuminate/cache: ^9.2|^10.0|^11.0
- illuminate/console: ^9.2|^10.0|^11.0
- illuminate/database: ^9.2|^10.0|^11.0
- illuminate/support: ^9.2|^10.0|^11.0
- illuminate/translation: ^9.2|^10.0|^11.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.5
- orchestra/testbench: ^7.0|^8.0|^9.0
- phpunit/phpunit: ^9.5|^10.0
This package is auto-updated.
Last update: 2024-09-18 11:03:17 UTC
README
此包扩展了Laravel的默认翻译功能,允许您从不同的来源加载翻译。它包含一个数据库加载器,可以自动创建缺失的键,并内置了缓存支持。
安装
您可以通过composer安装此包
composer require esign/laravel-translation-loader
此包将自动注册一个服务提供者。
此包包含一个迁移,用于将翻译存储在数据库中。您可以使用以下命令发布迁移文件
php artisan vendor:publish --provider="Esign\TranslationLoader\TranslationLoaderServiceProvider" --tag="migrations"
这将发布以下迁移
return new class extends Migration { public function up(): void { Schema::create('translations', function (Blueprint $table) { $table->id(); $table->string('key'); $table->string('group')->default('*'); $table->text('value_en')->nullable(); $table->timestamps(); $table->unique(['key', 'group']); }); } };
默认情况下,它支持英语语言,并使用我们的Underscore Translatable包将这些语言存储在不同的列中。您可以根据需要添加更多语言。
接下来,您可以选择发布配置文件
php artisan vendor:publish --provider="Esign\TranslationLoader\TranslationLoaderServiceProvider" --tag="config"
配置文件将发布为config/translation-loader.php,内容如下
return [ /** * These loaders will load translations from different sources. * You can use any class that implements the TranslationLoaderContract. */ 'loaders' => [ \Esign\TranslationLoader\Loaders\DatabaseLoader::class, ], /** * This is the loader that combines all of the other loaders together. * This class overrides Laravel's default `translation.loader`. */ 'aggregate_loader' => \Esign\TranslationLoader\Loaders\AggregateLoader::class, /** * This is the model that will be used by the DatabaseLoader. * You may provide a class that implements the UnderscoreTranslatable trait. */ 'model' => \Esign\TranslationLoader\Models\Translation::class, 'cache' => [ /** * The key that will be used to cache the database translations. */ 'key' => 'esign.laravel-translation-loader.translations', /** * The duration for which database translations will be cached. */ 'ttl' => \DateInterval::createFromDateString('24 hours'), /** * The cache store to be used for database translations. * Use null to utilize the default cache store from the cache.php config file. * To disable caching, you can use the 'array' store. */ 'store' => null, ], /** * Configuration for the custom translator class that handles missing translation keys. * This class overrides Laravel's default `translator` binding. */ 'translator' => \Esign\TranslationLoader\Translator::class, ];
用法
要创建数据库翻译,您可以在Translation
模型上使用create
方法
use Esign\TranslationLoader\Models\Translation; Translation::create([ 'group' => 'messages', 'key' => 'welcome', 'value_en' => 'Hello World!', 'value_nl' => 'Hallo Wereld!', ]);
对于更自动化的方法,请考虑自动创建数据库翻译,从而消除手动创建键的需求。
创建后,您可以在Laravel中像通常一样检索翻译
trans('messages.welcome'); // Hello World! trans('messages.welcome', [], 'nl'); // Hallo Wereld!
有关所有可能性,请参阅Laravel的本地化文档。请注意,数据库定义的翻译可以覆盖可能存在的文件翻译。
处理缺失的翻译键
在您请求一个不存在的翻译键的情况下,您可以选择向翻译器提供一个回调。当请求的翻译键找不到时,此回调将被触发。请注意,如果翻译键存在但值为空或null,则不会调用此回调。
您还可以通过从回调返回一个特定值来自定义翻译器的行为。然后,返回的值将用作缺失键的翻译。
您可以使用Esign\TranslationLoader\Facades\Translator
外观的setMissingKeyCallback
方法提供此回调
use Esign\TranslationLoader\Facades\Translator; Translator::setMissingKeyCallback(function (string $key, string $locale) { // Implement your custom logic here return "Fallback translation for '$key'"; });
在提供的闭包中,您可以实现任何需要的自定义逻辑来处理缺失的翻译键。这可能涉及记录、发送通知或根据您的应用程序需求提供默认翻译值。
自动创建缺失的翻译键
此包包含自动在键不存在时创建数据库翻译的能力。您可以通过在Esign\TranslationLoader\Facades\Translator
外观上调用createMissingTranslations
来激活此功能。通常,这将在您的应用程序中的服务提供者内完成
use Esign\TranslationLoader\Facades\Translator; Translator::createMissingTranslations();
请注意,此功能将在*
组下创建翻译。如果您需要更改此行为,您可以通过定义自己的setMissingKeyCallback
来实现。
注册加载器
如果您需要从不同的来源收集翻译,您可以通过创建一个自定义翻译加载器来实现,该加载器实现了Esign\TranslationLoader\Contracts\TranslationLoaderContract
接口
use Esign\TranslationLoader\Contracts\TranslationLoaderContract; class MyTranslationsLoader implements TranslationLoaderContract { public function loadTranslations(string $locale, string $group, string $namespace = null): array { // Your implementation here } }
通过将自定义加载器包含在此包的配置文件中的 loaders
数组中来集成您的自定义加载器。
缓存数据库翻译
默认情况下,此包通过缓存您的数据库翻译24小时来确保高效性能。此缓存机制使用您在Laravel应用程序中配置的默认缓存驱动程序。
如果您想修改缓存持续时间或切换到不同的缓存存储,请参阅配置文件中的缓存设置。
清除翻译缓存
当您与Esign\TranslationLoader\Models\Translation
模型交互时,翻译缓存会自动维护。但是,如果您在这些操作之外进行更改,则需要手动清除缓存。
php artisan translations:clear-cache
将文件翻译导入到数据库中
此包附带了一个Artisan命令,允许您将文件翻译导入到数据库中。当您想将翻译从基于文件存储迁移到基于数据库存储时,这可能很有用。您应该指定要导入翻译的区域,作为逗号分隔的列表。
php artisan translations:import-files-to-database --locales=en,nl
您可以可选地指定 --overwrite
标志以覆盖任何现有翻译。
php artisan translations:import-files-to-database --locales=en,nl --overwrite
常见问题解答
与[mcamara/laravel-localization](https://github.com/mcamara/laravel-localization)的安装冲突
laravel-localization包通过利用Laravel的翻译器提供路由翻译功能。然而,由于我们的包覆盖了Laravel翻译器的行为,可能会出现冲突。这可能导致查询翻译时潜在的数据库异常,阻碍我们包的安装。
为了解决这个问题,您可以在应用程序的服务提供程序中利用上下文绑定。这指示Laravel仅当注册已翻译的路由时使用基于文件的翻译。
在您的应用程序中的服务提供程序中包含以下代码
use Illuminate\Contracts\Translation\Translator as TranslatorContract; use Illuminate\Foundation\Application; use Illuminate\Translation\FileLoader; use Illuminate\Translation\Translator; use Mcamara\LaravelLocalization\LaravelLocalization; public function register(): void { $this ->app ->when(LaravelLocalization::class) ->needs(TranslatorContract::class) ->give(function (Application $app) { $loader = new FileLoader($app['files'], [__DIR__.'/lang', $app['path.lang']]); return new Translator($loader, $app->getLocale()); }); }
请注意,此解决方案仅适用于mcamara/laravel-localization的任何版本高于^2.0
的情况。
测试
composer test
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。