Add LibreTranslate auto-translation, improve test coverage, fix code duplication

Translation system:
- Add LibreTranslate container (dev + prod), CPU-only, no port exposed, FR/EN/ES/DE/IT
- Create app:translate command: reads *.fr.yaml, translates incrementally, preserves placeholders
- Makefile: make trans / make trans_prod (stops container after translation)
- Ansible: start libretranslate -> translate -> stop during deploy
- Prod container restart: "no" (only runs during deploy)
- .gitignore: ignore generated *.en/es/de/it.yaml files
- 11 tests for TranslateCommand (API unreachable, empty, incremental, obsolete keys, placeholders, fallback)

Test coverage improvements:
- OrderController: event ended (400), invalid cart JSON, invalid email, stock zero (4 new tests)
- AccountController: finance stats all statuses (paid/pending/refunded/cancelled), soldCounts (2 new tests)
- JS cart: checkout without error elements, hide error on retry, stock polling edge cases (singular, no label, qty zero, unknown billet) (8 new tests)
- JS editor: comment node sanitization (1 new test)
- JS tabs: missing panel, generated id, parent null, click no-panel (5 new tests)

Code duplication fixes:
- MeilisearchConsistencyCommand: extract diffAndReport() method (was duplicated 3x)
- Email templates: extract _order_items_table.html.twig partial (shared by notification + cancelled)
- SonarQube: exclude src/Entity/** from CPD (getters/setters duplication)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Serreau Jovann
2026-03-23 11:44:13 +01:00
parent 04927ec988
commit 42d06dd49f
16 changed files with 1087 additions and 138 deletions

View File

@@ -136,6 +136,21 @@ services:
volumes:
- meilisearch-data:/meili_data
libretranslate:
image: libretranslate/libretranslate:latest
container_name: e_ticket_libretranslate
environment:
LT_LOAD_ONLY: fr,en,es,de,it
LT_DISABLE_WEB_UI: "true"
volumes:
- libretranslate-data:/home/libretranslate/.local
healthcheck:
test: ["CMD-SHELL", "curl -sf http://localhost:5000/languages || exit 1"]
interval: 10s
timeout: 5s
retries: 10
start_period: 120s
redisinsight:
image: redis/redisinsight:latest
container_name: e_ticket_redisinsight
@@ -151,3 +166,4 @@ volumes:
bun-modules:
vault-data:
meilisearch-data:
libretranslate-data: