浏览代码

Merge pull request #5702 from pixelfed/staging

Add localization:generate command to generate the js/vue l10n files f…
daniel 5 月之前
父节点
当前提交
cc3001c5fe
共有 1 个文件被更改,包括 113 次插入0 次删除
  1. 113 0
      app/Console/Commands/Localization.php

+ 113 - 0
app/Console/Commands/Localization.php

@@ -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;
+    }
+}