mirror of
https://github.com/grocy/grocy.git
synced 2025-04-29 17:45:39 +00:00
* use singletons to reduce need to recreate the same objects * unable to make the constructor private * comment out debug printing to log file * correct typo of treating self() as a var instead of a function * utilise Localisation service as a singleton * fix errent line that should have been commented * remove phpinfo * correct mistake in stock controller * try storing app in apcu * serialise inside the app closures * get timings for db-changed-time * get timings for db-changed-time * store localisation service in apcu * stor translations in apcu instead of localisation service (due to database connection) * correct syntax error * forgot to uncomment instance map * correct indentation and variable out of scope * more timings for app execution time * try apc caching for views * correct scope for Pot variable * remove additional fopen * correct timings for app build time * correct timings for app object build time * correct timings for app route build time * get timings for routing timings * get more in depth timings for routing loading * fix more in depth timings for routing loading * start investigating session auth middleware creation * start investigating session auth middleware creation * start investigating Login controller time * start investigating Login controller time * in depth look at Logincontroller timings * comment out debug printing * lazily obtain valus for page rendering * correct syntax error * correct scope of variable * correct visibiity of methds inherited from BaseController * missing use for Userfieldsservice * lazy loading of open api spec * lazy loading of users service * lazy loading of batteries service * lazy loading of services in controllers * lazy loading of services in services * correct mistake * fix userservice * fix userservice * fix userfieldservice * fix chores service * fix calendar service * remove Dockerfile used for development * Remove docker compose file used for development * Clean up app.php * remove last diff * Clean up base controller * Clean up controllers * lean up middleware * Clean up and tuen all services into singletons * remove debug from routes.php * remove acpu from localisation * Complete removal of acpu from localisation * fixes for things broken * More fixes following merge * Fix for start up bug. Re factoring singleton code had brroken due to scope of clas var. * fix bug where getUsersService is declared twice * bug fixes following merge * bug fixes following merge * bug fixes following merge * bug fixes following merge * bug fixes following merge * Fix all the not working things... * Deleted off-topic files * Deleted off-topic files Co-authored-by: Bernd Bestel <bernd@berrnd.de>
168 lines
4.8 KiB
PHP
168 lines
4.8 KiB
PHP
<?php
|
|
|
|
namespace Grocy\Services;
|
|
|
|
#use \Grocy\Services\DatabaseService;
|
|
use \Gettext\Translation;
|
|
use \Gettext\Translations;
|
|
use \Gettext\Translator;
|
|
|
|
class LocalizationService
|
|
{
|
|
|
|
private static $instanceMap = array();
|
|
|
|
public function __construct(string $culture)
|
|
{
|
|
$this->Culture = $culture;
|
|
|
|
$this->LoadLocalizations($culture);
|
|
}
|
|
|
|
|
|
protected function getDatabaseService()
|
|
{
|
|
return DatabaseService::getInstance();
|
|
}
|
|
|
|
protected function getdatabase()
|
|
{
|
|
return $this->getDatabaseService()->GetDbConnection();
|
|
}
|
|
|
|
public static function getInstance(string $culture)
|
|
{
|
|
if (!in_array($culture, self::$instanceMap))
|
|
{
|
|
self::$instanceMap[$culture] = new self($culture);
|
|
}
|
|
|
|
return self::$instanceMap[$culture];
|
|
}
|
|
|
|
protected $Pot;
|
|
protected $PotMain;
|
|
protected $Po;
|
|
protected $PoUserStrings;
|
|
protected $Translator;
|
|
|
|
private function LoadLocalizations()
|
|
{
|
|
$culture = $this->Culture;
|
|
|
|
if (GROCY_MODE === 'dev')
|
|
{
|
|
$this->PotMain = Translations::fromPoFile(__DIR__ . '/../localization/strings.pot');
|
|
|
|
$this->Pot = Translations::fromPoFile(__DIR__ . '/../localization/chore_period_types.pot');
|
|
$this->Pot = $this->Pot->mergeWith(Translations::fromPoFile(__DIR__ . '/../localization/chore_assignment_types.pot'));
|
|
$this->Pot = $this->Pot->mergeWith(Translations::fromPoFile(__DIR__ . '/../localization/component_translations.pot'));
|
|
$this->Pot = $this->Pot->mergeWith(Translations::fromPoFile(__DIR__ . '/../localization/demo_data.pot'));
|
|
$this->Pot = $this->Pot->mergeWith(Translations::fromPoFile(__DIR__ . '/../localization/stock_transaction_types.pot'));
|
|
$this->Pot = $this->Pot->mergeWith(Translations::fromPoFile(__DIR__ . '/../localization/strings.pot'));
|
|
$this->Pot = $this->Pot->mergeWith(Translations::fromPoFile(__DIR__ . '/../localization/userfield_types.pot'));
|
|
}
|
|
|
|
$this->PoUserStrings = new Translations();
|
|
$this->PoUserStrings->setDomain('grocy/userstrings');
|
|
|
|
$this->Po = Translations::fromPoFile(__DIR__ . "/../localization/$culture/chore_period_types.po");
|
|
$this->Po = $this->Po->mergeWith(Translations::fromPoFile(__DIR__ . "/../localization/$culture/chore_assignment_types.po"));
|
|
$this->Po = $this->Po->mergeWith(Translations::fromPoFile(__DIR__ . "/../localization/$culture/component_translations.po"));
|
|
$this->Po = $this->Po->mergeWith(Translations::fromPoFile(__DIR__ . "/../localization/$culture/demo_data.po"));
|
|
$this->Po = $this->Po->mergeWith(Translations::fromPoFile(__DIR__ . "/../localization/$culture/stock_transaction_types.po"));
|
|
$this->Po = $this->Po->mergeWith(Translations::fromPoFile(__DIR__ . "/../localization/$culture/strings.po"));
|
|
$this->Po = $this->Po->mergeWith(Translations::fromPoFile(__DIR__ . "/../localization/$culture/userfield_types.po"));
|
|
|
|
$quantityUnits = null;
|
|
try
|
|
{
|
|
$quantityUnits = $this->getDatabase()->quantity_units()->fetchAll();
|
|
}
|
|
catch (\Exception $ex)
|
|
{
|
|
// Happens when database is not initialised or migrated...
|
|
}
|
|
|
|
if ($quantityUnits !== null)
|
|
{
|
|
foreach ($quantityUnits as $quantityUnit)
|
|
{
|
|
$translation = new Translation('', $quantityUnit['name']);
|
|
$translation->setTranslation($quantityUnit['name']);
|
|
$translation->setPlural($quantityUnit['name_plural']);
|
|
$translation->setPluralTranslations(preg_split('/\r\n|\r|\n/', $quantityUnit['plural_forms']));
|
|
|
|
$this->PoUserStrings[] = $translation;
|
|
}
|
|
$this->Po = $this->Po->mergeWith($this->PoUserStrings);
|
|
}
|
|
|
|
$this->Translator = new Translator();
|
|
$this->Translator->loadTranslations($this->Po);
|
|
}
|
|
|
|
public function GetPoAsJsonString()
|
|
{
|
|
return $this->Po->toJsonString();
|
|
}
|
|
|
|
public function GetPluralCount()
|
|
{
|
|
if ($this->Po->getHeader(Translations::HEADER_PLURAL) !== null)
|
|
{
|
|
return $this->Po->getPluralForms()[0];
|
|
}
|
|
else
|
|
{
|
|
return 2;
|
|
}
|
|
}
|
|
|
|
public function GetPluralDefinition()
|
|
{
|
|
if ($this->Po->getHeader(Translations::HEADER_PLURAL) !== null)
|
|
{
|
|
return $this->Po->getPluralForms()[1];
|
|
}
|
|
else
|
|
{
|
|
return '(n != 1)';
|
|
}
|
|
}
|
|
|
|
public function __t($text, ...$placeholderValues)
|
|
{
|
|
$this->CheckAndAddMissingTranslationToPot($text);
|
|
|
|
if (func_num_args() === 1)
|
|
{
|
|
return $this->Translator->gettext($text);
|
|
}
|
|
else
|
|
{
|
|
return vsprintf($this->Translator->gettext($text), ...$placeholderValues);
|
|
}
|
|
}
|
|
|
|
public function __n($number, $singularForm, $pluralForm)
|
|
{
|
|
$this->CheckAndAddMissingTranslationToPot($singularForm);
|
|
|
|
return sprintf($this->Translator->ngettext($singularForm, $pluralForm, $number), $number);
|
|
}
|
|
|
|
public function CheckAndAddMissingTranslationToPot($text)
|
|
{
|
|
if (GROCY_MODE === 'dev')
|
|
{
|
|
if ($this->Pot->find('', $text) === false && $this->PoUserStrings->find('', $text) === false)
|
|
{
|
|
$translation = new Translation('', $text);
|
|
$this->PotMain[] = $translation;
|
|
$this->PotMain->toPoFile(__DIR__ . '/../localization/strings.pot');
|
|
}
|
|
}
|
|
}
|
|
}
|