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 }}
+
{{ $item->type }}
+
{{ ($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(),
];