esign/laravel-translation-loader

从数据库或其他来源加载翻译。

1.2.0 2024-06-18 10:16 UTC

This package is auto-updated.

Last update: 2024-09-18 11:03:17 UTC


README

Latest Version on Packagist Total Downloads GitHub Actions

此包扩展了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)。有关更多信息,请参阅许可证文件