FallbackCatalogueLoader::setFallbackLocales()   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
c 0
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
3
/*
4
 * This file is part of the openl10n package.
5
 *
6
 * (c) Matthieu Moquet <[email protected]>
7
 *
8
 * This source file is subject to the MIT license that is bundled
9
 * with this source code in the file LICENSE.
10
 */
11
12
namespace Openl10n\Component\Translation\MessageCatalogue;
13
14
/**
15
 * Combine catalogues using fallback locales.
16
 */
17
class FallbackCatalogueLoader implements MessageCatalogueLoader
18
{
19
    /**
20
     * Decorated catalogue loader.
21
     *
22
     * @var MessageCatalogueLoader
23
     */
24
    protected $catalogueLoader;
25
26
    /**
27
     * Fallback locales.
28
     *
29
     * @var array
30
     */
31
    protected $fallbackLocales = [];
32
33
    /**
34
     * @param MessageCatalogueLoader $catalogueLoader
35
     */
36
    public function __construct(MessageCatalogueLoader $catalogueLoader)
37
    {
38
        $this->catalogueLoader = $catalogueLoader;
39
    }
40
41
    /**
42
     * Sets the fallback locales.
43
     *
44
     * @param array $locales The fallback locales
45
     */
46
    public function setFallbackLocales(array $locales)
47
    {
48
        $this->fallbackLocales = $locales;
49
    }
50
51
    /**
52
     * Gets the fallback locales.
53
     *
54
     * @return array $locales The fallback locales
55
     */
56
    public function getFallbackLocales()
57
    {
58
        return $this->fallbackLocales;
59
    }
60
61
    /**
62
     * {@inheritdoc}
63
     */
64
    public function loadCatalogue($locale)
65
    {
66
        $catalogues = [];
67
68
        $catalogues[$locale] = $this->catalogueLoader->loadCatalogue($locale);
69
70
        $current = $catalogues[$locale];
71
72
        foreach ($this->computeFallbackLocales($locale) as $fallback) {
73
            if (!isset($catalogues[$fallback])) {
74
                $catalogues[$fallback] = $this->catalogueLoader->loadCatalogue($fallback);
75
            }
76
77
            $current->addFallbackCatalogue($catalogues[$fallback]);
78
            $current = $catalogues[$fallback];
79
        }
80
81
        return $catalogues[$locale];
82
    }
83
84
    protected function computeFallbackLocales($locale)
85
    {
86
        $locales = [];
87
        foreach ($this->fallbackLocales as $fallback) {
88
            if ($fallback === $locale) {
89
                continue;
90
            }
91
92
            $locales[] = $fallback;
93
        }
94
95
        if (strrchr($locale, '_') !== false) {
96
            array_unshift($locales, substr($locale, 0, -strlen(strrchr($locale, '_'))));
97
        }
98
99
        return array_unique($locales);
100
    }
101
}
102