Switch PHP translator implementation.

This commit is contained in:
Buster "Silver Eagle" Neece 2022-05-07 11:44:14 -05:00
parent 3e03980811
commit fb3a8a5fc9
No known key found for this signature in database
GPG Key ID: 9FC8B9E008872109
27 changed files with 236 additions and 174 deletions

View File

@ -11,6 +11,7 @@
],
"require": {
"php": "^8.1",
"ext-PDO": "*",
"ext-curl": "*",
"ext-fileinfo": "*",
"ext-gd": "*",
@ -19,7 +20,6 @@
"ext-json": "*",
"ext-maxminddb": "*",
"ext-mbstring": "*",
"ext-PDO": "*",
"ext-redis": "*",
"ext-simplexml": "*",
"ext-xml": "*",
@ -43,7 +43,6 @@
"dragonmantank/cron-expression": "^3.1",
"gettext/gettext": "^5",
"gettext/php-scanner": "^1.3",
"gettext/translator": "^1.1",
"guzzlehttp/guzzle": "^7.0",
"guzzlehttp/oauth-subscriber": "^0.6.0",
"http-interop/http-factory-guzzle": "^1.0",
@ -65,6 +64,7 @@
"pagerfanta/doctrine-orm-adapter": "^3",
"php-di/php-di": "^6.0",
"php-di/slim-bridge": "^3.0",
"phpmyadmin/motranslator": "^5.3",
"psr/http-factory": ">1",
"psr/simple-cache": ">1",
"ramsey/uuid": "^4.0",

198
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "14156b3b2d744b3e7d4daab6c35159b4",
"content-hash": "0104251d3227b908f4942d08ded6aef4",
"packages": [
{
"name": "aws/aws-crt-php",
@ -2639,80 +2639,6 @@
},
"time": "2022-03-18T11:47:55+00:00"
},
{
"name": "gettext/translator",
"version": "v1.1.1",
"source": {
"type": "git",
"url": "https://github.com/php-gettext/Translator.git",
"reference": "b18ff33e8203de623854561f5e47e992fc5c50bb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-gettext/Translator/zipball/b18ff33e8203de623854561f5e47e992fc5c50bb",
"reference": "b18ff33e8203de623854561f5e47e992fc5c50bb",
"shasum": ""
},
"require": {
"php": "^7.2|^8.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^2.15",
"gettext/gettext": "^5.0.0",
"oscarotero/php-cs-fixer-config": "^1.0",
"phpunit/phpunit": "^8.0",
"squizlabs/php_codesniffer": "^3.0"
},
"suggest": {
"gettext/gettext": "Is necessary to load and generate array files used by the translator"
},
"type": "library",
"autoload": {
"psr-4": {
"Gettext\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Oscar Otero",
"email": "oom@oscarotero.com",
"homepage": "http://oscarotero.com",
"role": "Developer"
}
],
"description": "Gettext translator functions",
"homepage": "https://github.com/php-gettext/Translator",
"keywords": [
"gettext",
"i18n",
"php",
"translator"
],
"support": {
"email": "oom@oscarotero.com",
"issues": "https://github.com/php-gettext/Translator/issues",
"source": "https://github.com/php-gettext/Translator/tree/v1.1.1"
},
"funding": [
{
"url": "https://paypal.me/oscarotero",
"type": "custom"
},
{
"url": "https://github.com/oscarotero",
"type": "github"
},
{
"url": "https://www.patreon.com/misteroom",
"type": "patreon"
}
],
"time": "2022-02-23T20:29:40+00:00"
},
{
"name": "graham-campbell/guzzle-factory",
"version": "v5.0.3",
@ -5504,6 +5430,63 @@
},
"time": "2021-09-18T07:57:46+00:00"
},
{
"name": "phpmyadmin/motranslator",
"version": "5.3.0",
"source": {
"type": "git",
"url": "https://github.com/phpmyadmin/motranslator.git",
"reference": "87baa97809ec556c40e4cba4bdef998a2de2a003"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpmyadmin/motranslator/zipball/87baa97809ec556c40e4cba4bdef998a2de2a003",
"reference": "87baa97809ec556c40e4cba4bdef998a2de2a003",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0",
"symfony/expression-language": "^4.0 || ^5.0 || ^6.0"
},
"require-dev": {
"phpmyadmin/coding-standard": "^3.0.0",
"phpstan/phpstan": "^1.4.6",
"phpunit/phpunit": "^7.4 || ^8 || ^9"
},
"suggest": {
"ext-apcu": "Needed for ACPu-backed translation cache"
},
"type": "library",
"autoload": {
"psr-4": {
"PhpMyAdmin\\MoTranslator\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"GPL-2.0-or-later"
],
"authors": [
{
"name": "The phpMyAdmin Team",
"email": "developers@phpmyadmin.net",
"homepage": "https://www.phpmyadmin.net/team/"
}
],
"description": "Translation API for PHP using Gettext MO files",
"homepage": "https://github.com/phpmyadmin/motranslator",
"keywords": [
"gettext",
"i18n",
"mo",
"translator"
],
"support": {
"issues": "https://github.com/phpmyadmin/motranslator/issues",
"source": "https://github.com/phpmyadmin/motranslator"
},
"time": "2022-04-26T11:24:50+00:00"
},
{
"name": "phpoption/phpoption",
"version": "1.8.1",
@ -7564,6 +7547,69 @@
],
"time": "2022-01-02T09:55:41+00:00"
},
{
"name": "symfony/expression-language",
"version": "v6.0.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/expression-language.git",
"reference": "7affe5d5e579cd89c664b364f74ce2d01d57cf29"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/expression-language/zipball/7affe5d5e579cd89c664b364f74ce2d01d57cf29",
"reference": "7affe5d5e579cd89c664b364f74ce2d01d57cf29",
"shasum": ""
},
"require": {
"php": ">=8.0.2",
"symfony/cache": "^5.4|^6.0",
"symfony/service-contracts": "^1.1|^2|^3"
},
"type": "library",
"autoload": {
"psr-4": {
"Symfony\\Component\\ExpressionLanguage\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Provides an engine that can compile and evaluate expressions",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/expression-language/tree/v6.0.8"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2022-04-12T16:11:42+00:00"
},
{
"name": "symfony/filesystem",
"version": "v6.0.7",
@ -14366,6 +14412,7 @@
"prefer-lowest": false,
"platform": {
"php": "^8.1",
"ext-pdo": "*",
"ext-curl": "*",
"ext-fileinfo": "*",
"ext-gd": "*",
@ -14374,7 +14421,6 @@
"ext-json": "*",
"ext-maxminddb": "*",
"ext-mbstring": "*",
"ext-pdo": "*",
"ext-redis": "*",
"ext-simplexml": "*",
"ext-xml": "*",

View File

@ -236,7 +236,10 @@ class BackupCommand extends AbstractBackupCommand
$io->success(
[
__('Backup complete in %.2f seconds.', $time_diff),
sprintf(
__('Backup complete in %.2f seconds.'),
$time_diff
),
]
);
return 0;

View File

@ -43,7 +43,12 @@ class RestoreCommand extends AbstractBackupCommand
}
if (!file_exists($path)) {
$io->getErrorStyle()->error(__('Backup path %s not found!', $path));
$io->getErrorStyle()->error(
sprintf(
__('Backup path %s not found!'),
$path
)
);
return 1;
}

View File

@ -33,8 +33,14 @@ class InitializeCommand extends CommandAbstract
$io->listing(
[
__('Environment: %s', $this->environment->getAppEnvironmentEnum()->getName()),
__('Installation Method: %s', $this->environment->isDocker() ? 'Docker' : 'Ansible'),
sprintf(
__('Environment: %s'),
$this->environment->getAppEnvironmentEnum()->getName()
),
sprintf(
__('Installation Method: %s'),
$this->environment->isDocker() ? 'Docker' : 'Ansible'
),
]
);

View File

@ -54,7 +54,10 @@ class ImportCommand extends CommandAbstract
$moGenerator->generateFile($translations, $localeDest);
$io->writeln(
__('Imported locale: %s', $supportedLocale->value . ' (' . $supportedLocale->getLocalName() . ')')
sprintf(
__('Imported locale: %s'),
$supportedLocale->value . ' (' . $supportedLocale->getLocalName() . ')'
)
);
}
}

View File

@ -87,7 +87,10 @@ class SetupCommand extends CommandAbstract
$io->success(
[
__('AzuraCast installation complete!'),
__('Visit %s to complete setup.', 'http://' . $public_ip),
sprintf(
__('Visit %s to complete setup.'),
'http://' . $public_ip
),
]
);
}

View File

@ -54,8 +54,8 @@ class SetAdministratorCommand extends CommandAbstract
$this->em->flush();
$io->text(
__(
'The account associated with e-mail address "%s" has been set as an administrator',
sprintf(
__('The account associated with e-mail address "%s" has been set as an administrator'),
$user->getEmail()
)
);

View File

@ -294,8 +294,8 @@ class ListAction
$row->playlists = (array)$foldersInDir[$row->path]['playlists'];
}
} elseif (isset($unprocessableMedia[$row->path])) {
$row->text = __(
'File Not Processed: %s',
$row->text = sprintf(
__('File Not Processed: %s'),
Utilities\Strings::truncateText($unprocessableMedia[$row->path])
);
} else {

View File

@ -155,8 +155,8 @@ class ImportAction extends AbstractPlaylistsAction
return $response->withJson(
new Entity\Api\StationPlaylistImportResult(
true,
__(
'Playlist successfully imported; %d of %d files were successfully matched.',
sprintf(
__('Playlist successfully imported; %d of %d files were successfully matched.'),
$foundPaths,
$totalPaths
),

View File

@ -53,12 +53,12 @@ class ScheduleApiGenerator
$row->type = Entity\Api\StationSchedule::TYPE_PLAYLIST;
$row->name = $playlist->getName();
$row->title = $row->name;
$row->description = __('Playlist: %s', $row->name);
$row->description = sprintf(__('Playlist: %s'), $row->name);
} elseif ($streamer instanceof Entity\StationStreamer) {
$row->type = Entity\Api\StationSchedule::TYPE_STREAMER;
$row->name = $streamer->getDisplayName();
$row->title = $row->name;
$row->description = __('Streamer: %s', $row->name);
$row->description = sprintf(__('Streamer: %s'), $row->name);
}
return $row;

View File

@ -121,9 +121,7 @@ class StationRequestRepository extends Repository
if (count($recent_requests) > 0) {
throw new Exception(
__(
'You have submitted a request too recently! Please wait before submitting another one.'
)
__('You have submitted a request too recently! Please wait before submitting another one.')
);
}
}
@ -247,9 +245,7 @@ class StationRequestRepository extends Repository
if ($isDuplicate) {
throw new Exception(
__(
'This song or artist has been played too recently. Wait a while before requesting it again.'
)
__('This song or artist has been played too recently. Wait a while before requesting it again.')
);
}

View File

@ -11,6 +11,7 @@ use App\Http\ServerRequest;
use Gettext\GettextTranslator;
use Gettext\TranslatorFunctions;
use Gettext\TranslatorInterface;
use PhpMyAdmin\MoTranslator\Loader;
use Psr\Http\Message\ServerRequestInterface;
enum SupportedLocales: string
@ -64,22 +65,14 @@ enum SupportedLocales: string
return self::stripLocaleEncoding($this);
}
public function createTranslator(Environment $environment): TranslatorInterface
{
$translator = new GettextTranslator();
$translator->setLanguage($this->value);
$translator->loadDomain('default', $environment->getBaseDirectory() . '/resources/locale');
return $translator;
}
public function register(Environment $environment): void
{
$translator = $this->createTranslator($environment);
$translator = Loader::getInstance();
$translator->setlocale($this->value);
$translator->textdomain('default');
$translator->bindtextdomain('default', $environment->getBaseDirectory() . '/resources/locale');
TranslatorFunctions::register($translator);
// Register translation superglobal functions
setlocale(LC_ALL, $this->value);
Loader::loadFunctions();
}
public static function default(): self

View File

@ -198,10 +198,10 @@ class InstallCommand extends Command
);
$io->listing(
[
__('HTTP Port: %d', $env['AZURACAST_HTTP_PORT']),
__('HTTPS Port: %d', $env['AZURACAST_HTTPS_PORT']),
__('SFTP Port: %d', $env['AZURACAST_SFTP_PORT']),
__('Radio Ports: %s', $env['AZURACAST_STATION_PORTS']),
sprintf(__('HTTP Port: %d'), $env['AZURACAST_HTTP_PORT']),
sprintf(__('HTTPS Port: %d'), $env['AZURACAST_HTTPS_PORT']),
sprintf(__('SFTP Port: %d'), $env['AZURACAST_SFTP_PORT']),
sprintf(__('Radio Ports: %s'), $env['AZURACAST_STATION_PORTS']),
],
);

View File

@ -110,7 +110,7 @@ abstract class AbstractEnvFile implements ArrayAccess
$keyInfo['options'],
);
$envFile[] = '# ' . __('Valid options: %s', implode(', ', $options));
$envFile[] = '# ' . sprintf(__('Valid options: %s'), implode(', ', $options));
}
if (isset($values[$key])) {
@ -122,7 +122,7 @@ abstract class AbstractEnvFile implements ArrayAccess
if (!empty($keyInfo['default'])) {
$default = $this->getEnvValue($keyInfo['default']);
$envFile[] = '# ' . __('Default: %s', $default);
$envFile[] = '# ' . sprintf(__('Default: %s'), $default);
} else {
$default = '';
}

View File

@ -32,28 +32,22 @@ class AzuraCastEnvFile extends AbstractEnvFile
$config = [
Environment::LANG => [
'name' => __(
'The locale to use for CLI commands.',
),
'options' => $langOptions,
'default' => SupportedLocales::default()->getLocaleWithoutEncoding(),
'name' => __('The locale to use for CLI commands.'),
'options' => $langOptions,
'default' => SupportedLocales::default()->getLocaleWithoutEncoding(),
'required' => true,
],
Environment::APP_ENV => [
'name' => __(
'The application environment.',
),
'options' => ApplicationEnvironment::toSelect(),
'name' => __('The application environment.'),
'options' => ApplicationEnvironment::toSelect(),
'required' => true,
],
Environment::LOG_LEVEL => [
'name' => __(
'Manually modify the logging level.',
),
'name' => __('Manually modify the logging level.'),
'description' => __(
'This allows you to log debug-level errors temporarily (for problem-solving) or reduce the volume of logs that are produced by your installation, without needing to modify whether your installation is a production or development instance.'
),
'options' => [
'options' => [
LogLevel::DEBUG,
LogLevel::INFO,
LogLevel::NOTICE,
@ -73,17 +67,13 @@ class AzuraCastEnvFile extends AbstractEnvFile
'default' => false,
],
Environment::AUTO_ASSIGN_PORT_MIN => [
'name' => __(
'Minimum Port for Station Port Assignment'
),
'name' => __('Minimum Port for Station Port Assignment'),
'description' => __(
'Modify this if your stations are listening on nonstandard ports.',
),
],
Environment::AUTO_ASSIGN_PORT_MAX => [
'name' => __(
'Maximum Port for Station Port Assignment'
),
'name' => __('Maximum Port for Station Port Assignment'),
'description' => __(
'Modify this if your stations are listening on nonstandard ports.',
),
@ -206,9 +196,9 @@ class AzuraCastEnvFile extends AbstractEnvFile
'default' => 5,
],
Environment::PROFILING_EXTENSION_ENABLED => [
'name' => __('Enable Performance Profiling Extension'),
'description' => __(
'Profiling data can be viewed by visiting %s.',
'name' => __('Enable Performance Profiling Extension'),
'description' => sprintf(
__('Profiling data can be viewed by visiting %s.'),
'http://your-azuracast-site/?SPX_KEY=dev&SPX_UI_URI=/',
),
],

View File

@ -11,7 +11,6 @@ use App\Environment;
use App\Event\GetNotifications;
use App\Session\Flash;
use App\Utilities\Strings;
use App\Version;
class BaseUrlCheck
{
@ -55,8 +54,8 @@ class BaseUrlCheck
// phpcs:enable Generic.Files.LineLength
$notification = new Notification();
$notification->title = __(
'Your "Base URL" setting (%s) does not match the URL you are currently using (%s).',
$notification->title = sprintf(
__('Your "Base URL" setting (%s) does not match the URL you are currently using (%s).'),
Strings::truncateUrl((string)$baseUriWithoutRequest),
Strings::truncateUrl((string)$baseUriWithRequest)
);

View File

@ -46,13 +46,13 @@ class UpdateCheck
if (ReleaseChannel::Stable === $releaseChannel && $updateData['needs_release_update']) {
$notificationParts = [
'<b>' . __(
'AzuraCast <a href="%s" target="_blank">version %s</a> is now available.',
'<b>' . sprintf(
__('AzuraCast <a href="%s" target="_blank">version %s</a> is now available.'),
Version::CHANGELOG_URL,
$updateData['latest_release']
) . '</b>',
__(
'You are currently running version %s. Updating is highly recommended.',
sprintf(
__('You are currently running version %s. Updating is highly recommended.'),
$updateData['current_release']
),
];
@ -71,8 +71,8 @@ class UpdateCheck
if (ReleaseChannel::RollingRelease === $releaseChannel && $updateData['needs_rolling_update']) {
$notificationParts = [];
$notificationParts[] = '<b>' . __(
'Your installation is currently %d update(s) behind the latest version.',
$notificationParts[] = '<b>' . sprintf(
__('Your installation is currently %d update(s) behind the latest version.'),
$updateData['rolling_updates_available']
) . '</b>';

View File

@ -245,7 +245,10 @@ abstract class AbstractAdapter
$class_name = array_pop($class_parts);
if ($e instanceof Fault\BadNameException) {
$e_headline = __('%s is not recognized as a service.', $class_name);
$e_headline = sprintf(
__('%s is not recognized as a service.'),
$class_name
);
$e_body = __('It may not be registered with Supervisor yet. Restarting broadcasting may help.');
$app_e = new BadNameException(
@ -254,7 +257,10 @@ abstract class AbstractAdapter
$e
);
} elseif ($e instanceof Fault\AlreadyStartedException) {
$e_headline = __('%s cannot start', $class_name);
$e_headline = sprintf(
__('%s cannot start'),
$class_name
);
$e_body = __('It is already running.');
$app_e = new AlreadyRunningException(
@ -263,7 +269,10 @@ abstract class AbstractAdapter
$e
);
} elseif ($e instanceof Fault\NotRunningException) {
$e_headline = __('%s cannot stop', $class_name);
$e_headline = sprintf(
__('%s cannot stop'),
$class_name
);
$e_body = __('It is not running.');
$app_e = new NotRunningException(
@ -272,7 +281,10 @@ abstract class AbstractAdapter
$e
);
} else {
$e_headline = __('%s encountered an error', $class_name);
$e_headline = sprintf(
__('%s encountered an error'),
$class_name
);
// Get more detailed information for more significant errors.
$process_log = $this->supervisor->tailProcessStdoutLog($program_name, 0, 500);

View File

@ -26,8 +26,8 @@ class GeoLite extends AbstractIpGeolocator
public static function getAttribution(): string
{
return __(
'This product includes GeoLite2 data created by MaxMind, available from %s.',
return sprintf(
__('This product includes GeoLite2 data created by MaxMind, available from %s.'),
'<a href="https://www.maxmind.com">https://www.maxmind.com</a>'
);
}

View File

@ -39,7 +39,10 @@ class StationPortCheckerValidator extends ConstraintValidator
$used_ports = $this->configuration->getUsedPorts($value);
$message = __('The port %s is in use by another station.', '{{ port }}');
$message = sprintf(
__('The port %s is in use by another station.'),
'{{ port }}'
);
foreach ($ports_to_check as $port_path => $port) {
if (null === $port) {

View File

@ -34,8 +34,8 @@ class StorageLocationValidator extends ConstraintValidator
try {
$value->validate();
} catch (Exception $e) {
$message = __(
'Storage location %s could not be validated: %s',
$message = sprintf(
__('Storage location %s could not be validated: %s'),
'{{ storageLocation }}',
'{{ error }}'
);
@ -65,8 +65,8 @@ class StorageLocationValidator extends ConstraintValidator
/** @var Entity\StorageLocation $row */
foreach ($qb->getQuery()->toIterable() as $row) {
if ($row->getUri() === $storageLocationUri) {
$message = __(
'Storage location %s already exists.',
$message = sprintf(
__('Storage location %s already exists.'),
'{{ storageLocation }}',
);

View File

@ -117,7 +117,7 @@ $assets
foreach ($queue_totals as $queueType => $queueTotal): ?>
<div class="col">
<h5 class="mb-0"><?= $queueType ?></h5>
<p><?= __('%d queued messages', $queueTotal) ?></p>
<p><?= sprintf(__('%d queued messages'), $queueTotal) ?></p>
<div class="buttons">
<a class="btn btn-sm btn-primary" role="button" href="<?= $router->named(

View File

@ -17,8 +17,12 @@ $this->layout('main', [
</div>
<div class="card-body">
<?php if ($environment->isDocker()): ?>
<p><?=__('Because you are running Docker, some system logs can only be accessed from a shell session on the host computer. You can run <code>%s</code> to access container logs from the terminal.',
'docker-compose logs -f (nginx|web|stations|...)')?></p>
<p><?= sprintf(
__(
'Because you are running Docker, some system logs can only be accessed from a shell session on the host computer. You can run <code>%s</code> to access container logs from the terminal.'
),
'docker-compose logs -f (nginx|web|stations|...)'
) ?></p>
<?php endif; ?>
</div>
<div class="list-group list-group-flush">

View File

@ -1,16 +1,16 @@
<?php
/** @var */
?><?=__('Account Recovery')?>
?><?= __('Account Recovery') ?>
<?=__('An account recovery link has been requested for your account on "%s".', $environment->getAppName())?>
<?= sprintf(__('An account recovery link has been requested for your account on "%s".'), $environment->getAppName()) ?>
<?=__('Click the link below to log in to your account.')?>
<?= __('Click the link below to log in to your account.') ?>
<?=$router->named(
<?= $router->named(
'account:recover',
['token' => $token],
[],

View File

@ -172,17 +172,16 @@ endif; ?>
<footer id="footer" <?php
if (empty($sidebar)): ?>class="footer-alt"<?php
endif; ?> role="contentinfo">
<?=__(
'Powered by %s',
<?= sprintf(
__('Powered by %s'),
'<a href="https://www.azuracast.com/" target="_blank">' . $environment->getAppName(
) . '</a> &bull; ' . $version->getVersionText() . ' &bull; ' . ($environment->isDocker(
) ? 'Docker' : 'Ansible') . ' &bull; PHP ' . \PHP_MAJOR_VERSION . '.' . \PHP_MINOR_VERSION
)?>
) ?>
<br>
<?=__(
'Like our software? <a href="%s" target="_blank">Donate to support AzuraCast!</a>',
'https://docs.azuracast.com/en/contribute/donate'
)?>
<?= __('Like our software?') ?> <a href="https://docs.azuracast.com/en/contribute/donate"><?= __(
'Donate to support AzuraCast!'
) ?></a>
</footer>
<div id="radio-player"></div>

View File

@ -10,7 +10,7 @@ $autoloader->addClassMap([
$GLOBALS['autoloader'] = $autoloader;
if (!function_exists('__')) {
\Gettext\TranslatorFunctions::register(new \Gettext\Translator());
\PhpMyAdmin\MoTranslator\Loader::loadFunctions();
}
// Clear output directory