Skip to content

Commit 766f184

Browse files
committed
Allow translate skill names and short codes - refs BT#13589 (#2219)
* Allow translate skill names - refs BT#13589 * Allow translate skill short codes - refs BT#13589
1 parent 932208a commit 766f184

File tree

6 files changed

+201
-32
lines changed

6 files changed

+201
-32
lines changed

main/admin/skill_edit.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,16 @@
6161
/* Form */
6262
$editForm = new FormValidator('skill_edit');
6363
$editForm->addHeader(get_lang('SkillEdit'));
64-
$editForm->addText('name', get_lang('Name'), true, ['id' => 'name']);
65-
$editForm->addText('short_code', get_lang('ShortCode'), false, ['id' => 'short_code']);
64+
65+
$translateNameUrl = api_get_path(WEB_CODE_PATH).'admin/skill_translate.php?'
66+
.http_build_query(['skill' => $skillId, 'action' => 'name']);
67+
$translateCodeUrl = api_get_path(WEB_CODE_PATH).'admin/skill_translate.php?'
68+
.http_build_query(['skill' => $skillId, 'action' => 'code']);
69+
$translateNameButton = Display::toolbarButton(get_lang('TranslateThisTerm'), $translateNameUrl, 'language', 'link');
70+
$translateCodeButton = Display::toolbarButton(get_lang('TranslateThisTerm'), $translateCodeUrl, 'language', 'link');
71+
72+
$editForm->addText('name', [get_lang('Name'), $translateNameButton], true, ['id' => 'name']);
73+
$editForm->addText('short_code', [get_lang('ShortCode'), $translateCodeButton], false, ['id' => 'short_code']);
6674
$editForm->addSelect('parent_id', get_lang('Parent'), $skillList, ['id' => 'parent_id']);
6775
$editForm->addSelect(
6876
'gradebook_id',

main/admin/skill_translate.php

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
<?php
2+
/* For licensing terms, see /license.txt */
3+
4+
use \Chamilo\CoreBundle\Entity\ExtraField;
5+
use Chamilo\CoreBundle\Entity\Skill;
6+
use Chamilo\CoreBundle\Entity\Language;
7+
8+
$cidReset = true;
9+
10+
require_once __DIR__.'/../inc/global.inc.php';
11+
12+
api_protect_admin_script();
13+
14+
$em = Database::getManager();
15+
16+
$skill = null;
17+
$extraFieldOption = null;
18+
$variableLanguage = null;
19+
$originalName = null;
20+
$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'name';
21+
22+
if (isset($_GET['skill'])) {
23+
/** @var Skill $skill */
24+
$skill = $em->find('ChamiloCoreBundle:Skill', intval($_GET['skill']));
25+
26+
if ($action === 'name') {
27+
$variableLanguage = '$Skill'.api_underscore_to_camel_case(
28+
str_replace(' ', '_', $skill->getName(false))
29+
);
30+
$originalName = $skill->getName(false);
31+
} elseif ($action === 'code') {
32+
$variableLanguage = '$SkillCode'.api_underscore_to_camel_case(
33+
str_replace(' ', '_', $skill->getShortCode(false))
34+
);
35+
$originalName = $skill->getShortCode(false);
36+
}
37+
}
38+
39+
if (!$skill || empty($variableLanguage)) {
40+
api_not_allowed(true);
41+
}
42+
43+
if (empty($originalName)) {
44+
Display::addFlash(
45+
Display::return_message(get_lang('CanNotTranslate'), 'error')
46+
);
47+
header('Location: '.api_get_path(WEB_CODE_PATH).'admin/skill_edit.php?id='.$skill->getId());
48+
exit;
49+
}
50+
51+
$languageId = isset($_GET['sub_language']) ? intval($_GET['sub_language']) : 0;
52+
53+
$languages = $em
54+
->getRepository('ChamiloCoreBundle:Language')
55+
->findAllPlatformSubLanguages();
56+
57+
$languagesOptions = [0 => get_lang('None')];
58+
59+
/** @var Language $language */
60+
foreach ($languages as $language) {
61+
$languagesOptions[$language->getId()] = $language->getOriginalName();
62+
}
63+
64+
$translateUrl = api_get_path(WEB_CODE_PATH).'admin/sub_language_ajax.inc.php?skill='.$skill->getId();
65+
66+
$form = new FormValidator('new_lang_variable', 'POST', $translateUrl);
67+
$form->addHeader(get_lang('AddWordForTheSubLanguage'));
68+
$form->addText('variable_language', get_lang('LanguageVariable'), false);
69+
$form->addText('original_name', get_lang('OriginalName'), false);
70+
$form->addSelect('sub_language', [get_lang('SubLanguage'), get_lang('OnlyActiveSubLanguagesAreListed')], $languagesOptions);
71+
72+
if ($languageId) {
73+
$languageInfo = api_get_language_info($languageId);
74+
75+
$form->addText('new_language', [get_lang('Translation'), get_lang('IfThisTranslationExistsThisWillReplaceTheTerm')]);
76+
$form->addHidden('file_id', 0);
77+
$form->addHidden('id', $languageInfo['parent_id']);
78+
$form->addHidden('sub', $languageInfo['id']);
79+
$form->addHidden('sub_language_id', $languageInfo['id']);
80+
$form->addHidden('redirect', true);
81+
$form->addButtonSave(get_lang('Save'));
82+
}
83+
84+
$form->setDefaults([
85+
'variable_language' => $variableLanguage,
86+
'original_name' => $originalName,
87+
'sub_language' => $languageId,
88+
'new_language' => $action === 'code' ? $skill->getShortCode() : $skill->getName()
89+
]);
90+
$form->addRule('sub_language', get_lang('Required'), 'required');
91+
$form->freeze(['variable_language', 'original_name']);
92+
93+
$interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')];
94+
$interbreadcrumb[] = ['url' => 'skill_list.php', 'name' => get_lang('ManageSkills')];
95+
96+
$view = new Template(get_lang('AddWordForTheSubLanguage'));
97+
$view->assign('form', $form->returnForm());
98+
$template = $view->get_template('extrafield/translate.tpl');
99+
$content = $view->fetch($template);
100+
$view->assign('content', $content);
101+
$view->display_one_col_template();

main/admin/sub_language_ajax.inc.php

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -46,27 +46,39 @@
4646
}
4747
}
4848

49-
if (isset($_REQUEST['redirect'], $_REQUEST['extra_field_type'])) {
50-
Display::addFlash(
51-
Display::return_message(get_lang('TheNewWordHasBeenAdded'), 'success')
52-
);
53-
54-
$redirectUrl = api_get_path(WEB_CODE_PATH).'admin/extra_fields.php?type=';
55-
56-
switch ($_REQUEST['extra_field_type']) {
57-
case ExtraField::USER_FIELD_TYPE:
58-
$redirectUrl .= 'user';
59-
break;
60-
case ExtraField::COURSE_FIELD_TYPE:
61-
$redirectUrl .= 'course';
62-
break;
63-
case ExtraField::SESSION_FIELD_TYPE:
64-
$redirectUrl .= 'session';
65-
break;
49+
if (isset($_REQUEST['redirect'])) {
50+
$message = Display::return_message(get_lang('TheNewWordHasBeenAdded'), 'success');
51+
52+
if (!empty($variables_with_problems)) {
53+
Display::return_message(
54+
$path_folder.' '.get_lang('IsNotWritable').'<br /> '.api_ucwords(get_lang('ErrorsFound'))
55+
.': <br />'.$variables_with_problems,
56+
'error'
57+
);
6658
}
6759

68-
header("Location: $redirectUrl");
69-
exit;
60+
Display::addFlash($message);
61+
62+
if (isset($_REQUEST['extra_field_type'])) {
63+
$redirectUrl = api_get_path(WEB_CODE_PATH).'admin/extra_fields.php';
64+
65+
switch ($_REQUEST['extra_field_type']) {
66+
case ExtraField::USER_FIELD_TYPE:
67+
header("Location: {$redirectUrl}?type=user");
68+
exit;
69+
case ExtraField::COURSE_FIELD_TYPE:
70+
header("Location: {$redirectUrl}?type=course");
71+
exit;
72+
case ExtraField::SESSION_FIELD_TYPE:
73+
header("Location: {$redirectUrl}?type=session");
74+
exit;
75+
}
76+
}
77+
78+
if (isset($_REQUEST['skill'])) {
79+
header('Location: '.api_get_path(WEB_CODE_PATH).'admin/skill_list.php');
80+
exit;
81+
}
7082
}
7183

7284
if (!empty($variables_with_problems)) {

main/inc/lib/skill.lib.php

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,8 @@ public function get($id)
657657
$result['img_mini'] = Display::img($iconBig, $result['name'], ['width' => ICON_SIZE_MEDIUM]);
658658
$result['img_big'] = Display::img($iconBig, $result['name']);
659659
$result['img_small'] = Display::img($iconSmall, $result['name']);
660+
$result['name'] = self::translate($result['name']);
661+
$result['short_code'] = self::translate($result['short_code']);
660662

661663
return $result;
662664
}
@@ -734,20 +736,22 @@ public function getSkillsInfo($skill_list)
734736
WHERE id IN ('$skill_list') ";
735737

736738
$result = Database::query($sql);
737-
$users = Database::store_result($result, 'ASSOC');
739+
$skills = Database::store_result($result, 'ASSOC');
738740

739-
foreach ($users as &$user) {
740-
if (!$user['icon']) {
741+
foreach ($skills as &$skill) {
742+
if (!$skill['icon']) {
741743
continue;
742744
}
743745

744-
$user['icon_small'] = sprintf(
746+
$skill['icon_small'] = sprintf(
745747
"badges/%s-small.png",
746-
sha1($user['name'])
748+
sha1($skill['name'])
747749
);
750+
$skill['name'] = self::translate($skill['name']);
751+
$skill['short_code'] = self::translate($skill['short_code']);
748752
}
749753

750-
return $users;
754+
return $skills;
751755
}
752756

753757
/**
@@ -797,6 +801,8 @@ public function get_all(
797801
$webPath = api_get_path(WEB_UPLOAD_PATH);
798802
if (Database::num_rows($result)) {
799803
while ($row = Database::fetch_array($result, 'ASSOC')) {
804+
$row['name'] = self::translate($row['name']);
805+
$row['short_code'] = self::translate($row['short_code']);
800806
$skillRelSkill = new SkillRelSkill();
801807
$parents = $skillRelSkill->getSkillParents($row['id']);
802808
$row['level'] = count($parents) - 1;
@@ -1147,7 +1153,7 @@ public function getUserSkillsTable($userId, $courseId = 0, $sessionId = 0)
11471153

11481154
$tableRow = array(
11491155
'skill_badge' => $resultData['img_mini'],
1150-
'skill_name' => $resultData['name'],
1156+
'skill_name' => Skill::translate($resultData['name']),
11511157
'achieved_at' => api_get_local_time($resultData['acquired_skill_at']),
11521158
'course_image' => '',
11531159
'course_name' => ''
@@ -1704,6 +1710,7 @@ public function listAchievedByCourse($courseId)
17041710
$result = Database::query($sql);
17051711

17061712
while ($row = Database::fetch_assoc($result)) {
1713+
$row['skill_name'] = self::translate($row['skill_name']);
17071714
$list[] = $row;
17081715
}
17091716

@@ -1747,6 +1754,7 @@ public function listUsersWhoAchieved($skillId)
17471754

17481755
$result = Database::query($sql);
17491756
while ($row = Database::fetch_assoc($result)) {
1757+
$row['skill_name'] = self::translate($row['skill_name']);
17501758
$list[] = $row;
17511759
}
17521760

@@ -1931,6 +1939,28 @@ public function getStudentSkills($userId)
19311939

19321940
$result = Database::query($sql);
19331941

1934-
return Database::store_result($result, 'ASSOC');
1942+
$skills = [];
1943+
1944+
foreach ($result as $item) {
1945+
$skills[] = [
1946+
'name' => self::translate($item['name']),
1947+
'acquired_skill_at' => $item['acquired_skill_at']
1948+
];
1949+
}
1950+
1951+
return $skills;
1952+
}
1953+
1954+
/**
1955+
* @param string $name
1956+
* @return string
1957+
*/
1958+
public static function translate($name)
1959+
{
1960+
$camelCase = 'Skill'.api_underscore_to_camel_case(
1961+
str_replace(' ', '_', $name)
1962+
);
1963+
1964+
return isset($GLOBALS[$camelCase]) ? $GLOBALS[$camelCase] : $name;
19351965
}
19361966
}

main/social/my_skills_report.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
while ($resultData = Database::fetch_assoc($result)) {
6262
$tableRow = array(
6363
'completeName' => $followedStudents[$selectedStudent]['completeName'],
64-
'skillName' => $resultData['name'],
64+
'skillName' => Skill::translate($resultData['name']),
6565
'achievedAt' => api_format_date($resultData['acquired_skill_at'], DATE_FORMAT_NUMBER),
6666
'courseImage' => Display::return_icon(
6767
'course.png',

src/Chamilo/CoreBundle/Entity/Skill.php

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,19 @@ public function setName($name)
118118
/**
119119
* Get name
120120
*
121+
* @param bool $translated Optional. Get the name translated when is it exists in a sub-language. By default is true
121122
* @return string
122123
*/
123-
public function getName()
124+
public function getName($translated = true)
124125
{
126+
if ($translated) {
127+
$camelCase = 'Skill'.api_underscore_to_camel_case(
128+
str_replace(' ', '_', $this->name)
129+
);
130+
131+
return isset($GLOBALS[$camelCase]) ? $GLOBALS[$camelCase] : $this->name;
132+
}
133+
125134
return $this->name;
126135
}
127136

@@ -141,10 +150,19 @@ public function setShortCode($shortCode)
141150
/**
142151
* Get shortCode
143152
*
153+
* @param bool $translated Optional. Get the code translated when is it exists in a sub-language. By default is true
144154
* @return string
145155
*/
146-
public function getShortCode()
156+
public function getShortCode($translated = true)
147157
{
158+
if ($translated) {
159+
$camelCase = 'SkillCode'.api_underscore_to_camel_case(
160+
str_replace(' ', '_', $this->shortCode)
161+
);
162+
163+
return isset($GLOBALS[$camelCase]) ? $GLOBALS[$camelCase] : $this->shortCode;
164+
}
165+
148166
return $this->shortCode;
149167
}
150168

0 commit comments

Comments
 (0)