src/Controller/TranslationController.php line 80

  1. <?php
  2. namespace App\Controller;
  3. use App\Form\TerlaterieSearchType;
  4. use App\Form\TerlaterieWcaKeysType;
  5. use App\Service\ProjectService;
  6. use App\Service\RecursiveArraySearch;
  7. use App\Service\TranslationDataGenerator;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\Finder\Finder;
  10. use Symfony\Component\Form\FormFactoryInterface;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Intl\Languages;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use Symfony\Component\Yaml\Yaml;
  16. class TranslationController extends AbstractController
  17. {
  18.     #[Route(
  19.         path: '/{_locale}/terlaterie/encerche/wca-keys',
  20.         name: 'terlaterie_encerche_wca_keys',
  21.     )]
  22.     public function terlaterieEncercheWcaKeys(Request $request, FormFactoryInterface $formFactory): Response
  23.     {
  24.         $form = $formFactory->create(TerlaterieWcaKeysType::class);
  25.         $translations = [];
  26.         $finder = new Finder();
  27.         $languageFiles = $finder->in('../data/translation_sources/wca')->files()->name("*.yml");
  28.         $search = '';
  29.         $form->handleRequest($request);
  30.         if ($form->isSubmitted() && $form->isValid()) {
  31.             $stringArray = explode(' navigate_next ', $form->getData()['string']);
  32.             if (count($stringArray) < 2) {
  33.                 $stringArray = explode(' > ', $form->getData()['string']);
  34.                 if (count($stringArray) < 2) {
  35.                     $stringArray = explode(' ', $form->getData()['string']);
  36.                 }
  37.             }
  38.             $search = implode(' > ', $stringArray);
  39.             foreach ($languageFiles as $file) {
  40.                 $language = $file->getFilenameWithoutExtension();
  41.                 $stringArray[0] = $language;
  42.                 $data = Yaml::parse($file->getContents());
  43.                 foreach ($stringArray as $ymlKey) {
  44.                     if (!array_key_exists($ymlKey, $data)) {
  45.                         $data = '';
  46.                         break;
  47.                     }
  48.                     $data = $data[$ymlKey];
  49.                 }
  50.                 // lanquages of the wca are like fr-CA but symfony uses the format fr_CA
  51.                 $language = str_replace('-', '_', $language);
  52.                 $originalLanguageName = Languages::getName($language, $language);
  53.                 $languageName = Languages::getName($language);
  54.                 $translations[$language]['originalName'] = $originalLanguageName;
  55.                 $translations[$language]['translatedName'] = $languageName;
  56.                 $translations[$language]['data'] = is_string($data) ? $data : '';
  57.             }
  58.             ksort($translations);
  59.         }
  60.         return $this->render('terlaterie_wca_keys.html.twig', [
  61.             'form' => $form,
  62.             'translations' => $translations,
  63.             'search_string' => $search
  64.         ]);
  65.     }
  66.     #[Route(
  67.         path: '/{_locale}/terlaterie/encerche/projits',
  68.         name: 'terlaterie_encerche_projits',
  69.     )]
  70.     public function terlaterieEncerche(Request $request, FormFactoryInterface $formFactory, ProjectService $projectsService, RecursiveArraySearch $recursiveArraySearch, TranslationDataGenerator $dataGenerator): Response
  71.     {
  72.         $form = $formFactory->create(TerlaterieSearchType::class);
  73.         $translations = [];
  74.         $searchString = '';
  75.         $languagesHandled = [];
  76.         $projects = $projectsService->getProjects();
  77.         $form->handleRequest($request);
  78.         if ($form->isSubmitted() && $form->isValid()) {
  79.             $formData = $form->getData();
  80.             $searchString = htmlspecialchars($formData['searchString'], ENT_NOQUOTES, 'UTF-8');
  81.             $searchStringWithSlashEscaped = str_replace(array("/"),array("\/"),$searchString);
  82.             $searchLanguage = $formData['searchLanguage'];
  83.             foreach ($projects as $projectKey => $projectInfo) {
  84.                 $data = $dataGenerator->generateData($projectKey, $projectInfo, $searchLanguage);
  85.                 $results = $recursiveArraySearch->rarray_search($searchStringWithSlashEscaped, $data);
  86.                 if (!$results) {
  87.                     continue;
  88.                 }
  89.                 foreach ($results as $key => $result) {
  90.                     $pattern = '/^' . $searchLanguage . '\./';
  91.                     $keyModified = preg_replace($pattern, '', $key);
  92.                     $translations[$projectKey][$keyModified][$searchLanguage] = preg_replace('/(' . $searchStringWithSlashEscaped . ')/ui', '<span class="search-match">$1</span>', $result);
  93.                 }
  94.                 $targetLanguages = $formData['targetLanguages'];
  95.                 $languagesHandled[$projectKey] = [$searchLanguage];
  96.                 foreach ($targetLanguages as $targetLanguage) {
  97.                     if ($targetLanguage === $searchLanguage) {
  98.                         continue;
  99.                     }
  100.                     $data = $dataGenerator->generateData($projectKey, $projectInfo, $targetLanguage);
  101.                     if (!array_key_exists($targetLanguage, $data)) {
  102.                         continue;
  103.                     }
  104.                     $data = $data[$targetLanguage];
  105.                     foreach ($translations[$projectKey] as $key => $translation) {
  106.                         $dataToHandle = $data;
  107.                         $keysArray = explode('.', $key);
  108.                         foreach ($keysArray as $keyInArray) {
  109.                             if (array_key_exists($keyInArray, $dataToHandle)) {
  110.                                 $dataToHandle = $dataToHandle[$keyInArray];
  111.                             }
  112.                         }
  113.                         $translations[$projectKey][$key][$targetLanguage] = is_array($dataToHandle) ? '' : $dataToHandle;
  114.                     }
  115.                     $languagesHandled[$projectKey][] = $targetLanguage;
  116.                 }
  117.             }
  118.         }
  119.         return $this->render('terlaterie_search.html.twig', [
  120.             'form' => $form,
  121.             'translations' => $translations,
  122.             'search_string' => $searchString,
  123.             'languages' => $languagesHandled,
  124.             'projects' => $projects
  125.         ]);
  126.     }
  127. }