
Centralized Multilingual Translation Management Platform
An internal web application centralizing translation management across 7 European languages for a B2B promotional product marketplace - inline AJAX editing, PO/MO file management, automated reminders and multi-project synchronization.
Languages
7
fr, en, de, it, es, nl, pt
Lines of Code
~4 332
PHP, Twig, JS, CSS, YAML
Routes
15
Defined in routing.yml
Consumer Projects
6+
ES, Extranet, es_suppliers, MEW...
Presentation
A custom tool for managing translations across a European B2B platform
This project is an internal web application for centralized multilingual translation management, developed for European Sourcing, a company in the B2B promotional product sector. Accessible via a dedicated subdomain, the tool allows internal teams to manage, edit, validate and export translations for the main europeansourcing.com website and its associated sub-projects.
The application manages two distinct content types: database translations (categories, attributes, keywords, markings, products) stored in MySQL, and UI text translations managed via GNU gettext PO/MO files across 2 domains (site interface and marketing). It serves 7 European languages and feeds translations to 6+ interconnected projects.
Inline AJAX editing
Double-click to edit, Enter to save - no page reload. Keyboard navigation between fields.
Verification tracking
Green/red color coding for verified/unverified translations across all content types.
Automated email reminders
CLI command sending summary of unverified translations to translators via Amazon SES.
CSV export with filters
Export all translations to multilingual CSV, filterable by project source.
Objectives, Context, Stakes & Risks
Why this tool was critical for the business
- Centralize all translations in a single interface
- Allow real-time editing via AJAX (double-click to edit, Enter to save)
- Track vérification status with visual feedback (green/red)
- Export translations as CSV for offline use
- Automate email reminders for unverified translations
- Auto-compile .mo files from .po after each edit
The main europeansourcing.com site was a PHP/SQLI application using GNU gettext for i18n. Managing 7 European languages across thousands of catalog entries and UI strings was impossible by hand. The translation volume demanded a dedicated tool.
- Direct impact on international revenue: incorrect translations affect product understanding by buyers
- SEO positioning: translated categories and keywords impact search ranking across European markets
- Multilingual consistency: same term must be translated consistently across all 6+ projects
Data corruption risk
PO file modifications via regex without full parsing were fragile and prone to corruption.
SQL injection vulnerability
SQL queries built by string concaténation without prepared statements in BDManager.
Minimal access control
In-memory users with plaintext passwords, no per-language role management.
Infrastructure dependency
Cross-server sync relied on a "mounted drive" with undocumented reliability.
The Steps - What I Did
From scaffold takeover to full-featured translation platform
- Steve installed Symfony 2.4, created TraductionBundle with full structure
- Thomas configured Doctrine/MySQL and Amazon SES email transport
- Yves set up dev environment, wrote backup script
- Developed BDController + BDManager for MySQL translations
- Paginated search with vérification status sorting
- Inline AJAX editing with double-click and auto-save
- jQuery UI autocomplete on search field
- Developed WebSiteController + CommunicationController with POManager
- Replaced fragile custom PO parser with Gettext\Translations library
- Built verified.json tracking for PO validation state
- Automatic .mo compilation via msgfmt after each edit
- Tabbed navigation across 7 translation types
- Result tables with 249 country flag PNGs
- Keyboard navigation (Enter to save, auto-focus next field)
- Search term highlighting via jQuery Highlight plugin
- CSV export with all languages, filterable by project source
- Key création/deletion for communication translations
- Provenance references showing which project uses each text
- LaunchMailCommand for automated reminders via Amazon SES
- Automatic JSON regeneration for es_suppliers after each edit
The Actors - Interactions
A project carried by one developer within a small ecosystem
File modifications per developer (excluding vendor/)
Jose (75,4%)
Lead Developer285 files. Built all 3 controllers, 2 services, Twig templates, routing, CLI command, 249 flags. Replaced Thomas's broken PO parser. Author of 75% of the project.
Steve (21,7%)
Initial Developer82 files. Created Symfony scaffold, TraductionBundle structure, FieldEdition.js, first assets.
Yves (2,4%)
DevOps9 files. Environment config, backup script, composer.lock.
Thomas (0,5%)
Developer2 files. Doctrine config. His PO parser code was later replaced.
- SQLI - Agency that developed the main europeansourcing.com site
- OVH - Dedicated server hosting
- Amazon Web Services (SES) - Email delivery
The Results
Impact for the project, the business, and personal growth
- Translators manage all translations autonomously without developer intervention
- Inline AJAX editing with autocomplete and keyboard nav significantly accelerated workflow
- Verification tracking with email reminders helped identify and fill gaps
- Translations feed 6+ projects/subdomains across the ecosystem
- Deep expertise in i18n/l10n workflows: GNU gettext PO/MO, multilingual data, translation state tracking
- Strengthened full-stack skills: Symfony 2, Doctrine DBAL, jQuery AJAX, Bootstrap
- Learned to replace fragile custom parsers with proven libraries
- Project takeover experience: stepped in after 6 months of scaffolding and delivered a production tool
- 15 features delivered (inline editing, search, autocomplete, pagination, export, references, key management, email reminders, auto-compilation, backup...)
- 7 languages covered with full verification tracking
- 14 PO files managed (7 languages x 2 domains)
- 6+ consumer projects synchronized automatically
The Project Aftermath
From production deployment to archival
After delivery, translators used the tool daily to manage translations across the platform. Automated email reminders kept translation coverage high, and CSV export allowed external contractors to work offline and reintegrate their work.
The project is now archived (SVN backup on NAS). European Sourcing continued evolving its workflows, but this tool remained the operational foundation for several years. The architectural choices (DB/PO séparation, inline AJAX editing) proved their worth over time.
My Critical Reflection
Strengths, weaknesses and lasting lessons
Pragmatic interface
Double-click editing with AJAX save is intuitive for mass translation. Keyboard navigation optimizes productivity.
Clean service séparation
Clear distinction between BDManager (DB) and POManager (files) allows independent operation.
Smart vérification tracking
verified.json as lightweight storage for PO validation state - simple and effective.
Ecosystem integration
Auto-sync with es_suppliers, link to extranet, email reminders - fits well in the ecosystem.
SQL injection vulnerability
BDManager builds queries by string concaténation. Should have used prepared statements.
No functional tests
Only test is a Symfony placeholder testing /hello/Fabien. No business logic coverage.
Duplicated controller code
CommunicationController and WebSiteController share ~90% identical code. Should have been abstracted.
No caching
Loading all PO files in memory each request (1024M limit) is costly. Redis or file cache would help.
- Never build SQL queries by concaténation - always use prepared statements, even for internal tools.
- Prefer proven libraries over custom parsers for standard formats (PO, CSV, XML).
- Factor out early - when 2 controllers share 90% code, abstraction is not premature, it is necessary.
- An internal tool deserves tests too - especially when it handles critical business data.
Related journey
Professional experience linked to this achievement
Skills applied
Technical and soft skills applied
Image gallery
Project screenshots and visuals






