From 481c535f8eced8e744a7645e57ff1512a6522eaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=9Cmit=20Tun=C3=A7?= Date: Mon, 29 Sep 2025 10:41:23 -0300 Subject: [PATCH] Add user management features to Citrus Platform: Integrated Filament Shield and Filament Users for role and permission management. Updated User model to include role functionality, added policies for Blog, Customer, Page, and Role management, and created necessary localization files for user management in multiple languages. Enhanced composer dependencies for improved functionality. --- app/Models/User.php | 3 +- app/Policies/BlogPolicy.php | 70 +++ app/Policies/CustomerPolicy.php | 70 +++ app/Policies/PagePolicy.php | 70 +++ app/Policies/RolePolicy.php | 70 +++ app/Providers/Filament/AdminPanelProvider.php | 6 + composer.json | 5 +- composer.lock | 463 +++++++++++++++++- config/filament-shield.php | 261 ++++++++++ config/filament-users.php | 162 ++++++ config/permission.php | 202 ++++++++ ..._09_29_132612_create_permission_tables.php | 136 +++++ lang/en/users.php | 79 +++ lang/tr/users.php | 79 +++ lang/vendor/filament-users/ar/user.php | 66 +++ lang/vendor/filament-users/de/user.php | 66 +++ lang/vendor/filament-users/en/user.php | 66 +++ lang/vendor/filament-users/es/user.php | 66 +++ lang/vendor/filament-users/id/user.php | 66 +++ lang/vendor/filament-users/it/user.php | 66 +++ lang/vendor/filament-users/ja/user.php | 66 +++ lang/vendor/filament-users/mk/user.php | 66 +++ lang/vendor/filament-users/nl/user.php | 66 +++ lang/vendor/filament-users/pt_BR/user.php | 66 +++ lang/vendor/filament-users/pt_PT/user.php | 66 +++ lang/vendor/filament-users/ru/user.php | 66 +++ 26 files changed, 2465 insertions(+), 3 deletions(-) create mode 100644 app/Policies/BlogPolicy.php create mode 100644 app/Policies/CustomerPolicy.php create mode 100644 app/Policies/PagePolicy.php create mode 100644 app/Policies/RolePolicy.php create mode 100644 config/filament-shield.php create mode 100644 config/filament-users.php create mode 100644 config/permission.php create mode 100644 database/migrations/2025_09_29_132612_create_permission_tables.php create mode 100644 lang/en/users.php create mode 100644 lang/tr/users.php create mode 100644 lang/vendor/filament-users/ar/user.php create mode 100644 lang/vendor/filament-users/de/user.php create mode 100644 lang/vendor/filament-users/en/user.php create mode 100644 lang/vendor/filament-users/es/user.php create mode 100644 lang/vendor/filament-users/id/user.php create mode 100644 lang/vendor/filament-users/it/user.php create mode 100644 lang/vendor/filament-users/ja/user.php create mode 100644 lang/vendor/filament-users/mk/user.php create mode 100644 lang/vendor/filament-users/nl/user.php create mode 100644 lang/vendor/filament-users/pt_BR/user.php create mode 100644 lang/vendor/filament-users/pt_PT/user.php create mode 100644 lang/vendor/filament-users/ru/user.php diff --git a/app/Models/User.php b/app/Models/User.php index 749c7b7..ac2ca92 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -6,11 +6,12 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; +use Spatie\Permission\Traits\HasRoles; class User extends Authenticatable { /** @use HasFactory<\Database\Factories\UserFactory> */ - use HasFactory, Notifiable; + use HasFactory, Notifiable, HasRoles; /** * The attributes that are mass assignable. diff --git a/app/Policies/BlogPolicy.php b/app/Policies/BlogPolicy.php new file mode 100644 index 0000000..d6d6562 --- /dev/null +++ b/app/Policies/BlogPolicy.php @@ -0,0 +1,70 @@ +can('ViewAny:Blog'); + } + + public function view(AuthUser $authUser, Blog $blog): bool + { + return $authUser->can('View:Blog'); + } + + public function create(AuthUser $authUser): bool + { + return $authUser->can('Create:Blog'); + } + + public function update(AuthUser $authUser, Blog $blog): bool + { + return $authUser->can('Update:Blog'); + } + + public function delete(AuthUser $authUser, Blog $blog): bool + { + return $authUser->can('Delete:Blog'); + } + + public function restore(AuthUser $authUser, Blog $blog): bool + { + return $authUser->can('Restore:Blog'); + } + + public function forceDelete(AuthUser $authUser, Blog $blog): bool + { + return $authUser->can('ForceDelete:Blog'); + } + + public function forceDeleteAny(AuthUser $authUser): bool + { + return $authUser->can('ForceDeleteAny:Blog'); + } + + public function restoreAny(AuthUser $authUser): bool + { + return $authUser->can('RestoreAny:Blog'); + } + + public function replicate(AuthUser $authUser, Blog $blog): bool + { + return $authUser->can('Replicate:Blog'); + } + + public function reorder(AuthUser $authUser): bool + { + return $authUser->can('Reorder:Blog'); + } + +} \ No newline at end of file diff --git a/app/Policies/CustomerPolicy.php b/app/Policies/CustomerPolicy.php new file mode 100644 index 0000000..6c9368d --- /dev/null +++ b/app/Policies/CustomerPolicy.php @@ -0,0 +1,70 @@ +can('ViewAny:Customer'); + } + + public function view(AuthUser $authUser, Customer $customer): bool + { + return $authUser->can('View:Customer'); + } + + public function create(AuthUser $authUser): bool + { + return $authUser->can('Create:Customer'); + } + + public function update(AuthUser $authUser, Customer $customer): bool + { + return $authUser->can('Update:Customer'); + } + + public function delete(AuthUser $authUser, Customer $customer): bool + { + return $authUser->can('Delete:Customer'); + } + + public function restore(AuthUser $authUser, Customer $customer): bool + { + return $authUser->can('Restore:Customer'); + } + + public function forceDelete(AuthUser $authUser, Customer $customer): bool + { + return $authUser->can('ForceDelete:Customer'); + } + + public function forceDeleteAny(AuthUser $authUser): bool + { + return $authUser->can('ForceDeleteAny:Customer'); + } + + public function restoreAny(AuthUser $authUser): bool + { + return $authUser->can('RestoreAny:Customer'); + } + + public function replicate(AuthUser $authUser, Customer $customer): bool + { + return $authUser->can('Replicate:Customer'); + } + + public function reorder(AuthUser $authUser): bool + { + return $authUser->can('Reorder:Customer'); + } + +} \ No newline at end of file diff --git a/app/Policies/PagePolicy.php b/app/Policies/PagePolicy.php new file mode 100644 index 0000000..1c5d14d --- /dev/null +++ b/app/Policies/PagePolicy.php @@ -0,0 +1,70 @@ +can('ViewAny:Page'); + } + + public function view(AuthUser $authUser, Page $page): bool + { + return $authUser->can('View:Page'); + } + + public function create(AuthUser $authUser): bool + { + return $authUser->can('Create:Page'); + } + + public function update(AuthUser $authUser, Page $page): bool + { + return $authUser->can('Update:Page'); + } + + public function delete(AuthUser $authUser, Page $page): bool + { + return $authUser->can('Delete:Page'); + } + + public function restore(AuthUser $authUser, Page $page): bool + { + return $authUser->can('Restore:Page'); + } + + public function forceDelete(AuthUser $authUser, Page $page): bool + { + return $authUser->can('ForceDelete:Page'); + } + + public function forceDeleteAny(AuthUser $authUser): bool + { + return $authUser->can('ForceDeleteAny:Page'); + } + + public function restoreAny(AuthUser $authUser): bool + { + return $authUser->can('RestoreAny:Page'); + } + + public function replicate(AuthUser $authUser, Page $page): bool + { + return $authUser->can('Replicate:Page'); + } + + public function reorder(AuthUser $authUser): bool + { + return $authUser->can('Reorder:Page'); + } + +} \ No newline at end of file diff --git a/app/Policies/RolePolicy.php b/app/Policies/RolePolicy.php new file mode 100644 index 0000000..a2a3263 --- /dev/null +++ b/app/Policies/RolePolicy.php @@ -0,0 +1,70 @@ +can('ViewAny:Role'); + } + + public function view(AuthUser $authUser, Role $role): bool + { + return $authUser->can('View:Role'); + } + + public function create(AuthUser $authUser): bool + { + return $authUser->can('Create:Role'); + } + + public function update(AuthUser $authUser, Role $role): bool + { + return $authUser->can('Update:Role'); + } + + public function delete(AuthUser $authUser, Role $role): bool + { + return $authUser->can('Delete:Role'); + } + + public function restore(AuthUser $authUser, Role $role): bool + { + return $authUser->can('Restore:Role'); + } + + public function forceDelete(AuthUser $authUser, Role $role): bool + { + return $authUser->can('ForceDelete:Role'); + } + + public function forceDeleteAny(AuthUser $authUser): bool + { + return $authUser->can('ForceDeleteAny:Role'); + } + + public function restoreAny(AuthUser $authUser): bool + { + return $authUser->can('RestoreAny:Role'); + } + + public function replicate(AuthUser $authUser, Role $role): bool + { + return $authUser->can('Replicate:Role'); + } + + public function reorder(AuthUser $authUser): bool + { + return $authUser->can('Reorder:Role'); + } + +} \ No newline at end of file diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php index 1206467..771c047 100644 --- a/app/Providers/Filament/AdminPanelProvider.php +++ b/app/Providers/Filament/AdminPanelProvider.php @@ -12,6 +12,8 @@ use Filament\PanelProvider; use Filament\Support\Colors\Color; use Filament\Widgets\AccountWidget; use Filament\Widgets\FilamentInfoWidget; +use BezhanSalleh\FilamentShield\FilamentShieldPlugin; +use TomatoPHP\FilamentUsers\FilamentUsersPlugin; use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse; use Illuminate\Cookie\Middleware\EncryptCookies; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken; @@ -38,6 +40,10 @@ class AdminPanelProvider extends PanelProvider Dashboard::class, ]) ->discoverWidgets(in: app_path('Filament/Admin/Widgets'), for: 'App\Filament\Admin\Widgets') + ->plugins([ + FilamentShieldPlugin::make(), + FilamentUsersPlugin::make(), + ]) ->widgets([ AccountWidget::class, FilamentInfoWidget::class, diff --git a/composer.json b/composer.json index 7acf950..d6aa7cd 100644 --- a/composer.json +++ b/composer.json @@ -7,9 +7,12 @@ "license": "MIT", "require": { "php": "^8.2", + "bezhansalleh/filament-shield": "*", "filament/filament": "~4.0", "laravel/framework": "^12.0", - "laravel/tinker": "^2.10.1" + "laravel/tinker": "^2.10.1", + "spatie/laravel-permission": "^6.21", + "tomatophp/filament-users": "^4.0" }, "require-dev": { "fakerphp/faker": "^1.23", diff --git a/composer.lock b/composer.lock index 44f40e3..d7709cf 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f7b774c648bf40d96f6deebb6eb2e60d", + "content-hash": "ae5eda2a09c03c50635001cd6005dbec", "packages": [ { "name": "anourvalar/eloquent-serialize", @@ -72,6 +72,178 @@ }, "time": "2025-07-30T15:45:57+00:00" }, + { + "name": "bezhansalleh/filament-plugin-essentials", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/bezhanSalleh/filament-plugin-essentials.git", + "reference": "fb4656c661270133b1b1c4297616745e4d586ca7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bezhanSalleh/filament-plugin-essentials/zipball/fb4656c661270133b1b1c4297616745e4d586ca7", + "reference": "fb4656c661270133b1b1c4297616745e4d586ca7", + "shasum": "" + }, + "require": { + "filament/filament": "^4.0", + "illuminate/contracts": "^11.28|^12.0", + "php": "^8.2", + "spatie/laravel-package-tools": "^1.9" + }, + "require-dev": { + "larastan/larastan": "^2.9||^3.0", + "laravel/pint": "^1.14", + "nunomaduro/collision": "^8.1.1||^7.10.0", + "orchestra/testbench": "^10.0.0||^9.0.0", + "pestphp/pest": "^3.0", + "pestphp/pest-plugin-arch": "^3.0", + "pestphp/pest-plugin-laravel": "^3.0", + "pestphp/pest-plugin-type-coverage": "^3.5", + "phpstan/extension-installer": "^1.3||^2.0", + "phpstan/phpstan-deprecation-rules": "^1.1||^2.0", + "phpstan/phpstan-phpunit": "^1.3||^2.0", + "rector/rector": "^2.1", + "spatie/laravel-ray": "^1.40" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BezhanSalleh\\PluginEssentials\\PluginEssentialsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "BezhanSalleh\\PluginEssentials\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bezhan Salleh", + "email": "bezhan_salleh@yahoo.com", + "role": "Developer" + } + ], + "description": "A collection of essential traits that streamline Filament plugin development by taking care of the boilerplate, so you can focus on shipping real features faster", + "homepage": "https://github.com/bezhansalleh/filament-plugin-essentials", + "keywords": [ + "Bezhan Salleh", + "filament-plugin-essentials", + "laravel" + ], + "support": { + "issues": "https://github.com/bezhanSalleh/filament-plugin-essentials/issues", + "source": "https://github.com/bezhanSalleh/filament-plugin-essentials/tree/1.0.0" + }, + "funding": [ + { + "url": "https://github.com/bezhanSalleh", + "type": "github" + } + ], + "time": "2025-08-31T06:50:44+00:00" + }, + { + "name": "bezhansalleh/filament-shield", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/bezhanSalleh/filament-shield.git", + "reference": "1c7b21dbac1e80bb05a409c9b13926c13ff210ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bezhanSalleh/filament-shield/zipball/1c7b21dbac1e80bb05a409c9b13926c13ff210ab", + "reference": "1c7b21dbac1e80bb05a409c9b13926c13ff210ab", + "shasum": "" + }, + "require": { + "bezhansalleh/filament-plugin-essentials": "^1.0", + "filament/filament": "^4.0", + "illuminate/contracts": "^11.28|^12.0", + "illuminate/support": "*", + "php": "^8.2", + "spatie/laravel-package-tools": "^1.9", + "spatie/laravel-permission": "^6.0" + }, + "require-dev": { + "larastan/larastan": "^2.2|^3.0", + "laravel/pint": "^1.0", + "nunomaduro/collision": "^7.0|^8.0", + "orchestra/testbench": "^8.0|^9.0|^10.0", + "pestphp/pest": "^2.0|^3.0", + "pestphp/pest-plugin-laravel": "^2.0|^3.0", + "pestphp/pest-plugin-livewire": "^3.0", + "pestphp/pest-plugin-type-coverage": "^3.5", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.1|^11.0", + "rector/rector": "^2.1", + "spatie/laravel-ray": "^1.40" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "FilamentShield": "BezhanSalleh\\FilamentShield\\Facades\\FilamentShield" + }, + "providers": [ + "BezhanSalleh\\FilamentShield\\FilamentShieldServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "BezhanSalleh\\FilamentShield\\": "src", + "BezhanSalleh\\FilamentShield\\Database\\Factories\\": "database/factories" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bezhan Salleh", + "email": "bezhan_salleh@yahoo.com", + "role": "Developer" + } + ], + "description": "Filament support for `spatie/laravel-permission`.", + "homepage": "https://github.com/bezhansalleh/filament-shield", + "keywords": [ + "acl", + "bezhanSalleh", + "filament", + "filament-shield", + "laravel", + "permission", + "permissions", + "rbac", + "roles", + "security" + ], + "support": { + "issues": "https://github.com/bezhanSalleh/filament-shield/issues", + "source": "https://github.com/bezhanSalleh/filament-shield/tree/4.0.2" + }, + "funding": [ + { + "url": "https://github.com/bezhanSalleh", + "type": "github" + } + ], + "time": "2025-09-11T02:13:12+00:00" + }, { "name": "blade-ui-kit/blade-heroicons", "version": "2.6.0", @@ -2036,6 +2208,73 @@ }, "time": "2025-08-14T18:43:05+00:00" }, + { + "name": "lab404/laravel-impersonate", + "version": "1.7.7", + "source": { + "type": "git", + "url": "https://github.com/404labfr/laravel-impersonate.git", + "reference": "5033f3433a55ca8bb2cc3e4a018a39dd8a327a9f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/404labfr/laravel-impersonate/zipball/5033f3433a55ca8bb2cc3e4a018a39dd8a327a9f", + "reference": "5033f3433a55ca8bb2cc3e4a018a39dd8a327a9f", + "shasum": "" + }, + "require": { + "laravel/framework": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0 | ^12.0", + "php": "^7.2 | ^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.3.3", + "orchestra/testbench": "^4.0 | ^5.0 | ^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0", + "phpunit/phpunit": "^7.5 | ^8.0 | ^9.0 | ^10.0 | ^11.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Lab404\\Impersonate\\ImpersonateServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Lab404\\Impersonate\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marceau Casals", + "email": "marceau@casals.fr" + } + ], + "description": "Laravel Impersonate is a plugin that allows to you to authenticate as your users.", + "keywords": [ + "auth", + "impersonate", + "impersonation", + "laravel", + "laravel-package", + "laravel-plugin", + "package", + "plugin", + "user" + ], + "support": { + "issues": "https://github.com/404labfr/laravel-impersonate/issues", + "source": "https://github.com/404labfr/laravel-impersonate/tree/1.7.7" + }, + "time": "2025-02-24T16:18:38+00:00" + }, { "name": "laravel/framework", "version": "v12.31.1", @@ -5276,6 +5515,89 @@ ], "time": "2025-07-17T15:46:43+00:00" }, + { + "name": "spatie/laravel-permission", + "version": "6.21.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-permission.git", + "reference": "6a118e8855dfffcd90403aab77bbf35a03db51b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/6a118e8855dfffcd90403aab77bbf35a03db51b3", + "reference": "6a118e8855dfffcd90403aab77bbf35a03db51b3", + "shasum": "" + }, + "require": { + "illuminate/auth": "^8.12|^9.0|^10.0|^11.0|^12.0", + "illuminate/container": "^8.12|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^8.12|^9.0|^10.0|^11.0|^12.0", + "illuminate/database": "^8.12|^9.0|^10.0|^11.0|^12.0", + "php": "^8.0" + }, + "require-dev": { + "laravel/passport": "^11.0|^12.0", + "laravel/pint": "^1.0", + "orchestra/testbench": "^6.23|^7.0|^8.0|^9.0|^10.0", + "phpunit/phpunit": "^9.4|^10.1|^11.5" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\Permission\\PermissionServiceProvider" + ] + }, + "branch-alias": { + "dev-main": "6.x-dev", + "dev-master": "6.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\Permission\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Permission handling for Laravel 8.0 and up", + "homepage": "https://github.com/spatie/laravel-permission", + "keywords": [ + "acl", + "laravel", + "permission", + "permissions", + "rbac", + "roles", + "security", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-permission/issues", + "source": "https://github.com/spatie/laravel-permission/tree/6.21.0" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2025-07-23T16:08:05+00:00" + }, { "name": "spatie/shiki-php", "version": "2.3.2", @@ -7946,6 +8268,145 @@ }, "time": "2024-12-21T16:25:41+00:00" }, + { + "name": "tomatophp/console-helpers", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/tomatophp/console-helpers.git", + "reference": "69dd818a2bfa7d038467fb526be6c9b573d36a34" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tomatophp/console-helpers/zipball/69dd818a2bfa7d038467fb526be6c9b573d36a34", + "reference": "69dd818a2bfa7d038467fb526be6c9b573d36a34", + "shasum": "" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "TomatoPHP\\ConsoleHelpers\\ConsoleHelpersServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "TomatoPHP\\ConsoleHelpers\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fady Mondy", + "email": "EngFadyMondy@gmail.com" + } + ], + "description": "tons of helper you need for you artisan command line application", + "keywords": [ + "application", + "artisan", + "command", + "console", + "helpers", + "line" + ], + "support": { + "issues": "https://github.com/tomatophp/console-helpers/issues", + "source": "https://github.com/tomatophp/console-helpers/tree/v1.1.0" + }, + "funding": [ + { + "url": "https://github.com/3x1io", + "type": "github" + } + ], + "time": "2023-02-12T12:00:38+00:00" + }, + { + "name": "tomatophp/filament-users", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/tomatophp/filament-users.git", + "reference": "263fe9ca101f84c32feec144d06dec49c6e5c833" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tomatophp/filament-users/zipball/263fe9ca101f84c32feec144d06dec49c6e5c833", + "reference": "263fe9ca101f84c32feec144d06dec49c6e5c833", + "shasum": "" + }, + "require": { + "filament/filament": "^4.0", + "lab404/laravel-impersonate": "^1.7", + "php": "^8.2|^8.3|^8.4", + "tomatophp/console-helpers": "^1.1" + }, + "require-dev": { + "larastan/larastan": "^2.9||^3.0", + "laravel/pint": "^1.14", + "nunomaduro/collision": "^8.1.1||^7.10.0", + "orchestra/testbench": "^10.0.0||^9.0.0", + "pestphp/pest": "^3.0", + "pestphp/pest-plugin-arch": "^3.0", + "pestphp/pest-plugin-laravel": "^3.0", + "pestphp/pest-plugin-livewire": "^3.0", + "pestphp/pest-plugin-type-coverage": "^3.5", + "phpstan/extension-installer": "^1.3||^2.0", + "phpstan/phpstan-deprecation-rules": "^1.1||^2.0", + "phpstan/phpstan-phpunit": "^1.3||^2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "TomatoPHP\\FilamentUsers\\FilamentUsersServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "TomatoPHP\\FilamentUsers\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fady Mondy", + "email": "info@3x1.io" + } + ], + "description": "Manage your users with a highly customizable user resource for FilamentPHP with integration of filament-shield and filament-impersonate", + "keywords": [ + "User management", + "Users", + "filament-impersonate", + "filament-shield", + "filamentphp", + "laravel", + "php", + "user CRUD", + "user resource" + ], + "support": { + "issues": "https://github.com/tomatophp/filament-users/issues", + "source": "https://github.com/tomatophp/filament-users/tree/v4.0.2" + }, + "funding": [ + { + "url": "https://github.com/fadymondy", + "type": "github" + } + ], + "time": "2025-08-25T23:33:45+00:00" + }, { "name": "ueberdosis/tiptap-php", "version": "2.0.0", diff --git a/config/filament-shield.php b/config/filament-shield.php new file mode 100644 index 0000000..4fafd7e --- /dev/null +++ b/config/filament-shield.php @@ -0,0 +1,261 @@ + [ + 'slug' => 'shield/roles', + 'show_model_path' => true, + 'cluster' => null, + 'tabs' => [ + 'pages' => true, + 'widgets' => true, + 'resources' => true, + 'custom_permissions' => false, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Multi-Tenancy + |-------------------------------------------------------------------------- + | + | When your application supports teams, Shield will automatically detect + | and configure the tenant model during setup. This enables tenant-scoped + | roles and permissions throughout your application. + | + */ + + 'tenant_model' => null, + + /* + |-------------------------------------------------------------------------- + | User Model + |-------------------------------------------------------------------------- + | + | This value contains the class name of your user model. This model will + | be used for role assignments and must implement the HasRoles trait + | provided by the Spatie\Permission package. + | + */ + + 'auth_provider_model' => 'App\\Models\\User', + + /* + |-------------------------------------------------------------------------- + | Super Admin + |-------------------------------------------------------------------------- + | + | Here you may define a super admin that has unrestricted access to your + | application. You can choose to implement this via Laravel's gate system + | or as a traditional role with all permissions explicitly assigned. + | + */ + + 'super_admin' => [ + 'enabled' => true, + 'name' => 'super_admin', + 'define_via_gate' => false, + 'intercept_gate' => 'before', + ], + + /* + |-------------------------------------------------------------------------- + | Panel User + |-------------------------------------------------------------------------- + | + | When enabled, Shield will create a basic panel user role that can be + | assigned to users who should have access to your Filament panels but + | don't need any specific permissions beyond basic authentication. + | + */ + + 'panel_user' => [ + 'enabled' => true, + 'name' => 'panel_user', + ], + + /* + |-------------------------------------------------------------------------- + | Permission Builder + |-------------------------------------------------------------------------- + | + | You can customize how permission keys are generated to match your + | preferred naming convention and organizational standards. Shield uses + | these settings when creating permission names from your resources. + | + | Supported formats: snake, kebab, pascal, camel, upper_snake, lower_snake + | + */ + + 'permissions' => [ + 'separator' => ':', + 'case' => 'pascal', + 'generate' => true, + ], + + /* + |-------------------------------------------------------------------------- + | Policies + |-------------------------------------------------------------------------- + | + | Shield can automatically generate Laravel policies for your resources. + | When merge is enabled, the methods below will be combined with any + | resource-specific methods you define in the resources section. + | + */ + + 'policies' => [ + 'path' => app_path('Policies'), + 'merge' => true, + 'generate' => true, + 'methods' => [ + 'viewAny', 'view', 'create', 'update', 'delete', 'restore', + 'forceDelete', 'forceDeleteAny', 'restoreAny', 'replicate', 'reorder', + ], + 'single_parameter_methods' => [ + 'viewAny', + 'create', + 'deleteAny', + 'forceDeleteAny', + 'restoreAny', + 'reorder', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Localization + |-------------------------------------------------------------------------- + | + | Shield supports multiple languages out of the box. When enabled, you + | can provide translated labels for permissions to create a more + | localized experience for your international users. + | + */ + + 'localization' => [ + 'enabled' => false, + 'key' => 'filament-shield::filament-shield', + ], + + /* + |-------------------------------------------------------------------------- + | Resources + |-------------------------------------------------------------------------- + | + | Here you can fine-tune permissions for specific Filament resources. + | Use the 'manage' array to override the default policy methods for + | individual resources, giving you granular control over permissions. + | + */ + + 'resources' => [ + 'subject' => 'model', + 'manage' => [ + \BezhanSalleh\FilamentShield\Resources\Roles\RoleResource::class => [ + 'viewAny', + 'view', + 'create', + 'update', + 'delete', + ], + ], + 'exclude' => [ + // + ], + ], + + /* + |-------------------------------------------------------------------------- + | Pages + |-------------------------------------------------------------------------- + | + | Most Filament pages only require view permissions. Pages listed in the + | exclude array will be skipped during permission generation and won't + | appear in your role management interface. + | + */ + + 'pages' => [ + 'subject' => 'class', + 'prefix' => 'view', + 'exclude' => [ + \Filament\Pages\Dashboard::class, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Widgets + |-------------------------------------------------------------------------- + | + | Like pages, widgets typically only need view permissions. Add widgets + | to the exclude array if you don't want them to appear in your role + | management interface. + | + */ + + 'widgets' => [ + 'subject' => 'class', + 'prefix' => 'view', + 'exclude' => [ + \Filament\Widgets\AccountWidget::class, + \Filament\Widgets\FilamentInfoWidget::class, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Permissions + |-------------------------------------------------------------------------- + | + | Sometimes you need permissions that don't map to resources, pages, or + | widgets. Define any custom permissions here and they'll be available + | when editing roles in your application. + | + */ + + 'custom_permissions' => [], + + /* + |-------------------------------------------------------------------------- + | Entity Discovery + |-------------------------------------------------------------------------- + | + | By default, Shield only looks for entities in your default Filament + | panel. Enable these options if you're using multiple panels and want + | Shield to discover entities across all of them. + | + */ + + 'discovery' => [ + 'discover_all_resources' => false, + 'discover_all_widgets' => false, + 'discover_all_pages' => false, + ], + + /* + |-------------------------------------------------------------------------- + | Role Policy + |-------------------------------------------------------------------------- + | + | Shield can automatically register a policy for role management itself. + | This lets you control who can manage roles using Laravel's built-in + | authorization system. Requires a RolePolicy class in your app. + | + */ + + 'register_role_policy' => true, + +]; diff --git a/config/filament-users.php b/config/filament-users.php new file mode 100644 index 0000000..6cea0cd --- /dev/null +++ b/config/filament-users.php @@ -0,0 +1,162 @@ + true, + + /** + * --------------------------------------------- + * Change The Group Name And Override Translated One + * --------------------------------------------- + * The Group name of the resource. + */ + 'group' => null, + + /** + * --------------------------------------------- + * Change The Navigation Sort + * --------------------------------------------- + * The navigation sort of the resource. + */ + 'navigation_sort' => 9, + + /** + * --------------------------------------------- + * Change The Navigation Icon + * --------------------------------------------- + * The navigation icon of the resource. + */ + 'navigation_icon' => 'heroicon-o-user', + + /** + * --------------------------------------------- + * User Filament Impersonate + * --------------------------------------------- + * if you are using filament impersonate, you can set this to true. + */ + 'impersonate' => [ + 'enabled' => true, + 'banner' => [ + // Available hooks: https://filamentphp.com/docs/3.x/support/render-hooks#available-render-hooks + 'render_hook' => env('FILAMENT_IMPERSONATE_BANNER_RENDER_HOOK', 'panels::body.start'), + + // Currently supports 'dark', 'light' and 'auto'. + 'style' => env('FILAMENT_IMPERSONATE_BANNER_STYLE', 'dark'), + + // Turn this off if you want `absolute` positioning, so the banner scrolls out of view + 'fixed' => env('FILAMENT_IMPERSONATE_BANNER_FIXED', true), + + // Currently supports 'top' and 'bottom'. + 'position' => env('FILAMENT_IMPERSONATE_BANNER_POSITION', 'top'), + + 'styles' => [ + 'light' => [ + 'text' => '#1f2937', + 'background' => '#f3f4f6', + 'border' => '#e8eaec', + ], + 'dark' => [ + 'text' => '#f3f4f6', + 'background' => '#1f2937', + 'border' => '#374151', + ], + ], + ], + 'redirect_to' => '/admin', + 'back_to' => '/admin', + 'leave_middleware' => 'web', + 'auth_guard' => 'web', + ], + + /** + * --------------------------------------------- + * User Filament Shield + * --------------------------------------------- + * if you are using filament shield, you can set this to true. + */ + 'shield' => true, + + /** + * --------------------------------------------- + * Use Simple Resource + * --------------------------------------------- + * change the resource from pages to modals by allow simple resource. + */ + 'simple' => false, + + /** + * --------------------------------------------- + * Use Teams + * --------------------------------------------- + * if you want to allow team resource and filters and actions. + */ + 'teams' => false, + + /** + * --------------------------------------------- + * Use Styled Columns + * --------------------------------------------- + * if you want to use styled columns for the resource. + */ + 'styled_columns' => false, + + /** + * --------------------------------------------- + * User Model + * --------------------------------------------- + * if you when to custom the user model path + */ + 'model' => \App\Models\User::class, + + /** + * --------------------------------------------- + * Team Model + * --------------------------------------------- + * if you when to custom the team model path + */ + 'team_model' => \App\Models\Team::class, + + /** + * --------------------------------------------- + * Role Model + * --------------------------------------------- + * if you when to custom the role model path + */ + 'roles_model' => \Spatie\Permission\Models\Role::class, + + /** + * --------------------------------------------- + * Resource Building + * --------------------------------------------- + * if you want to use the resource custom class + */ + 'resource' => [ + 'table' => [ + 'class' => \TomatoPHP\FilamentUsers\Filament\Resources\Users\Tables\UsersTable::class, + 'filters' => \TomatoPHP\FilamentUsers\Filament\Resources\Users\Tables\UserFilters::class, + 'actions' => \TomatoPHP\FilamentUsers\Filament\Resources\Users\Tables\UserActions::class, + 'bulkActions' => \TomatoPHP\FilamentUsers\Filament\Resources\Users\Tables\UserBulkActions::class, + ], + 'form' => [ + 'class' => \TomatoPHP\FilamentUsers\Filament\Resources\Users\Schemas\UserForm::class, + ], + 'infolist' => [ + 'class' => \TomatoPHP\FilamentUsers\Filament\Resources\Users\Schemas\UserInfolist::class, + ], + ], + + /** + * --------------------------------------------- + * Avatar Collection + * --------------------------------------------- + * if you want to use a custom avatar collection. + */ + 'avatar_collection' => 'avatar', +]; diff --git a/config/permission.php b/config/permission.php new file mode 100644 index 0000000..f39f6b5 --- /dev/null +++ b/config/permission.php @@ -0,0 +1,202 @@ + [ + + /* + * When using the "HasPermissions" trait from this package, we need to know which + * Eloquent model should be used to retrieve your permissions. Of course, it + * is often just the "Permission" model but you may use whatever you like. + * + * The model you want to use as a Permission model needs to implement the + * `Spatie\Permission\Contracts\Permission` contract. + */ + + 'permission' => Spatie\Permission\Models\Permission::class, + + /* + * When using the "HasRoles" trait from this package, we need to know which + * Eloquent model should be used to retrieve your roles. Of course, it + * is often just the "Role" model but you may use whatever you like. + * + * The model you want to use as a Role model needs to implement the + * `Spatie\Permission\Contracts\Role` contract. + */ + + 'role' => Spatie\Permission\Models\Role::class, + + ], + + 'table_names' => [ + + /* + * When using the "HasRoles" trait from this package, we need to know which + * table should be used to retrieve your roles. We have chosen a basic + * default value but you may easily change it to any table you like. + */ + + 'roles' => 'roles', + + /* + * When using the "HasPermissions" trait from this package, we need to know which + * table should be used to retrieve your permissions. We have chosen a basic + * default value but you may easily change it to any table you like. + */ + + 'permissions' => 'permissions', + + /* + * When using the "HasPermissions" trait from this package, we need to know which + * table should be used to retrieve your models permissions. We have chosen a + * basic default value but you may easily change it to any table you like. + */ + + 'model_has_permissions' => 'model_has_permissions', + + /* + * When using the "HasRoles" trait from this package, we need to know which + * table should be used to retrieve your models roles. We have chosen a + * basic default value but you may easily change it to any table you like. + */ + + 'model_has_roles' => 'model_has_roles', + + /* + * When using the "HasRoles" trait from this package, we need to know which + * table should be used to retrieve your roles permissions. We have chosen a + * basic default value but you may easily change it to any table you like. + */ + + 'role_has_permissions' => 'role_has_permissions', + ], + + 'column_names' => [ + /* + * Change this if you want to name the related pivots other than defaults + */ + 'role_pivot_key' => null, // default 'role_id', + 'permission_pivot_key' => null, // default 'permission_id', + + /* + * Change this if you want to name the related model primary key other than + * `model_id`. + * + * For example, this would be nice if your primary keys are all UUIDs. In + * that case, name this `model_uuid`. + */ + + 'model_morph_key' => 'model_id', + + /* + * Change this if you want to use the teams feature and your related model's + * foreign key is other than `team_id`. + */ + + 'team_foreign_key' => 'team_id', + ], + + /* + * When set to true, the method for checking permissions will be registered on the gate. + * Set this to false if you want to implement custom logic for checking permissions. + */ + + 'register_permission_check_method' => true, + + /* + * When set to true, Laravel\Octane\Events\OperationTerminated event listener will be registered + * this will refresh permissions on every TickTerminated, TaskTerminated and RequestTerminated + * NOTE: This should not be needed in most cases, but an Octane/Vapor combination benefited from it. + */ + 'register_octane_reset_listener' => false, + + /* + * Events will fire when a role or permission is assigned/unassigned: + * \Spatie\Permission\Events\RoleAttached + * \Spatie\Permission\Events\RoleDetached + * \Spatie\Permission\Events\PermissionAttached + * \Spatie\Permission\Events\PermissionDetached + * + * To enable, set to true, and then create listeners to watch these events. + */ + 'events_enabled' => false, + + /* + * Teams Feature. + * When set to true the package implements teams using the 'team_foreign_key'. + * If you want the migrations to register the 'team_foreign_key', you must + * set this to true before doing the migration. + * If you already did the migration then you must make a new migration to also + * add 'team_foreign_key' to 'roles', 'model_has_roles', and 'model_has_permissions' + * (view the latest version of this package's migration file) + */ + + 'teams' => false, + + /* + * The class to use to resolve the permissions team id + */ + 'team_resolver' => \Spatie\Permission\DefaultTeamResolver::class, + + /* + * Passport Client Credentials Grant + * When set to true the package will use Passports Client to check permissions + */ + + 'use_passport_client_credentials' => false, + + /* + * When set to true, the required permission names are added to exception messages. + * This could be considered an information leak in some contexts, so the default + * setting is false here for optimum safety. + */ + + 'display_permission_in_exception' => false, + + /* + * When set to true, the required role names are added to exception messages. + * This could be considered an information leak in some contexts, so the default + * setting is false here for optimum safety. + */ + + 'display_role_in_exception' => false, + + /* + * By default wildcard permission lookups are disabled. + * See documentation to understand supported syntax. + */ + + 'enable_wildcard_permission' => false, + + /* + * The class to use for interpreting wildcard permissions. + * If you need to modify delimiters, override the class and specify its name here. + */ + // 'wildcard_permission' => Spatie\Permission\WildcardPermission::class, + + /* Cache-specific settings */ + + 'cache' => [ + + /* + * By default all permissions are cached for 24 hours to speed up performance. + * When permissions or roles are updated the cache is flushed automatically. + */ + + 'expiration_time' => \DateInterval::createFromDateString('24 hours'), + + /* + * The cache key used to store all permissions. + */ + + 'key' => 'spatie.permission.cache', + + /* + * You may optionally indicate a specific cache driver to use for permission and + * role caching using any of the `store` drivers listed in the cache.php config + * file. Using 'default' here means to use the `default` set in cache.php. + */ + + 'store' => 'default', + ], +]; diff --git a/database/migrations/2025_09_29_132612_create_permission_tables.php b/database/migrations/2025_09_29_132612_create_permission_tables.php new file mode 100644 index 0000000..ce4d9d2 --- /dev/null +++ b/database/migrations/2025_09_29_132612_create_permission_tables.php @@ -0,0 +1,136 @@ +engine('InnoDB'); + $table->bigIncrements('id'); // permission id + $table->string('name'); // For MyISAM use string('name', 225); // (or 166 for InnoDB with Redundant/Compact row format) + $table->string('guard_name'); // For MyISAM use string('guard_name', 25); + $table->timestamps(); + + $table->unique(['name', 'guard_name']); + }); + + Schema::create($tableNames['roles'], static function (Blueprint $table) use ($teams, $columnNames) { + // $table->engine('InnoDB'); + $table->bigIncrements('id'); // role id + if ($teams || config('permission.testing')) { // permission.testing is a fix for sqlite testing + $table->unsignedBigInteger($columnNames['team_foreign_key'])->nullable(); + $table->index($columnNames['team_foreign_key'], 'roles_team_foreign_key_index'); + } + $table->string('name'); // For MyISAM use string('name', 225); // (or 166 for InnoDB with Redundant/Compact row format) + $table->string('guard_name'); // For MyISAM use string('guard_name', 25); + $table->timestamps(); + if ($teams || config('permission.testing')) { + $table->unique([$columnNames['team_foreign_key'], 'name', 'guard_name']); + } else { + $table->unique(['name', 'guard_name']); + } + }); + + Schema::create($tableNames['model_has_permissions'], static function (Blueprint $table) use ($tableNames, $columnNames, $pivotPermission, $teams) { + $table->unsignedBigInteger($pivotPermission); + + $table->string('model_type'); + $table->unsignedBigInteger($columnNames['model_morph_key']); + $table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_permissions_model_id_model_type_index'); + + $table->foreign($pivotPermission) + ->references('id') // permission id + ->on($tableNames['permissions']) + ->onDelete('cascade'); + if ($teams) { + $table->unsignedBigInteger($columnNames['team_foreign_key']); + $table->index($columnNames['team_foreign_key'], 'model_has_permissions_team_foreign_key_index'); + + $table->primary([$columnNames['team_foreign_key'], $pivotPermission, $columnNames['model_morph_key'], 'model_type'], + 'model_has_permissions_permission_model_type_primary'); + } else { + $table->primary([$pivotPermission, $columnNames['model_morph_key'], 'model_type'], + 'model_has_permissions_permission_model_type_primary'); + } + + }); + + Schema::create($tableNames['model_has_roles'], static function (Blueprint $table) use ($tableNames, $columnNames, $pivotRole, $teams) { + $table->unsignedBigInteger($pivotRole); + + $table->string('model_type'); + $table->unsignedBigInteger($columnNames['model_morph_key']); + $table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_roles_model_id_model_type_index'); + + $table->foreign($pivotRole) + ->references('id') // role id + ->on($tableNames['roles']) + ->onDelete('cascade'); + if ($teams) { + $table->unsignedBigInteger($columnNames['team_foreign_key']); + $table->index($columnNames['team_foreign_key'], 'model_has_roles_team_foreign_key_index'); + + $table->primary([$columnNames['team_foreign_key'], $pivotRole, $columnNames['model_morph_key'], 'model_type'], + 'model_has_roles_role_model_type_primary'); + } else { + $table->primary([$pivotRole, $columnNames['model_morph_key'], 'model_type'], + 'model_has_roles_role_model_type_primary'); + } + }); + + Schema::create($tableNames['role_has_permissions'], static function (Blueprint $table) use ($tableNames, $pivotRole, $pivotPermission) { + $table->unsignedBigInteger($pivotPermission); + $table->unsignedBigInteger($pivotRole); + + $table->foreign($pivotPermission) + ->references('id') // permission id + ->on($tableNames['permissions']) + ->onDelete('cascade'); + + $table->foreign($pivotRole) + ->references('id') // role id + ->on($tableNames['roles']) + ->onDelete('cascade'); + + $table->primary([$pivotPermission, $pivotRole], 'role_has_permissions_permission_id_role_id_primary'); + }); + + app('cache') + ->store(config('permission.cache.store') != 'default' ? config('permission.cache.store') : null) + ->forget(config('permission.cache.key')); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + $tableNames = config('permission.table_names'); + + if (empty($tableNames)) { + throw new \Exception('Error: config/permission.php not found and defaults could not be merged. Please publish the package configuration before proceeding, or drop the tables manually.'); + } + + Schema::drop($tableNames['role_has_permissions']); + Schema::drop($tableNames['model_has_roles']); + Schema::drop($tableNames['model_has_permissions']); + Schema::drop($tableNames['roles']); + Schema::drop($tableNames['permissions']); + } +}; diff --git a/lang/en/users.php b/lang/en/users.php new file mode 100644 index 0000000..bcf6852 --- /dev/null +++ b/lang/en/users.php @@ -0,0 +1,79 @@ + 'User Management', + 'navigation_label' => 'Users', + 'model_label' => 'User', + 'plural_model_label' => 'Users', + + // Actions + 'create' => 'Create User', + 'edit' => 'Edit User', + 'delete' => 'Delete User', + 'restore' => 'Restore User', + 'force_delete' => 'Force Delete User', + + // Form fields + 'name' => 'Full Name', + 'email' => 'Email', + 'password' => 'Password', + 'password_confirmation' => 'Confirm Password', + 'roles' => 'Roles', + 'permissions' => 'Permissions', + 'is_active' => 'Active', + 'email_verified_at' => 'Email Verified At', + + // Messages + 'created_successfully' => 'User created successfully.', + 'updated_successfully' => 'User updated successfully.', + 'deleted_successfully' => 'User deleted successfully.', + 'restored_successfully' => 'User restored successfully.', + + // Table columns + 'table_name' => 'Full Name', + 'table_email' => 'Email', + 'table_roles' => 'Roles', + 'table_status' => 'Status', + 'table_created_at' => 'Created At', + 'table_updated_at' => 'Updated At', + + // Status + 'status_active' => 'Active', + 'status_inactive' => 'Inactive', + + // Validation messages + 'name_required' => 'Full name field is required.', + 'email_required' => 'Email field is required.', + 'email_unique' => 'This email address is already in use.', + 'password_required' => 'Password field is required.', + 'password_min' => 'Password must be at least 8 characters.', + 'password_confirmation_required' => 'Password confirmation field is required.', + 'password_confirmation_same' => 'Password confirmation does not match password.', + + // Roles + 'roles_title' => 'Role Management', + 'roles_navigation_label' => 'Roles', + 'roles_model_label' => 'Role', + 'roles_plural_model_label' => 'Roles', + + 'role_name' => 'Role Name', + 'role_guard_name' => 'Guard Name', + 'role_permissions' => 'Permissions', + + 'role_created_successfully' => 'Role created successfully.', + 'role_updated_successfully' => 'Role updated successfully.', + 'role_deleted_successfully' => 'Role deleted successfully.', + + // Permissions + 'permissions_title' => 'Permission Management', + 'permissions_navigation_label' => 'Permissions', + 'permissions_model_label' => 'Permission', + 'permissions_plural_model_label' => 'Permissions', + + 'permission_name' => 'Permission Name', + 'permission_guard_name' => 'Guard Name', + + 'permission_created_successfully' => 'Permission created successfully.', + 'permission_updated_successfully' => 'Permission updated successfully.', + 'permission_deleted_successfully' => 'Permission deleted successfully.', +]; diff --git a/lang/tr/users.php b/lang/tr/users.php new file mode 100644 index 0000000..7c771fd --- /dev/null +++ b/lang/tr/users.php @@ -0,0 +1,79 @@ + 'Kullanıcı Yönetimi', + 'navigation_label' => 'Kullanıcılar', + 'model_label' => 'Kullanıcı', + 'plural_model_label' => 'Kullanıcılar', + + // Actions + 'create' => 'Kullanıcı Oluştur', + 'edit' => 'Kullanıcı Düzenle', + 'delete' => 'Kullanıcı Sil', + 'restore' => 'Kullanıcıyı Geri Yükle', + 'force_delete' => 'Kullanıcıyı Kalıcı Olarak Sil', + + // Form fields + 'name' => 'Ad Soyad', + 'email' => 'E-posta', + 'password' => 'Şifre', + 'password_confirmation' => 'Şifre Tekrarı', + 'roles' => 'Roller', + 'permissions' => 'İzinler', + 'is_active' => 'Aktif', + 'email_verified_at' => 'E-posta Doğrulama Tarihi', + + // Messages + 'created_successfully' => 'Kullanıcı başarıyla oluşturuldu.', + 'updated_successfully' => 'Kullanıcı başarıyla güncellendi.', + 'deleted_successfully' => 'Kullanıcı başarıyla silindi.', + 'restored_successfully' => 'Kullanıcı başarıyla geri yüklendi.', + + // Table columns + 'table_name' => 'Ad Soyad', + 'table_email' => 'E-posta', + 'table_roles' => 'Roller', + 'table_status' => 'Durum', + 'table_created_at' => 'Oluşturulma Tarihi', + 'table_updated_at' => 'Güncellenme Tarihi', + + // Status + 'status_active' => 'Aktif', + 'status_inactive' => 'Pasif', + + // Validation messages + 'name_required' => 'Ad soyad alanı zorunludur.', + 'email_required' => 'E-posta alanı zorunludur.', + 'email_unique' => 'Bu e-posta adresi zaten kullanılıyor.', + 'password_required' => 'Şifre alanı zorunludur.', + 'password_min' => 'Şifre en az 8 karakter olmalıdır.', + 'password_confirmation_required' => 'Şifre tekrarı alanı zorunludur.', + 'password_confirmation_same' => 'Şifre tekrarı şifre ile eşleşmiyor.', + + // Roles + 'roles_title' => 'Rol Yönetimi', + 'roles_navigation_label' => 'Roller', + 'roles_model_label' => 'Rol', + 'roles_plural_model_label' => 'Roller', + + 'role_name' => 'Rol Adı', + 'role_guard_name' => 'Guard Adı', + 'role_permissions' => 'İzinler', + + 'role_created_successfully' => 'Rol başarıyla oluşturuldu.', + 'role_updated_successfully' => 'Rol başarıyla güncellendi.', + 'role_deleted_successfully' => 'Rol başarıyla silindi.', + + // Permissions + 'permissions_title' => 'İzin Yönetimi', + 'permissions_navigation_label' => 'İzinler', + 'permissions_model_label' => 'İzin', + 'permissions_plural_model_label' => 'İzinler', + + 'permission_name' => 'İzin Adı', + 'permission_guard_name' => 'Guard Adı', + + 'permission_created_successfully' => 'İzin başarıyla oluşturuldu.', + 'permission_updated_successfully' => 'İzin başarıyla güncellendi.', + 'permission_deleted_successfully' => 'İzin başarıyla silindi.', +]; diff --git a/lang/vendor/filament-users/ar/user.php b/lang/vendor/filament-users/ar/user.php new file mode 100644 index 0000000..4192644 --- /dev/null +++ b/lang/vendor/filament-users/ar/user.php @@ -0,0 +1,66 @@ + 'الإعدادات', + 'resource' => [ + 'id' => 'م', + 'single' => 'مستخدم', + 'email_verified_at' => 'البريد الالكتروني مفعل', + 'created_at' => 'تم اضافته في', + 'updated_at' => 'تم تعديله في', + 'verified' => 'مفعل', + 'unverified' => 'غير مفعل', + 'name' => 'الاسم', + 'email' => 'البريد الالكتروني', + 'password' => 'كلمة المرور', + 'password_confirmation' => 'تأكيد كلمة المرور', + 'roles' => 'الرتب', + 'teams' => 'الفرق', + 'label' => 'المستخدمين', + 'title' => [ + 'show' => 'عرض مستخدم', + 'delete' => 'حذف مستخدم', + 'impersonate' => 'تقمص مستخدم', + 'create' => 'إنشاء مستخدم', + 'edit' => 'تعديل مستخدم', + 'list' => 'المستخدمين', + 'home' => 'المستخدمين', + ], + 'notificaitons' => [ + 'last' => [ + 'title' => 'خطأ', + 'body' => 'لا يمكنك حذف آخر مستخدم', + ], + 'self' => [ + 'title' => 'خطأ', + 'body' => 'لا يمكنك حذف نفسك', + ], + ], + 'avatar' => 'الصورة الشخصية', + 'change_password' => 'تغيير كلمة المرور', + 'change_password_auto' => 'تم تغيير كلمة المرور بشكل آلي', + 'change_password_success' => 'تم تغيير كلمة المرور بنجاح', + 'change_password_auto_body' => 'تم تغيير كلمة المرور بشكل آلي', + 'change_password_success_body' => 'تم تغيير كلمة المرور بنجاح', + 'change_password_auto_body_placeholder' => 'اترك فارغ لتوليد تلقائي', + 'change_password_success_body_placeholder' => 'اترك فارغ لتوليد تلقائي', + ], + 'bulk' => [ + 'teams' => 'تحديث الفرق', + 'roles' => 'تحديث الأدوار', + ], + 'team' => [ + 'title' => 'الفرق', + 'single' => 'فريق', + 'columns' => [ + 'avatar' => 'الصورة الشخصية', + 'name' => 'الاسم', + 'owner' => 'المالك', + 'personal_team' => 'فريق شخصي', + ], + ], + 'banner' => [ + 'impersonating' => 'تقمص', + 'leave' => 'ترك التقمص', + ], +]; diff --git a/lang/vendor/filament-users/de/user.php b/lang/vendor/filament-users/de/user.php new file mode 100644 index 0000000..01bd07d --- /dev/null +++ b/lang/vendor/filament-users/de/user.php @@ -0,0 +1,66 @@ + 'Einstellungen', + 'resource' => [ + 'id' => 'ID', + 'single' => 'Benutzer', + 'email_verified_at' => 'E-Mail verifiziert', + 'created_at' => 'Erstellt am', + 'updated_at' => 'Aktualisiert am', + 'verified' => 'Verifiziert', + 'unverified' => 'Nicht verifiziert', + 'name' => 'Name', + 'email' => 'E-Mail', + 'password' => 'Passwort', + 'password_confirmation' => 'Passwort bestätigen', + 'roles' => 'Rollen', + 'teams' => 'Teams', + 'label' => 'Benutzer', + 'title' => [ + 'show' => 'Benutzer anzeigen', + 'delete' => 'Benutzer löschen', + 'impersonate' => 'Benutzer imitieren', + 'create' => 'Benutzer erstellen', + 'edit' => 'Benutzer bearbeiten', + 'list' => 'Benutzer', + 'home' => 'Benutzer', + ], + 'notificaitons' => [ + 'last' => [ + 'title' => 'Fehler', + 'body' => 'Sie können den letzten Benutzer nicht löschen', + ], + 'self' => [ + 'title' => 'Fehler', + 'body' => 'Sie können sich nicht selbst löschen', + ], + ], + 'avatar' => 'Avatar', + 'change_password' => 'Passwort ändern', + 'change_password_auto' => 'Passwort automatisch geändert', + 'change_password_success' => 'Passwort erfolgreich geändert', + 'change_password_auto_body' => 'Passwort automatisch geändert', + 'change_password_success_body' => 'Passwort erfolgreich geändert', + 'change_password_auto_body_placeholder' => 'Leer lassen, um automatisch zu generieren', + 'change_password_success_body_placeholder' => 'Leer lassen, um automatisch zu generieren', + ], + 'bulk' => [ + 'teams' => 'Teams aktualisieren', + 'roles' => 'Rollen aktualisieren', + ], + 'team' => [ + 'title' => 'Teams', + 'single' => 'Team', + 'columns' => [ + 'avatar' => 'Avatar', + 'name' => 'Name', + 'owner' => 'Owner', + 'personal_team' => 'Persönliches Team', + ], + ], + 'banner' => [ + 'impersonating' => 'Imitieren', + 'leave' => 'Imitation beenden', + ], +]; diff --git a/lang/vendor/filament-users/en/user.php b/lang/vendor/filament-users/en/user.php new file mode 100644 index 0000000..21045c5 --- /dev/null +++ b/lang/vendor/filament-users/en/user.php @@ -0,0 +1,66 @@ + 'Settings', + 'resource' => [ + 'id' => 'ID', + 'single' => 'User', + 'email_verified_at' => 'Email Verified', + 'created_at' => 'Created At', + 'updated_at' => 'Updated At', + 'verified' => 'Verified', + 'unverified' => 'Unverified', + 'name' => 'Name', + 'email' => 'Email', + 'password' => 'Password', + 'password_confirmation' => 'Password Confirmation', + 'roles' => 'Roles', + 'teams' => 'Teams', + 'label' => 'Users', + 'title' => [ + 'show' => 'Show User', + 'delete' => 'Delete User', + 'impersonate' => 'Impersonate User', + 'create' => 'Create User', + 'edit' => 'Edit User', + 'list' => 'Users', + 'home' => 'Users', + ], + 'notificaitons' => [ + 'last' => [ + 'title' => 'Error', + 'body' => 'You cannot delete the last user', + ], + 'self' => [ + 'title' => 'Error', + 'body' => 'You cannot delete yourself', + ], + ], + 'avatar' => 'Avatar', + 'change_password' => 'Change Password', + 'change_password_auto' => 'Password changed automatically', + 'change_password_success' => 'Password changed successfully', + 'change_password_auto_body' => 'Password changed automatically', + 'change_password_success_body' => 'Password changed successfully', + 'change_password_auto_body_placeholder' => 'Leave blank to auto-generate', + 'change_password_success_body_placeholder' => 'Leave blank to auto-generate', + ], + 'bulk' => [ + 'teams' => 'Update Teams', + 'roles' => 'Update Roles', + ], + 'team' => [ + 'title' => 'Teams', + 'single' => 'Team', + 'columns' => [ + 'avatar' => 'Avatar', + 'name' => 'Name', + 'owner' => 'Owner', + 'personal_team' => 'Personal Team', + ], + ], + 'banner' => [ + 'impersonating' => 'Impersonating', + 'leave' => 'Leave Impersonation', + ], +]; diff --git a/lang/vendor/filament-users/es/user.php b/lang/vendor/filament-users/es/user.php new file mode 100644 index 0000000..e9e1b57 --- /dev/null +++ b/lang/vendor/filament-users/es/user.php @@ -0,0 +1,66 @@ + 'Configuraciones', + 'resource' => [ + 'id' => 'ID', + 'single' => 'Usuario', + 'email_verified_at' => 'Correo electrónico verificado', + 'created_at' => 'Creado', + 'updated_at' => 'Actualizado', + 'verified' => 'Verificado', + 'unverified' => 'No Verificado', + 'name' => 'Nombre', + 'email' => 'Correo Electrónico', + 'password' => 'Contraseña', + 'password_confirmation' => 'Confirmar Contraseña', + 'roles' => 'Roles', + 'teams' => 'Equipos', + 'label' => 'Usuarios', + 'title' => [ + 'show' => 'Mostrar Usuario', + 'delete' => 'Eliminar Usuario', + 'impersonate' => 'Suplantar Usuario', + 'create' => 'Crear Usuario', + 'edit' => 'Editar Usuario', + 'list' => 'Usuarios', + 'home' => 'Usuarios', + ], + 'notificaitons' => [ + 'last' => [ + 'title' => 'Error', + 'body' => 'No puedes eliminar el último usuario', + ], + 'self' => [ + 'title' => 'Error', + 'body' => 'No puedes eliminarte a ti mismo', + ], + ], + 'avatar' => 'Avatar', + 'change_password' => 'Cambiar Contraseña', + 'change_password_auto' => 'Contraseña cambiada automáticamente', + 'change_password_success' => 'Contraseña cambiada correctamente', + 'change_password_auto_body' => 'Contraseña cambiada automáticamente', + 'change_password_success_body' => 'Contraseña cambiada correctamente', + 'change_password_auto_body_placeholder' => 'Dejar en blanco para generar automáticamente', + 'change_password_success_body_placeholder' => 'Dejar en blanco para generar automáticamente', + ], + 'bulk' => [ + 'teams' => 'Actualizar Equipos', + 'roles' => 'Actualizar Roles', + ], + 'team' => [ + 'title' => 'Equipos', + 'single' => 'Equipo', + 'columns' => [ + 'avatar' => 'Avatar', + 'name' => 'Nombre', + 'owner' => 'Propietario', + 'personal_team' => 'Equipo Personal', + ], + ], + 'banner' => [ + 'impersonating' => 'Suplantando', + 'leave' => 'Salir de la Suplantación', + ], +]; diff --git a/lang/vendor/filament-users/id/user.php b/lang/vendor/filament-users/id/user.php new file mode 100644 index 0000000..2146967 --- /dev/null +++ b/lang/vendor/filament-users/id/user.php @@ -0,0 +1,66 @@ + 'Pengaturan', + 'resource' => [ + 'id' => 'ID', + 'single' => 'Pengguna', + 'email_verified_at' => 'Email Terverifikasi', + 'created_at' => 'Dibuat Pada', + 'updated_at' => 'Diperbarui Pada', + 'verified' => 'Terverifikasi', + 'unverified' => 'Belum Terverifikasi', + 'name' => 'Nama', + 'email' => 'Email', + 'password' => 'Kata Sandi', + 'password_confirmation' => 'Konfirmasi Kata Sandi', + 'roles' => 'Peran', + 'teams' => 'Tim', + 'label' => 'Pengguna', + 'title' => [ + 'show' => 'Lihat Pengguna', + 'delete' => 'Hapus Pengguna', + 'impersonate' => 'Menyamar sebagai Pengguna', + 'create' => 'Buat Pengguna', + 'edit' => 'Edit Pengguna', + 'list' => 'Pengguna', + 'home' => 'Pengguna', + ], + 'notifications' => [ + 'last' => [ + 'title' => 'Kesalahan', + 'body' => 'Anda tidak dapat menghapus pengguna terakhir', + ], + 'self' => [ + 'title' => 'Kesalahan', + 'body' => 'Anda tidak dapat menghapus diri sendiri', + ], + ], + 'avatar' => 'Avatar', + 'change_password' => 'Ubah Kata Sandi', + 'change_password_auto' => 'Kata Sandi berubah secara otomatis', + 'change_password_success' => 'Kata Sandi berubah secara sukses', + 'change_password_auto_body' => 'Kata Sandi berubah secara otomatis', + 'change_password_success_body' => 'Kata Sandi berubah secara sukses', + 'change_password_auto_body_placeholder' => 'Biarkan kosong untuk menghasilkan secara otomatis', + 'change_password_success_body_placeholder' => 'Biarkan kosong untuk menghasilkan secara otomatis', + ], + 'bulk' => [ + 'teams' => 'Perbarui Tim', + 'roles' => 'Perbarui Peran', + ], + 'team' => [ + 'title' => 'Tim', + 'single' => 'Tim', + 'columns' => [ + 'avatar' => 'Avatar', + 'name' => 'Nama', + 'owner' => 'Pemilik', + 'personal_team' => 'Tim Pribadi', + ], + ], + 'banner' => [ + 'impersonating' => 'Menyamar', + 'leave' => 'Keluar dari Menyamar', + ], +]; diff --git a/lang/vendor/filament-users/it/user.php b/lang/vendor/filament-users/it/user.php new file mode 100644 index 0000000..0f1fe71 --- /dev/null +++ b/lang/vendor/filament-users/it/user.php @@ -0,0 +1,66 @@ + 'Configurazione', + 'resource' => [ + 'id' => 'ID', + 'single' => 'Utente', + 'email_verified_at' => 'Email Verificata', + 'created_at' => 'Creato il', + 'updated_at' => 'Aggiornato il', + 'verified' => 'Verificato', + 'unverified' => 'Non Verificato', + 'name' => 'Nome', + 'email' => 'Email', + 'password' => 'Password', + 'password_confirmation' => 'Conferma Password', + 'roles' => 'Ruoli', + 'teams' => 'Teams', + 'label' => 'Utenti', + 'title' => [ + 'show' => 'Visualizza Utente', + 'delete' => 'Elimina Utente', + 'impersonate' => 'Impersonifica Utente', + 'create' => 'crea Utente', + 'edit' => 'Modifica Utente', + 'list' => 'Utenti', + 'home' => 'Utenti', + ], + 'notificaitons' => [ + 'last' => [ + 'title' => 'Errore', + 'body' => "Non puoi eliminare l'ultimo utente", + ], + 'self' => [ + 'title' => 'Errore', + 'body' => 'Non puoi eliminare te stesso', + ], + ], + 'avatar' => 'Avatar', + 'change_password' => 'Cambia Password', + 'change_password_auto' => 'Password cambiata automaticamente', + 'change_password_success' => 'Password cambiata con successo', + 'change_password_auto_body' => 'Password cambiata automaticamente', + 'change_password_success_body' => 'Password cambiata con successo', + 'change_password_auto_body_placeholder' => 'Lasciare vuoto per generare automaticamente', + 'change_password_success_body_placeholder' => 'Lasciare vuoto per generare automaticamente', + ], + 'bulk' => [ + 'teams' => 'Aggiorna Team', + 'roles' => 'Aggiorna Ruoli', + ], + 'team' => [ + 'title' => 'Team', + 'single' => 'Team', + 'columns' => [ + 'avatar' => 'Avatar', + 'name' => 'Nome', + 'owner' => 'Owner', + 'personal_team' => 'Team Personale', + ], + ], + 'banner' => [ + 'impersonating' => 'Impersonando', + 'leave' => 'Lasciare l\'Impersonazione', + ], +]; diff --git a/lang/vendor/filament-users/ja/user.php b/lang/vendor/filament-users/ja/user.php new file mode 100644 index 0000000..cb700e3 --- /dev/null +++ b/lang/vendor/filament-users/ja/user.php @@ -0,0 +1,66 @@ + 'ALC', + 'resource' => [ + 'id' => 'ID', + 'single' => 'ユーザー', + 'email_verified_at' => 'メールアドレス認証日時', + 'created_at' => '作成日時', + 'updated_at' => '更新日時', + 'verified' => '認証済', + 'unverified' => '未認証', + 'name' => '名前', + 'email' => 'メールアドレス', + 'password' => 'パスワード', + 'password_confirmation' => 'パスワード確認', + 'roles' => 'ロール', + 'teams' => 'チーム', + 'label' => 'ユーザー', + 'title' => [ + 'show' => 'ユーザーを表示', + 'delete' => 'ユーザーを削除', + 'impersonate' => 'ユーザーを偽装', + 'create' => 'ユーザーを作成', + 'edit' => 'ユーザーを編集', + 'list' => 'ユーザー', + 'home' => 'ユーザー', + ], + 'notificaitons' => [ + 'last' => [ + 'title' => 'エラー', + 'body' => '最後のユーザーを削除することはできません', + ], + 'self' => [ + 'title' => 'エラー', + 'body' => '自分自身を削除することはできません', + ], + ], + 'avatar' => 'アバター', + 'change_password' => 'パスワードを変更', + 'change_password_auto' => 'パスワードが自動的に変更されました', + 'change_password_success' => 'パスワードが正常に変更されました', + 'change_password_auto_body' => 'パスワードが自動的に変更されました', + 'change_password_success_body' => 'パスワードが正常に変更されました', + 'change_password_auto_body_placeholder' => '自動生成する場合は空欄にしてください', + 'change_password_success_body_placeholder' => '自動生成する場合は空欄にしてください', + ], + 'bulk' => [ + 'teams' => 'チームを更新', + 'roles' => 'ロールを更新', + ], + 'team' => [ + 'title' => 'チーム', + 'single' => 'チーム', + 'columns' => [ + 'avatar' => 'アバター', + 'name' => '名前', + 'owner' => 'オーナー', + 'personal_team' => '個人チーム', + ], + ], + 'banner' => [ + 'impersonating' => '偽装中', + 'leave' => '偽装を終了', + ], +]; diff --git a/lang/vendor/filament-users/mk/user.php b/lang/vendor/filament-users/mk/user.php new file mode 100644 index 0000000..c61278f --- /dev/null +++ b/lang/vendor/filament-users/mk/user.php @@ -0,0 +1,66 @@ + 'Група', + 'resource' => [ + 'id' => 'ИД', + 'single' => 'Корисник', + 'email_verified_at' => 'Е-пошта е верифицирана', + 'created_at' => 'Креирано на', + 'updated_at' => 'Ажурирано на', + 'verified' => 'Верифициран', + 'unverified' => 'Неверифициран', + 'name' => 'Име', + 'email' => 'Е-пошта', + 'password' => 'Лозинка', + 'password_confirmation' => 'Потврди лозинка', + 'roles' => 'Улоги', + 'teams' => 'Тимови', + 'label' => 'Корисници', + 'title' => [ + 'show' => 'Прикажи корисник', + 'delete' => 'Избриши корисник', + 'impersonate' => 'Имперсонирај корисник', + 'create' => 'Креирај корисник', + 'edit' => 'Уреди корисник', + 'list' => 'Листа на корисници', + 'home' => 'Корисници', + ], + 'notificaitons' => [ + 'last' => [ + 'title' => 'Грешка', + 'body' => 'Не можете да го избришете последниот корисник', + ], + 'self' => [ + 'title' => 'Грешка', + 'body' => 'Не можете да се избришете себеси', + ], + ], + 'avatar' => 'Аватар', + 'change_password' => 'Промени лозинка', + 'change_password_auto' => 'Лозинката е промената автоматски', + 'change_password_success' => 'Лозинката е успешно промената', + 'change_password_auto_body' => 'Лозинката е промената автоматски', + 'change_password_success_body' => 'Лозинката е успешно промената', + 'change_password_auto_body_placeholder' => 'Оставете празно за автоматско генерирање', + 'change_password_success_body_placeholder' => 'Оставете празно за автоматско генерирање', + ], + 'bulk' => [ + 'teams' => 'Ажурирај тимови', + 'roles' => 'Ажурирај улоги', + ], + 'team' => [ + 'title' => 'Тимови', + 'single' => 'Тим', + 'columns' => [ + 'avatar' => 'Аватар', + 'name' => 'Име', + 'owner' => 'Сопственик', + 'personal_team' => 'Личен тим', + ], + ], + 'banner' => [ + 'impersonating' => 'Имперсонирано', + 'leave' => 'Напусти Имперсонирање', + ], +]; diff --git a/lang/vendor/filament-users/nl/user.php b/lang/vendor/filament-users/nl/user.php new file mode 100644 index 0000000..67b42f6 --- /dev/null +++ b/lang/vendor/filament-users/nl/user.php @@ -0,0 +1,66 @@ + 'ALC', + 'resource' => [ + 'id' => 'ID', + 'single' => 'Gebruiker', + 'email_verified_at' => 'Email Geverifieerd', + 'created_at' => 'Aangemaakt Op', + 'updated_at' => 'Bijgewerkt Op', + 'verified' => 'Geverifieerd', + 'unverified' => 'Niet geverifieerd', + 'name' => 'Naam', + 'email' => 'Email', + 'password' => 'Wachtwoord', + 'password_confirmation' => 'Wachtwoord Bevestigen', + 'roles' => 'Rollen', + 'teams' => 'Teams', + 'label' => 'Gebruikers', + 'title' => [ + 'show' => 'Toon Gebruiker', + 'delete' => 'Verwijder Gebruiker', + 'impersonate' => 'Impersonate Gebruiker', + 'create' => 'Maak Gebruiker', + 'edit' => 'Bewerk Gebruiker', + 'list' => 'Gebruikers', + 'home' => 'Gebruikers', + ], + 'notificaitons' => [ + 'last' => [ + 'title' => 'Fout', + 'body' => 'Je kunt de laatste gebruiker niet verwijderen', + ], + 'self' => [ + 'title' => 'Fout', + 'body' => 'Je kunt jezelf niet verwijderen', + ], + ], + 'avatar' => 'Avatar', + 'change_password' => 'Wachtwoord wijzigen', + 'change_password_auto' => 'Wachtwoord is automatisch gewijzigd', + 'change_password_success' => 'Wachtwoord is succesvol gewijzigd', + 'change_password_auto_body' => 'Wachtwoord is automatisch gewijzigd', + 'change_password_success_body' => 'Wachtwoord is succesvol gewijzigd', + 'change_password_auto_body_placeholder' => 'Laat leeg voor automatisch genereren', + 'change_password_success_body_placeholder' => 'Laat leeg voor automatisch genereren', + ], + 'bulk' => [ + 'teams' => 'Teams bijwerken', + 'roles' => 'Rollen bijwerken', + ], + 'team' => [ + 'title' => 'Teams', + 'single' => 'Team', + 'columns' => [ + 'avatar' => 'Avatar', + 'name' => 'Name', + 'owner' => 'Owner', + 'personal_team' => 'Persoonlijk Team', + ], + ], + 'banner' => [ + 'impersonating' => 'Impersonate', + 'leave' => 'Leave Impersonation', + ], +]; diff --git a/lang/vendor/filament-users/pt_BR/user.php b/lang/vendor/filament-users/pt_BR/user.php new file mode 100644 index 0000000..29c319d --- /dev/null +++ b/lang/vendor/filament-users/pt_BR/user.php @@ -0,0 +1,66 @@ + 'ALC', + 'resource' => [ + 'id' => 'ID', + 'single' => 'Usuário', + 'email_verified_at' => 'Email Verificado', + 'created_at' => 'Criado em', + 'updated_at' => 'Atualizado em', + 'verified' => 'Verificado', + 'unverified' => 'Não verificado', + 'name' => 'Nome', + 'email' => 'Email', + 'password' => 'Senha', + 'password_confirmation' => 'Confirmação de Senha', + 'roles' => 'Funções', + 'teams' => 'Equipes', + 'label' => 'Usuários', + 'title' => [ + 'show' => 'Mostrar Usuário', + 'delete' => 'Deletar Usuário', + 'impersonate' => 'Despersonificar Usuário', + 'create' => 'Criar Usuário', + 'edit' => 'Editar Usuário', + 'list' => 'Usuários', + 'home' => 'Usuários', + ], + 'notificaitons' => [ + 'last' => [ + 'title' => 'Erro', + 'body' => 'Você não pode deletar o último usuário', + ], + 'self' => [ + 'title' => 'Erro', + 'body' => 'Você não pode deletar a si mesmo', + ], + ], + 'avatar' => 'Avatar', + 'change_password' => 'Alterar Senha', + 'change_password_auto' => 'Senha alterada automaticamente', + 'change_password_success' => 'Senha alterada com sucesso', + 'change_password_auto_body' => 'Senha alterada automaticamente', + 'change_password_success_body' => 'Senha alterada com sucesso', + 'change_password_auto_body_placeholder' => 'Deixe em branco para gerar automaticamente', + 'change_password_success_body_placeholder' => 'Deixe em branco para gerar automaticamente', + ], + 'bulk' => [ + 'teams' => 'Atualizar Equipes', + 'roles' => 'Atualizar Funções', + ], + 'team' => [ + 'title' => 'Equipes', + 'single' => 'Equipe', + 'columns' => [ + 'avatar' => 'Avatar', + 'name' => 'Nome', + 'owner' => 'Proprietário', + 'personal_team' => 'Equipe Pessoal', + ], + ], + 'banner' => [ + 'impersonating' => 'Despersonificando', + 'leave' => 'Sair da Despersonificação', + ], +]; diff --git a/lang/vendor/filament-users/pt_PT/user.php b/lang/vendor/filament-users/pt_PT/user.php new file mode 100644 index 0000000..d541e6e --- /dev/null +++ b/lang/vendor/filament-users/pt_PT/user.php @@ -0,0 +1,66 @@ + 'ALC', + 'resource' => [ + 'id' => 'ID', + 'single' => 'Utilizador', + 'email_verified_at' => 'Email Verificado em', + 'created_at' => 'Criado em', + 'updated_at' => 'Atualizado em', + 'verified' => 'Verificado', + 'unverified' => 'Não verificado', + 'name' => 'Nome', + 'email' => 'Email', + 'password' => 'Palavra-passe', + 'password_confirmation' => 'Confirmação de Palavra-passe', + 'roles' => 'Funções', + 'teams' => 'Equipes', + 'label' => 'Utilizadores', + 'title' => [ + 'show' => 'Ver Utilizador', + 'delete' => 'Apagar Utilizador', + 'impersonate' => 'Simular Utilizador', + 'create' => 'Criar Utilizador', + 'edit' => 'Editar Utilizador', + 'list' => 'Utilizadores', + 'home' => 'Utilizadores', + ], + 'notificaitons' => [ + 'last' => [ + 'title' => 'Erro', + 'body' => 'Não é possível apagar o último utilizador', + ], + 'self' => [ + 'title' => 'Erro', + 'body' => 'Não pode apagar-se a si mesmo', + ], + ], + 'avatar' => 'Avatar', + 'change_password' => 'Alterar Palavra-passe', + 'change_password_auto' => 'Palavra-passe alterada automaticamente', + 'change_password_success' => 'Palavra-passe alterada com sucesso', + 'change_password_auto_body' => 'Palavra-passe alterada automaticamente', + 'change_password_success_body' => 'Palavra-passe alterada com sucesso', + 'change_password_auto_body_placeholder' => 'Deixe em branco para gerar automaticamente', + 'change_password_success_body_placeholder' => 'Deixe em branco para gerar automaticamente', + ], + 'bulk' => [ + 'teams' => 'Atualizar Equipes', + 'roles' => 'Atualizar Funções', + ], + 'team' => [ + 'title' => 'Equipes', + 'single' => 'Equipe', + 'columns' => [ + 'avatar' => 'Avatar', + 'name' => 'Nome', + 'owner' => 'Proprietário', + 'personal_team' => 'Equipe Pessoal', + ], + ], + 'banner' => [ + 'impersonating' => 'Simulando', + 'leave' => 'Sair da Simulação', + ], +]; diff --git a/lang/vendor/filament-users/ru/user.php b/lang/vendor/filament-users/ru/user.php new file mode 100644 index 0000000..19e2526 --- /dev/null +++ b/lang/vendor/filament-users/ru/user.php @@ -0,0 +1,66 @@ + 'ALC', + 'resource' => [ + 'id' => 'ID', + 'single' => 'Пользователь', + 'email_verified_at' => 'Email подтвержден', + 'created_at' => 'Создан', + 'updated_at' => 'Изменен', + 'verified' => 'Верифицирован', + 'unverified' => 'Не верифицирован', + 'name' => 'Имя', + 'email' => 'Email', + 'password' => 'Пароль', + 'password_confirmation' => 'Подтверждение пароля', + 'roles' => 'Роли', + 'teams' => 'Команды', + 'label' => 'Пользователи', + 'title' => [ + 'show' => 'Показать Пользователя', + 'delete' => 'Удалить Пользователя', + 'impersonate' => 'Войти как Пользователь', + 'create' => 'Создать', + 'edit' => 'Редактировать', + 'list' => 'Пользователи', + 'home' => 'Пользователи', + ], + 'notificaitons' => [ + 'last' => [ + 'title' => 'Ошибка', + 'body' => 'Вы не можете удалить последнего пользователя', + ], + 'self' => [ + 'title' => 'Ошибка', + 'body' => 'Вы не можете удалить себя', + ], + ], + 'avatar' => 'Аватар', + 'change_password' => 'Изменить пароль', + 'change_password_auto' => 'Пароль изменен автоматически', + 'change_password_success' => 'Пароль изменен успешно', + 'change_password_auto_body' => 'Пароль изменен автоматически', + 'change_password_success_body' => 'Пароль изменен успешно', + 'change_password_auto_body_placeholder' => 'Оставить пустым для автоматического генерации', + 'change_password_success_body_placeholder' => 'Оставить пустым для автоматического генерации', + ], + 'bulk' => [ + 'teams' => 'Обновить команды', + 'roles' => 'Обновить роли', + ], + 'team' => [ + 'title' => 'Команды', + 'single' => 'Команда', + 'columns' => [ + 'avatar' => 'Аватар', + 'name' => 'Имя', + 'owner' => 'Владелец', + 'personal_team' => 'Личная команда', + ], + ], + 'banner' => [ + 'impersonating' => 'Войти как', + 'leave' => 'Выйти из режима', + ], +];