<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Language;
use Illuminate\Pagination\LengthAwarePaginator;
class LanguageController extends Controller
{
public function langManage($lang = false)
{
$pageTitle = 'Manage Languages';
$languages = Language::orderBy('is_default','desc')->get();
return view('admin.language.lang', compact('pageTitle', 'languages'));
}
public function langStore(Request $request)
{
$request->validate([
'name' => 'required|string|max:40',
'code' => 'required|string|max:40|unique:languages'
]);
function find_lang_strings($directory, &$strings) {
$pattern = "/@lang\\('(.*?)'\\)/"; // define the regular expression pattern
if (is_dir($directory)) {
$files = scandir($directory); // get a list of files in the directory
foreach ($files as $file) {
if ($file !== '.' && $file !== '..') {
$path = $directory . '/' . $file;
if (is_dir($path)) {
find_lang_strings($path, $strings); // recursively search subdirectories
} else {
$content = file_get_contents($path); // read the file contents
preg_match_all($pattern, $content, $matches); // search for the pattern in the content
foreach ($matches[1] as $match) {
$strings[] = $match; // add the matched string to the array
}
}
}
}
}
}
$directory = base_path('resources/views'); // get the path to the views directory
$strings = array(); // initialize an array to store the strings
find_lang_strings($directory, $strings); // call the recursive function to search the directory
$lang = array();
foreach ($strings as $string) {
$lang[$string] = $string; // use the string as both the key and the value
}
$json = json_encode($lang, JSON_PRETTY_PRINT); // convert the array to a JSON string
$json_file = strtolower($request->code) . '.json';
file_put_contents(resource_path('lang/') . $json_file, $json); // write the JSON string to a file
$language = new Language();
if ($request->is_default) {
$lang = $language->where('is_default', 1)->first();
if ($lang) {
$lang->is_default = 0;
$lang->save();
}
}
$language->name = $request->name;
$language->code = strtolower($request->code);
$language->is_default = $request->is_default ? 1 : 0;
$language->save();
$notify[] = ['success', 'Language has been added successfully'];
return back()->withNotify($notify);
}
public function langUpdate(Request $request, $id)
{
$request->validate([
'name' => 'required',
]);
$language = Language::findOrFail($id);
if (!$request->is_default) {
$defaultLang = Language::where('is_default', 1)->where('id','!=',$id)->exists();
if (!$defaultLang) {
$notify[] = ['error','You\'ve to set another language as default before unset this'];
return back()->withNotify($notify);
}
}
$language->name = $request->name;
$language->is_default = $request->is_default ? 1 : 0;
$language->save();
if ($request->is_default) {
$lang = Language::where('is_default', 1)->where('id','!=',$language->id)->first();
if ($lang) {
$lang->is_default = 0;
$lang->save();
}
}
$notify[] = ['success', 'Update successfully'];
return back()->withNotify($notify);
}
public function langDelete($id)
{
$lang = Language::find($id);
fileManager()->removeFile(resource_path('lang/') . $lang->code . '.json');
$lang->delete();
$notify[] = ['success', 'Language has been deleted successfully'];
return back()->withNotify($notify);
}
public function langEdit($id)
{
$lang = Language::find($id);
$pageTitle = "Update " . $lang->name . " Keywords";
$jsonPath = resource_path('lang/') . $lang->code . '.json';
if (!file_exists($jsonPath)) {
$notify[] = ['error', 'File not found'];
return back()->withNotify($notify);
}
$jsonData = file_get_contents($jsonPath);
$data = json_decode($jsonData, true);
$perPage = 20; // Number of items per page
$page = request('page', 1); // Get the current page from the query string
$offset = ($page - 1) * $perPage;
$paginatedData = array_slice($data, $offset, $perPage, true);
$paginatedData = new LengthAwarePaginator($paginatedData, count($data), $perPage, $page);
$paginatedData->setPath(url()->current());
$list_lang = Language::all();
return view('admin.language.edit_lang', compact('pageTitle', 'paginatedData', 'lang', 'list_lang'));
}
public function langImport(Request $request)
{
$tolang = Language::find($request->toLangid);
$fromLang = Language::find($request->id);
$json = file_get_contents(resource_path('lang/') . $fromLang->code . '.json');
$json_arr = json_decode($json, true);
file_put_contents(resource_path('lang/') . $tolang->code . '.json', json_encode($json_arr));
return 'success';
}
public function storeLanguageJson(Request $request, $id)
{
$lang = Language::find($id);
$this->validate($request, [
'key' => 'required',
'value' => 'required'
]);
$items = file_get_contents(resource_path('lang/') . $lang->code . '.json');
$reqKey = trim($request->key);
if (array_key_exists($reqKey, json_decode($items, true))) {
$notify[] = ['error', "Key already exist"];
return back()->withNotify($notify);
} else {
$newArr[$reqKey] = trim($request->value);
$itemData = json_decode($items, true);
$result = array_merge($itemData, $newArr);
file_put_contents(resource_path('lang/') . $lang->code . '.json', json_encode($result));
$notify[] = ['success', "Language key has been added successfully"];
return back()->withNotify($notify);
}
}
public function deleteLanguageJson(Request $request, $id)
{
$this->validate($request, [
'key' => 'required',
'value' => 'required'
]);
$key = $request->key;
$lang = Language::find($id);
$data = file_get_contents(resource_path('lang/') . $lang->code . '.json');
$json_arr = json_decode($data, true);
unset($json_arr[$key]);
file_put_contents(resource_path('lang/'). $lang->code . '.json', json_encode($json_arr));
$notify[] = ['success', "Language key has been deleted successfully"];
return back()->withNotify($notify);
}
public function updateLanguageJson(Request $request, $id)
{
$this->validate($request, [
'key' => 'required',
'value' => 'required'
]);
$key = trim($request->key);
$reqValue = $request->value;
$lang = Language::find($id);
$data = file_get_contents(resource_path('lang/') . $lang->code . '.json');
$json_arr = json_decode($data, true);
$json_arr[$key] = $reqValue;
file_put_contents(resource_path('lang/'). $lang->code . '.json', json_encode($json_arr));
$notify[] = ['success', 'Language key has been updated successfully'];
return back()->withNotify($notify);
}
}