After buying an unlimited license of Laravel Spark v3, I discovered that it loads the subscription plans from a config file, which means that you don't have access to Laravels translation magics.
I posted a question in the Laravel Spark chat. The reply was a suggestion to solve it with a Middleware
.
The example below is how I solved it in my app.
1. Create Middleware
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Config;
class SparkTransPlansMiddleware
{
public function handle(Request $request, Closure $next)
{
Config::set('spark.billables', $this->getTranslatedPlans(config('spark.billables')));
return $next($request);
}
private function getTranslatedPlans(array $billables): array
{
$translated = [];
foreach ($billables['user']['plans'] as $plan) {
$key = $plan['name'];
$translated[] = array_merge($plan, [
"short_description" => trans("plans.$key.short_description"),
"features" => trans("plans.$key.features"),
]);
}
$billables['user']['plans'] = $translated;
return $billables;
}
}
2. Create translation files
Example lang/en/plans.php
Make sure that the plan name
is the same as in config/spark
<?php
return [
'Small' => [
'short_description' => 'Free plan',
'features' => [
'Feature 1',
'Feature 2',
],
],
'Medium' => [
'short_description' => 'Paid plan',
'features' => [
'Feature 1',
'Feature 2',
'Feature 3',
],
],
];
3. Add the plans to Spark config
It doesn't matter what you type in short_description
and features
, as it is replaced in the Middleware at runtime. I typed the translation path as a reminder to myself when I get back to the code after a while.
'billables' => [
'user' => [
'model' => User::class,
'trial_days' => 30,
'default_interval' => 'monthly',
'plans' => [
[
'name' => 'Small',
'short_description' => 'trans.plans',
'monthly_id' => 'stripe_id',
//'yearly_id' => 'none',
'features' => ['trans.plans'],
],
[
'name' => 'Medium',
'short_description' => 'trans.plans',
'monthly_id' => 'stripe_id',
'yearly_id' => 'stripe_id',
'features' => ['trans.plans'],
],
],
],
]
4. Register the middleware
http/Kernel
protected $routeMiddleware = [
'spark-trans-plans' => \App\Http\Middleware\SparkTransPlansMiddleware::class,
];
5. Apply the middleware to Spark billing route
config/spark
'middleware' => ['web', 'auth', 'spark-trans-plans'],
Don't forget to clear the config, route and app cache.
Comments (0)