Add localization:generate command to generate the js/vue l10n files from the blade translations

pull/5702/head
Daniel Supernault 3 weeks ago
parent dc4e683f0a
commit df7283fc00
No known key found for this signature in database
GPG Key ID: 23740873EE6F76A1

@ -0,0 +1,113 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;
class Localization extends Command
{
protected $signature = 'localization:generate';
protected $description = 'Generate JSON files for all available localizations';
public function __construct()
{
parent::__construct();
}
public function handle()
{
$languages = $this->discoverLangs();
foreach ($languages as $lang) {
$this->info("Processing {$lang} translations...");
$this->buildTranslations($lang);
}
$this->info('All language files have been processed successfully!');
}
protected function buildTranslations(string $lang)
{
$path = base_path("resources/lang/{$lang}");
$keys = [];
$kcount = 0;
if (! File::isDirectory($path)) {
$this->error("Directory not found: {$path}");
return;
}
foreach (new \DirectoryIterator($path) as $io) {
if ($io->isDot() || ! $io->isFile()) {
continue;
}
$key = $io->getBasename('.php');
try {
$translations = __($key, [], $lang);
$keys[$key] = [];
foreach ($translations as $k => $str) {
$keys[$key][$k] = $str;
$kcount++;
}
ksort($keys[$key]);
} catch (\Exception $e) {
$this->warn("Failed to process {$lang}/{$key}.php: {$e->getMessage()}");
}
}
$result = $this->prepareOutput($keys, $kcount);
$this->saveTranslations($result, $lang);
}
protected function prepareOutput(array $keys, int $keyCount): array
{
$output = $keys;
$hash = hash('sha256', json_encode($output));
$output['_meta'] = [
'key_count' => $keyCount,
'generated' => now()->toAtomString(),
'hash_sha256' => $hash,
];
ksort($output);
return $output;
}
protected function saveTranslations(array $translations, string $lang)
{
$directory = public_path('_lang');
if (! File::isDirectory($directory)) {
File::makeDirectory($directory, 0755, true);
}
$filename = "{$directory}/{$lang}.json";
$contents = json_encode($translations, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
File::put($filename, $contents);
$this->info("Generated {$lang}.json");
}
protected function discoverLangs(): array
{
$path = base_path('resources/lang');
$languages = [];
foreach (new \DirectoryIterator($path) as $io) {
$name = $io->getFilename();
if (! $io->isDot() && $io->isDir() && $name !== 'vendor') {
$languages[] = $name;
}
}
return $languages;
}
}
Loading…
Cancel
Save