Add to file src/Entity/MyEntity.php
/**
* Defines the my entity class.
*
* @ContentEntityType(
...
* data_table = "my_entity_field_data",
* translatable = TRUE,
...
* entity_keys = {
...
* "langcode" = "langcode"
* },
...
* )
*/
Add ->setTranslatable(TRUE) to baseFieldDefinitions. For example
$fields['title'] = BaseFieldDefinition::create('string')
->setLabel(\t('Title'))
->setDescription(\t('The title of the media gallery entity.'))
->setRequired(TRUE)
->setSetting('max_length', 255)
->setDisplayOptions('form', [
'type' => 'string_textfield',
'weight' => 0,
])
->setDisplayConfigurable('form', TRUE)
->setDisplayOptions('view', [
'label' => 'hidden',
'type' => 'string',
'weight' => 0,
])
->setTranslatable(TRUE)
->setDisplayConfigurable('view', TRUE);
If you have existing content of your entity, you need to create hook_update in your my_entity.install file
/**
* Make my entity translatable.
*/
function my_entity_update_8102(&$sandbox) {
$definition_update_manager = \Drupal::entityDefinitionUpdateManager();
$entity_type = $definition_update_manager->getEntityType('my_entity');
if ($entity_type) {
$langcode = BaseFieldDefinition::create('language')
->setLabel(t('Language code'))
->setDescription(t('The language code.'))
->setTranslatable(TRUE);
$definition_update_manager->installFieldStorageDefinition('langcode', $entity_type->id(), 'my_entity', $langcode);
$keys = $entity_type->getKeys();
$keys['langcode'] = 'langcode';
$entity_type->set('entity_keys', $keys);
$entity_type->set('translatable', TRUE);
$definition_update_manager->updateFieldableEntityType($entity_type, \Drupal::service('entity_field.manager')->getFieldStorageDefinitions('my_entity'), $sandbox);
}
}
Run update.php
Go to /admin/config/regional/content-language and enable checkbox for your entity
Now you can translate your entity