web-dev-qa-db-fra.com

Comment traduire des éléments de menu avec migrate?

J'importe des éléments de menu depuis CSV en utilisant migrate, migrate_tools, migrate_plus et migrate_source_csv.

Voici un exemple de la façon dont je le fais pour la langue d'origine:

source:
  plugin: csv
  path: 'private://init/links_gl.csv'
  delimiter: ','
  Enclosure: '"'
  header_row_count: 1
  keys:
    - id
  column_names:
    0:
      id: id
    1:
      source_id: source_id
    2:
      parent_id: parent_id
    3:
      menu_name: menu_name
    4:
      weight: weight
    5:
      title: title

  constants:
    path: 'entity:node/'

ids:
  id:
    type: string

process:
  title: title
  menu_name: menu_name
  nid:
    plugin: bbaa_migration_lookup
    migration: init_contents_gl
    source: source_id
  'link/uri':
    plugin: bbaa_concat
    source:
      - constants/path
      - '@nid'
  parent:
    plugin: menu_link_parent
    source:
      - parent_id
      - '@menu_name'
  external:
    plugin: default_value
    default_value: 0
  expanded:
    plugin: default_value
    default_value: 1
  enabled:
    plugin: default_value
    default_value: 1
  langcode:
    plugin: default_value
    default_value: 'gl'
  weight: weight

destination:
  plugin: entity:menu_link_content
  bundle: menu_link_content
  no_stub: true

Cela fonctionne, mais maintenant je dois importer un autre fichier CSV avec des éléments de menu traduits.

J'ai créé une autre configuration de migration pour la langue traduite et j'ai essayé d'ajouter ce code:

  id:
    plugin: migration
    source: id
    migration: init_links_gl
  content_translation_source:
    plugin: default_value
    default_value: 'gl'
  langcode:
    plugin: default_value
    default_value: 'es'

destination:
  plugin: entity:menu_link_content
  translations: true
  no_stub: true

Mais ça ne marche pas.

Comment traduire des éléments de menu avec migrate?

1
ilazgo

Je ne vois rien de mal à l'évidence dans votre code, mais il aurait été préférable de publier les 2 exemples complets (et idéalement, vous devriez d'abord essayer un exemple simple qui peut être importé sans plugins personnalisés)

Notez que pour le deuxième fichier YML (la traduction), vous n'avez pas besoin d'importer la plupart des éléments: vous devez essentiellement traiter le id, le parent et le title, pas besoin de nid ou 'link/uri'.

Comme la documentation à ce sujet est rare, je publie un exemple de travail (en utilisant JSON, pas CSV).

YML pour la première migration:

id: menu
label: JSON feed of menu links
migration_group: menu
source:
  plugin: url
  data_fetcher_plugin: file
  data_parser_plugin: json
  urls:
    - modules/custom/migrate_custom/artifacts/menu_en.json
  item_selector: data
  fields:
    -
      name: mlid
      label: 'Unique Id coming from API'
      selector: id
    -
      name: country_migration_id
      label: 'Unique Country Id coming from API. Used to create the relation with the nodes'
      selector: country_migration_id
    -
      name: name
      label: 'Country name'
      selector: name
    -
      name: parent_id
      label: 'Parent menu link id'
      selector: parent
  constants:
    path: 'entity:node/'
  ids:
    mlid:
      type: string
process:
  menu_name:
    plugin: default_value
    default_value: 'main'
  nid:
    plugin: migration_lookup
    migration:
      - country
    source_ids:
      country:
        - country_migration_id
  title:
    plugin: get
    source: name
    language: 'en'
  'link/uri':
    plugin: concat
    source:
      - constants/path
      - '@nid'
  parent:
    plugin: menu_link_parent
    source:
       - parent_id
       - 'main'
  external:
    plugin: default_value
    default_value: 0
  expanded:
    plugin: default_value
    default_value: 0
  enabled:
    plugin: default_value
    default_value: 1
  langcode:
    plugin: default_value
    default_value: 'en'
destination:
  plugin: entity:menu_link_content
  bundle: menu_link_content
  no_stub: true
migration_dependencies:
  required:
    - country
dependencies:
  enforced:
    module:
      - migrate_custom

Fichier YML à traduire:

id: menu_ca
label: JSON feed of menu links (Catalan)
migration_group: menu
source:
  plugin: url
  data_fetcher_plugin: file
  data_parser_plugin: json
  urls:
    - modules/custom/migrate_custom/artifacts/menu_ca.json
  item_selector: data
  fields:
    -
      name: mlid
      label: 'Unique Id coming from API. Used to match the original language of the menu links'
      selector: id
    -
      name: name
      label: 'Country name'
      selector: name
    -
      name: parent_id
      label: 'Parent menu link id'
      selector: parent
  ids:
    mlid:
      type: string
process:
  menu_name:
    plugin: default_value
    default_value: 'main'
  id:
    plugin: migration_lookup
    migration:
      - menu
    source_ids:
      menu:
        - mlid
  title:
    plugin: get
    source: name
    language: 'ca'
  parent:
    plugin: menu_link_parent
    source:
       - parent_id
       - 'main'
  external:
    plugin: default_value
    default_value: 0
  expanded:
    plugin: default_value
    default_value: 0
  enabled:
    plugin: default_value
    default_value: 1
  langcode:
    plugin: default_value
    default_value: 'ca'
destination:
  plugin: entity:menu_link_content
  bundle: menu_link_content
  no_stub: true
  translations: true
migration_dependencies:
  required:
    - country
    - menu
dependencies:
  enforced:
    module:
      - migrate_custom

menu_en.json:

{
    "data": [{
        "id": "1_CHE",
        "country_migration_id": "CHE",
        "name": "Switzerland",
        "parent": 0
    }]
}

menu_ca.json:

{
    "data": [{
        "id": "1_CHE",
        "country_migration_id": "CHE",
        "name": "Suïssa",
        "parent": 0
    }]
}
1
Pere