Add Site Translation Management: Created SiteTranslation resource with pages for listing, creating, and editing translations. Implemented localization support for translation keys and values, enhancing the admin panel's usability for managing site translations. Introduced a new migration for the site_translations table and updated helper functions for translation retrieval.

This commit is contained in:
Ümit Tunç
2025-12-30 23:41:32 +03:00
parent f381caaa39
commit 064ec327ba
13 changed files with 376 additions and 252 deletions
@@ -0,0 +1,12 @@
<?php
namespace App\Filament\Admin\Resources\SiteTranslations\Pages;
use App\Filament\Admin\Resources\SiteTranslations\SiteTranslationResource;
use Filament\Resources\Pages\CreateRecord;
class CreateSiteTranslation extends CreateRecord
{
protected static string $resource = SiteTranslationResource::class;
}
@@ -0,0 +1,20 @@
<?php
namespace App\Filament\Admin\Resources\SiteTranslations\Pages;
use App\Filament\Admin\Resources\SiteTranslations\SiteTranslationResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditSiteTranslation extends EditRecord
{
protected static string $resource = SiteTranslationResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Filament\Admin\Resources\SiteTranslations\Pages;
use App\Filament\Admin\Resources\SiteTranslations\SiteTranslationResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListSiteTranslations extends ListRecords
{
protected static string $resource = SiteTranslationResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
@@ -0,0 +1,44 @@
<?php
namespace App\Filament\Admin\Resources\SiteTranslations\Schemas;
use App\Models\Language;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Components\Grid;
use Filament\Schemas\Components\Group;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;
class SiteTranslationForm
{
public static function make(Schema $schema): Schema
{
$languages = Language::where('is_active', true)->get();
$translationFields = [];
foreach ($languages as $language) {
$translationFields[] = Textarea::make($language->code)
->label($language->name . " ({$language->code})")
->rows(2);
}
return $schema
->components([
Section::make()
->schema([
Textarea::make('key')
->label('Key / Original Text')
->required()
->columnSpanFull()
->helperText('The original text to be translated. Use this exact text in t() helper.'),
Group::make()
->schema($translationFields)
->statePath('translations')
->columnSpanFull(),
])
]);
}
}
@@ -0,0 +1,67 @@
<?php
namespace App\Filament\Admin\Resources\SiteTranslations;
use App\Filament\Admin\Resources\SiteTranslations\Pages;
use App\Filament\Admin\Resources\SiteTranslations\Schemas\SiteTranslationForm;
use App\Filament\Admin\Resources\SiteTranslations\Tables\SiteTranslationsTable;
use App\Models\SiteTranslation;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Table;
use UnitEnum;
use BackedEnum;
class SiteTranslationResource extends Resource
{
protected static ?string $model = SiteTranslation::class;
protected static BackedEnum|string|null $navigationIcon = 'heroicon-o-language';
protected static UnitEnum|string|null $navigationGroup = 'Settings';
protected static ?int $navigationSort = 100;
public static function form(Schema $schema): Schema
{
return SiteTranslationForm::make($schema);
}
public static function table(Table $table): Table
{
return SiteTranslationsTable::make($table);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListSiteTranslations::route('/'),
'create' => Pages\CreateSiteTranslation::route('/create'),
'edit' => Pages\EditSiteTranslation::route('/{record}/edit'),
];
}
public static function getNavigationLabel(): string
{
return __('Site Translations');
}
public static function getModelLabel(): string
{
return __('Translation');
}
public static function getPluralModelLabel(): string
{
return __('Translations');
}
}
@@ -0,0 +1,52 @@
<?php
namespace App\Filament\Admin\Resources\SiteTranslations\Tables;
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
class SiteTranslationsTable
{
public static function make(Table $table): Table
{
$defaultLocale = app()->getLocale();
return $table
->columns([
TextColumn::make('key')
->searchable()
->sortable()
->limit(50)
->wrap(),
TextColumn::make("translations.{$defaultLocale}")
->label("Translation ({$defaultLocale})")
->searchable()
->limit(50)
->wrap()
->placeholder('No translation'),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//
])
->recordActions([
EditAction::make(),
DeleteAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]);
}
}