--- /dev/null
+<?php
+
+/**
+ * @file
+ * Simulate a custom module with a local po file.
+ */
+
+use Drupal\Core\Extension\Extension;
+use Drupal\Core\StreamWrapper\PublicStream;
+
+/**
+ * Implements hook_system_info_alter().
+ *
+ * Make the test scripts to be believe this is not a hidden test module, but
+ * a regular custom module.
+ */
+function locale_test_system_info_alter(&$info, Extension $file, $type) {
+ // Only modify the system info if required.
+ // By default the locale_test modules are hidden and have a project specified.
+ // To test the module detection process by locale_project_list() the
+ // test modules should mimic a custom module. I.e. be non-hidden.
+ if (\Drupal::state()->get('locale.test_system_info_alter')) {
+ if ($file->getName() == 'locale_test' || $file->getName() == 'locale_test_translate') {
+ // Don't hide the module.
+ $info['hidden'] = FALSE;
+ }
+ }
+}
+
+/**
+ * Implements hook_locale_translation_projects_alter().
+ *
+ * The translation status process by default checks the status of the installed
+ * projects. This function replaces the data of the installed modules by a
+ * predefined set of modules with fixed file names and release versions. Project
+ * names, versions, timestamps etc must be fixed because they must match the
+ * files created by the test script.
+ *
+ * The "locale.test_projects_alter" state variable must be set by the
+ * test script in order for this hook to take effect.
+ */
+function locale_test_locale_translation_projects_alter(&$projects) {
+ // Drupal core should not be translated. By overriding the server pattern we
+ // make sure that no translation for drupal core will be found and that the
+ // translation update system will not go out to l.d.o to check.
+ $projects['drupal']['server_pattern'] = 'translations://';
+
+ if (\Drupal::state()->get('locale.remove_core_project')) {
+ unset($projects['drupal']);
+ }
+
+ if (\Drupal::state()->get('locale.test_projects_alter')) {
+
+ // Instead of the default ftp.drupal.org we use the file system of the test
+ // instance to simulate a remote file location.
+ $url = \Drupal::url('<front>', [], ['absolute' => TRUE]);
+ $remote_url = $url . PublicStream::basePath() . '/remote/';
+
+ // Completely replace the project data with a set of test projects.
+ $projects = [
+ 'contrib_module_one' => [
+ 'name' => 'contrib_module_one',
+ 'info' => [
+ 'name' => 'Contributed module one',
+ 'interface translation server pattern' => $remote_url . '%core/%project/%project-%version.%language._po',
+ 'package' => 'Other',
+ 'version' => '8.x-1.1',
+ 'project' => 'contrib_module_one',
+ 'datestamp' => '1344471537',
+ '_info_file_ctime' => 1348767306,
+ ],
+ 'datestamp' => '1344471537',
+ 'project_type' => 'module',
+ 'project_status' => TRUE,
+ ],
+ 'contrib_module_two' => [
+ 'name' => 'contrib_module_two',
+ 'info' => [
+ 'name' => 'Contributed module two',
+ 'interface translation server pattern' => $remote_url . '%core/%project/%project-%version.%language._po',
+ 'package' => 'Other',
+ 'version' => '8.x-2.0-beta4',
+ 'project' => 'contrib_module_two',
+ 'datestamp' => '1344471537',
+ '_info_file_ctime' => 1348767306,
+ ],
+ 'datestamp' => '1344471537',
+ 'project_type' => 'module',
+ 'project_status' => TRUE,
+ ],
+ 'contrib_module_three' => [
+ 'name' => 'contrib_module_three',
+ 'info' => [
+ 'name' => 'Contributed module three',
+ 'interface translation server pattern' => $remote_url . '%core/%project/%project-%version.%language._po',
+ 'package' => 'Other',
+ 'version' => '8.x-1.0',
+ 'project' => 'contrib_module_three',
+ 'datestamp' => '1344471537',
+ '_info_file_ctime' => 1348767306,
+ ],
+ 'datestamp' => '1344471537',
+ 'project_type' => 'module',
+ 'project_status' => TRUE,
+ ],
+ 'locale_test' => [
+ 'name' => 'locale_test',
+ 'info' => [
+ 'name' => 'Locale test',
+ 'interface translation project' => 'locale_test',
+ 'interface translation server pattern' => 'core/modules/locale/tests/test.%language.po',
+ 'package' => 'Other',
+ 'version' => NULL,
+ 'project' => 'locale_test',
+ '_info_file_ctime' => 1348767306,
+ 'datestamp' => 0,
+ ],
+ 'datestamp' => 0,
+ 'project_type' => 'module',
+ 'project_status' => TRUE,
+ ],
+ 'custom_module_one' => [
+ 'name' => 'custom_module_one',
+ 'info' => [
+ 'name' => 'Custom module one',
+ 'interface translation project' => 'custom_module_one',
+ 'interface translation server pattern' => 'translations://custom_module_one.%language.po',
+ 'package' => 'Other',
+ 'version' => NULL,
+ 'project' => 'custom_module_one',
+ '_info_file_ctime' => 1348767306,
+ 'datestamp' => 0,
+ ],
+ 'datestamp' => 0,
+ 'project_type' => 'module',
+ 'project_status' => TRUE,
+ ],
+ ];
+ }
+}
+
+/**
+ * Implements hook_language_fallback_candidates_OPERATION_alter().
+ */
+function locale_test_language_fallback_candidates_locale_lookup_alter(array &$candidates, array $context) {
+ \Drupal::state()->set('locale.test_language_fallback_candidates_locale_lookup_alter_candidates', $candidates);
+ \Drupal::state()->set('locale.test_language_fallback_candidates_locale_lookup_alter_context', $context);
+}
+
+/**
+ * Implements hook_theme().
+ */
+function locale_test_theme() {
+ $return = [];
+
+ $return['locale_test_tokenized'] = [
+ 'variable' => ['content' => ''],
+ ];
+
+ return $return;
+}
+
+/**
+ * Implements hook_token_info().
+ */
+function locale_test_token_info() {
+ $info = [];
+
+ $info['types']['locale_test'] = [
+ 'name' => t('Locale test'),
+ 'description' => t('Locale test'),
+ ];
+
+ $info['tokens']['locale_test']['security_test1'] = [
+ 'type' => 'text',
+ 'name' => t('Security test 1'),
+ ];
+ $info['tokens']['locale_test']['security_test2'] = [
+ 'type' => 'text',
+ 'name' => t('Security test 2'),
+ ];
+
+ return $info;
+}
+
+/**
+ * Implements hook_tokens().
+ */
+function locale_test_tokens($type, $tokens, array $data = [], array $options = []) {
+ $return = [];
+ if ($type == 'locale_test') {
+ foreach ($tokens as $name => $original) {
+ switch ($name) {
+ case 'security_test1':
+ $return[$original] = "javascript:alert('Mooooh!');";
+ break;
+ case 'security_test2':
+ $return[$original] = "<script>alert('Mooooh!');</script>";
+ break;
+ }
+ }
+ }
+
+ return $return;
+}