Skip to content

Commit

Permalink
Language: Migrations to use parent ISO code + self ID for new sub lan…
Browse files Browse the repository at this point in the history
…guages - refs BT#21568
  • Loading branch information
AngelFQC committed Jan 8, 2025
1 parent 229209d commit 3e39091
Show file tree
Hide file tree
Showing 5 changed files with 144 additions and 25 deletions.
5 changes: 3 additions & 2 deletions src/CoreBundle/Migrations/Schema/V200/Version20.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
namespace Chamilo\CoreBundle\Migrations\Schema\V200;

use Chamilo\CoreBundle\DataFixtures\LanguageFixtures;
use Chamilo\CoreBundle\Entity\Language;
use Chamilo\CoreBundle\Migrations\AbstractMigrationChamilo;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Schema\Schema;
Expand Down Expand Up @@ -162,7 +163,7 @@ public function up(Schema $schema): void

// Update language to ISO.
$this->addSql('UPDATE language SET isocode = "en" WHERE isocode IS NULL');
$this->addSql('ALTER TABLE language CHANGE isocode isocode VARCHAR(10) NOT NULL');
$this->addSql('ALTER TABLE language CHANGE isocode isocode VARCHAR('.Language::ISO_MAX_LENGTH.') NOT NULL');
$this->addSql('UPDATE language SET english_name = "english" WHERE english_name IS NULL');
$this->addSql('ALTER TABLE language CHANGE english_name english_name VARCHAR(255) NOT NULL');

Expand All @@ -182,7 +183,7 @@ public function up(Schema $schema): void
$englishName = $item['english_name'];
if (isset($languages[$englishName])) {
$newIso = $languages[$englishName];
$this->addSql("UPDATE language SET isocode = '$newIso' WHERE id = $id");
$this->addSql("UPDATE language SET isocode = '$newIso', parent_id = NULL WHERE id = $id");
}
}

Expand Down
25 changes: 2 additions & 23 deletions src/CoreBundle/Migrations/Schema/V200/Version20240122221400.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ private function updateAndGenerateSubLanguage(array $sublanguage): string
$parentIsoCode = $this->connection->executeQuery($parentIsoQuery, [$parentId])->fetchOne();

// Get the prefix of the parent language's isocode
$firstIso = substr($parentIsoCode, 0, 2);
$newIsoCode = $this->generateSublanguageCode($firstIso, $sublanguage['english_name']);
$firstIso = explode('_', $parentIsoCode)[0];
$newIsoCode = $firstIso.'_'.$sublanguage['id'];

// Update the isocode in the language table
$updateLanguageQuery = 'UPDATE language SET isocode = ? WHERE id = ?';
Expand Down Expand Up @@ -171,27 +171,6 @@ private function executeVueTranslationsUpdate(): void
error_log($content);
}

private function generateSublanguageCode(string $parentCode, string $variant, int $maxLength = 10): string
{
$parentCode = strtolower(trim($parentCode));
$variant = strtolower(trim($variant));

// Generate a variant code by truncating the variant name
$variantCode = substr($variant, 0, $maxLength - \strlen($parentCode) - 1);

// Build the complete code
return substr($parentCode.'_'.$variantCode, 0, $maxLength);
}

private function deleteImportFolder(): void
{
$kernel = $this->container->get('kernel');
$rootPath = $kernel->getProjectDir();
$importPath = $rootPath.'/var/translations/import/';

$this->recursiveRemoveDirectory($importPath);
}

private function recursiveRemoveDirectory($directory): void
{
foreach (glob("{$directory}/*") as $file) {
Expand Down
34 changes: 34 additions & 0 deletions src/CoreBundle/Migrations/Schema/V200/Version20250106152600.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

/* For licensing terms, see /license.txt */

declare(strict_types=1);

namespace Chamilo\CoreBundle\Migrations\Schema\V200;

use Chamilo\CoreBundle\DataFixtures\LanguageFixtures;
use Chamilo\CoreBundle\Migrations\AbstractMigrationChamilo;
use Doctrine\DBAL\Schema\Schema;

final class Version20250106152600 extends AbstractMigrationChamilo
{
public function getDescription(): string
{
return 'Set parent as null for initial lenguages.';
}

/**
* @inheritDoc
*/
public function up(Schema $schema): void
{
$languageNameList = array_column(
LanguageFixtures::getLanguages(),
'english_name',
);

$this->addSql(
'UPDATE language SET parent_id = NULL WHERE english_name IN ("'.implode('", "', $languageNameList).'")'
);
}
}
78 changes: 78 additions & 0 deletions src/CoreBundle/Migrations/Schema/V200/Version20250106152601.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
<?php

/* For licensing terms, see /license.txt */

declare(strict_types=1);

namespace Chamilo\CoreBundle\Migrations\Schema\V200;

use Chamilo\CoreBundle\Migrations\AbstractMigrationChamilo;
use Doctrine\DBAL\Schema\Schema;
use Symfony\Component\Filesystem\Filesystem;

final class Version20250106152601 extends AbstractMigrationChamilo
{
public function getDescription(): string
{
return 'Set new ISO code for sub-languages.';
}

/**
* @inheritDoc
*/
public function up(Schema $schema): void
{
$kernel = $this->container->get('kernel');
$baseTranslationPath = $kernel->getProjectDir().'/var/translations/messages.';

$fs = new Filesystem();

$subLanguages = $this->connection
->executeQuery("SELECT id, isocode, parent_id FROM language WHERE parent_id IS NOT NULL")
->fetchAllAssociative()
;

/** @var array $subLanguage */
foreach ($subLanguages as $subLanguage) {

$parentIsoCode = $this->connection
->executeQuery('SELECT isocode FROM language WHERE id = ?', [$subLanguage['parent_id']])
->fetchOne()
;

$newIsoCode = sprintf(
'%s_%d',
explode('_', $parentIsoCode)[0],
$subLanguage['id']
);

$params = [
'new_iso' => $newIsoCode,
'old_iso' => $subLanguage['isocode'],
];

if ($params['new_iso'] === $params['old_iso']) {
continue;
}

$this->addSql(
'UPDATE language SET isocode = :new_iso WHERE id = :id',
[
'new_iso' => $newIsoCode,
'id' => $subLanguage['id'],
]
);

$this->addSql('UPDATE user SET locale = :new_iso WHERE locale = :old_iso', $params);
$this->addSql('UPDATE course SET course_language = :new_iso WHERE course_language = :old_iso', $params);
$this->addSql("UPDATE settings SET selected_value = :new_iso WHERE variable = 'platform_language' AND selected_value = :old_iso", $params);

$oldPoFile = $baseTranslationPath.$params['old_iso'].'.po';
$newPoFile = $baseTranslationPath.$params['new_iso'].'.po';

if ($fs->exists($oldPoFile)) {
$fs->rename($oldPoFile, $newPoFile);
}
}
}
}
27 changes: 27 additions & 0 deletions src/CoreBundle/Migrations/Schema/V200/Version20250106152602.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

/* For licensing terms, see /license.txt */

declare(strict_types=1);

namespace Chamilo\CoreBundle\Migrations\Schema\V200;

use Chamilo\CoreBundle\Entity\Language;
use Chamilo\CoreBundle\Migrations\AbstractMigrationChamilo;
use Doctrine\DBAL\Schema\Schema;

final class Version20250106152602 extends AbstractMigrationChamilo
{
public function getDescription(): string
{
return 'Change iso code length to 8 characters.';
}

/**
* @inheritDoc
*/
public function up(Schema $schema): void
{
$this->addSql('ALTER TABLE language CHANGE isocode isocode VARCHAR('.Language::ISO_MAX_LENGTH.') NOT NULL');
}
}

0 comments on commit 3e39091

Please sign in to comment.