152 lines
4.9 KiB
PHP
152 lines
4.9 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @file
|
|
*/
|
|
|
|
use Drupal\Core\Entity\EntityFormInterface;
|
|
use Drupal\Core\Form\FormStateInterface;
|
|
use Drupal\Core\Language\LanguageInterface;
|
|
use Drupal\language\Entity\ContentLanguageSettings;
|
|
|
|
/**
|
|
* Processes a language select list form element.
|
|
*
|
|
* @param array $element
|
|
* The form element to process.
|
|
*
|
|
* @return array
|
|
* The processed form element.
|
|
*/
|
|
function language_process_language_select($element) {
|
|
// Don't set the options if another module (translation for example) already
|
|
// set the options.
|
|
if (!isset($element['#options'])) {
|
|
$element['#options'] = [];
|
|
foreach (\Drupal::languageManager()->getLanguages($element['#languages']) as $langcode => $language) {
|
|
$element['#options'][$langcode] = $language->isLocked() ? t('- @name -', ['@name' => $language->getName()]) : $language->getName();
|
|
}
|
|
}
|
|
return $element;
|
|
}
|
|
|
|
/**
|
|
* Submit handler for the forms that have a language_configuration element.
|
|
*/
|
|
function language_configuration_element_submit(&$form, FormStateInterface $form_state): void {
|
|
// Iterate through all the language_configuration elements and save their
|
|
// values.
|
|
// In case we are editing a bundle, we must check the new bundle name,
|
|
// because e.g. hook_ENTITY_update fired before.
|
|
if ($language = $form_state->get('language')) {
|
|
foreach ($language as $element_name => $values) {
|
|
$entity_type_id = $values['entity_type'];
|
|
$bundle = $values['bundle'];
|
|
$form_object = $form_state->getFormObject();
|
|
if ($form_object instanceof EntityFormInterface) {
|
|
/** @var \Drupal\Core\Entity\EntityFormInterface $form_object */
|
|
$entity = $form_object->getEntity();
|
|
if ($entity->getEntityType()->getBundleOf()) {
|
|
$bundle = $entity->id();
|
|
$language[$element_name]['bundle'] = $bundle;
|
|
}
|
|
}
|
|
$config = ContentLanguageSettings::loadByEntityTypeBundle($entity_type_id, $bundle);
|
|
$config->setDefaultLangcode($form_state->getValue([$element_name, 'langcode']));
|
|
$config->setLanguageAlterable($form_state->getValue([$element_name, 'language_alterable']));
|
|
$config->save();
|
|
|
|
// Set the form_state language with the updated bundle.
|
|
$form_state->set('language', $language);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns the default language code assigned to an entity type and a bundle.
|
|
*
|
|
* @param string $entity_type
|
|
* The entity type.
|
|
* @param string $bundle
|
|
* The bundle name.
|
|
*
|
|
* @return string
|
|
* The language code.
|
|
*/
|
|
function language_get_default_langcode($entity_type, $bundle) {
|
|
$configuration = ContentLanguageSettings::loadByEntityTypeBundle($entity_type, $bundle);
|
|
|
|
$default_value = NULL;
|
|
$language_interface = \Drupal::languageManager()->getCurrentLanguage();
|
|
switch ($configuration->getDefaultLangcode()) {
|
|
case LanguageInterface::LANGCODE_SITE_DEFAULT:
|
|
$default_value = \Drupal::languageManager()->getDefaultLanguage()->getId();
|
|
break;
|
|
|
|
case 'current_interface':
|
|
$default_value = $language_interface->getId();
|
|
break;
|
|
|
|
case 'authors_default':
|
|
$user = \Drupal::currentUser();
|
|
$language_code = $user->getPreferredLangcode();
|
|
if (!empty($language_code)) {
|
|
$default_value = $language_code;
|
|
}
|
|
else {
|
|
$default_value = $language_interface->getId();
|
|
}
|
|
break;
|
|
}
|
|
if ($default_value) {
|
|
return $default_value;
|
|
}
|
|
|
|
// If we still do not have a default value, just return the value stored in
|
|
// the configuration; it has to be an actual language code.
|
|
return $configuration->getDefaultLangcode();
|
|
}
|
|
|
|
/**
|
|
* Update the list of prefixes from the installed languages.
|
|
*/
|
|
function language_negotiation_url_prefixes_update(): void {
|
|
$config = \Drupal::configFactory()->getEditable('language.negotiation');
|
|
$prefixes = $config->get('url.prefixes');
|
|
foreach (\Drupal::languageManager()->getLanguages() as $language) {
|
|
// The prefix for this language should be updated if it's not assigned yet
|
|
// or the prefix is set to the empty string.
|
|
if (empty($prefixes[$language->getId()])) {
|
|
// For the default language, set the prefix to the empty string,
|
|
// otherwise use the langcode.
|
|
$prefixes[$language->getId()] = $language->isDefault() ? '' : $language->getId();
|
|
}
|
|
// Otherwise we keep the configured prefix.
|
|
}
|
|
$config->set('url.prefixes', $prefixes)->save(TRUE);
|
|
}
|
|
|
|
/**
|
|
* Implements hook_preprocess_HOOK() for block templates.
|
|
*/
|
|
function language_preprocess_block(&$variables): void {
|
|
if ($variables['configuration']['provider'] == 'language') {
|
|
$variables['attributes']['role'] = 'navigation';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns language mappings between browser and Drupal language codes.
|
|
*
|
|
* @return array
|
|
* An array containing browser language codes as keys with corresponding
|
|
* Drupal language codes as values.
|
|
*/
|
|
function language_get_browser_drupal_langcode_mappings() {
|
|
$config = \Drupal::config('language.mappings');
|
|
if ($config->isNew()) {
|
|
return [];
|
|
}
|
|
return $config->get('map');
|
|
}
|