File: LanguagesHelper.php

package info (click to toggle)
matomo 5.5.1%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 73,596 kB
  • sloc: php: 231,041; javascript: 102,286; python: 202; xml: 189; sh: 172; makefile: 20; sql: 10
file content (78 lines) | stat: -rw-r--r-- 2,380 bytes parent folder | download
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;
    }
}