I18n::_()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
3
/**
4
 * Manage Translation
5
 *
6
 * @category    lib
7
 * @author      Judicaël Paquet <[email protected]>
8
 * @copyright   Copyright (c) 2013-2014 PAQUET Judicaël FR Inc. (https://github.com/las93)
9
 * @license     https://github.com/las93/venus2/blob/master/LICENSE.md Tout droit réservé à PAQUET Judicaël
10
 * @version     Release: 1.0.0
11
 * @filesource  https://github.com/las93/venus2
12
 * @link        https://github.com/las93
13
 * @since       1.0
14
 */
15
namespace Venus\lib;
16
17
use \Apollina\I18n      as CoreI18n;
18
use \Venus\core\Config  as Config;
19
20
/**
21
 * This class manage the Translation
22
 *
23
 * @category    lib
24
 * @author      Judicaël Paquet <[email protected]>
25
 * @copyright   Copyright (c) 2013-2014 PAQUET Judicaël FR Inc. (https://github.com/las93)
26
 * @license     https://github.com/las93/venus2/blob/master/LICENSE.md Tout droit réservé à PAQUET Judicaël
27
 * @version     Release: 1.0.0
28
 * @filesource  https://github.com/las93/venus2
29
 * @link        https://github.com/las93
30
 * @since       1.0
31
 */
32
class I18n extends CoreI18n
33
{
34
    /**
35
     * constructor
36
     * 
37
     * @access public
38
     * @return \Venus\lib\I18n
0 ignored issues
show
Comprehensibility Best Practice introduced by
Adding a @return annotation to constructors is generally not recommended as a constructor does not have a meaningful return value.

Adding a @return annotation to a constructor is not recommended, since a constructor does not have a meaningful return value.

Please refer to the PHP core documentation on constructors.

Loading history...
39
     */
40
    public function __construct()
41
    {
42
        $this->setI18nDirectory(__DIR__.DIRECTORY_SEPARATOR.I18N_DIRECTORY)
43
             ->setI18nDomain(I18N_DOMAIN)
44
             ->setIntermediaiteDirectory(DIRECTORY_SEPARATOR.'LC_MESSAGES'.DIRECTORY_SEPARATOR);
45
        
46
        foreach (Config::get('Plugins')->list as $iKey => $sPlugin) {
47
            
48
            if (file_exists(__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'src'.DIRECTORY_SEPARATOR.'plugins'.DIRECTORY_SEPARATOR.$sPlugin.DIRECTORY_SEPARATOR.'i18n'.DIRECTORY_SEPARATOR.$this->getLanguage().$this->getIntermediaiteDirectory().$sPlugin.'.json')) {
49
50
                $oJson = json_decode(file_get_contents(__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'src'.DIRECTORY_SEPARATOR.'plugins'.DIRECTORY_SEPARATOR.$sPlugin.DIRECTORY_SEPARATOR.'i18n'.DIRECTORY_SEPARATOR.$this->getLanguage().$this->getIntermediaiteDirectory().$sPlugin.'.json'));
51
                
52
                $fCallBack = function($sValue) use ($oJson)
53
                {    
54
                    if (isset($oJson->$sValue)) { return $oJson->$sValue; }
55
                    else { return ''; }
56
                };
57
            }
58
            
59
            CoreI18n::addCallback($sPlugin, $fCallBack);
0 ignored issues
show
Bug introduced by
The variable $fCallBack does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
Documentation introduced by
$fCallBack is of type object<Closure>, but the function expects a object<Apollina\fucntion>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
60
        }
61
    }
62
63
    /**
64
     * Hilight to add the plugin I18N
65
     *
66
     * @access public
67
     * @param string $sValue value of text to traduct
68
     * @return string
69
     */
70
    public function _(string $sValue) : string
71
    {
72
        return $this->getText($sValue);
73
    }
74
}
75