casa-parks/extract-translations

Casa-Parks 的 Laravel 翻译提取器。

1.0.3 2017-07-21 09:21 UTC

This package is not auto-updated.

Last update: 2024-09-15 03:08:36 UTC


README

Build Status Total Downloads Latest Stable Version License

简介

Extract Translations 是一个简单的翻译列表提供,设计用于前端使用(例如:在 JavaScript 中)。

许可证

Extract Translations 是开源软件,根据 MIT 许可证 发布。

安装

要开始使用 Extract Translations,使用 Composer 将包添加到您的项目依赖项中。

composer require casa-parks/extract-translations

配置

安装后,在您的 config/app.php 配置文件中注册 CasaParks\ExtractTranslations\ExtractTranslationsServiceProvider

'providers' => [
    // Other service providers...

    CasaParks\ExtractTranslations\ExtractTranslationsServiceProvider::class,
],

基本用法

创建一个简单的视图生成器,如下所示

<?php

namespace App\Composers;

use CasaParks\ExtractTranslations\Builder as TranslationsExtractorBuilder;
use Illuminate\Contracts\View\View;

class TranslationsComposer
{
    /**
     * The translations extractor builder.
     *
     * @var \CasaParks\ExtractTranslations\Builder
     */
    protected $builder;

    /**
     * Whether the data is cached or not.
     *
     * @var bool
     */
    protected $cached;

    /**
     * The view data.
     *
     * @var array
     */
    protected $data;

    /**
     * Creates a new translations composer.
     *
     * @param \CasaParks\ExtractTranslations\Builder $builder
     */
    public function __construct(TranslationsExtractorBuilder $builder)
    {
        $this->builder = $builder;
    }

    /**
     * Compose the view.
     *
     * @param \Illuminate\Contracts\View\View $view
     *
     * @return void
     */
    public function compose(View $view)
    {
        if (! $this->cached) {
            $this->cache();
        }

        $view->with($this->data);
    }

    /**
     * Cache the data.
     *
     * @return void
     */
    protected function cache()
    {
        $this->cached = true;

        $translations = $this->builder
            ->locales('en', 'de')
            ->groups('pagination', 'validation')
            ->service();

        $this->data = compact('translations');
    }
}

将此视图生成器添加到您的应用(或 composer)服务提供者的 boot 方法中

/**
 * Register any composers for your application.
 *
 * @return void
 */
public function boot()
{
    // ...

    // assuming `layout` is your common layout template.
    $this->app['view']->composer('layout', 'App\Composers\TranslationsComposer');

    // ...
}

在您的通用 layout 模板文件中

<!-- ... -->
<head>
    <!-- ... -->

    <script>window.translations = {!! $translations->toJson() !!}</script>

    <!-- ... -->
</head>
<!-- ... -->

然后在您的 JavaScript 中按需使用。

高级用法

我个人不希望在每次页面加载时都进行所有这些操作。我会做的是有一个翻译 API(我们知道如果翻译将在前端使用,那么用户肯定已经启用了 JavaScript,对吧?)。

我会有一个简单的 API 控制器,如下所示

namespace App\Http\Controllers\Api;

use CasaParks\ExtractTranslations\Builder;

class TranslationController extends Controller
{
    /**
     * Get the available translations.
     *
     * @param \CasaParks\ExtractTranslations\Builder $builder
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function list(Builder $builder)
    {
        return $builder->locales('en', 'de')
            ->groups('pagination', 'validation')
            ->service();
    }
}

简单的 API 路由(在 routes/api.php 或您的等效路径中)

$router->get('/api/translations', [
    'as' => 'get::api.translations',
    'uses' => 'Api\TranslationController@list',
]);

然后在您的客户端(例如,使用 axios)

window.axios.get('/api/translations')
    .then(translations => window.translations = translations);

附加用法

您甚至可以根据每种语言分别进行,作为一个热插拔,类似于这样的东西

namespace App\Http\Controllers\Api;

use CasaParks\ExtractTranslations\Builder;

class TranslationController extends Controller
{
    /**
     * Get the available translations.
     *
     * @param string                                 $translation
     * @param \CasaParks\ExtractTranslations\Builder $builder
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function get($translation, Builder $builder)
    {
        $translations = $builder->locales($translation)
            ->groups('pagination', 'validation')
            ->service()
            ->toArray();

        return array_get($translations, $translation, []);
    }
}
$router->get('/api/translations/{translation}', [
    'as' => 'get::api.translation',
    'uses' => 'Api\TranslationController@get',
]);
function translate(translation) {
    window.axios.get(`/api/translations/${translation}`)
        .then(translations => window.translations = translations);
}