Laravel-JS-Localization icon indicating copy to clipboard operation
Laravel-JS-Localization copied to clipboard

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

Open timvisee opened this issue 3 years ago • 8 comments

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.

timvisee avatar Feb 15 '22 14:02 timvisee

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

przemekperon avatar Apr 15 '22 12:04 przemekperon

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.

mirkoschmidt avatar May 12 '22 22:05 mirkoschmidt

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

ZejdCicak avatar May 18 '22 08:05 ZejdCicak

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.

mirkoschmidt avatar May 19 '22 07:05 mirkoschmidt

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.

lphilps avatar Jul 13 '22 01:07 lphilps

When this can be merged please?

nasirouwagana avatar Oct 13 '22 22:10 nasirouwagana

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

rmariuzzo avatar Oct 14 '22 12:10 rmariuzzo

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

amadeann avatar Dec 06 '23 13:12 amadeann