======================================================================= Managing translations within CHILL using Loco as a translation provider ======================================================================= Within CHILL we make use of Symfony's translation component together with *Loco* as an external translation provider. Using this setup centralise translations in a single online location (Loco), while still allowing developers to create and update translation keys locally in the project (YAML files). Workflow ======== We use the following workflow: * Developers create translation keys in YAML files inside each bundle. * Keys are written in **English**. * Application UI defaults to **French**, with **Dutch** as an additional locale (other languages can be added in the future). * Loco acts as the central translation memory and synchronisation source. * Loco Symfony package was installed so that built-in translation commands can be used to push/pull content between Loco and the local project. Translation directory structure =============================== Each bundle contains its own ``translations`` directory, for example:: chill-bundles/ ChillCoreBundle/ translations/ messages.fr.yml messages.nl.yml ChillPersonBundle/ translations/ messages.fr.yml messages.nl.yml ... Configuration ============= The translation configuration is defined in ``config/packages/translation.yaml``:: framework: default_locale: '%env(resolve:LOCALE)%' translator: default_path: '%kernel.project_dir%/translations' fallbacks: - '%env(resolve:LOCALE)%' - 'en' providers: loco: dsn: '%env(LOCO_DSN)%' domains: [ 'messages' ] locales: [ 'fr', 'nl' ] Note: * ``en`` is the **source locale** in Loco. * ``fr`` and ``nl`` are the **application locales**. * ``domains: [messages]`` means only ``messages.*.yml`` files are pushed. Environment variables --------------------- In ``.env``:: LOCALE=fr In ``.env.local``:: LOCO_DSN="loco://API_KEY@default" Replace ``API_KEY`` with the key provided by Loco. Working with Loco ================= Loco shows all translation keys under three languages: * **English (source)** — keys are listed but remain “untranslated” * **French** — translated strings for French users * **Dutch** — translated strings for Dutch users Note: Don't add translations directly in the English column. This column simply represents the *key*. Pushing translations to Loco ============================ You can push local translations to Loco using: .. code-block:: bash symfony console translation:push loco --locales=fr --locales=nl --force This will: * Upload all French and Dutch translation values from ``*.fr.yml`` and ``*.nl.yml`` files * Ensures Loco stays in sync with local YAML files * Creates any missing keys in Loco Pulling translations from Loco ============================== When translators update strings in Loco, developers can fetch updates with: .. code-block:: bash symfony console translation:pull loco --locales=fr --locales=nl --force This will: * Download the latest French and Dutch translations * Overwrite the local YAML files with Loco’s content * Keep everything consistent across the team Adding new translation keys (Developer workflow) ================================================ 1. Add a new key directly in the appropriate YAML file, for example:: chill-bundles/ChillPersonBundle/translations/messages.fr.yml Example key:: person.form.submit: "Envoyer" 2. Add Dutch translation as well if you can (otherwise leave empty to be translated within Loco later):: person.form.submit: "Verzenden" 3. Run a push to send the new key to Loco: .. code-block:: bash symfony console translation:push loco --locales=fr --locales=nl --force 4. The key will now appear in Loco for translation management. Note: English appears as “untranslated”, because it is merely the source language