71 lines
2.1 KiB
PHP
71 lines
2.1 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/**
|
|
* @defgroup i18n I18N
|
|
* Implements localization concerns such as locale files, time zones, and country lists.
|
|
*/
|
|
|
|
/**
|
|
* @file classes/i18n/translation/LocaleFile.php
|
|
*
|
|
* Copyright (c) 2014-2021 Simon Fraser University
|
|
* Copyright (c) 2000-2021 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @class LocaleFile
|
|
*
|
|
* @ingroup i18n
|
|
*
|
|
* @brief Loads translations from a locale file
|
|
*/
|
|
|
|
namespace PKP\i18n\translation;
|
|
|
|
use DateInterval;
|
|
use Exception;
|
|
use Gettext\Generator\ArrayGenerator;
|
|
use Gettext\Loader\LoaderInterface;
|
|
use Gettext\Loader\MoLoader;
|
|
use Gettext\Loader\PoLoader;
|
|
use Gettext\Translations;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use SplFileInfo;
|
|
|
|
abstract class LocaleFile
|
|
{
|
|
/** @var string Max lifetime for the cache, a new cache file is created whenever the translation file is modified */
|
|
protected const MAX_CACHE_LIFETIME = '1 year';
|
|
|
|
/**
|
|
* Retrieves a suitable loader
|
|
*/
|
|
public static function getLoader(string $path): LoaderInterface
|
|
{
|
|
return match (strtolower((new SplFileInfo($path))->getExtension())) {
|
|
'po' => new PoLoader(),
|
|
'mo' => new MoLoader(),
|
|
default => throw new Exception("There's no suitable gettext loader for this file type")
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Loads the translations from a file
|
|
*/
|
|
public static function loadTranslations(string $path): Translations
|
|
{
|
|
return self::getLoader($path)->loadFile($path);
|
|
}
|
|
|
|
/**
|
|
* Loads the translations from a file as an array and caches the content physically as a PHP file in order to use the opcache
|
|
*/
|
|
public static function loadArray(string $path, bool $useCache = false): array
|
|
{
|
|
$loader = fn () => (new ArrayGenerator(['includeEmpty' => false]))->generateArray(static::loadTranslations($path));
|
|
$key = __METHOD__ . static::MAX_CACHE_LIFETIME . $path . filemtime($path);
|
|
return $useCache ? Cache::remember($key, DateInterval::createFromDateString(static::MAX_CACHE_LIFETIME), $loader) : $loader();
|
|
}
|
|
}
|