mirror of
https://gitlab.com/TheGamecraft/c-cms.git
synced 2026-04-23 03:19:10 -04:00
144 lines
3.5 KiB
PHP
144 lines
3.5 KiB
PHP
<?php
|
|
|
|
namespace Carbon;
|
|
|
|
use Symfony\Component\Translation;
|
|
|
|
class Translator extends Translation\Translator
|
|
{
|
|
/**
|
|
* Singleton for Translator.
|
|
*
|
|
* @var static
|
|
*/
|
|
protected static $singleton;
|
|
|
|
/**
|
|
* List of custom localized messages.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected static $messages = array();
|
|
|
|
/**
|
|
* Return a singleton instance of Translator.
|
|
*
|
|
* @param string|null $locale optional initial locale ("en" - english by default)
|
|
*
|
|
* @return static
|
|
*/
|
|
public static function get($locale = null)
|
|
{
|
|
if (static::$singleton === null) {
|
|
static::$singleton = new static($locale ?: 'en');
|
|
}
|
|
|
|
return static::$singleton;
|
|
}
|
|
|
|
public function __construct($locale, Translation\Formatter\MessageFormatterInterface $formatter = null, $cacheDir = null, $debug = false)
|
|
{
|
|
$this->addLoader('array', new Translation\Loader\ArrayLoader());
|
|
parent::__construct($locale, $formatter, $cacheDir, $debug);
|
|
}
|
|
|
|
/**
|
|
* Reset messages of a locale (all locale if no locale passed).
|
|
* Remove custom messages and reload initial messages from matching
|
|
* file in Lang directory.
|
|
*
|
|
* @param string|null $locale
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function resetMessages($locale = null)
|
|
{
|
|
if ($locale === null) {
|
|
static::$messages = array();
|
|
|
|
return true;
|
|
}
|
|
|
|
if (file_exists($filename = __DIR__.'/Lang/'.$locale.'.php')) {
|
|
static::$messages[$locale] = require $filename;
|
|
$this->addResource('array', static::$messages[$locale], $locale);
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Init messages language from matching file in Lang directory.
|
|
*
|
|
* @param string $locale
|
|
*
|
|
* @return bool
|
|
*/
|
|
protected function loadMessagesFromFile($locale)
|
|
{
|
|
if (isset(static::$messages[$locale])) {
|
|
return true;
|
|
}
|
|
|
|
return $this->resetMessages($locale);
|
|
}
|
|
|
|
/**
|
|
* Set messages of a locale and take file first if present.
|
|
*
|
|
* @param string $locale
|
|
* @param array $messages
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setMessages($locale, $messages)
|
|
{
|
|
$this->loadMessagesFromFile($locale);
|
|
$this->addResource('array', $messages, $locale);
|
|
static::$messages[$locale] = array_merge(
|
|
isset(static::$messages[$locale]) ? static::$messages[$locale] : array(),
|
|
$messages
|
|
);
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get messages of a locale, if none given, return all the
|
|
* languages.
|
|
*
|
|
* @param string|null $locale
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getMessages($locale = null)
|
|
{
|
|
return $locale === null ? static::$messages : static::$messages[$locale];
|
|
}
|
|
|
|
/**
|
|
* Set the current translator locale and indicate if the source locale file exists
|
|
*
|
|
* @param string $locale locale ex. en
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function setLocale($locale)
|
|
{
|
|
$locale = preg_replace_callback('/[-_]([a-z]{2,})/', function ($matches) {
|
|
// _2-letters is a region, _3+-letters is a variant
|
|
return '_'.call_user_func(strlen($matches[1]) > 2 ? 'ucfirst' : 'strtoupper', $matches[1]);
|
|
}, strtolower($locale));
|
|
|
|
if ($this->loadMessagesFromFile($locale)) {
|
|
parent::setLocale($locale);
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|