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 $requestFormFactoryInterface $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 $requestFormFactoryInterface $formFactoryProjectService $projectsServiceRecursiveArraySearch $recursiveArraySearchTranslationDataGenerator $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. }