**Translation** phpList core uses the Symfony Translation component. Translation strings are extracted from the code into XLIFF catalogs and loaded via Symfony's translator service — there is no gettext/.po system involved. **Where translations live** Catalogs are stored in resources/translations/, one file per domain and locale, following Symfony's domain.locale.xlf naming convention: - messages.en.xlf — application strings (log/console messages, exception messages, email content, config descriptions, etc.) - security.en.xlf — Symfony's built-in security-related messages - validators.en.xlf — Symfony Validator constraint messages Only English (en) ships today. Adding a new language means messages..xlf (and optionally security..xlf /validators..xlf) with translated values. **Adding new strings** 1. Write the string literally inside a trans() call in code. 2. Run the extractor to regenerate the catalog: php bin/console translation:extract --force en --format=xlf This adds any new strings to messages.en.xlf. Translating to another locale means creating that locale's XLIFF file and filling in the nodes. **Translating via Weblate** Translating strings by hand isn't required — this project is configured on Weblate. Translators can work in the Weblate UI, and Weblate opens merge requests back to the repository automatically with the updated XLIFF files. New/changed source strings in messages.en.xlf are picked up by Weblate for translation into other locales.