pluswerk/grumphp-xliff-task
GrumPHP task to lint XLF/XLIFF translation files. Configure ignore patterns and XML validation options (load_from_net, x_include, DTD and schema validation) and run on commits via GrumPHP (triggered_by: xlf).
Install the package via Composer in your Laravel project (dev dependency):
composer require --dev pluswerk/grumphp-xliff-task
Configure GrumPHP (grumphp.yml) to include the task:
parameters:
tasks:
xlifflint:
ignore_patterns: [] # Add patterns like ['vendor/', 'tests/'] if needed
triggered_by: [xlf, xliff] # Files to trigger the task
extensions:
- PLUS\GrumPHPXliffTask\ExtensionLoader
Run GrumPHP locally to test:
./vendor/bin/grumphp run
.xlf or .xliff extensions.Validate XLIFF files before merging translations into your Laravel localization workflow (e.g., Spatie Translation Manager or custom XLIFF-based systems).
Pre-Commit Hook Integration
.git/hooks/pre-commit or use grumphp's built-in Git hooks:
# grumphp.yml
hooks:
pre_commit:
tasks: [xlifflint]
CI/CD Pipeline Enforcement
# .github/workflows/grumphp.yml
jobs:
lint-xliff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: composer install --dev
- run: ./vendor/bin/grumphp run --tasks=xlifflint
Dynamic Configuration
config() to override ignore_patterns per environment:
// config/grumphp.php
'xlifflint' => [
'ignore_patterns' => env('APP_ENV') === 'production'
? ['storage/old-translations/']
: [],
];
grumphp.yml via parameters.Pair with Laravel Localization Packages
Artisan Command Integration
// app/Console/Commands/LintXliff.php
public function handle()
{
$grumphp = new \GrumPHP\Runner();
$grumphp->run(['--tasks' => 'xlifflint']);
}
php artisan lint-xliff
Schema Validation
tasks:
xlifflint:
dtd_validation: true
scheme_validation: true
Network Dependency Control
load_from_net if your CI environment restricts external requests:
tasks:
xlifflint:
load_from_net: false
Custom Error Handling
// app/Providers/AppServiceProvider.php
public function boot()
{
\GrumPHP\Task\XliffLintTask::setLogger(function ($message) {
\Log::info('XLIFF Lint: '.$message);
});
}
GrumPHP Version Mismatch
composer.json:
"require-dev": {
"grumphp/grumphp": "^1.3"
}
Path Resolution Failures
__DIR__ instead of getcwd(), causing path errors in CI.# GitHub Actions
- run: cd $GITHUB_WORKSPACE && ./vendor/bin/grumphp run
Silent Failures
xlifflint tool is missing or misconfigured.xlifflint is installed in your CI environment:
# Example for Ubuntu
sudo apt-get install xlifflint
Performance with Large Files
ignore_patterns to exclude non-critical files temporarily.Namespace Confusion
andersundsehr/grumphp-xliff-task may leave old namespace references (AUS\GrumPHPXliffTask\ExtensionLoader).grumphp.yml to use the new namespace:
extensions:
- PLUS\GrumPHPXliffTask\ExtensionLoader
Enable Verbose Logging
./vendor/bin/grumphp run --verbose --tasks=xlifflint
Test with a Subset of Files
triggered_by to a single file to isolate issues:
tasks:
xlifflint:
triggered_by: [path/to/test.xlf]
Check XLIFF File Validity
xlifflint:
xlifflint path/to/file.xlf
CI-Specific Quirks
xlifflint tool is available in the container. Use a custom Docker image if needed.xlifflint binary to avoid reinstallation:
cache:
key: xlifflint
paths:
- .xlifflint-cache
Custom Validation Rules
\PLUS\GrumPHPXliffTask\Task\XliffLintTask:
// app/GrumPHP/XliffCustomTask.php
class XliffCustomTask extends \PLUS\GrumPHPXliffTask\Task\XliffLintTask
{
protected function validateFile($file)
{
// Add custom logic (e.g., check for specific tags)
if (!str_contains(file_get_contents($file), '<target>')) {
return $this->createFailure('Missing target element in '.$file);
}
return parent::validateFile($file);
}
}
grumphp.yml:
extensions:
- App\GrumPHP\XliffCustomTask
Dynamic Configuration
// config/grumphp.php
'xlifflint' => [
'ignore_patterns' => config('app.xliff_ignore_patterns'),
];
Post-Validation Actions
// app/Providers/AppServiceProvider.php
public function boot()
{
\GrumPHP\Task\XliffLintTask::onFailure(function ($task, $file) {
event(new \App\Events\XliffValidationFailed($file));
});
}
triggered_by vs. file_extensions
triggered_by (not file_extensions) to define file patterns. Ensure your grumphp.yml matches:
tasks:
xlifflint:
triggered_by: [xlf, xliff] # Correct
# file_extensions: [xlf, xliff]
How can I help you explore Laravel packages today?