1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\LanguagesManager;
use Piwik\Container\StaticContainer;
use Piwik\Plugins\UsersManager\Model as UserModel;
use Piwik\Plugins\LanguagesManager\Model as LangModel;
use Piwik\Translation\Translator;
/**
* Helper class allowing to run a callback function with the given user's preferred language
* temporarily set for the translator.
*
* This is handy for cases such as sending a reminder or notification email from the scheduled task
* where the system is not running under the given user. Previously set language is restored after the callback is run.
*
* Usage:
*
* LanguageHelper::doWithUserLanguage('someUsernameOrEmail', function() { ... code to run ... });
*/
class LanguagesHelper
{
private static function getUserFromEmailOrLogin(string $emailOrLogin): ?array
{
$userModel = new UserModel();
$user = null;
if ($userModel->userExists($emailOrLogin)) {
$user = $userModel->getUser($emailOrLogin);
} elseif ($userModel->userEmailExists($emailOrLogin)) {
$user = $userModel->getUserByEmail($emailOrLogin);
}
return $user;
}
public static function doWithUserLanguage(string $emailOrLogin, callable $callback)
{
$user = self::getUserFromEmailOrLogin($emailOrLogin);
if (!$user) {
return $callback();
}
$langModel = new LangModel();
$userLanguage = $langModel->getLanguageForUser($user['login']);
$translator = StaticContainer::get(Translator::class);
$backupLanguage = $translator->getCurrentLanguage();
if (empty($backupLanguage)) {
// if no language was set yet, ensure to restore the default language
$backupLanguage = $translator->getDefaultLanguage();
}
if (!empty($userLanguage)) {
// temporarily overwrite the language to perform the callback action
$translator->setCurrentLanguage($userLanguage);
}
try {
$result = $callback();
} catch (\Throwable $ex) {
throw $ex;
} finally {
$translator->setCurrentLanguage($backupLanguage);
}
return $result;
}
}
|