Contact
Let's work together
Centralized Multilingual Translation Management Platform

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.

2014 - 2015
~18 months (scaffolding + core development)
Senior Software Engineer (75% of codebase)
PHP 5.3+Symfony 2.4MySQLDoctrine DBALTwigjQuery 2.1jQuery UI 1.10Bootstrap 3.1Select2 3.4SwiftMailerAmazon SESGettext PO/MOSVNComposer

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.

Translation Ecosystem
The centralized tool feeds 6+ projects across the ecosystem
Translation Content Distribution

Objectives, Context, Stakes & Risks

Why this tool was critical for the business

Objectives
  • 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
Technical Context

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.

Business Stakes
  • 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
Identified Risks

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.

Language Coverage

The Steps - What I Did

From scaffold takeover to full-featured translation platform

Project Timeline
~18 months from scaffolding to final delivery
Phase 1
Scaffold & Infrastructure
May-Nov 2014
  • 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
Phase 2
DB Translation Module
Mar-Apr 2015
  • 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
Phase 3
PO Translation Modules
Apr-Aug 2015
  • 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
Phase 4
Bootstrap UI & UX
Mar-Sep 2015
  • 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
Phase 5
Advanced Features
Sep-Nov 2015
  • 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
Application Architecture
Symfony 2 MVC with 3 controllers and 2 services
Translation Edit Flow
From double-click to .mo compilation
Database Schema (ER Diagram)
7 MySQL tables for multilingual catalog translations
Code Metrics

The Actors - Interactions

A project carried by one developer within a small ecosystem

Contribution Breakdown (SVN metadata)

File modifications per developer (excluding vendor/)

Jose (75,4%)

Lead Developer

285 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 Developer

82 files. Created Symfony scaffold, TraductionBundle structure, FieldEdition.js, first assets.

Yves (2,4%)

DevOps

9 files. Environment config, backup script, composer.lock.

Thomas (0,5%)

Developer

2 files. Doctrine config. His PO parser code was later replaced.

External Stakeholders
  • 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

Business Impact
  • 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
Personal Growth
  • 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
Deliverables
  • 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.

Infrastructure Diagram
Production across 2 OVH servers + Amazon SES

My Critical Reflection

Strengths, weaknesses and lasting lessons

Strengths

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.

Areas for Improvement

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.

Lasting Lessons
  • 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

Specifications overview document
Functional specifications for the translation management platform
Project listing interface screenshot
Multi-project listing with translation progress per language
Translation search engine interface
Search across all translations with filters by language and project
Copy reference feature screenshot
Quick copy of translation keys for developer integration
Memo feature for translation notes
Contextual notes attached to translation entries for translators
User management administration panel
Role-based access control for translators, reviewers and administrators
Import/export interface for PO/MO files
Batch import and export of PO/MO translation files per project