local_translation-8.x-1.x-dev/modules/local_translation_interface/src/LocalTranslationInterfaceLanguagesTrait.php

modules/local_translation_interface/src/LocalTranslationInterfaceLanguagesTrait.php
<?php

namespace Drupal\local_translation_interface;

use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\Session\AccountProxyInterface;
use Drupal\Core\State\StateInterface;
use Drupal\local_translation\Services\LocalTranslationUserSkills;
use Drupal\locale\StringStorageInterface;
use Drupal\user\Entity\User;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Trait LocalTranslationInterfaceLanguagesTrait.
 *
 * We are using this trait in TranslateEditForm and TranslateFilterForm
 * classes' children only.
 *
 * @see \Drupal\local_translation_interface\Form\TranslateEditForm
 * @see \Drupal\local_translation_interface\Form\TranslateFilterForm
 *
 * @package Drupal\local_translation_interface
 */
trait LocalTranslationInterfaceLanguagesTrait {

  /**
   * User registered languages list.
   *
   * @var array
   */
  protected $userRegisteredSkills = [];
  /**
   * Local translation skills service.
   *
   * @var \Drupal\local_translation\Services\LocalTranslationUserSkills
   */
  protected $userSkillsService;
  /**
   * Current user account.
   *
   * @var \Drupal\Core\Session\AccountProxyInterface
   */
  protected $currentUser;

  /**
   * {@inheritdoc}
   */
  public function __construct(
    StringStorageInterface $locale_storage,
    StateInterface $state,
    LanguageManagerInterface $language_manager,
    AccountProxyInterface $current_user,
    LocalTranslationUserSkills $skills
  ) {
    $this->languageManager   = $language_manager;
    $this->localeStorage     = $locale_storage;
    $this->currentUser       = $current_user;
    $this->userSkillsService = $skills;
    $this->state             = $state;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('locale.storage'),
      $container->get('state'),
      $container->get('language_manager'),
      $container->get('current_user'),
      $container->get('local_translation.user_skills')
    );
  }

  /**
   * {@inheritdoc}
   */
  protected function translateFilters() {
    // We are using this trait in TranslateEditForm and TranslateFilterForm
    // classes' children only.
    $filters = parent::translateFilters();

    // Get languages by registered skills.
    $languages = $this->getLanguagesBySkills();

    // Update filters array.
    $filters['langcode_from'] = [
      'title'   => $this->t('From language'),
      'options' => $languages['from'],
      'default' => !empty($languages['from']) ? key($languages['from']) : NULL,
    ];
    // Langcode will mean "langcode_to",
    // to prevent bugs with data selection it should be named as "langcode".
    $filters['langcode'] = [
      'title'   => $this->t('To language'),
      'options' => $languages['to'],
      'default' => !empty($languages['to']) ? key($languages['to']) : NULL,
    ];

    return $filters;
  }

  /**
   * Get languages from/to array using local translation skills values.
   *
   * @return array
   *   Languages from/to array.
   */
  protected function getLanguagesBySkills() {
    // Set defaults to prevent error if user has no skills.
    $languages = ['from' => [], 'to' => []];
    if (!$this->userSkillsService->getSkills()) {
      $this->userSkillsService->showEmptyMessage();
    }
    // Add registered languages to the top of the list.
    $this->addRegisteredLanguages($languages);
    // Add all other languages to the available options
    // if user has core's permission to translate interface.
    /** @var \Drupal\Core\Session\AccountInterface $current_user */
    $current_user = $this->currentUser();
    if ($current_user->hasPermission('translate interface')) {
      $this->appendOtherLanguages($languages);
    }
    // Remove English option if an appropriate option has not been enabled.
    $this->processEnglishInterfaceTranslation($languages);
    $languages['from']['en'] = 'English';
    return $languages;
  }

  /**
   * Add registered languages to the options list.
   *
   * @param array $languages
   *   Languages list.
   */
  protected function addRegisteredLanguages(array &$languages = []) {
    /** @var \Drupal\Core\Form\FormBase $this */
    $field_name = $this->config('local_translation.settings')
      ->get('field_name');
    /** @var \Drupal\user\Entity\User $user */
    $user = User::load($this->currentUser->id());
    $language_manager = $this->languageManager;
    if ($user->hasField($field_name)) {
      $combinations = $user->get($field_name);
      if (!$combinations->isEmpty()) {
        $combinations = $combinations->getValue();
        foreach ($combinations as $combination) {
          $language = $language_manager->getLanguage($combination['language_from']);
          $languages['from'][$language->getId()] = $language->getName();
          $language = $language_manager->getLanguage($combination['language_to']);
          $languages['to'][$language->getId()] = $language->getName();
        }
      }
    }
    if ($user->hasPermission('translate interface text into registered languages')
      && $user->hasPermission('translate interface')
    ) {
      $this->userRegisteredSkills = $languages;
    }
  }

  /**
   * Append all languages to the list.
   *
   * @param array &$languages
   *   Languages list.
   */
  protected function appendOtherLanguages(array &$languages) {
    $languages_list = $this->languageManager->getNativeLanguages();
    foreach ($languages_list as $lang) {
      foreach (['from', 'to'] as $type) {
        if (!isset($languages[$type][$lang->getId()])) {
          $languages[$type][$lang->getId()] = $lang->getName();
        }
      }
    }
  }

  /**
   * Process English translation options.
   *
   * @param array &$languages
   *   Languages array.
   */
  protected function processEnglishInterfaceTranslation(array &$languages) {
    if (!$this->isTranslateToEnglishEnabled()) {
      if (isset($languages['to']['en'])) {
        unset($languages['to']['en']);
      }
    }
  }

  /**
   * Check if the interface translation option is enabled for English.
   *
   * @return bool
   *   TRUE - if enabled, FALSE otherwise.
   */
  protected function isTranslateToEnglishEnabled() {
    return (bool) $this->config('locale.settings')->get('translate_english');
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc