Skill: Enable title and short code translation - refs BT#21568

pull/5919/head
Angel Fernando Quiroz Campos 1 year ago
parent a773e3bb1d
commit 07094d08c8
No known key found for this signature in database
GPG Key ID: B284841AE3E562CD
  1. 131
      public/main/skills/skill_translate.php
  2. 20
      src/CoreBundle/Entity/Skill.php
  3. 16
      src/CoreBundle/Repository/LanguageRepository.php

@ -5,6 +5,8 @@
use Chamilo\CoreBundle\Component\Utils\ChamiloApi;
use Chamilo\CoreBundle\Entity\Language;
use Chamilo\CoreBundle\Entity\Skill;
use Chamilo\CoreBundle\Framework\Container;
use Gedmo\Translatable\Entity\Translation;
$cidReset = true;
@ -12,50 +14,35 @@ require_once __DIR__.'/../inc/global.inc.php';
api_protect_admin_script();
$request = Container::getRequest();
$em = Database::getManager();
$translationsRepo = $em->getRepository(Translation::class);
$defaultLocale = Container::getParameter('locale');
$skill = null;
$extraFieldOption = null;
$variableLanguage = null;
$originalName = null;
$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'name';
if (isset($_GET['skill'])) {
/** @var Skill $skill */
$skill = $em->find(Skill::class, $_GET['skill']);
if ('name' === $action) {
$variableLanguage = ChamiloApi::getLanguageVar(
$skill->getTitle(false),
'Skill'
);
$originalName = $skill->getTitle(false);
} elseif ('code' === $action) {
$variableLanguage = ChamiloApi::getLanguageVar(
$skill->getShortCode(false),
'SkillCode'
);
$originalName = $skill->getShortCode(false);
}
}
$action = $request->query->getString('action') ?: $request->request->getString('action');
if (!$skill || empty($variableLanguage)) {
api_not_allowed(true);
}
$fieldsMap = ['name' => 'title', 'code' => 'shortCode'];
$fieldToTranslate = $fieldsMap[$action] ?? null;
/** @var Skill $skill */
$skill = $em->find(
Skill::class,
$request->query->getInt('skill')
);
if (empty($originalName)) {
if (!$skill || empty($skill->getShortCode())) {
Display::addFlash(
Display::return_message(get_lang('Could not translate'), 'error')
);
header('Location: '.api_get_path(WEB_CODE_PATH).'skills/skill_edit.php?id='.$skill->getId());
exit;
}
$languageId = isset($_GET['sub_language']) ? intval($_GET['sub_language']) : 0;
$languages = $em
->getRepository(Language::class)
->findAllSubLanguages();
$languages = Container::getLanguageRepository()->getAllAvailable(true)->getQuery()->getResult();
$translations = $translationsRepo->findTranslations($skill);
$languagesOptions = [0 => get_lang('none')];
@ -64,40 +51,68 @@ foreach ($languages as $language) {
$languagesOptions[$language->getId()] = $language->getOriginalName();
}
$translateUrl = api_get_path(WEB_CODE_PATH).'admin/sub_language_ajax.inc.php?skill='.$skill->getId();
$translateUrl = api_get_self().'?'.http_build_query(['skill' => $skill->getId(), 'action' => $action]);
$skill->setLocale($defaultLocale);
$em->refresh($skill);
$form = new FormValidator('new_lang_variable', 'POST', $translateUrl);
$defaults = [
'original_name' => 'title' === $fieldToTranslate ? $skill->getTitle() : $skill->getShortCode(),
];
$form = new FormValidator('new_lang_variable', 'post', $translateUrl);
$form->addHeader(get_lang('Add terms to the sub-language'));
$form->addText('variable_language', get_lang('Language variable'), false);
$form->addText('original_name', get_lang('Original name'), false);
$form->addSelect(
'sub_language',
[get_lang('Sub-language'), get_lang('OnlyActiveSub-languagesAreListed')],
$languagesOptions
$form->addText(
'original_name',
[
get_lang('Original name'),
get_lang('If this term has already been translated, this operation will replace its translation for this sub-language.'),
],
false
);
if ($languageId) {
$languageInfo = api_get_language_info($languageId);
foreach ($languages as $language) {
$iso = $language->getIsoCode();
$form->addText(
'new_language',
[get_lang('Translation'), get_lang('If this term has already been translated, this operation will replace its translation for this sub-language.')]
'language['.$language->getId().']',
$language->getOriginalName(),
false
);
$form->addHidden('file_id', 0);
$form->addHidden('id', $languageInfo['parent_id']);
$form->addHidden('sub', $languageInfo['id']);
$form->addHidden('sub_language_id', $languageInfo['id']);
$form->addHidden('redirect', true);
$form->addButtonSave(get_lang('Save'));
if (!empty($translations[$iso][$fieldToTranslate])) {
$defaults["language[{$language->getId()}]"] = $translations[$iso][$fieldToTranslate];
}
}
$form->setDefaults([
'variable_language' => '$'.$variableLanguage,
'original_name' => $originalName,
'sub_language' => $languageId,
'new_language' => 'code' === $action ? $skill->getShortCode() : $skill->getTitle(),
]);
$form->addRule('sub_language', get_lang('Required'), 'required');
$form->freeze(['variable_language', 'original_name']);
$form->addButtonSave(get_lang('Save'));
$form->freeze(['original_name']);
$form->setDefaults($defaults);
if ($form->validate()) {
$values = $form->exportValues();
foreach ($languages as $language) {
if (empty($values['language'][$language->getId()])) {
continue;
}
$translationsRepo->translate(
$skill,
$fieldToTranslate,
$language->getIsocode(),
$values['language'][$language->getId()]
);
}
$em->flush();
Display::addFlash(
Display::return_message(get_lang('Translation saved'), 'success')
);
header("Location: $translateUrl");
exit;
}
$interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('Administration')];
$interbreadcrumb[] = ['url' => 'skill_list.php', 'name' => get_lang('Manage skills')];

@ -16,6 +16,7 @@ use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\Translatable\Translatable;
use Stringable;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
@ -24,7 +25,7 @@ use Symfony\Component\Validator\Constraints as Assert;
#[ApiFilter(SearchFilter::class, properties: ['issuedSkills.user' => 'exact'])]
#[ORM\Table(name: 'skill')]
#[ORM\Entity(repositoryClass: SkillRepository::class)]
class Skill implements Stringable
class Skill implements Stringable, Translatable
{
public const STATUS_DISABLED = 0;
public const STATUS_ENABLED = 1;
@ -70,11 +71,13 @@ class Skill implements Stringable
#[ORM\OneToMany(mappedBy: 'skill', targetEntity: SkillRelGradebook::class, cascade: ['persist'])]
protected Collection $gradeBookCategories;
#[Gedmo\Translatable]
#[Assert\NotBlank]
#[Groups(['skill:read', 'skill:write', 'skill_rel_user:read'])]
#[ORM\Column(name: 'title', type: 'string', length: 255, nullable: false)]
protected string $title;
#[Gedmo\Translatable]
#[Assert\NotBlank]
#[Groups(['skill:read', 'skill:write'])]
#[ORM\Column(name: 'short_code', type: 'string', length: 100, nullable: false)]
@ -106,6 +109,9 @@ class Skill implements Stringable
#[ORM\Column(name: 'updated_at', type: 'datetime', nullable: false)]
protected DateTime $updatedAt;
#[Gedmo\Locale]
private ?string $locale = null;
public function __construct()
{
$this->issuedSkills = new ArrayCollection();
@ -398,4 +404,16 @@ class Skill implements Stringable
$item->setSkill($this);
$this->courses[] = $item;
}
public function getLocale(): string
{
return $this->locale;
}
public function setLocale(string $locale): Skill
{
$this->locale = $locale;
return $this;
}
}

@ -11,15 +11,18 @@ use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\QueryBuilder;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
class LanguageRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
public function __construct(
ManagerRegistry $registry,
private readonly ParameterBagInterface $parameterBag,
) {
parent::__construct($registry, Language::class);
}
public function getAllAvailable(): QueryBuilder
public function getAllAvailable($excludeDefaultLocale = false): QueryBuilder
{
$qb = $this->createQueryBuilder('l');
$qb
@ -31,6 +34,13 @@ class LanguageRepository extends ServiceEntityRepository
)*/
;
if ($excludeDefaultLocale) {
$qb
->andWhere($qb->expr()->neq('l.isocode', ':iso_en'))
->setParameter('iso_en', $this->parameterBag->get('locale'))
;
}
return $qb;
}

Loading…
Cancel
Save