rmariuzzo / Laravel-JS-Localization

🌐 Convert your Laravel messages and consume them in the front-end!
https://github.com/rmariuzzo/laravel-js-localization
MIT License
596 stars 170 forks source link

Fix for Laravel 9+: support moved language resource path in Laravel 9 #166

Open timvisee opened 2 years ago

timvisee commented 2 years ago

Laravel 9 moves the language directory, breaking the current implementation.

This change uses app()->langPath() in Laravel 9+ to dynamically get the language resource path, as recommended per documentation.

This should support installations updated from 8 to 9 still using the old path.

przemekperon commented 2 years ago

Any chance on merging this one? Without it the package doesn't work with default Laravel 9 install.

mirkoschmidt commented 2 years ago

I have found an alternative way. Create a service provider which references the Mariuzzo\LaravelJsLocalization\LaravelJsLocalizationServiceProvider and overwrite the register method. Then just add your own service provider to config/app.php and it will work with the new path.

ZejdCicak commented 2 years ago

@mirkoschmidt how would you reference another service provider form a service provider? Can you share your solution please?

mirkoschmidt commented 2 years ago

Under app/Providers I created the following provider "LaravelLangJSServiceProvider" with the following content

<?php

namespace App\Providers;

use Mariuzzo\LaravelJsLocalization\Commands\LangJsCommand;
use Mariuzzo\LaravelJsLocalization\Generators\LangJsGenerator;
use Mariuzzo\LaravelJsLocalization\LaravelJsLocalizationServiceProvider;

class LaravelLangJsServiceProvider extends LaravelJsLocalizationServiceProvider
{
    /**
     * Register the service provider.
     */
    public function register()
    {
        // Bind the Laravel JS Localization command into the app IOC.
        $this->app->singleton('localization.js', function ($app) {
            $app = $this->app;
            $laravelMajorVersion = (int) $app::VERSION;

            $files = $app['files'];

            if ($laravelMajorVersion === 4) {
                $langs = $app['path.base'].'/app/lang';
            } elseif ($laravelMajorVersion >= 5 && $laravelMajorVersion < 9) {
                $langs = $app['path.base'].'/resources/lang';
            } elseif ($laravelMajorVersion >= 9) {
                $langs = app()->langPath();;
            }
            $messages = $app['config']->get('localization-js.messages');
            $generator = new LangJsGenerator($files, $langs, $messages);

            return new LangJsCommand($generator);
        });

        // Bind the Laravel JS Localization command into Laravel Artisan.
        $this->commands('localization.js');
    }
}

and in config/app.php in the section "providers" i added this at the end

App\Providers\LaravelLangJsServiceProvider::class,

with reference i mean extends.

lphilps commented 2 years ago

Any chance of getting this PR merged and another release generated? I just had to go the "override the service provider" route as detailed by @mirkoschmidt to get this to work in Laravel 9.

nasirouwagana commented 2 years ago

When this can be merged please?

rmariuzzo commented 2 years ago

Today, I'm gonna check that one. I will be careful with the versioning too.

amadeann commented 11 months ago

Until this is merged, this command works for default location of lang files in Laravel 9+: php artisan lang:js --source lang