Unverified Commit a064775e authored by Stefan Auditor's avatar Stefan Auditor Committed by Stefan Auditor
Browse files

Issue #3282696 by sanduhrs: Port of l10n_community: Add theme hook, template,...

Issue #3282696 by sanduhrs: Port of l10n_community: Add theme hook, template, controllers, blocks and forms
parent 42db8a44
Loading
Loading
Loading
Loading
+40 −0
Original line number Diff line number Diff line
@@ -57,3 +57,43 @@ function template_preprocess_l10n_community_progress_columns(array &$variables)
  $variables['bar'] = $bar;
  $variables['untranslated'] = max($sum - $translated, 0);
}

/**
 * Implements hook_preprocess_page_title().
 */
function l10n_community_preprocess_page_title(&$variables) {
  $group = \Drupal::routeMatch()->getParameter('group');
  if ($group instanceof \Drupal\group\Entity\GroupInterface
      && $group->hasField('field_translation_language')) {
    if ($langcode = $group->get('field_translation_language')->first()->getValue()['target_id']) {
      $language = \Drupal::languageManager()->getLanguage($langcode);
    }
  }

  if (!$group instanceof \Drupal\group\Entity\GroupInterface
      || !$language instanceof \Drupal\Core\Language\LanguageInterface) {
    return;
  }

  $route_name = \Drupal::routeMatch()->getRouteName();
  switch ($route_name) {
    case 'entity.group.canonical':
      $group = \Drupal::routeMatch()->getParameter('group');
      $langcode = $group->get('field_translation_language')->first()->getValue()['target_id'];
      $language = \Drupal::languageManager()->getLanguage($langcode);
      if ($language) {
        $variables['title'] = t('@language overview', [
          '@language' => $language->getName(),
        ]);
      }
      break;
    case 'view.l10n_groups_ron.page_1':
      if ($language) {
        $variables['title'] = t('Board - @language', [
          '@language' => $language->getName(),
        ]);
      }
      break;
  }

}
+3 −3
Original line number Diff line number Diff line
l10n_community.welcone_page:
l10n_community.welcome_page:
  path: '/translate'
  defaults:
    _title: 'Translations'
    _title: 'Latest translation status'
    _title_callback:  '\Drupal\l10n_community\Controller\L10nCommunityWelcomePageController::title'
    _controller: '\Drupal\l10n_community\Controller\L10nCommunityWelcomePageController::build'
  requirements:
    _permission: 'access localization community'

l10n_community.explore_languages:
  path: '/translate/languages'
  defaults:
+13 −5
Original line number Diff line number Diff line
@@ -87,13 +87,19 @@ class L10nCommunityExploreLanguagesController extends ControllerBase {
      if (!$plural_formula->getFormula($language->getId())) {
        $table_rows[] = [
          [
            'data' => t($language->getName()),
            'sortdata' => t($language->getName()),
            'data' => t('@language', [
              '@language' => $language->getName(),
            ]),
            'sortdata' => t('@language', [
              '@language' => $language->getName(),
            ]),
            'class' => ['rowhead'],
          ],
          [
            'data' => t('Uninitialized plural formula. Please set up the plural formula in <a href="@language-config">the langauge configuration</a> or alternatively <a href="@import-url">import a valid interface translation</a> for Drupal in this language.', ['@import-url' => Url::fromUri('internal:/admin/structure/translate/import')->toString(), '@language-config' => Url::fromUri('internal:/admin/config/language')->toString()]
            ),
            'data' => t('Uninitialized plural formula. Please set up the plural formula in <a href="@language-config">the langauge configuration</a> or alternatively <a href="@import-url">import a valid interface translation</a> for Drupal in this language.', [
              '@import-url' => Url::fromUri('internal:/admin/structure/translate/import')->toString(),
              '@language-config' => Url::fromUri('internal:/admin/config/regional/language')->toString(),
            ]),
            'class' => ['error'],
          ],
          ['data' => ''],
@@ -115,7 +121,9 @@ class L10nCommunityExploreLanguagesController extends ControllerBase {
              ':link' => Url::fromUri('internal:/translate/languages/' . $langcode)->toString(),
              '@name' => $language->getName(),
            ]),
            'sortdata' => t($language->getName()),
            'sortdata' => t('@language', [
              '@language' => $language->getName(),
            ]),
            'class' => ['rowhead'],
          ],
          [
+67 −21
Original line number Diff line number Diff line
@@ -51,29 +51,58 @@ class L10nCommunityWelcomePageController extends ControllerBase {
    return ((@$a[$sortkey]['sortdata'] < @$b[$sortkey]['sortdata']) ? -1 : 1) * ($_GET['sort'] == 'asc' ? 1 : -1);
  }

  /**
   * Title callback.
   *
   * @return \Drupal\Core\StringTranslation\TranslatableMarkup|void
   *   Translatable markup object.
   *
   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
   */
  public function title() {
    $project_name = \Drupal::config('l10n_community.settings')
      ->get('highlighted_project');
    $projects = $entities = \Drupal::entityTypeManager()
      ->getStorage('l10n_server_project')
      ->loadByProperties(['title' => $project_name]);

    /** @var \Drupal\l10n_server\Entity\L10nServerProjectInterface $project */
    if ($project = reset($projects)) {
      return $this->t('Latest @project_name translation status', [
        '@project_name' => $project->label(),
      ]);
    }
  }

  /**
   * Builds the response.
   */
  public function build() {
    /** @var \Drupal\locale\PluralFormula $plural_formula */
    $plural_formula = \Drupal::service('locale.plural.formula');
    $config = \Drupal::configFactory()->get('l10n_community.settings');
    $config = \Drupal::config('l10n_community.settings');

    if (!$config->get('stats_enabled')) {

      $build['content'] = [
        '#type' => 'item',
        '#markup' => $this->t('Statistics for projects have been disabled.'),
      ];
      return $build;

    }
    elseif ($project_name = $config->get('highlighted_project')) {

      $entities = \Drupal::entityTypeManager()
      $projects = \Drupal::entityTypeManager()
        ->getStorage('l10n_server_project')
        ->loadByProperties(['title' => $project_name]);
      $project = reset($entities);
      if (!$project = reset($projects)) {
        $build['content'] = [
          '#type' => 'item',
          '#markup' => $this->t('Highlighted project not found.'),
        ];
        return $build;
      }

      $languages = \Drupal::languageManager()->getLanguages();

      // Check for l10n_packager, for faster queries but only on latest release.
@@ -92,13 +121,19 @@ class L10nCommunityWelcomePageController extends ControllerBase {
        if (!$plural_formula->getFormula($language->getId())) {
          $table_rows[] = [
            [
              'data' => $this->t($language->getName()),
              'sortdata' => $this->t($language->getName()),
              'data' => $this->t('@language', [
                '@language' => $language->getName(),
              ]),
              'sortdata' => $this->t('@language', [
                '@language' => $language->getName(),
              ]),
              'class' => ['rowhead'],
            ],
            [
              'data' => $this->t('Uninitialized plural formula. Please set up the plural formula in <a href="@language-config">the language configuration</a> or alternatively <a href="@import-url">import a valid interface translation</a> for Drupal in this language.', ['@import-url' => Url::fromUri('internal:/admin/structure/translate/import')->toString(), '@language-config' => Url::fromUri('internal:/admin/config/language')->toString()]
              ),
              'data' => $this->t('Uninitialized plural formula. Please set up the plural formula in <a href="@language-config">the language configuration</a> or alternatively <a href="@import-url">import a valid interface translation</a> for Drupal in this language.', [
                '@import-url' => Url::fromUri('internal:/admin/structure/translate/import')->toString(),
                '@language-config' => Url::fromUri('internal:/admin/config/regional/language/edit/' . $language->getId())->toString(),
              ]),
              'class' => ['error'],
            ],
            ['data' => ''],
@@ -120,7 +155,9 @@ class L10nCommunityWelcomePageController extends ControllerBase {
                ':link' => Url::fromUri('internal:/translate/languages/' . $langcode)->toString(),
                '@name' => $language->getName(),
              ]),
              'sortdata' => t($language->getName()),
              'sortdata' => $this->t('@language', [
                '@language' => $language->getName(),
              ]),
              'class' => ['rowhead'],
            ],
            [
@@ -140,9 +177,21 @@ class L10nCommunityWelcomePageController extends ControllerBase {
      }

      $header = [
        ['data' => $this->t('Language'), 'field' => 'language', 'class' => ['rowhead']],
        ['data' => $this->t('@project progress', ['@project' => $project->label()]), 'field' => 'progress'],
        ['data' => $this->t('Contributors'), 'field' => 'contributors'],
        [
          'data' => $this->t('Language'),
          'field' => 'language',
          'class' => ['rowhead'],
        ],
        [
          'data' => $this->t('@project progress', [
            '@project' => $project->label(),
          ]),
          'field' => 'progress',
        ],
        [
          'data' => $this->t('Contributors'),
          'field' => 'contributors',
        ],
      ];
      $build['content'] = [
        '#type' => 'table',
@@ -175,16 +224,13 @@ class L10nCommunityWelcomePageController extends ControllerBase {
          ),
        ];
      }

      return $build;
    }
    else {

    $build['content'] = [
      '#type' => 'item',
      '#markup' => $this->t('No highlighted project set.'),
    ];

    }
    return $build;
  }

+208 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\l10n_community\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
use Symfony\Component\HttpFoundation\RedirectResponse;

/**
 * Provides a Localization community UI form.
 */
class PickGoForm extends FormBase {

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'l10n_community_pick_go';
  }

  /**
   * List groups a user is a member of to help jump there.
   */
  private function pickGo() {
    /** @var \Drupal\group\GroupMembershipLoaderInterface $group_membership_loader */
    $group_membership_loader = \Drupal::service('group.membership_loader');
    $group_memberships = $group_membership_loader->loadByUser(\Drupal::currentUser()->getAccount());

    if (!empty($group_memberships)) {
      $l10n_groups = [];
      foreach ($group_memberships as $group_membership) {
        $group = $group_membership->getGroup();
        if ($group->getGroupType()->id() == 'translation') {
          $l10n_groups[$group->get('field_translation_language')->first()->getValue()['target_id']] = $this->t('<a href="@url">@name</a>', [
            '@name' => $group->label(),
            '@url' => $group->toUrl()->toString(),
          ]);
        }
      }
      if (!empty($l10n_groups)) {
        return [
          '#markup' => '<span>' . $this->formatPlural(count($l10n_groups), t('Your group'), t('Your groups')) . '</span><p>' . implode(', ', $l10n_groups) . '</p>',
          '#l10n_groups' => array_keys($l10n_groups),
        ];
      }
    }
    return NULL;
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    /** @var \Drupal\locale\PluralFormula $plural_formula */
    $plural_formula = \Drupal::service('locale.plural.formula');
    $languages = \Drupal::languageManager()->getLanguages();
    $project_count = \Drupal::entityTypeManager()
      ->getStorage('l10n_server_project')
      ->getQuery()
      ->count()
      ->execute();

    $language_list = [];
    foreach ($languages as $langcode => $language) {
      if ($plural_formula->getFormula($language->getId())) {
        $language_list[$langcode] = t("@language", [
          '@language' => $language->getName(),
        ]);
      }
    }

    if (!count($language_list) || !$project_count) {
      $pconfig_tip = '';
      if (!\Drupal::moduleHandler()->moduleExists('l10n_pconfig')) {
        $pconfig_tip = ' ' . t('The <a href="@pconfig">Plural formula configurator</a> module is recommended for plural formula setup.', [
          '@pconfig' => 'http://drupal.org/project/l10n_pconfig',
        ]);
      }
      $form['dummy'] = [
        '#markup' => t('No languages with plural formulas defined or no projects scanned yet. Check the <a href="@languages">configuration of languages</a>, <a href="@connectors">list of connectors</a> and <a href="@projects">projects</a>.', [
          '@languages' => Url::fromUri('internal:/admin/config/regional/language')->toString(),
          '@connectors' => Url::fromUri('internal:/admin/config/l10n-server/connectors')->toString(),
          '@projects' => Url::fromUri('internal:/admin/localization/projects')->toString(),
        ]) . $pconfig_tip,
      ];
      return $form;
    }

    $default_language = '';
    if (\Drupal::moduleHandler()->moduleExists('l10n_groups')) {
      // We are dealing with a groups based permission model.
      $form['groups'] = $this->pickGo();
      if (isset($form['groups']['#l10n_groups'])
          && is_array($form['groups']['#l10n_groups'])) {
        // Pick the first language as default. Most people are only member of
        // one language, so this should be a safe default.
        $default_language = current($form['groups']['#l10n_groups']);
      }
    }

    if (count($language_list) > 1) {
      // If more than one language.
      $form['langcode'] = [
        // For three or less languages, display radio buttons, select otherwise.
        '#type' => (count($language_list) <= 3) ? 'radios' : 'select',
        '#title' => $this->t('Pick a language'),
        '#options' => ['' => $this->t('All')] + $language_list,
        '#description' => $this->t('Alternatively you can <a href="@explore">explore languages</a>.', [
          '@explore' => Url::fromUri('internal:/translate/languages')->toString(),
        ]),
        '#default_value' => $default_language,
      ];
    }
    else {
      // Only one language, store as form value.
      $language_code = key($language_list);
      $language_name = $language_list[$language_code];
      $form['langcode'] = [
        '#type' => 'value',
        '#value' => $language_code,
      ];
    }

    if (count($language_list) > 1) {
      $projects_title = \Drupal::currentUser()->hasPermission('browse translations') ? t('And/or pick a project') : t('Or pick a project');
    }
    else {
      $projects_title = t('Pick a project for @language translation', [
        '@language' => $language_name,
      ]);
    }
    $form['project'] = [
      '#title' => $projects_title,
      '#description' => t('Alternatively you can <a href="@explore">explore projects</a>.', [
        '@explore' => Url::fromUri('internal:/translate/projects')->toString(),
      ]),
      '#default_value' => $form_state->getValue('project'),
    ];
    if ($project_count <= 30) {
      // Radio box widget for as much as 5 projects, select widget for 5-30
      // projects.
      $form['project']['#type'] = ($project_count <= 5 ? 'radios' : 'select');
      $form['project']['#options'] = ['' => t('All')];
      $projects = \Drupal::entityTypeManager()
        ->getStorage('l10n_server_project')
        ->loadMultiple();
      foreach ($projects as $project) {
        // Title used to conform to the autocomplete behavior.
        $form['project']['#options'][$project->label()] = $project->label();
      }
    }
    else {
      // Autocomplete field for more than 30 projects.
      $form['project'] += [
        '#type' => 'entity_autocomplete',
        '#target_type' => 'l10n_server_project',
      ];
    }

    $form['actions'] = [
      '#type' => 'actions',
    ];
    $form['actions']['submit'] = [
      '#type' => 'submit',
      '#value' => $this->t('Go there'),
    ];
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    if (empty($form_state['values']['project'])
        && empty($form_state['values']['langcode'])) {
      // We require at least one to be selected to be effective.
      $form_state->setErrorByName('langcode', $this->t('At least select a language or a project.'));
    }
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    if (!empty($form_state['values']['project']) && ($uri = l10n_community_project_uri_by_title($form_state['values']['project']))) {
      // Project surely selected, possibly with language too.
      if (!empty($form_state['values']['langcode'])) {
        if (l10n_community_access('browse translations')) {
          return new RedirectResponse(Url::fromUri('internal:/translate/languages/' . $form_state->getValue('langcode') . '/translate', ['query' => ['project' => $uri]])->toString());
        }
        else {
          // Both language and project set, no access to browse > go to project.
          return new RedirectResponse(Url::fromUri('internal:/translate/projects/' . $uri)->toString());
        }
      }
      else {
        // Only project set.
        return new RedirectResponse(Url::fromUri('internal:/translate/projects/' . $uri)->toString());
      }
    }
    elseif (!empty($form_state['values']['langcode'])) {
      // Only language set.
      return new RedirectResponse(Url::fromUri('internal:/translate/languages/' . $form_state->getValue('langcode'))->toString());
    }
  }

}
Loading