Au cours des derniers jours j'ai essayé de migrer un fichier CSV multilingue vers Drupal 8 sans succès, donc finalement j'ai décidé d'utiliser un Batch Process pour accomplir la tâche.
En ce moment, le processus par lots fonctionne, mais à ce stade, je dois créer mes nœuds et créer la traduction. Alors, comment créer un nœud multilingue par programmation?
Heureusement, j'ai trouvé un article nommé Créer et traduire par programmation un nœud multilingue.
Et voici le code avec quelques commentaires:
use Drupal\node\Entity\Node;
$node = Node::create([
// The node entity bundle in this case article.
'type' => 'article',
//The base language
'langcode' => 'en',
'created' => \Drupal::time()->getRequestTime(),
'changed' => \Drupal::time()->getRequestTime(),
// The user ID.
'uid' => 1,
'title' => 'My test!',
//If you have another field lets says field_day you can do this:
//'field_day' => 'value',
'body' => [
'summary' => '',
'value' => '<p>The body of my node.</p>',
'format' => 'full_html',
],
]);
//Saving the node
$node->save();
//This line is not necessary
\Drupal::service('path.alias_storage')->save("/node/" . $node->id(), "/my/path", "en");
//Creating the translation Spanish in this case
$node_es = $node->addTranslation('es');
$node_es->title = 'Mi prueba!';
$node_es->body->value = '<p>El cuerpo de mi nodo.</p>';
$node_es->body->format = 'full_html';
//Saving the node
$node_es->save();
//This line is not necessary
\Drupal::service('path.alias_storage')->save("/node/" . $node->id(), "/mi/ruta", "es");
Je réfléchissais à ce problème dans Drupal 8. Voici comment je l'ai finalement fait, ce code copie le titre, le corps, tous les champs et le paramètre pathauto. Je suis sûr qu'il y a de la place à améliorer ici, car certains champs méta doivent probablement être traités également. Mais cela devrait vous aider à démarrer!
// This assumes you have a $node variable that contains the node translation you're starting with
$node_trans = $node->addTranslation('en-au'); // sample using Australian English
$node_trans->setTitle($node->getTitle());
$node_trans_fields = $node->getTranslatableFields();
foreach ($node_trans_fields as $name => $field) {
if (substr($name, 0, 6) == 'field_' || in_array($name, ['body', 'path', 'title'])) {
$node_trans->set($name, $field->getValue());
}
}
try {
$node->save();
}
catch (\Exception $error) {
$add_status .= 'ERROR saving ';
}
La dernière partie de la réponse d'Adrian n'a pas fonctionné pour moi.
Pour la partie traduction, utilisez:
$node->addTranslation('es', ['title' => "Translate title"])->save();