beholdr / folio-translate
Easy translation for Laravel Folio pages.
Requires
- php: ^8.3
- illuminate/contracts: ^11.0||^12.0
- laravel/folio: ^1.1
- mcamara/laravel-localization: ^2.3
- spatie/laravel-package-tools: ^1.16
Requires (Dev)
- larastan/larastan: ^2.9||^3.0
- laravel/pint: ^1.14
- nunomaduro/collision: ^8.1.1||^7.10.0
- orchestra/testbench: ^10.0.0||^9.0.0||^8.22.0
- pestphp/pest: ^3.0
- pestphp/pest-plugin-arch: ^3.0
- pestphp/pest-plugin-laravel: ^3.0
- phpstan/extension-installer: ^1.3||^2.0
- phpstan/phpstan-deprecation-rules: ^1.1||^2.0
- phpstan/phpstan-phpunit: ^1.3||^2.0
README
Easy translation for Laravel Folio pages. This package based on mcamara/laravel-localization.
This package extends laravel-localization
with these features:
- translate Folio content via files in the same folder
- check and hide unsupported locales in a language switcher
- redirect to a default locale if a page does not support current locale
Installation
You can install the package via composer:
composer require beholdr/folio-translate
Usage
Add middleware alias in your bootstrap/app.php
:
return Application::configure(basePath: dirname(__DIR__)) ->withMiddleware(function (Middleware $middleware) { $middleware->alias([ // other middleware aliases... 'supportedLocales' => \Beholdr\FolioTranslate\Middleware\SupportedLocales::class, ]);
Add middlewares in your app/Providers/FolioServiceProvider.php
:
namespace App\Providers; use Illuminate\Support\ServiceProvider; use Laravel\Folio\Folio; use Mcamara\LaravelLocalization\Facades\LaravelLocalization; class FolioServiceProvider extends ServiceProvider { public function boot(): void { $locale = LaravelLocalization::setLocale(); Folio::path(resource_path('views/pages'))->middleware([ '*' => [ 'localeSessionRedirect', 'localizationRedirect', 'supportedLocales', ], ])->uri($locale ?? ''); } }
Content translation
Given you have a page views/pages/index.blade.php
and want to translate it to english
and russian
languages.
- Call
translate
function inviews/pages/index.blade.php
file:
<?php use function Beholdr\FolioTranslate\translate; translate(); ?>
- Create
views/pages/index-en.blade.php
andviews/pages/index-ru.blade.php
files in the same directory with original file. Translated files should have the same prefix as the original file, for example:
views
pages
some-path
filename.blade.php
filename-en.blade.php
filename-ru.blade.php
index.blade.php
index-en.blade.php
index-ru.blade.php
- Put your translated content in these files. They will be rendered for each corresponding locale.
For example
views/pages/index-en.blade.php
:
<x-layouts.base title="English page"> English content... </x-layouts.base>
Fallback locale
You can pass an optional argument to translate
function to specify default (fallback) locale: translate('en')
.
This locale will be used to load content if there is no translation for a current locale.
If not specified, it equals to a system APP_FALLBACK_LOCALE
.
Define supported languages manually
Sometimes you need to define supported languages for page manually. It even could be non-Folio page.
In this case you can use middleware supportedLocales
or a helper method setSupportedLanguagesKeys
.
Middleware
You can add supportedLocales
middleware with a list of supported languages to any route:
Route::get('/news', NewsController::class) ->middleware('supportedLocales:en,ru');
In this case a page will support passed languages.
Helper method
Also you can programmatically set supported languages, using FolioTranslate::setSupportedLanguagesKeys()
method:
if ($redirect = FolioTranslate::setSupportedLanguagesKeys(['ru', 'en'])) { return $redirect; }
In case of absent translation for current language, setSupportedLanguagesKeys
will return redirect to a default locale version.
Testing
composer test
License
The MIT License (MIT). Please see License File for more information.