<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
vasilgerginski / filamentphp-text-extractor example snippets
use VasilGerginski\FilamentTextExtractor\FilamentTextExtractorPlugin;
public function panel(Panel $panel): Panel
{
return $panel
// ... other configuration
->plugin(FilamentTextExtractorPlugin::make());
}
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use VasilGerginski\FilamentTextExtractor\Traits\ExtractsTranslatableText;
class BlogPost extends Model
{
use ExtractsTranslatableText;
// Define which fields should be extracted
protected array $translatableFields = [
'title',
'content',
'excerpt',
'meta_description',
];
}
use VasilGerginski\FilamentTextExtractor\Jobs\ExtractTextJob;
// Extract synchronously
ExtractTextJob::dispatchSync(BlogPost::class);
// Or dispatch to queue
ExtractTextJob::dispatch(BlogPost::class);
use VasilGerginski\FilamentTextExtractor\Casts\Translatable;
class BlogPost extends Model
{
use ExtractsTranslatableText;
protected $casts = [
'title' => Translatable::class,
'excerpt' => Translatable::class,
'meta_description' => Translatable::class,
];
}
use VasilGerginski\FilamentTextExtractor\Casts\JsonTranslatable;
class BlogPost extends Model
{
protected $casts = [
'content' => JsonTranslatable::class, // For page builder blocks
'metadata' => JsonTranslatable::class, // For component data
];
}
// Original rich text content
$content = '<h1>Welcome</h1><p>This is <strong>important</strong> text.</p>';
// Extracted as
'Welcome This is important text.'
return [
// Default locale for extracted texts
'default_locale' => 'en',
// Available locales
'locales' => ['en', 'es', 'fr', 'de'],
// Auto-generate Laravel translation files
'auto_generate_lang_files' => true,
// Translation file naming pattern
'lang_file_pattern' => '{model_name}.php', // e.g., blog_posts.php
// Queue name for extraction jobs
'queue' => 'default',
// Fields to exclude from extraction
'excluded_fields' => ['id', 'password', 'remember_token'],
// Custom field handlers
'field_handlers' => [
'email' => \VasilGerginski\FilamentTextExtractor\FieldHandlers\EmailHandler::class,
'url' => \VasilGerginski\FilamentTextExtractor\FieldHandlers\UrlHandler::class,
// Add your custom handlers here
],
];
namespace App\FieldHandlers;
use VasilGerginski\FilamentTextExtractor\FieldHandlers\AbstractFieldHandler;
class PhoneNumberHandler extends AbstractFieldHandler
{
public function handle(mixed $value): ?string
{
// Your custom logic here
return $this->formatPhoneNumber($value);
}
public function shouldExtract(mixed $value): bool
{
return !empty($value) && $this->isValidPhoneNumber($value);
}
}
// After extraction, files are created in:
// lang/en/blog_posts.php
// lang/es/blog_posts.php
// etc.
// Example generated file content:
return [
'post_1_title' => 'Welcome to our Blog',
'post_1_content' => 'This is the first blog post content...',
'post_1_excerpt' => 'A brief introduction to our blog',
// ... more extracted texts
];
// In your Blade views
{{ __('blog_posts.post_1_title') }}
// Or create a model accessor
class BlogPost extends Model
{
use ExtractsTranslatableText;
public function getLocalizedTitleAttribute()
{
return __("blog_posts.post_{$this->id}_title");
}
public function getLocalizedContentAttribute()
{
return __("blog_posts.post_{$this->id}_content");
}
}
// Usage
$post = BlogPost::find(1);
echo $post->localized_title; // Automatically uses current locale
use VasilGerginski\FilamentTextExtractor\Casts\Translatable;
class BlogPost extends Model
{
protected $casts = [
'title' => Translatable::class,
'content' => Translatable::class,
'excerpt' => Translatable::class,
];
}
// Now these fields automatically return translated values
$post = BlogPost::find(1);
echo $post->title; // Returns translated title based on current locale