samuelvi/spreadsheet-translator-core
Core library for spreadsheet-translator: parses and converts spreadsheet files into translation resources. Built for Laravel/PHP workflows, enabling import/export of i18n strings from Excel/CSV with a clean, reusable engine for other adapters and apps.
## Getting Started
### Minimal Setup
1. **Installation**:
```bash
composer require samuelvi/spreadsheet-translator-core
Ensure your project uses PHP 8.4+ and Laravel 9+. This version drops support for older PHP versions (pre-8.4).
Basic Usage:
use Samuelvi\SpreadsheetTranslatorCore\Facades\SpreadsheetTranslator;
// Load a CSV/Excel file
$translator = SpreadsheetTranslator::load('path/to/file.csv');
// Translate a cell (e.g., column A1)
$translated = $translator->translate('A1');
First Use Case:
$data = $translator->getData(); // Returns translated array
User::insert($data); // Bulk insert
Translation Pipeline:
->translate()->format()->validate()).$translator
->load('file.xlsx')
->translate() // Apply custom rules
->format('array') // Output as array/object
->save('processed.csv'); // Export
Dynamic Rules:
$translator->addRule('email', fn($value) => filter_var($value, FILTER_VALIDATE_EMAIL));
Batch Processing:
$translator->chunk(1000, function ($chunk) {
// Process chunk (e.g., save to DB)
});
Laravel Filesystem:
Use Storage::disk() to handle remote files (S3, etc.):
$translator->load(Storage::disk('s3')->path('file.xlsx'));
Queue Jobs: Offload heavy translations to queues:
TranslateSpreadsheetJob::dispatch('file.xlsx')->onQueue('translations');
Service Provider: Bind the translator to the container for dependency injection:
$this->app->singleton(SpreadsheetTranslator::class, function ($app) {
return new SpreadsheetTranslator(config('spreadsheet-translator'));
});
PHP 8.4 Compatibility:
fn() or named arguments if applicable.Memory Limits:
memory_limit. Use chunk() or setMemoryLimit(512).fgetcsv() for CSV or PhpSpreadsheet's iterators.Column Mapping:
A1 notation. For dynamic columns, use:
$translator->mapColumn('header_name', 'A1');
$translator->debug(true)->translate(); // Logs input/output
->validate() to catch errors early:
$translator->validate()->onError(function ($errors) {
Log::error($errors);
});
Custom Translators:
Extend BaseTranslator to add logic:
class MyTranslator extends BaseTranslator {
public function translateDate(string $value): string {
return Carbon::parse($value)->format('Y-m-d');
}
}
Event Listeners:
Hook into translated or loaded events:
SpreadsheetTranslator::addListener('translated', function (array $data) {
// Post-process data
});
Configuration:
Override defaults in config/spreadsheet-translator.php:
'default_rules' => [
'email' => 'validate_email',
'date' => 'parse_date',
],
$mock = Mockery::mock(SpreadsheetTranslator::class);
$mock->shouldReceive('translate')->andReturn(['data']);
enum TranslationRule {
case EMAIL;
case DATE;
}
NO_UPDATE_NEEDED would not apply here due to the PHP 8.4 upgrade requiring adjustments in the **Gotchas and Tips** section.
How can I help you explore Laravel packages today?