Add content translations for site_sections taxonomy terms

Taxonomy term names are content, not interface strings, so .po files
don't translate them. This adds programmatic content translations via
the ContentLanguageSettings API and addTranslation/setName on each term.

- Add _structural_pages_term_translations() with pt-br name map
- Add _structural_pages_add_term_translations() to create/update translations
- Add _structural_pages_ensure_content_translation() using ContentLanguageSettings API
- Add config/optional for new installs with content_translation enabled
- Remove term name entries from .po file (ineffective for content)
- Add update hook 10004 to fix existing installations

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-05 12:41:02 -03:00
parent 24799e9c49
commit ba3087e6eb
3 changed files with 151 additions and 85 deletions

View File

@@ -73,6 +73,8 @@ function _structural_pages_create_default_terms(): void {
'IT Services' => [],
];
$created_terms = [];
$weight = 0;
foreach ($terms_structure as $parent_name => $children) {
// Create parent term.
@@ -82,6 +84,7 @@ function _structural_pages_create_default_terms(): void {
'weight' => $weight++,
]);
$parent_term->save();
$created_terms[] = $parent_term;
// Create child terms.
$child_weight = 0;
@@ -93,8 +96,96 @@ function _structural_pages_create_default_terms(): void {
'weight' => $child_weight++,
]);
$child_term->save();
$created_terms[] = $child_term;
}
}
// Add content translations if available.
_structural_pages_add_term_translations($created_terms);
}
/**
* Adds content translations to taxonomy terms.
*
* @param \Drupal\taxonomy\Entity\Term[] $terms
* The terms to translate.
*/
function _structural_pages_add_term_translations(array $terms): void {
if (!\Drupal::moduleHandler()->moduleExists('content_translation')) {
return;
}
$translations = _structural_pages_term_translations();
$language_manager = \Drupal::languageManager();
foreach ($translations as $langcode => $name_map) {
if (!$language_manager->getLanguage($langcode)) {
continue;
}
foreach ($terms as $term) {
$name = $term->getName();
if (!isset($name_map[$name])) {
continue;
}
$translated_name = $name_map[$name];
if ($term->hasTranslation($langcode)) {
// Update existing translation if name doesn't match.
$translation = $term->getTranslation($langcode);
if ($translation->getName() !== $translated_name) {
$translation->setName($translated_name);
$translation->save();
}
}
else {
$term->addTranslation($langcode, ['name' => $translated_name]);
$term->save();
}
}
}
}
/**
* Returns term name translations keyed by langcode.
*
* @return array
* Nested array: langcode => [english_name => translated_name].
*/
function _structural_pages_term_translations(): array {
return [
'pt-br' => [
'News' => 'Notícias',
'Events' => 'Eventos',
'People' => 'Pessoas',
'Institutional' => 'Institucional',
'About' => 'Sobre',
'Communication' => 'Comunicação',
'Information and Services' => 'Informações e Serviços',
'Team' => 'Equipe',
'Management' => 'Gestão',
'Inclusion and Belonging' => 'Inclusão e Pertencimento',
'Undergraduate' => 'Graduação',
'Statistics' => 'Estatística',
'Mathematics' => 'Matemática',
'Applied Mathematics' => 'Matemática Aplicada',
'Mathematics Teaching' => 'Licenciatura em Matemática',
'Graduate' => 'Pós-Graduação',
'Statistics Program' => 'Programa de Estatística',
'Mathematics Program' => 'Programa de Matemática',
'Applied Mathematics Program' => 'Programa de Matemática Aplicada',
'Research' => 'Pesquisa',
'Extension' => 'Extensão',
'Administration' => 'Administração',
'Departments' => 'Departamentos',
'Statistics Department' => 'Departamento de Estatística',
'Mathematics Department' => 'Departamento de Matemática',
'Applied Mathematics Department' => 'Departamento de Matemática Aplicada',
'Library' => 'Biblioteca',
'IT Services' => 'Informática',
],
];
}
/**
@@ -186,6 +277,49 @@ function structural_pages_update_10001(): void {
}
}
/**
* Add content translations to site_sections taxonomy terms (no-op, see 10003).
*/
function structural_pages_update_10002(): void {
}
/**
* Add content translations to site_sections taxonomy terms (no-op, see 10004).
*/
function structural_pages_update_10003(): void {
}
/**
* Fix content translation config and update site_sections term translations.
*/
function structural_pages_update_10004(): void {
// Ensure content translation is properly configured for the vocabulary.
_structural_pages_ensure_content_translation();
$terms = \Drupal::entityTypeManager()
->getStorage('taxonomy_term')
->loadByProperties(['vid' => 'site_sections']);
if ($terms) {
_structural_pages_add_term_translations($terms);
}
}
/**
* Ensures content translation settings exist for site_sections vocabulary.
*/
function _structural_pages_ensure_content_translation(): void {
if (!\Drupal::moduleHandler()->moduleExists('content_translation')) {
return;
}
$config = \Drupal\language\Entity\ContentLanguageSettings::loadByEntityTypeBundle('taxonomy_term', 'site_sections');
$config->setDefaultLangcode('site_default');
$config->setLanguageAlterable(TRUE);
$config->setThirdPartySetting('content_translation', 'enabled', TRUE);
$config->save();
}
/**
* Implements hook_requirements().
*/