Manage TYPO3 translations directly in the backend โ no more digging through language files
TextDB is a powerful TYPO3 extension that transforms how you manage translations. Instead of editing language files scattered across your project, manage all translations through a convenient backend module with filtering, search, and bulk operations.
Perfect for:
- ๐ Multi-language websites with frequent translation updates
- ๐ฅ Clients and editors who need to update translations without touching code
- ๐ Translation workflows requiring import/export capabilities
- ๐ Agencies managing multiple TYPO3 projects with consistent translation processes
User interface elements that come from your code, NOT editor-created content:
- โ Form labels: "First Name", "Email Address", "Submit Button"
- โ Button texts: "Add to Cart", "Checkout", "Learn More"
- โ Error messages: "Invalid email format", "Field is required"
- โ Navigation labels: "Products", "About Us", "Contact"
- โ Status messages: "Item added to cart", "Order confirmed"
- โ Validation messages, tooltips, placeholder texts
Example Scenario: Your e-commerce checkout has 50+ labels/buttons needing German, French, and Spanish translations. Instead of editing .xlf files, editors manage them through TextDB's backend module.
- โ Page content created by editors (use TYPO3's built-in page translation)
- โ News articles or blog posts (use news/blog extension translation features)
- โ Content elements like text blocks, images (use TYPO3 content localization)
- โ Backend module labels (use TYPO3's core translation system)
- โ TCA field labels (use locallang_db.xlf in your extension)
TYPO3 Translation Landscape:
โโ Backend/Admin Interface โ TYPO3 Core locallang files
โโ Content Elements โ TYPO3 Page/Content translation
โโ Editor-created content โ TYPO3 Localization features
โโ Frontend System Strings โ โจ TextDB (YOU ARE HERE)
Problem: Your checkout flow has 80+ UI strings (field labels, buttons, validation messages) needing translations in German, French, and Spanish.
Without TextDB: Developers edit .xlf files for every text change, deploy to production.
With TextDB: Product managers update translations directly in backend, changes live immediately.
Result: Translation updates in minutes, not days. Non-technical staff manage translations independently.
Problem: Multi-tenant SaaS with 200+ form labels across 15 modules, requiring consistent translation management.
Without TextDB: Scattered .xlf files across multiple extensions, no central overview, duplicate translations.
With TextDB: Hierarchical organization by component/type, centralized filtering, bulk operations, zero duplication.
Result: 70% reduction in translation maintenance time, consistent terminology across modules.
Problem: 20+ TYPO3 installations, each with custom form/button texts needing German/English translations.
Without TextDB: Copy .xlf files between projects, manual sync, version control overhead.
With TextDB: Export/import workflows, standardized translation structure, zero-friction migration via textdb:translate.
Result: Standardized translation process across all clients, 50% faster project setup.
Problem: Legal requirements demand audit trails for translated UI strings, editor-friendly workflow without file access.
Without TextDB: Developers as bottleneck for every text change, no change tracking, risky file edits. With TextDB: Backend module access for translators, database change tracking, missing translation detection.
Result: Compliance-ready audit trails, editor empowerment, reduced developer burden.
Your TYPO3 Project/
โโโ typo3conf/ext/my_extension/
โ โโโ Resources/Private/Language/
โ โโโ locallang.xlf # 150 lines of XML
โ โโโ de.locallang.xlf # 150 lines (duplicated structure)
โ โโโ fr.locallang.xlf # 150 lines (duplicated structure)
โ โโโ locallang_checkout.xlf # Another 200 lines
โโโ typo3conf/ext/another_extension/
โ โโโ Resources/Private/Language/
โ โโโ ... more scattered files
Workflow: Developer edits XML โ Git commit โ Deploy โ Cache clear โ Test
Problems:
- โ Non-developers can't update translations
- โ Changes require full deployment cycle
- โ No central overview of all translations
- โ Duplicate structure across language files
- โ Merge conflicts in XML files
- โ No built-in search/filter capabilities
Your TYPO3 Backend/
โโโ Netresearch โ TextDB Module
โโโ ๐ Search: [button checkout] # Instant filtering
โโโ ๐ Filter: Component: "checkout" | Type: "button"
โ
โโโ โ๏ธ Edit inline:
โ โโโ EN: "Proceed to Checkout" โ [Click to edit]
โ โโโ DE: "Zur Kasse gehen" โ [Click to edit]
โ โโโ FR: "Passer ร la caisse" โ [Click to edit]
โ
โโโ ๐ฅ Import: Upload XLF โ Auto-merge
โโโ ๐ค Export: Download ZIP (all languages)
Workflow: Editor logs in โ Click translation โ Edit โ Save โ Live immediately
Benefits:
- โ Non-developers manage translations independently
- โ Changes live in seconds (no deployment)
- โ Centralized dashboard with 500+ translations
- โ Single source of truth (no XML duplication)
- โ Advanced filtering: component, type, placeholder, value search
- โ Export/import for translation agencies
- โ
Zero-friction migration via
textdb:translateViewHelper
Phase 1: Prepare (5 minutes)
<!-- Add namespace to your templates -->
xmlns:textdb="http://typo3.org/ns/Netresearch/NrTextdb/ViewHelpers"Phase 2: Auto-Import (Automatic)
<!-- Replace f:translate with textdb:translate -->
<textdb:translate key="LLL:EXT:my_ext/Resources/Private/Language/locallang.xlf:submit" />
<!-- First render automatically imports to database -->
<!-- All existing translations preserved -->Phase 3: Optimize (Gradual)
<!-- Switch to native syntax at your own pace -->
<textdb:textdb component="checkout" type="button" placeholder="submit" />
<!-- Old .xlf files can stay as backup until you're confident -->Zero Downtime: Existing translations continue working during migration. Zero Data Loss: Automatic import preserves all language variants. Zero Risk: Rollback anytime by reverting ViewHelper change.
- User-friendly backend module for managing all translations
- Advanced filtering by component, type, and placeholder
- Multi-language support with TYPO3's site configuration
- Inline editing of translations directly in the list view
- XLF file import/export for easy translation workflows
- Bulk operations for updating multiple translations at once
- Overwrite protection with optional merge strategies
- Multi-language export for all configured site languages
- ViewHelper for migration from LLL files to database storage
- Automatic translation detection and import during migration
- Backward-compatible migration path preserving existing translations
- Extbase ViewHelpers (
textdb:textdb,textdb:translate) - Console commands for automated import workflows
- Structured data model (Environment โ Component โ Type โ Placeholder)
- TYPO3 v13 compatibility with modern dependency injection
| Feature | TextDB | l10nmgr | Snowbabel | translatelabels | TYPO3 Core |
|---|---|---|---|---|---|
| Frontend System Strings | โ Primary Focus | โ No | โ No | โ Backend Only | |
| Database-Backed Storage | โ Yes | โ Yes | โ Yes | โ Yes | โ File-Based |
| Zero-Friction Migration | โ Auto-Import | โ Manual | โ Manual | โ Manual | N/A |
| Backend Module | โ Advanced Filtering | โ Workflow-Heavy | โ Simple | โ Basic | โ No |
| XLF Import/Export | โ Multi-Language ZIP | โ Complex Workflow | โ No | โ Single Files | |
| Hierarchical Organization | โ 4-Level Structure | โ Flat | โ Flat | โ Flat | โ File Structure |
| Live Translation Updates | โ Instant | โ Instant | โ Instant | โ Requires Deployment | |
| Non-Developer Editing | โ Backend Module | โ Simple | โ Basic | โ File Access Needed | |
| Code Quality | โ PHPStan 10 | โ High | |||
| TYPO3 v13 Ready | โ Yes | โ Outdated | โ Unmaintained | โ Yes |
The TextDB Advantage: Drop-in replacement for f:translate ViewHelper with automatic LLL import on first render.
<!-- Step 1: Change namespace only -->
<textdb:translate key="LLL:EXT:my_ext/Resources/Private/Language/locallang.xlf:welcome" />
<!-- Step 2: Render page โ Automatic import to database -->
<!-- Step 3: Switch to native syntax -->
<textdb:textdb component="my-component" type="label" placeholder="welcome" />Competitors: Require manual migration, complex import processes, or complete rewrites.
The TextDB Advantage: 4-level structure (Environment โ Component โ Type โ Placeholder) prevents chaos at scale.
Example: 500+ translations organized logically instead of 500 flat key-value pairs.
Competitors: Flat key-value structure becomes unmanageable beyond 100 translations.
The TextDB Advantage: Product managers, translators, and editors update translations without:
- File system access
- Git knowledge
- Deployment pipelines
- Developer intervention
Competitors: Either require developer involvement (TYPO3 Core) or offer basic editing without advanced features (Snowbabel).
The TextDB Advantage:
- PHPStan level 10 static analysis
- 95%+ test coverage
- PSR-12 coding standards
- Modern PHP 8.2+ features (readonly properties, constructor promotion)
- Comprehensive CI/CD pipeline
Competitors: Lower code quality standards, outdated codebases, limited testing.
The TextDB Advantage:
- Fast Apply-compatible: Token-optimized for AI-assisted development
- Modern Architecture: Dependency injection, final classes, strict types
- CLI Automation: Console commands for import workflows
- API-ready: Clean service layer for programmatic access
Competitors: Legacy architectures, limited CLI support, manual workflows.
- TYPO3: 13.4.0 - 13.99.99
- PHP: 8.2, 8.3, or 8.4
- PHP Extensions: zip, simplexml, libxml
- Composer: For installation and dependency management
Install via Composer:
composer require netresearch/nr-textdbActivate the extension in the TYPO3 Extension Manager or via CLI:
vendor/bin/typo3 extension:activate nr_textdbConfigure the extension in the TYPO3 backend:
- Navigate to Admin Tools โ Settings โ Extension Configuration
- Select nr_textdb
- Set the Storage PID where translations will be stored
- Optionally disable "Create if missing" feature
Create a dedicated storage folder for your translations:
- Create a new page/folder in the TYPO3 page tree
- Note the page ID
- Set this ID in the extension configuration as the Storage PID
- (Optional) Create language overlays for the folder to enable the language switcher in TCA
Access the TextDB module under Netresearch โ TextDB in the TYPO3 backend.
Key Features:
- List View: Browse and filter all translations
- Inline Editing: Click to edit translation values directly
- Filtering: Filter by component, type, or search in placeholders/values
- Pagination: Navigate through large translation sets
Use TextDB translations in your Fluid templates:
<!-- Add namespace declaration -->
<html xmlns:textdb="http://typo3.org/ns/Netresearch/NrTextdb/ViewHelpers">
<!-- Use the ViewHelper -->
<textdb:textdb
component="my-component"
type="label"
placeholder="welcome.headline"
/>ViewHelper Parameters:
component: Logical grouping (e.g., "checkout", "contact-form")type: Translation type (e.g., "label", "message", "error")placeholder: Unique identifier for the translation
- Prepare an XLF file with the required structure (see below)
- Open the TextDB backend module
- Click Import
- Select your XLF file
- Check "Overwrite existing" if you want to update existing translations
- Click Import
XLF File Structure for English (source language):
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="messages">
<header>
<authorName>Your Name</authorName>
<authorEmail>[email protected]</authorEmail>
</header>
<body>
<trans-unit id="component|type|placeholder">
<source>Translation Value</source>
</trans-unit>
</body>
</file>
</xliff>XLF File Structure for Other Languages:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="messages">
<header>
<authorName>Your Name</authorName>
<authorEmail>[email protected]</authorEmail>
</header>
<body>
<trans-unit id="component|type|placeholder">
<target>รbersetzungswert</target>
</trans-unit>
</body>
</file>
</xliff>File Naming Convention:
- English (default):
textdb_[name].xlf - Other languages:
[iso-code].textdb_[name].xlf(e.g.,de.textdb_labels.xlf)
The XLF import functionality implements protection against XML External Entity (XXE) attacks:
- XXE Protection: Network access during XML parsing is blocked using the
LIBXML_NONETflag, preventing external entity resolution and SSRF attacks - PHP 8.0+ Compatible: External entity loading is disabled by default in PHP 8.0+, with
LIBXML_NONETproviding defense-in-depth security - Permission Requirements: Only backend users with appropriate permissions can import XLF files
- Best Practices:
- Review XLF files from untrusted sources before importing
- Monitor import operations in production environments
- Regularly update to the latest version to receive security updates
For more information about XXE vulnerabilities, see the OWASP XXE documentation.
- Open the TextDB backend module
- Apply filters (component, type) if needed
- Click "Export with current filter"
- A ZIP archive will be downloaded with XLF files for all languages
Note: Export includes all filtered translations, ignoring pagination.
Migrate existing f:translate ViewHelpers to TextDB:
Add to your template:
xmlns:textdb="http://typo3.org/ns/Netresearch/NrTextdb/ViewHelpers"use Netresearch\NrTextdb\ViewHelpers\TranslateViewHelper;
// In your controller action
TranslateViewHelper::$component = 'my-component';Replace f:translate with textdb:translate:
<!-- Before -->
<f:translate key="LLL:EXT:my_ext:Resources/Private/Language/locallang.xlf:welcome" />
<!-- During migration -->
<textdb:translate key="LLL:EXT:my_ext:Resources/Private/Language/locallang.xlf:welcome" />Access your frontend to trigger automatic import of translations into TextDB.
Replace all f:translate calls with textdb:textdb:
For tag syntax:
Search: <f:translate key="LLL:EXT:[^:]+:([^\"]+)"[^>]+>
Replace: <textdb:textdb component="my-component" placeholder="\1" type="label" />
For inline syntax:
Search: {f:translate\(key: 'LLL:EXT:[^:]+:([^\']+)'\)}
Replace: {textdb:textdb\({placeholder: '\1', component: 'my-component', type: 'label'})}
Run the complete test suite:
composer ci:testThis executes:
- โ PHP linting
- โ PHPStan static analysis (level 10)
- โ Rector code quality checks
- โ Fractor TYPO3 migrations
- โ Unit tests with coverage
- โ Coding standards (PHP CS Fixer)
composer ci:test:php:lint # PHP linting
composer ci:test:php:phpstan # PHPStan analysis
composer ci:test:php:rector # Rector checks
composer ci:test:php:fractor # Fractor checks
composer ci:test:php:unit # Unit tests
composer ci:test:php:cgl # Coding standards checkcomposer ci:cgl # Fix coding standards
composer ci:rector # Apply Rector refactorings
composer ci:fractor # Apply Fractor migrationsWe welcome all types of contributions! Whether you're a developer, translator, or documentation writer, there's a way for you to help.
Make TextDB available in your language! We use Crowdin for community translations.
The extension currently supports 23 languages, and we're always looking to add more:
๐ฟ๐ฆ Afrikaans โข ๐ธ๐ฆ Arabic โข ๐จ๐ฟ Czech โข ๐ฉ๐ฐ Danish โข ๐ฉ๐ช German โข ๐ช๐ธ Spanish โข ๐ซ๐ฎ Finnish โข ๐ซ๐ท French โข ๐ฎ๐ณ Hindi โข ๐ฎ๐ฉ Indonesian โข ๐ฎ๐น Italian โข ๐ฏ๐ต Japanese โข ๐ฐ๐ท Korean โข ๐ณ๐ฑ Dutch โข ๐ณ๐ด Norwegian โข ๐ต๐ฑ Polish โข ๐ต๐น Portuguese โข ๐ท๐บ Russian โข ๐ธ๐ช Swedish โข ๐น๐ฟ Swahili โข ๐น๐ญ Thai โข ๐ป๐ณ Vietnamese โข ๐จ๐ณ Chinese
How to contribute translations:
- Visit the TYPO3 Crowdin project: https://crowdin.com/project/typo3-cms
- Find the
nr_textdbextension - Select your language and start translating
- Your translations will be automatically synchronized
No technical knowledge required! See our Translation Guide for detailed instructions.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes following our coding standards
- Run tests:
composer ci:test - Open a Pull Request
Development Standards:
- PHPStan level 10 compliance required
- PSR-12 coding standards
declare(strict_types=1)in all PHP files- Type declarations on all methods
- Tests for new features
For detailed information about:
- Translation guidelines and proper names
- Code contribution workflow
- Development setup with DDEV
- Testing and quality standards
- Issue reporting
See our CONTRIBUTING.md guide.
This project is licensed under the GPL-3.0-or-later License - see the LICENSE file for details.
Developed and maintained by Netresearch DTT GmbH
Authors:
- Thomas Schรถne
- Axel Seemann
- Tobias Hein
- Rico Sonntag
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- TYPO3 Extension Repository: TER
- Company Website: netresearch.de
- nr-sync: Synchronize TextDB translations across TYPO3 instances
Made with โค๏ธ for the TYPO3 Community