diff --git a/app/Http/Controllers/TranslationController.php b/app/Http/Controllers/TranslationController.php new file mode 100644 index 0000000..5191bba --- /dev/null +++ b/app/Http/Controllers/TranslationController.php @@ -0,0 +1,59 @@ +setLocale($locale); + + return $this->all() ?? '{}'; + } + + /** + * @return array|null + */ + public function all() + { + $path = lang_path(app()->getLocale() . '.json'); + + if (File::exists($path)) { + return json_decode(File::get($path), true); + } + } + + /** + * @param \Illuminate\Http\Request $request + * @param string $locale + * @return \Illuminate\Http\Response + */ + public function register(Request $request, string $locale = 'id') + { + $request->validate([ + 'text' => 'required|string', + ]); + + app()->setLocale($locale); + + $all = $this->all() ?? []; + + if (!array_key_exists($request->text, $all)) { + $all[$request->text] = $request->text; + } + + $path = lang_path($locale . '.json'); + + return File::put($path, json_encode( + $all, JSON_PRETTY_PRINT + )); + } +} diff --git a/resources/js/app.js b/resources/js/app.js index db6a205..1002870 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -34,8 +34,31 @@ const can = (abilities) => { } } +window.translations = {} +window.locale = localStorage.getItem('locale') || 'id' + +const translation = () => axios.get(route('api.translation.get', window.locale)) + .then(response => response.data) + .then(response => window.translations = response) + +translation() + window.can = can window.__ = (text, replacements = {}) => { + if (typeof text === 'string') { + if (window.translations.hasOwnProperty(text)) { + text = window.translations[text] + } else { + axios.post(route( + 'api.translation.register', window.locale + ), { text }).then(translation) + } + + for (const key in replacements) { + text = text.replace(new RegExp(`:${key}`, 'g'), replacements[key]) + } + } + return text } diff --git a/routes/api.php b/routes/api.php index 45ed68f..4f81543 100644 --- a/routes/api.php +++ b/routes/api.php @@ -27,4 +27,9 @@ Route::prefix('/v1')->name('api.v1.')->middleware(['auth:sanctum'])->group(funct }); Route::get('/user', fn () => request()->user()); +}); + +Route::prefix('/translation/{locale?}')->name('api.translation.')->controller(App\Http\Controllers\TranslationController::class)->group(function () { + Route::get('/', 'get')->name('get'); + Route::post('/', 'register')->name('register'); }); \ No newline at end of file