Your IP : 216.73.216.79


Current Path : /var/www/html/reddsis/app/Http/Controllers/Backend/
Upload File :
Current File : /var/www/html/reddsis/app/Http/Controllers/Backend/AppTranslationController.php

<?php

namespace App\Http\Controllers\Backend;

use App\Http\Controllers\Controller;
use App\Http\Requests\Backend\AppTranslationRequest;
use App\Models\Backend\AppTranslation;
use App\Models\Backend\Ref;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class AppTranslationController extends Controller
{
    public function index(Request $request)
    {
        $search = $request->get('search');
        $filterLang = $request->get('lang');
        $languages = Ref::where('cat', 'LANGUAGE')->orderBy('sort')->pluck('descr', 'code');

        if ($filterLang && isset($languages[$filterLang])) {
            $items = AppTranslation::where('lang', $filterLang)
                ->when($search, function ($q) use ($search) {
                    $q->where(function ($sub) use ($search) {
                        $sub->where('key', 'like', "%{$search}%")
                            ->orWhere('value', 'like', "%{$search}%");
                    });
                })
                ->orderBy('key')
                ->paginate(10)
                ->onEachSide(1)
                ->withQueryString();

            return view('backend.module.appTranslation.index', [
                'items' => $items,
                'languages' => $languages,
                'search' => $search,
                'filterLang' => $filterLang,
            ]);
        }

        $query = AppTranslation::when($search, function ($q) use ($search) {
            $q->where('key', 'like', "%{$search}%")
                ->orWhere('value', 'like', "%{$search}%");
        });

        $allKeys = $query->clone()
            ->select('key')
            ->distinct()
            ->orderBy('key')
            ->get();

        $langPerPage = 5;
        $langPage = \Illuminate\Pagination\LengthAwarePaginator::resolveCurrentPage('lang_page');

        $langCodes = $languages->keys();
        $totalLangs = $langCodes->count();

        $langChunk = $langCodes->slice(($langPage - 1) * $langPerPage, $langPerPage);

        $translations = AppTranslation::when($search, function ($q) use ($search) {
            $q->where('key', 'like', "%{$search}%")
                ->orWhere('value', 'like', "%{$search}%");
        })
            ->whereIn('lang', $langChunk)
            ->get()
            ->groupBy('lang');

        $grouped = collect();
        foreach ($langChunk as $code) {
            $descr = $languages[$code] ?? $code;
            if ($translations->has($code)) {
                $grouped[$code] = $translations[$code];
            }
        }

        $langPaginator = new \Illuminate\Pagination\LengthAwarePaginator(
            $grouped,
            $totalLangs,
            $langPerPage,
            $langPage,
            ['path' => \Illuminate\Pagination\LengthAwarePaginator::resolveCurrentPath(), 'pageName' => 'lang_page']
        );
        $langPaginator->appends(request()->query());

        return view('backend.module.appTranslation.index', [
            'grouped' => $grouped,
            'langPaginator' => $langPaginator,
            'allKeys' => $allKeys,
            'languages' => $languages,
            'search' => $search,
            'filterLang' => null,
        ]);
    }

    public function create()
    {
        $languages = Ref::where('cat', 'LANGUAGE')->orderBy('sort')->pluck('descr', 'code');
        return view('backend.module.appTranslation.create', [
            'languages' => $languages,
        ]);
    }

    public function store(AppTranslationRequest $request)
    {
        AppTranslation::updateOrCreate(
            ['key' => $request->key, 'lang' => $request->lang],
            [
                'value' => $request->value,
                'created_by' => auth()->id(),
                'updated_by' => auth()->id(),
            ]
        );

        flash()->success('Translation saved successfully!');
        return redirect()->route('app-translation.index');
    }

    public function edit($key)
    {
        $items = AppTranslation::where('key', $key)->get();
        if ($items->isEmpty()) {
            abort(404);
        }

        $languages = Ref::where('cat', 'LANGUAGE')->orderBy('sort')->pluck('descr', 'code');

        return view('backend.module.appTranslation.edit', [
            'key' => $key,
            'items' => $items->keyBy('lang'),
            'languages' => $languages,
        ]);
    }

    public function update(Request $request, $key)
    {
        $request->validate([
            'values' => 'nullable|array',
            'values.*' => 'nullable|string',
        ]);

        $languages = Ref::where('cat', 'LANGUAGE')->pluck('code');

        foreach ($languages as $lang) {
            $value = $request->input("values.{$lang}");
            AppTranslation::updateOrCreate(
                ['key' => $key, 'lang' => $lang],
                [
                    'value' => $value,
                    'updated_by' => auth()->id(),
                ]
            );
        }

        flash()->success('Translation updated successfully!');
        return redirect()->route('app-translation.index');
    }

    public function destroy($key)
    {
        AppTranslation::where('key', $key)->delete();

        flash()->success('Translation deleted successfully.');
        return redirect()->route('app-translation.index');
    }
}