bugfixes
All checks were successful
Build & Push Docker Image / docker (push) Successful in 1m50s

This commit is contained in:
Ahmed Darrazi 2025-12-17 14:37:16 +01:00
parent efc7e1c2a7
commit dee9bbfbe7
4 changed files with 56 additions and 17 deletions

View File

@ -54,6 +54,13 @@ class LanguageController extends Controller
return back()->with('success', "Language deleted successfully"); return back()->with('success', "Language deleted successfully");
} }
public function sync(string $local)
{
$this->languageService->syncLanguageFromFiles($local);
return back()->with('success', "Language synced from files successfully");
}
public function edit_property(string $id) public function edit_property(string $id)
{ {
$property = LanguageProperty::where('id', $id)->with(['language:id,code'])->firstOrFail(); $property = LanguageProperty::where('id', $id)->with(['language:id,code'])->firstOrFail();

View File

@ -29,22 +29,8 @@ class LanguageService extends MediaService
$appLangPath = storage_path('app/lang/default'); $appLangPath = storage_path('app/lang/default');
$groups = []; $language = Language::create($data);
foreach ($this->groupNames as $groupName) { $this->syncLanguagePropertiesFromFiles($language);
$groups[$groupName] = $this->loadLanguageGroup($data['code'], $groupName);
}
$languages = Language::create($data);
foreach ($groups as $key => $group) {
foreach ($group as $value) {
LanguageProperty::create([
...$value,
'group' => $key,
'language_id' => $languages->id,
]);
}
}
$alreadyExists = is_dir($langDir); $alreadyExists = is_dir($langDir);
@ -59,6 +45,18 @@ class LanguageService extends MediaService
Language::find($id)->update($data); Language::find($id)->update($data);
} }
public function syncLanguageFromFiles(string $locale): void
{
$language = Language::where('code', $locale)->first();
if (! $language) {
return;
}
$this->syncLanguagePropertiesFromFiles($language);
$this->forgetLanguageCache($locale);
}
protected function loadLanguageGroup(string $locale, string $groupName): array protected function loadLanguageGroup(string $locale, string $groupName): array
{ {
$defaultGroupPath = storage_path("app/lang/groups/{$groupName}.php"); $defaultGroupPath = storage_path("app/lang/groups/{$groupName}.php");
@ -118,6 +116,27 @@ class LanguageService extends MediaService
return $groups; return $groups;
} }
protected function syncLanguagePropertiesFromFiles(Language $language): void
{
foreach ($this->groupNames as $groupName) {
$groups = $this->loadLanguageGroup($language->code, $groupName);
foreach ($groups as $group) {
LanguageProperty::updateOrCreate(
[
'language_id' => $language->id,
'group' => $groupName,
'slug' => $group['slug'],
],
[
'name' => $group['name'],
'properties' => $group['properties'],
]
);
}
}
}
function defaultLanguage($id) function defaultLanguage($id)
{ {
Language::where('is_default', true)->update(['is_default' => false]); Language::where('is_default', true)->update(['is_default' => false]);

View File

@ -9,6 +9,7 @@ Route::post('change-direction', [LanguageController::class, 'change_direction'])
Route::middleware(['installed', 'appConfig', 'auth', 'role:admin'])->prefix('dashboard/settings')->group(function () { Route::middleware(['installed', 'appConfig', 'auth', 'role:admin'])->prefix('dashboard/settings')->group(function () {
Route::resource('language', LanguageController::class)->except(['create']); Route::resource('language', LanguageController::class)->except(['create']);
Route::post('language/default/{id}', [LanguageController::class, 'default'])->name('language.default'); Route::post('language/default/{id}', [LanguageController::class, 'default'])->name('language.default');
Route::post('language/{local}/sync', [LanguageController::class, 'sync'])->name('language.sync');
Route::get('/language/property/{property}', [LanguageController::class, 'edit_property'])->name('language.property.edit'); Route::get('/language/property/{property}', [LanguageController::class, 'edit_property'])->name('language.property.edit');
Route::put('/language/property/{property}', [LanguageController::class, 'update_property'])->name('language.property.update'); Route::put('/language/property/{property}', [LanguageController::class, 'update_property'])->name('language.property.update');

View File

@ -5,7 +5,7 @@ import { Card } from '@/components/ui/card';
import Dashboard from '@/layouts/dashboard/layout'; import Dashboard from '@/layouts/dashboard/layout';
import { SharedData } from '@/types/global'; import { SharedData } from '@/types/global';
import { Head, Link, router, usePage } from '@inertiajs/react'; import { Head, Link, router, usePage } from '@inertiajs/react';
import { Pencil, Trash2 } from 'lucide-react'; import { Pencil, RefreshCw, Trash2 } from 'lucide-react';
import { ReactNode } from 'react'; import { ReactNode } from 'react';
import AddLanguage from './partials/add-language'; import AddLanguage from './partials/add-language';
@ -30,6 +30,12 @@ const Index = () => {
}); });
}; };
const syncFromFiles = (lang: Language) => {
router.post(route('language.sync', lang.code), {}, {
preserveScroll: true,
});
};
return ( return (
<> <>
<Head title={settings.language_settings} /> <Head title={settings.language_settings} />
@ -63,6 +69,9 @@ const Index = () => {
<Pencil className="h-4 w-4" /> <Pencil className="h-4 w-4" />
</Button> </Button>
</Link> </Link>
<Button size="icon" variant="secondary" className="mr-3 h-7 w-7 rounded-full text-blue-500" onClick={() => syncFromFiles(lang)}>
<RefreshCw className="h-4 w-4" />
</Button>
<Switch disabled checked name={lang.code} /> <Switch disabled checked name={lang.code} />
</div> </div>
</div> </div>
@ -84,6 +93,9 @@ const Index = () => {
<Pencil className="h-4 w-4" /> <Pencil className="h-4 w-4" />
</Button> </Button>
</Link> </Link>
<Button size="icon" variant="secondary" className="h-7 w-7 rounded-full text-blue-500" onClick={() => syncFromFiles(lang)}>
<RefreshCw className="h-4 w-4" />
</Button>
<DeleteModal <DeleteModal
routePath={route('language.destroy', lang.id)} routePath={route('language.destroy', lang.id)}