PHPackages                             jeromejhipolito/laravel-translation-middleware - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. jeromejhipolito/laravel-translation-middleware

ActiveLibrary[API Development](/categories/api)

jeromejhipolito/laravel-translation-middleware
==============================================

Automatic locale detection middleware and translation traits for Laravel APIs. Detects Accept-Language header and provides HasTranslations trait for models.

v1.0.0(3mo ago)011MITPHPPHP ^8.2

Since Feb 2Pushed 3mo agoCompare

[ Source](https://github.com/jeromejhipolito/laravel-translation-middleware)[ Packagist](https://packagist.org/packages/jeromejhipolito/laravel-translation-middleware)[ RSS](/packages/jeromejhipolito-laravel-translation-middleware/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (6)Versions (2)Used By (0)

Laravel Translation Middleware
==============================

[](#laravel-translation-middleware)

Automatic locale detection middleware and translation traits for Laravel APIs. Detects `Accept-Language` header and provides `HasTranslations` trait for models with JSON-stored translations.

Features
--------

[](#features)

- Automatically detects user's preferred language from `Accept-Language` header
- Sets Laravel's app locale based on the detected language
- Provides `HasTranslations` trait for models with JSON translation columns
- Provides `TranslatableResource` trait for API resources
- Supports locale fallbacks
- Configurable supported locales
- Excludes specific routes from locale detection

Requirements
------------

[](#requirements)

- PHP 8.2+
- Laravel 11.0+ or 12.0+

Installation
------------

[](#installation)

```
composer require jeromejhipolito/laravel-translation-middleware
```

The package will auto-register its service provider.

Configuration
-------------

[](#configuration)

Publish the configuration file:

```
php artisan vendor:publish --tag=translation-config
```

This will create `config/translation.php`:

```
return [
    // HTTP header name for locale detection
    'header' => env('TRANSLATION_HEADER', 'Accept-Language'),

    // Default locale when no header is provided
    'default' => env('TRANSLATION_DEFAULT', 'en'),

    // Supported locales (empty array = accept all)
    'supported_locales' => ['en', 'ja', 'ko', 'zh', 'es', 'fr', 'de', 'pt', 'it', 'ru'],

    // Fallback when translation not available
    'fallback' => env('TRANSLATION_FALLBACK', 'en'),

    // Column suffix for translations (e.g., title_translations)
    'column_suffix' => '_translations',

    // Parse 'en-US' to 'en' (true) or keep full code (false)
    'parse_language_only' => true,

    // Routes to skip locale detection
    'excluded_routes' => [],
];
```

Usage
-----

[](#usage)

### 1. Register the Middleware

[](#1-register-the-middleware)

Add the middleware to your routes in `bootstrap/app.php`:

```
use JeromeJHipolito\TranslationMiddleware\Middleware\SetLocaleMiddleware;

->withMiddleware(function (Middleware $middleware) {
    $middleware->api(append: [
        SetLocaleMiddleware::class,
    ]);
})
```

### 2. Add HasTranslations Trait to Models

[](#2-add-hastranslations-trait-to-models)

```
use Illuminate\Database\Eloquent\Model;
use JeromeJHipolito\TranslationMiddleware\Traits\HasTranslations;

class Article extends Model
{
    use HasTranslations;

    protected $fillable = [
        'title',
        'content',
        'title_translations',
        'content_translations',
    ];

    protected $casts = [
        'title_translations' => 'array',
        'content_translations' => 'array',
    ];

    // Define which attributes are translatable
    protected array $translatable = ['title', 'content'];
}
```

### 3. Database Migration

[](#3-database-migration)

```
Schema::create('articles', function (Blueprint $table) {
    $table->id();
    $table->string('title');                    // Default value
    $table->json('title_translations')->nullable();  // Translations
    $table->text('content');
    $table->json('content_translations')->nullable();
    $table->timestamps();
});
```

### 4. Store Translations

[](#4-store-translations)

```
$article = Article::create([
    'title' => 'Hello World',
    'content' => 'This is the content.',
]);

// Set individual translations
$article->setTranslation('title', 'ja', 'こんにちは世界');
$article->setTranslation('title', 'ko', '안녕하세요 세계');
$article->save();

// Or set multiple at once
$article->setTranslations('title', [
    'ja' => 'こんにちは世界',
    'ko' => '안녕하세요 세계',
    'zh' => '你好世界',
]);
$article->save();
```

### 5. Retrieve Translations

[](#5-retrieve-translations)

```
// Uses current app locale (set by middleware)
$title = $article->getTranslation('title');

// Specify locale explicitly
$title = $article->getTranslation('title', 'ja');

// Get all translations
$translations = $article->getTranslations('title');
// ['ja' => 'こんにちは世界', 'ko' => '안녕하세요 세계']

// Check if translation exists
if ($article->hasTranslation('title', 'fr')) {
    // ...
}

// Get available locales
$locales = $article->getAvailableLocales('title');
// ['ja', 'ko', 'zh']
```

### 6. Use TranslatableResource in API Resources

[](#6-use-translatableresource-in-api-resources)

```
use Illuminate\Http\Resources\Json\JsonResource;
use JeromeJHipolito\TranslationMiddleware\Traits\TranslatableResource;

class ArticleResource extends JsonResource
{
    use TranslatableResource;

    public function toArray($request): array
    {
        return [
            'id' => $this->id,
            'title' => $this->translated('title'),      // Auto-translated
            'content' => $this->translated('content'),  // Auto-translated
            'available_translations' => $this->availableTranslations('title'),
            'created_at' => $this->created_at,
        ];
    }
}
```

### Client-Side Usage

[](#client-side-usage)

Send the preferred language in the `Accept-Language` header:

```
fetch('/api/articles/1', {
    headers: {
        'Accept-Language': 'ja',
    },
});

// Response:
// {
//     "id": 1,
//     "title": "こんにちは世界",
//     "content": "これはコンテンツです",
//     "available_translations": ["ja", "ko", "zh"]
// }
```

API Reference
-------------

[](#api-reference)

### HasTranslations Trait Methods

[](#hastranslations-trait-methods)

MethodDescription`getTranslation($attribute, $locale = null)`Get translated value`setTranslation($attribute, $locale, $value)`Set translation for locale`setTranslations($attribute, $translations)`Set multiple translations`getTranslations($attribute)`Get all translations array`hasTranslation($attribute, $locale)`Check if translation exists`removeTranslation($attribute, $locale)`Remove translation`getAvailableLocales($attribute)`Get available locale codes`getAllAvailableLocales()`Get all locales across attributes`getTranslatableAttributes()`Get list of translatable attributes`translated($locale = null)`Get all translated attributes`toArrayTranslated($locale = null)`Convert model to array with translations### TranslatableResource Trait Methods

[](#translatableresource-trait-methods)

MethodDescription`getLocale()`Get current locale`translated($attribute)`Get translated value`translatedWhen($condition, $attribute)`Conditional translation`availableTranslations($attribute)`Get available locales`allAvailableTranslations()`Get all available locales`withTranslationMetadata()`Get metadata array`mergeTranslationMetadataWhen($condition)`Conditional metadataTesting
-------

[](#testing)

```
composer test
```

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE) for more information.

Credits
-------

[](#credits)

- [Jerome Hipolito](https://github.com/jeromejhipolito)

###  Health Score

36

—

LowBetter than 82% of packages

Maintenance81

Actively maintained with recent releases

Popularity5

Limited adoption so far

Community2

Small or concentrated contributor base

Maturity46

Maturing project, gaining track record

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

100d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/0306a31e9423235a83c0093c7caaa9725e76e8796396ed3bc51225dd0cdaa4f1?d=identicon)[jeromejhipolito](/maintainers/jeromejhipolito)

---

Tags

middlewareapilaraveli18ntranslationmultilinguallocale

###  Code Quality

TestsPest

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/jeromejhipolito-laravel-translation-middleware/health.svg)

```
[![Health](https://phpackages.com/badges/jeromejhipolito-laravel-translation-middleware/health.svg)](https://phpackages.com/packages/jeromejhipolito-laravel-translation-middleware)
```

###  Alternatives

[essa/api-tool-kit

set of tools to build an api with laravel

52680.5k](/packages/essa-api-tool-kit)[imliam/laravel-throttle-simultaneous-requests

Throttle the current user's requests based on how many requests are currently being executed.

4623.0k](/packages/imliam-laravel-throttle-simultaneous-requests)[dragon-code/laravel-json-response

Automatically always return a response in JSON format

1118.6k1](/packages/dragon-code-laravel-json-response)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
