Laravel9 langフォルダのメッセージをPHP/JavaScriptで共有したい。
/lang/ja/messages.phpを添付のように書いていたところ.
nodejsでコンパイル前のソースから同じ文言を共有したくなりました。
return [
'login' => [
'success' => 'ログインしました。',
'fail' => 'ログインに失敗しました。'
],
];
そこで、/lang/ja/以下のPHPをJSONに変換してJavaScriptの定数のように使えるようにするコマンドを作成しました。
- /lang/ja/以下のPHP
- const ファイル名 という変数名になります。
- とりあえず多言語化はしておらず、メッセージの定数管理のみ&JS側でIDEのコードヒントが出てほしいだけ
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;
class YamaLabLangMesJsonCommand extends Command
{
protected $signature = 'yamalab:lang_mes_json';
protected $description = 'langファイル(PHP)をJSONに変換し保存';
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$langdir = base_path('lang/ja');
if (is_dir($langdir)) {
$files = scandir($langdir);
if (!empty($files)) {
$langjs = [];
$files = array_filter($files, function ($f) {
return strpos($f, '.php') !== false;
});
foreach ($files as $f) {
$phpArr = include base_path("lang/ja/$f");
$json = json_encode($phpArr, JSON_UNESCAPED_UNICODE);
$name = str_replace('.php','.json',$f);
$varName = '__'.str($name)->replace('.json','')->upper().'__';
$row = sprintf('var %s = %s;',$varName,$json);
$langjs[] = $row;
}
$langjs = implode("\n",$langjs);
File::put(resource_path('js/lang.js'), $langjs);
}
}
return Command::SUCCESS;
}
}