DEV Community

Er Amit Gupta
Er Amit Gupta

Posted on

🌐 Easy Laravel Translation Sync for Inertia (Vue.js / React)

Untitled design

Laravel Lang Sync Inertia helps you add different languages to your Laravel app with Vue or React. It makes translations easy!

✨ Features

  • βš™οΈ Inertia.js integration with automatic sharing
  • πŸ“‚ Load single or multiple language files
  • πŸ”„ Dynamic replacement support in translations
  • 🧩 Supports both Vue.js and React
  • 🧡 Built-in middleware for automatic sharing
  • πŸ› οΈ Helper functions like trans() and __() for frontend usage
  • 🌍 Automatically switches language folder based on current Laravel locale

πŸ“¦ Installation

To install the package, run the following command via Composer:

composer require erag/laravel-lang-sync-inertia
Enter fullscreen mode Exit fullscreen mode

πŸ› οΈ Publish Configuration & Composables

To publish the configuration and composables, run:

php artisan erag:install-lang
Enter fullscreen mode Exit fullscreen mode

This will publish:

  • βœ… config/inertia-lang.php β€” for customizing the language path
  • βœ… resources/js/composables/useLang.ts β€” for Vue (if selected)
  • βœ… resources/js/hooks/useLang.tsx β€” for React (if selected)

During installation, you'll be prompted to choose either Vue or React for your frontend framework.


πŸš€ Usage Guide: syncLangFiles()

The syncLangFiles() function is a Laravel helper provided by this package. Use it inside your controller methods to load translation files and automatically share them with your Vue or React frontend via Inertia.js.

βœ… Think of syncLangFiles() as a bridge between Laravel’s backend translations and your Inertia-powered frontend.


πŸ§ͺ How It Works

Suppose you have the following language file:

πŸ“ resources/lang/en/auth.php

return [
    'welcome' => 'Welcome, {name}!',
    'greeting' => 'Hello!',
];
Enter fullscreen mode Exit fullscreen mode

Now, you want to show auth.welcome and auth.greeting on the frontend using Vue or React.


πŸ” Step-by-Step Example

πŸ”Ή 1. Load Translations in Controller

use Inertia\Inertia;

public function login()
{
    // Load the auth.php language file
    syncLangFiles('auth');

    return Inertia::render('Login');
}
Enter fullscreen mode Exit fullscreen mode

🧠 This loads the file resources/lang/en/auth.php based on the current Laravel locale and shares its content with Inertia.


πŸ’‘ Frontend Usage

βœ… Vue Example

<template>
    <div>
        <h1>{{ __('auth.greeting') }}</h1>
        <p>{{ trans('auth.welcome', { name: 'John' }) }}</p>
    </div>
</template>

<script setup>
import { useLang } from '@/composables/useLang'

const { trans, __ } = useLang()
</script>
Enter fullscreen mode Exit fullscreen mode

βœ… React Example

import React from 'react'
import { useLang } from '@/hooks/useLang'

export default function Login() {
    const { trans, __ } = useLang()

    return (
        <div>
            <h1>{__('auth.greeting')}</h1>
            <p>{trans('auth.welcome', { name: 'John' })}</p>
        </div>
    )
}
Enter fullscreen mode Exit fullscreen mode

πŸ“€ Output on Page

When the above code is rendered, this will be the output:

Hello!
Welcome, John!
Enter fullscreen mode Exit fullscreen mode

🧠 Notes on trans() vs __()

Function Use Case Description
trans() Advanced Use when you need to pass dynamic placeholders like {name}
__() Simple Shortcut for quick access to translated strings

βœ… You can use them interchangeably for basic translations.
βœ… Both support placeholder replacement.


πŸ›  Example with Plain String

Sometimes, you might want to append something without a key:

__('auth.welcome', 'Vue Developer')
// Output: "Welcome, {name}! Vue Developer" (if placeholder is not used)
Enter fullscreen mode Exit fullscreen mode

But recommended usage is always with an object:

trans('auth.welcome', { name: 'Amit' })
// Output: "Welcome, Amit!"
Enter fullscreen mode Exit fullscreen mode

πŸ“‘ Access Inertia Shared Props

Vue:

import { usePage } from '@inertiajs/vue3'

const { lang } = usePage().props
Enter fullscreen mode Exit fullscreen mode

React:

import { usePage } from '@inertiajs/react'

const { lang } = usePage().props
Enter fullscreen mode Exit fullscreen mode

You can directly access the full language object shared by Inertia.


πŸ—‚οΈ Translation File Location

Language files are loaded based on the current Laravel locale. By default, Laravel uses resources/lang/{locale} structure:

resources/lang/
β”œβ”€β”€ en/
β”‚   └── auth.php
β”œβ”€β”€ hi/
β”‚   └── auth.php
Enter fullscreen mode Exit fullscreen mode

When calling:

syncLangFiles('auth');
Enter fullscreen mode Exit fullscreen mode

It dynamically loads resources/lang/{locale}/auth.php.


βš™οΈ Configuration

You can customize the language directory by modifying config/inertia-lang.php:

return [
    'lang_path' => lang_path(), // Default: /resources/lang
];
Enter fullscreen mode Exit fullscreen mode

🧩 Composables Location

  • Vue: resources/js/composables/useLang.ts
  • React: resources/js/hooks/useLang.tsx

You can modify the location or structure of these files by adjusting the published files.


πŸ“„ License

This package is licensed under the MIT License.


🀝 Contributing

Pull requests and issues are welcome!
Let’s work together to improve localization in Laravel! πŸ’¬

Top comments (0)