casa-parks / extract-translations
Casa-Parks 的 Laravel 翻译提取器。
1.0.3
2017-07-21 09:21 UTC
Requires
- php: >=5.6.4
- illuminate/contracts: ^5.4
- illuminate/support: ^5.4
- illuminate/translation: ^5.4
Requires (Dev)
- mockery/mockery: ~0.9
- phpunit/phpunit: ~4.0|~5.0
This package is not auto-updated.
Last update: 2024-09-15 03:08:36 UTC
README
简介
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); }