Aller au contenu

Domain Config Language

Le module Domain Config Language ajoute la dimension langue aux surcharges de configuration par domaine fournies par Domain Config. Activez-le sur les sites multilingues qui ont besoin de surcharges variables à la fois selon le domaine et selon la langue (par exemple, un nom de site différent sur one.example.com en français et en anglais).

C'est le complément naturel de Domain Config : seul, ce dernier offre une couche de surcharges par domaine ; en y ajoutant Domain Config Language, on obtient une seconde couche indexée par couple (domain, langcode).

Quand l'activer

  • Le module language du cœur est activé.
  • Vous voulez des valeurs de configuration différentes selon le domaine et selon la langue.

Sur un site monolingue, ne l'installez pas — Domain Config seul couvre déjà les surcharges par domaine, sans tirer le module language dans votre installation.

Ce que ce module fournit

  • Drupal\domain_config_language\Config\DomainLanguageConfigFactoryOverride — service config.factory.override enregistré sous l'identifiant domain.language.config_factory_override (priorité -252).
  • Drupal\domain_config_language\Config\DomainLanguageConfigOverride — l'objet de surcharge éditable par couple (domain, langue).
  • Drupal\domain_config_language\DomainConfigLanguageManager — un décorateur du service language_manager du cœur qui résout les surcharges au runtime via la factory de surcharges par domaine et langue.

Ces classes sont marquées @internal. Le contrat stable, c'est l'identifiant de service domain.language.config_factory_override.

Stockage

Les surcharges sont stockées dans des collections de configuration Drupal nommées :

domain.{domain_id}.language.{langcode}

Le nom de la collection est construit par Drupal\domain_config_language\Config\DomainLanguageConfigCollectionUtils::createDomainLanguageConfigCollectionName(). À l'intérieur d'une collection, l'objet de configuration garde son nom d'origine — la surcharge du nom de site pour one_example_com en français est stockée comme system.site dans la collection domain.one_example_com.language.fr.

Ce format n'a pas changé avec la séparation des modules. Les sites 3.x existants migrent de façon transparente : le hook domain_config_update_10002() installe automatiquement ce sous-module lorsque le module language est déjà activé.

Comportement à l'exécution

Résolution des surcharges

Ce module enregistre un second service config.factory.override au-dessus de celui fourni par Domain Config :

  1. domain.config_factory_override (priorité -253, fourni par Domain Config) — charge la surcharge depuis la collection domain.{domain_id}.
  2. domain.language.config_factory_override (priorité -252, fourni par ce module) — charge la surcharge depuis la collection domain.{domain_id}.language.{lang_code}.

Une priorité plus élevée s'exécute plus tôt ; la surcharge par langue s'applique donc après celle par domaine et se place au sommet de la cascade :

Configuration de base (collection par défaut)
  ↓ fusionnée avec
Surcharge par domaine (collection domain.{domain_id})
  ↓ fusionnée avec
Surcharge par (domain, langue) (collection domain.{domain_id}.language.{lang_code})
  = Configuration finale au runtime

Exemple avec system.site sur le domaine two_example_com en espagnol :

# Configuration de base (collection par défaut) :
system.site:
  name: "My Site"

# Surcharge par domaine (collection domain.two_example_com) :
system.site:
  name: "Two"        # remplace "My Site" par "Two"

# Surcharge par (domain, langue) (collection domain.two_example_com.language.es) :
system.site:
  name: "Dos"        # remplace "Two" par "Dos"

# Résultat final au runtime : name = "Dos"

Mise en cache

Le service de surcharge par langue fournit un suffixe de cache qui combine l'identifiant du domaine actif avec le code de langue, de sorte qu'un objet de configuration mis en cache pour (two_example_com, es) n'est pas servi à (two_example_com, en).

Les métadonnées de cache ajoutent languages:language_interface au contexte domain existant, pour que les sorties rendues qui dépendent des surcharges par langue soient correctement variées.

Export et import de configuration

Le FileStorage de Drupal convertit les points des noms de collection en séparateurs de répertoires. En plus de la structure d'export par domaine décrite dans la documentation de Domain Config, ce module ajoute un sous-répertoire language/{langcode}/ sous chaque dossier de domaine :

config/sync/
  system.site.yml                              # Configuration de base
  domain/
    one_example_com/
      system.site.yml                          # Surcharge par domaine
      language/
        fr/
          system.site.yml                      # Surcharge par (domain, langue)
    two_example_com/
      system.site.yml
      language/
        en/
          system.site.yml
        es/
          system.site.yml

Les modules peuvent fournir des surcharges par défaut au format domaine et langue avec la même convention dans leur répertoire config/install/ :

mymodule/config/install/
  domain/
    one_example_com/
      language/
        fr/
          system.site.yml
    two_example_com/
      language/
        en/
          system.site.yml

Lorsqu'une nouvelle entité de domaine est créée ou que ce module est installé, l'appel à ConfigInstallerInterface::installCollectionDefaultConfig() de Drupal récupère ces fichiers dans la collection domain.{domain_id}.language.{langcode} correspondante.

Migration depuis la 2.x vers la 3.x

En Domain 2.x, les surcharges par langue étaient stockées dans des objets de configuration séparés, dans la collection par défaut, à côté de celles par domaine, en suivant une convention de nommage qui intégrait le code de langue dans le nom plat :

domain.config.{domain_id}.{langcode}.{config_name}

Par exemple, une surcharge en français du nom de site sur one_example_com :

domain.config.one_example_com.fr.system.site

Limitation : les surcharges par langue devaient être traitées indépendamment du système LanguageConfigOverride du cœur Drupal ; elles ne passaient par aucun pipeline standard de surcharge de configuration.

Le format 3.x unifie les deux types de surcharges sous des collections de configuration (voir Stockage plus haut pour le nom de la collection par langue). La migration vers ce format est embarquée dans domain_config_language_install() — elle s'exécute automatiquement la première fois que ce module est installé (ce qui, sur les sites en cours de mise à jour, est déclenché par domain_config_update_10002()).

La migration est réalisée par le service Drupal\domain_config_language\Service\DomainConfigMigration et couvre à la fois les surcharges par domaine (sans langcode) et celles par langue, en une seule passe :

  1. Scanne les objets de configuration hérités — détecte toutes les entrées domain.config.{domain_id}.* dans la collection par défaut.
  2. Analyse chaque nom hérité — extrait l'identifiant de domaine, le code de langue éventuel et le nom de configuration via le motif :
    /^domain\.config\.{domain_id}(?:\.([a-z]{2}))?\.([^.]+\.[^.]+)$/
    
  3. Écrit dans les collections — copie les données dans la collection domain.{domain_id} (sans langcode) ou domain.{domain_id}.language.{lang_code} (avec langcode).
  4. Met à jour le registre — si Domain Config UI est installé, met à jour le réglage overridable_configurations dans domain_config_ui.settings.
  5. Nettoie — supprime les objets domain.config.* hérités de la collection par défaut.

La migration est idempotente : sur une installation neuve sans données héritées, c'est un no-op. En cas d'échec sur un domaine, les exceptions sont collectées par domaine et remontées dans le résultat de migration.

Services

Service Classe Rôle
domain.language.config_factory_override DomainLanguageConfigFactoryOverride Surcharges par (domain, langue) (priorité -252)
domain.language_manager DomainConfigLanguageManager Décore language_manager pour intégrer les surcharges par domaine et langue
domain_config_language.config_migration DomainConfigMigration Service de migration 2.x → 3.x (interne)

Lien avec Domain Config UI

Si vous avez aussi activé Domain Config UI, installez Domain Config Language UI pour que la page d'aperçu d'administration affiche les surcharges par langue et que celles-ci soient nettoyées en même temps que la surcharge de base lors d'une suppression.