From e8e643db5fe86ce6652619b13ab0a1ffdbdfe9ea Mon Sep 17 00:00:00 2001 From: Moustafa Khazaal Date: Tue, 25 Feb 2025 11:10:11 +0200 Subject: [PATCH] feat: add Arabic language + Add Support Spatie translatable --- composer.json | 4 +- config/filament-menu-builder.php | 2 + .../migrations/create_menus_table.php.stub | 5 +- resources/lang/ar/menu-builder.php | 87 +++++++++++++++++++ .../views/components/menu-item.blade.php | 2 + src/Livewire/CreateCustomLink.php | 17 ++-- src/Livewire/MenuItems.php | 14 ++- src/Models/Menu.php | 5 +- src/Models/MenuItem.php | 3 + src/Models/MenuLocation.php | 1 + src/Resources/MenuResource.php | 3 + src/Resources/MenuResource/Pages/EditMenu.php | 2 + .../MenuResource/Pages/ListMenus.php | 2 + 13 files changed, 135 insertions(+), 12 deletions(-) create mode 100644 resources/lang/ar/menu-builder.php diff --git a/composer.json b/composer.json index 83d210b..00f2814 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,9 @@ "require": { "php": "^8.1", "filament/filament": "^3.0", - "spatie/laravel-package-tools": "^1.15.0" + "filament/spatie-laravel-translatable-plugin": "^3.2", + "spatie/laravel-package-tools": "^1.15.0", + "solution-forest/filament-translate-field": "^1.3.2" }, "require-dev": { "laravel/pint": "^1.0", diff --git a/config/filament-menu-builder.php b/config/filament-menu-builder.php index c451948..1b267f1 100644 --- a/config/filament-menu-builder.php +++ b/config/filament-menu-builder.php @@ -8,4 +8,6 @@ 'menu_items' => 'menu_items', 'menu_locations' => 'menu_locations', ], + 'translation'=>false, + 'locales'=>['en'], ]; diff --git a/database/migrations/create_menus_table.php.stub b/database/migrations/create_menus_table.php.stub index 6efd681..0a32fda 100644 --- a/database/migrations/create_menus_table.php.stub +++ b/database/migrations/create_menus_table.php.stub @@ -13,7 +13,8 @@ return new class extends Migration { Schema::create(config('filament-menu-builder.tables.menus'), function (Blueprint $table) { $table->id(); - $table->string('name'); + config('filament-menu-builder.translation')? + $table->json('name') : $table->string('name'); $table->boolean('is_visible')->default(true); $table->timestamps(); }); @@ -23,7 +24,7 @@ return new class extends Migration $table->foreignIdFor(Menu::class)->constrained()->cascadeOnDelete(); $table->foreignIdFor(MenuItem::class, 'parent_id')->nullable()->constrained($table->getTable())->nullOnDelete(); $table->nullableMorphs('linkable'); - $table->string('title'); + config('filament-menu-builder.translation')? $table->json('title') : $table->string('title'); $table->string('url')->nullable(); $table->string('target', 10)->default(LinkTarget::Self); $table->integer('order')->default(0); diff --git a/resources/lang/ar/menu-builder.php b/resources/lang/ar/menu-builder.php new file mode 100644 index 0000000..9c95fbe --- /dev/null +++ b/resources/lang/ar/menu-builder.php @@ -0,0 +1,87 @@ + [ + 'title' => 'العنوان', + 'url' => 'الرابط', + 'linkable_type' => 'النوع', + 'linkable_id' => 'المعرف', + ], + 'resource' => [ + 'name' => [ + 'label' => 'الاسم', + ], + 'locations' => [ + 'label' => 'المواقع', + 'empty' => 'غير معين', + ], + 'items' => [ + 'label' => 'العناصر', + ], + 'is_visible' => [ + 'label' => 'الرؤية', + 'visible' => 'مرئي', + 'hidden' => 'مخفي', + ], + ], + 'actions' => [ + 'add' => [ + 'label' => 'إضافة إلى القائمة', + ], + 'locations' => [ + 'label' => 'المواقع', + 'heading' => 'إدارة المواقع', + 'description' => 'اختر القائمة التي تظهر في كل موقع.', + 'submit' => 'تحديث', + 'form' => [ + 'location' => [ + 'label' => 'الموقع', + ], + 'menu' => [ + 'label' => 'القائمة المعينة', + ], + ], + 'empty' => [ + 'heading' => 'لا توجد مواقع مسجلة', + ], + ], + ], + 'items' => [ + 'expand' => 'توسيع', + 'collapse' => 'طي', + 'empty' => [ + 'heading' => 'لا توجد عناصر في هذه القائمة.', + ], + ], + 'custom_link' => 'رابط مخصص', + 'custom_text' => 'نص مخصص', + 'open_in' => [ + 'label' => 'فتح في', + 'options' => [ + 'self' => 'نفس علامة التبويب', + 'blank' => 'علامة تبويب جديدة', + 'parent' => 'علامة التبويب الأصلية', + 'top' => 'علامة التبويب العليا', + ], + ], + 'notifications' => [ + 'created' => [ + 'title' => 'تم إنشاء الرابط', + ], + 'locations' => [ + 'title' => 'تم تحديث مواقع القائمة', + ], + ], + 'panel' => [ + 'empty' => [ + 'heading' => 'لم يتم العثور على عناصر', + 'description' => 'لا توجد عناصر في هذه القائمة.', + ], + 'pagination' => [ + 'previous' => 'السابق', + 'next' => 'التالي', + ], + ], +]; diff --git a/resources/views/components/menu-item.blade.php b/resources/views/components/menu-item.blade.php index 8ee73c1..54afa7c 100644 --- a/resources/views/components/menu-item.blade.php +++ b/resources/views/components/menu-item.blade.php @@ -37,10 +37,12 @@ class="transition duration-200 ease-in-out" {{ $item->url }} +
+ {{ ($this->editAction)(['id' => $item->getKey(), 'title' => $item->title]) }} {{ ($this->deleteAction)(['id' => $item->getKey(), 'title' => $item->title]) }}
diff --git a/src/Livewire/CreateCustomLink.php b/src/Livewire/CreateCustomLink.php index a87e1e3..363014e 100644 --- a/src/Livewire/CreateCustomLink.php +++ b/src/Livewire/CreateCustomLink.php @@ -15,6 +15,7 @@ use Illuminate\Contracts\View\View; use Illuminate\Validation\Rule; use Livewire\Component; +use SolutionForest\FilamentTranslateField\Forms\Component\Translate; class CreateCustomLink extends Component implements HasForms { @@ -22,7 +23,7 @@ class CreateCustomLink extends Component implements HasForms public Menu $menu; - public string $title = ''; + public array|string $title; public string $url = ''; @@ -31,7 +32,7 @@ class CreateCustomLink extends Component implements HasForms public function save(): void { $this->validate([ - 'title' => ['required', 'string'], + 'title' => ['required'], 'url' => ['required', 'string'], 'target' => ['required', 'string', Rule::in(LinkTarget::cases())], ]); @@ -56,11 +57,17 @@ public function save(): void public function form(Form $form): Form { + + return $form ->schema([ - TextInput::make('title') - ->label(__('filament-menu-builder::menu-builder.form.title')) - ->required(), + config('filament-menu-builder.translation')? + Translate::make() + ->locales(config('filament-menu-builder.locales')) + ->schema([ + TextInput::make("title")->required(), + ]) : TextInput::make("title")->required() + , TextInput::make('url') ->label(__('filament-menu-builder::menu-builder.form.url')) ->required(), diff --git a/src/Livewire/MenuItems.php b/src/Livewire/MenuItems.php index 8a3b74b..4633940 100644 --- a/src/Livewire/MenuItems.php +++ b/src/Livewire/MenuItems.php @@ -27,6 +27,7 @@ use Livewire\Attributes\Computed; use Livewire\Attributes\On; use Livewire\Component; +use SolutionForest\FilamentTranslateField\Forms\Component\Translate; class MenuItems extends Component implements HasActions, HasForms { @@ -86,9 +87,15 @@ public function editAction(): Action ->first() ->toArray()) ->form([ - TextInput::make('title') - ->label(__('filament-menu-builder::menu-builder.form.title')) - ->required(), + config('filament-menu-builder.translation')? + Translate::make() + ->locales(config('filament-menu-builder.locales')) + ->schema([ + TextInput::make("title") + ->label(__('filament-menu-builder::menu-builder.form.title'))->required(), + ]) : TextInput::make("title") + ->label(__('filament-menu-builder::menu-builder.form.title'))->required() + , TextInput::make('url') ->hidden(fn (?string $state, Get $get): bool => blank($state) || filled($get('linkable_type'))) ->label(__('filament-menu-builder::menu-builder.form.url')) @@ -118,6 +125,7 @@ public function editAction(): Action ->slideOver(); } + public function deleteAction(): Action { return Action::make('delete') diff --git a/src/Models/Menu.php b/src/Models/Menu.php index 7c9782c..32dac24 100644 --- a/src/Models/Menu.php +++ b/src/Models/Menu.php @@ -7,10 +7,11 @@ use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; +use Spatie\Translatable\HasTranslations; /** * @property int $id - * @property string $name + * @property string|json $name * @property bool $is_visible * @property \Illuminate\Support\Carbon $created_at * @property \Illuminate\Support\Carbon $updated_at @@ -21,6 +22,8 @@ */ class Menu extends Model { + use HasTranslations; + public $translatable = ['name']; protected $guarded = []; public function getTable(): string diff --git a/src/Models/MenuItem.php b/src/Models/MenuItem.php index 8475ffc..cc30443 100644 --- a/src/Models/MenuItem.php +++ b/src/Models/MenuItem.php @@ -12,6 +12,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\MorphTo; +use Spatie\Translatable\HasTranslations; /** * @property int $id @@ -32,6 +33,8 @@ */ class MenuItem extends Model { + use HasTranslations; + public $translatable = ['title']; protected $guarded = []; protected $with = ['linkable']; diff --git a/src/Models/MenuLocation.php b/src/Models/MenuLocation.php index 9ea030c..a139a3b 100644 --- a/src/Models/MenuLocation.php +++ b/src/Models/MenuLocation.php @@ -18,6 +18,7 @@ */ class MenuLocation extends Model { + protected $guarded = []; public function getTable(): string diff --git a/src/Resources/MenuResource.php b/src/Resources/MenuResource.php index f4b036a..aff55f5 100644 --- a/src/Resources/MenuResource.php +++ b/src/Resources/MenuResource.php @@ -12,9 +12,12 @@ use Filament\Tables; use Filament\Tables\Table; use Illuminate\Support\Str; +use Filament\Resources\Concerns\Translatable; class MenuResource extends Resource { + + use Translatable; public static function getModel(): string { return FilamentMenuBuilderPlugin::get()->getMenuModel(); diff --git a/src/Resources/MenuResource/Pages/EditMenu.php b/src/Resources/MenuResource/Pages/EditMenu.php index 126fe40..f877359 100644 --- a/src/Resources/MenuResource/Pages/EditMenu.php +++ b/src/Resources/MenuResource/Pages/EditMenu.php @@ -14,6 +14,7 @@ class EditMenu extends EditRecord { use HasLocationAction; + use EditRecord\Concerns\Translatable; protected static string $view = 'filament-menu-builder::edit-record'; @@ -33,6 +34,7 @@ public function form(Form $form): Form protected function getHeaderActions(): array { return [ + Actions\LocaleSwitcher::make(), Actions\DeleteAction::make(), $this->getLocationAction(), ]; diff --git a/src/Resources/MenuResource/Pages/ListMenus.php b/src/Resources/MenuResource/Pages/ListMenus.php index 5141eab..26caeb3 100644 --- a/src/Resources/MenuResource/Pages/ListMenus.php +++ b/src/Resources/MenuResource/Pages/ListMenus.php @@ -12,6 +12,7 @@ class ListMenus extends ListRecords { use HasLocationAction; + use ListRecords\Concerns\Translatable; public static function getResource(): string { @@ -21,6 +22,7 @@ public static function getResource(): string protected function getHeaderActions(): array { return [ + Actions\LocaleSwitcher::make(), Actions\CreateAction::make(), $this->getLocationAction(), ];