475 lines
17 KiB
PHP
475 lines
17 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Language;
|
|
use App\Models\Setting;
|
|
use App\Services\BootstrapTableService;
|
|
use App\Services\CachingService;
|
|
use App\Services\FileService;
|
|
use App\Services\ResponseService;
|
|
use File;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use Illuminate\Support\Facades\Session;
|
|
use Illuminate\Support\Facades\Validator;
|
|
use Throwable;
|
|
|
|
class LanguageController extends Controller
|
|
{
|
|
private string $uploadFolder;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->uploadFolder = 'language';
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
$validator = Validator::make($request->all(), [
|
|
'name' => 'required',
|
|
'name_in_english' => 'required|regex:/^[\pL\s]+$/u',
|
|
'code' => 'required|unique:languages,code',
|
|
'rtl' => 'nullable',
|
|
'image' => 'required|mimes:jpeg,png,jpg,svg|max:7168',
|
|
'country_code' => 'nullable',
|
|
]);
|
|
if ($validator->fails()) {
|
|
ResponseService::validationError($validator->errors()->first());
|
|
}
|
|
try {
|
|
$data = $request->all();
|
|
$data['rtl'] = $request->rtl == 'on';
|
|
|
|
if ($request->hasFile('panel_file')) {
|
|
$data['panel_file'] = FileService::uploadLanguageFile($request->file('panel_file'), $request->code);
|
|
}
|
|
|
|
if ($request->hasFile('app_file')) {
|
|
$data['app_file'] = FileService::uploadLanguageFile($request->file('app_file'), $request->code . '_app');
|
|
}
|
|
|
|
if ($request->hasFile('web_file')) {
|
|
$data['web_file'] = FileService::uploadLanguageFile($request->file('web_file'), $request->code . '_web');
|
|
}
|
|
|
|
if ($request->hasFile('image')) {
|
|
$data['image'] = FileService::upload($request->file('image'), $this->uploadFolder);
|
|
}
|
|
|
|
Language::create($data);
|
|
CachingService::removeCache(config('constants.CACHE.LANGUAGE'));
|
|
ResponseService::successResponse('Language Successfully Added');
|
|
} catch (Throwable $th) {
|
|
ResponseService::logErrorRedirect($th, 'Language Controller -> Store');
|
|
ResponseService::errorResponse('Something Went Wrong');
|
|
}
|
|
}
|
|
|
|
public function show(Request $request)
|
|
{
|
|
$offset = $request->offset ?? 0;
|
|
$limit = $request->limit ?? 10;
|
|
$sort = $request->sort ?? 'id';
|
|
$order = $request->order ?? 'DESC';
|
|
|
|
$sql = Language::orderBy($sort, $order);
|
|
|
|
if (! empty($_GET['search'])) {
|
|
$search = $_GET['search'];
|
|
$sql->where('id', 'LIKE', "%$search%")->orwhere('code', 'LIKE', "%$search%")->orwhere('name', 'LIKE', "%$search%");
|
|
}
|
|
$total = $sql->count();
|
|
$sql->skip($offset)->take($limit);
|
|
$result = $sql->get();
|
|
$bulkData = [];
|
|
$bulkData['total'] = $total;
|
|
$rows = [];
|
|
foreach ($result as $key => $row) {
|
|
$tempRow = $row->toArray();
|
|
$tempRow['rtl_text'] = ($row->rtl == 1) ? 'Yes' : 'No';
|
|
$operate = '';
|
|
if ($row->code != 'en') {
|
|
$operate .= BootstrapTableService::editButton(route('language.update', $row->id), true);
|
|
$operate .= BootstrapTableService::deleteButton(route('language.destroy', $row->id));
|
|
}
|
|
$dropdownItems = [
|
|
[
|
|
'icon' => '',
|
|
'url' => route('languageedit', [$row->id, 'type' => 'panel']),
|
|
'text' => trans('Edit Panel Json'),
|
|
],
|
|
[
|
|
'icon' => '',
|
|
'url' => route('languageedit', [$row->id, 'type' => 'web']),
|
|
'text' => trans('Edit Web Json'),
|
|
],
|
|
[
|
|
'icon' => '',
|
|
'url' => route('languageedit', [$row->id, 'type' => 'app']),
|
|
'text' => trans('Edit App Json'),
|
|
],
|
|
];
|
|
|
|
$operate .= BootstrapTableService::dropdown('fas fa-ellipsis-v', $dropdownItems);
|
|
|
|
$tempRow['operate'] = $operate;
|
|
$rows[] = $tempRow;
|
|
}
|
|
|
|
$bulkData['rows'] = $rows;
|
|
|
|
return response()->json($bulkData);
|
|
}
|
|
|
|
public function update(Request $request, $id)
|
|
{
|
|
$validator = Validator::make($request->all(), [
|
|
'name' => 'required',
|
|
'name_in_english' => 'required|regex:/^[\pL\s]+$/u',
|
|
'code' => 'required|unique:languages,code,' . $id,
|
|
'rtl' => 'nullable|boolean',
|
|
'app_file' => 'nullable|mimes:json',
|
|
'panel_file' => 'nullable|mimes:json',
|
|
'web_file' => 'nullable|mimes:json',
|
|
'image' => 'nullable|mimes:jpeg,png,jpg,svg|max:7168',
|
|
'country_code' => 'nullable',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return ResponseService::validationError($validator->errors()->first());
|
|
}
|
|
|
|
try {
|
|
$language = Language::findOrFail($id);
|
|
|
|
$oldCode = $language->code;
|
|
$newCode = $request->input('code');
|
|
$defaultCode = Setting::where('name', 'default_language')->value('value');
|
|
|
|
|
|
|
|
|
|
$data = $request->only([
|
|
'name',
|
|
'name_in_english',
|
|
'code',
|
|
'country_code',
|
|
]);
|
|
|
|
// Preserve RTL unless changed
|
|
if ($request->has('rtl')) {
|
|
$data['rtl'] = (bool) $request->rtl;
|
|
}
|
|
|
|
unset($data['is_default']);
|
|
|
|
if ($request->hasFile('panel_file')) {
|
|
$data['panel_file'] = FileService::uploadLanguageFile(
|
|
$request->file('panel_file'),
|
|
$oldCode
|
|
);
|
|
}
|
|
|
|
if ($request->hasFile('app_file')) {
|
|
$data['app_file'] = FileService::uploadLanguageFile(
|
|
$request->file('app_file'),
|
|
$oldCode . '_app'
|
|
);
|
|
}
|
|
|
|
if ($request->hasFile('web_file')) {
|
|
$data['web_file'] = FileService::uploadLanguageFile(
|
|
$request->file('web_file'),
|
|
$oldCode . '_web'
|
|
);
|
|
}
|
|
|
|
if ($request->hasFile('image')) {
|
|
$data['image'] = FileService::replace(
|
|
$request->file('image'),
|
|
$this->uploadFolder,
|
|
$language->getRawOriginal('image')
|
|
);
|
|
}
|
|
|
|
|
|
if ($oldCode !== $newCode) {
|
|
FileService::renameLanguageFiles($oldCode, $newCode);
|
|
}
|
|
|
|
if ($defaultCode === $oldCode) {
|
|
|
|
Setting::updateOrCreate(
|
|
['name' => 'default_language'],
|
|
['value' => $newCode, 'type' => 'string']
|
|
);
|
|
|
|
Session::forget('locale');
|
|
Session::put('locale', $newCode);
|
|
Session::save();
|
|
|
|
app()->setLocale($newCode);
|
|
}
|
|
|
|
if (Session::get('locale') === $oldCode) {
|
|
Session::put('locale', $newCode);
|
|
app()->setLocale($newCode);
|
|
}
|
|
|
|
$language->update($data);
|
|
|
|
CachingService::removeCache(config('constants.CACHE.LANGUAGE'));
|
|
|
|
return ResponseService::successResponse('Language Updated successfully');
|
|
} catch (Throwable $th) {
|
|
ResponseService::logErrorResponse($th, 'Language Controller --> update');
|
|
return ResponseService::errorResponse('Something Went Wrong');
|
|
}
|
|
}
|
|
|
|
|
|
public function destroy($id)
|
|
{
|
|
try {
|
|
// if (!has_permissions('delete', 'property')) {
|
|
// return redirect()->back()->with('error', PERMISSION_ERROR_MSG);
|
|
// }
|
|
$language = Language::findOrFail($id);
|
|
$setting = \DB::table('settings')->where('name', 'default_language')->first();
|
|
if ($language->code === $setting->value) {
|
|
ResponseService::errorResponse('You can not delete default language');
|
|
}
|
|
|
|
$language->delete();
|
|
|
|
FileService::deleteLanguageFile($language->app_file);
|
|
FileService::deleteLanguageFile($language->panel_file);
|
|
FileService::deleteLanguageFile($language->web_file);
|
|
FileService::delete($language->getRawOriginal('image'));
|
|
CachingService::removeCache(config('constants.CACHE.LANGUAGE'));
|
|
|
|
ResponseService::successResponse('Language Deleted successfully');
|
|
} catch (Throwable $th) {
|
|
ResponseService::logErrorRedirect($th, 'Language Controller --> Destroy');
|
|
|
|
ResponseService::errorResponse('Something Went Wrong');
|
|
}
|
|
}
|
|
|
|
public function setLanguage($languageCode)
|
|
{
|
|
$language = Language::where('code', $languageCode)->firstOrFail();
|
|
|
|
Session::put('locale', $language->code);
|
|
Session::put('language', $language);
|
|
app()->setLocale($language->code);
|
|
|
|
return redirect()->back();
|
|
}
|
|
|
|
// public function setDefaultLanguage(Request $request)
|
|
// {
|
|
// ResponseService::noPermissionThenSendJson('settings-update');
|
|
|
|
// $request->validate([
|
|
// 'default_language' => 'required|exists:languages,code',
|
|
// ]);
|
|
|
|
// // Save default globally
|
|
// Setting::updateOrCreate(
|
|
// ['name' => 'default_language'],
|
|
// ['value' => $request->default_language, 'type' => 'string']
|
|
// );
|
|
// $language = Language::where('code', $request->default_language)->firstOrFail();
|
|
// Cache::forget('global_default_language');
|
|
// // Update current session too
|
|
// Session::put('locale', $request->default_language);
|
|
// Session::put('language', $language);
|
|
// Session::put('Default_langauge', $request->default_language);
|
|
// app()->setLocale($request->default_language);
|
|
|
|
// return redirect()->back()
|
|
// ->with('success', __('Default language updated successfully.'));
|
|
// }
|
|
public function setDefaultLanguage(Request $request)
|
|
{
|
|
ResponseService::noPermissionThenSendJson('settings-update');
|
|
|
|
$request->validate([
|
|
'default_language' => 'required|exists:languages,code',
|
|
]);
|
|
|
|
// 1. Save globally in the database
|
|
Setting::updateOrCreate(
|
|
['name' => 'default_language'],
|
|
['value' => $request->default_language, 'type' => 'string']
|
|
);
|
|
|
|
// 2. CRITICAL: Clear the Middleware cache
|
|
Cache::forget('global_default_language');
|
|
|
|
// 3. Update current user's session so the UI reflects the change immediately
|
|
$language = Language::where('code', $request->default_language)->firstOrFail();
|
|
|
|
Session::put('locale', $request->default_language);
|
|
Session::put('language', $language);
|
|
|
|
// Clear the CachingService cache if it has one (e.g., system_settings)
|
|
// Cache::forget('system_settings');
|
|
|
|
app()->setLocale($request->default_language);
|
|
|
|
return redirect()->back()
|
|
->with('success', __('Default language updated successfully.'));
|
|
}
|
|
|
|
|
|
|
|
|
|
public function editlanguage(Request $request, $id, $type)
|
|
{
|
|
$language = Language::findOrFail($id);
|
|
$languageCode = $language->code ?? 'en';
|
|
// $name = $type;
|
|
|
|
if ($type == 'panel') {
|
|
$fileName = $language->panel_file ?: "{$languageCode}.json";
|
|
$defaultFile = base_path('resources/lang/en.json');
|
|
} elseif ($type == 'web') {
|
|
$fileName = $language->web_file ?: "{$languageCode}_web.json";
|
|
$defaultFile = base_path('resources/lang/en_web.json');
|
|
} elseif ($type == 'app') {
|
|
$fileName = $language->app_file ?: "{$languageCode}_app.json";
|
|
$defaultFile = base_path('resources/lang/en_app.json');
|
|
} else {
|
|
$fileName = 'en.json';
|
|
$defaultFile = base_path('resources/lang/en.json');
|
|
}
|
|
|
|
$jsonFile = base_path("resources/lang/{$fileName}");
|
|
|
|
if (! File::exists($jsonFile)) {
|
|
if (File::exists($defaultFile)) {
|
|
$defaultContent = File::get($defaultFile);
|
|
} else {
|
|
$defaultContent = json_encode([]);
|
|
}
|
|
|
|
File::put($jsonFile, $defaultContent);
|
|
|
|
if ($type == 'panel') {
|
|
$language->panel_file = $fileName;
|
|
} elseif ($type == 'web') {
|
|
$language->web_file = $fileName;
|
|
} elseif ($type == 'app') {
|
|
$language->app_file = $fileName;
|
|
}
|
|
$language->save();
|
|
}
|
|
|
|
$jsonContent = File::get($jsonFile);
|
|
|
|
$enContent = File::exists($defaultFile) ? json_decode(File::get($defaultFile), true) : [];
|
|
$targetContent = File::exists($jsonFile) ? json_decode(File::get($jsonFile), true) : [];
|
|
|
|
foreach ($enContent as $key => $value) {
|
|
if (! array_key_exists($key, $targetContent)) {
|
|
$targetContent[$key] = $value;
|
|
}
|
|
}
|
|
File::put($jsonFile, json_encode($targetContent, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
|
|
$enLabels = json_decode($jsonContent, true);
|
|
|
|
return view('settings.languageedit', compact('enLabels', 'language', 'type'));
|
|
}
|
|
|
|
public function updatelanguage(Request $request, $id, $type)
|
|
{
|
|
$language = Language::findOrFail($id);
|
|
|
|
if ($type == 'panel') {
|
|
$jsonFile = base_path('resources/lang/' . $language->panel_file);
|
|
} elseif ($type == 'web') {
|
|
$jsonFile = base_path('resources/lang/' . $language->web_file);
|
|
} elseif ($type == 'app') {
|
|
$jsonFile = base_path('resources/lang/' . $language->app_file);
|
|
} else {
|
|
$jsonFile = base_path('resources/lang/en.json');
|
|
}
|
|
|
|
$directory = dirname($jsonFile);
|
|
if (! File::exists($directory)) {
|
|
File::makeDirectory($directory, 0755, true);
|
|
}
|
|
|
|
if (! File::exists($jsonFile)) {
|
|
$defaultContent = [];
|
|
File::put($jsonFile, json_encode($defaultContent, JSON_PRETTY_PRINT));
|
|
}
|
|
$jsonContent = File::get($jsonFile);
|
|
$enLabels = json_decode($jsonContent, true);
|
|
|
|
$updatedLabels = $request->input('values');
|
|
$keys = array_keys($enLabels);
|
|
foreach ($keys as $index => $key) {
|
|
if (isset($updatedLabels[$index])) {
|
|
$enLabels[$key] = $updatedLabels[$index];
|
|
}
|
|
}
|
|
File::put($jsonFile, json_encode($enLabels, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
|
|
|
|
ResponseService::successResponse('Json File updated successfully');
|
|
}
|
|
|
|
public function downloadJson($id, $type)
|
|
{
|
|
$language = Language::findOrFail($id);
|
|
$languageCode = $language->code ?? 'en';
|
|
|
|
switch ($type) {
|
|
case 'panel':
|
|
$fileName = $language->panel_file ?: "{$languageCode}.json";
|
|
$defaultFile = base_path('resources/lang/en.json');
|
|
break;
|
|
case 'web':
|
|
$fileName = $language->web_file ?: "{$languageCode}_web.json";
|
|
$defaultFile = base_path('resources/lang/en_web.json');
|
|
break;
|
|
case 'app':
|
|
$fileName = $language->app_file ?: "{$languageCode}_app.json";
|
|
$defaultFile = base_path('resources/lang/en_app.json');
|
|
break;
|
|
default:
|
|
abort(404);
|
|
}
|
|
|
|
$jsonFile = base_path("resources/lang/{$fileName}");
|
|
|
|
// If file does not exist, create it from default
|
|
if (! File::exists($jsonFile)) {
|
|
$defaultContent = File::exists($defaultFile)
|
|
? File::get($defaultFile)
|
|
: json_encode([], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
|
|
|
|
File::put($jsonFile, $defaultContent);
|
|
|
|
// Save the file path in DB if not already set
|
|
if ($type == 'panel') {
|
|
$language->panel_file = $fileName;
|
|
} elseif ($type == 'web') {
|
|
$language->web_file = $fileName;
|
|
} elseif ($type == 'app') {
|
|
$language->app_file = $fileName;
|
|
}
|
|
$language->save();
|
|
}
|
|
|
|
if (! File::exists($jsonFile)) {
|
|
abort(404, 'File not found');
|
|
}
|
|
|
|
return response()->download($jsonFile);
|
|
}
|
|
}
|