1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
/* |
4
|
|
|
* This file is part of the PHP Translation package. |
5
|
|
|
* |
6
|
|
|
* (c) PHP Translation team <[email protected]> |
7
|
|
|
* |
8
|
|
|
* For the full copyright and license information, please view the LICENSE |
9
|
|
|
* file that was distributed with this source code. |
10
|
|
|
*/ |
11
|
|
|
|
12
|
|
|
namespace Translation\Converter\Loader; |
13
|
|
|
|
14
|
|
|
use Symfony\Component\Finder\Finder; |
15
|
|
|
use Symfony\Component\Translation\Loader\LoaderInterface; |
16
|
|
|
use Symfony\Component\Translation\MessageCatalogue; |
17
|
|
|
use Translation\SymfonyStorage\TranslationLoader as TranslationLoaderInterface; |
18
|
|
|
|
19
|
|
|
class TranslationLoader implements TranslationLoaderInterface |
|
|
|
|
20
|
|
|
{ |
21
|
|
|
/** |
22
|
|
|
* @var LoaderInterface |
23
|
|
|
*/ |
24
|
|
|
private $loader; |
25
|
|
|
|
26
|
|
|
/** |
27
|
|
|
* @var string |
28
|
|
|
*/ |
29
|
|
|
private $format; |
30
|
|
|
|
31
|
|
|
/** |
32
|
|
|
* @param LoaderInterface $loader |
33
|
|
|
* @param string|string[] $format |
34
|
|
|
*/ |
35
|
2 |
|
public function __construct(LoaderInterface $loader, $format) |
36
|
|
|
{ |
37
|
2 |
|
$this->loader = $loader; |
38
|
2 |
|
$this->format = $format; |
|
|
|
|
39
|
2 |
|
} |
40
|
|
|
|
41
|
|
|
/** |
42
|
|
|
* Loads translation messages from a directory to the catalogue. |
43
|
|
|
* |
44
|
|
|
* @param string $directory the directory to look into |
45
|
|
|
* @param MessageCatalogue $catalogue the catalogue |
46
|
|
|
* |
47
|
2 |
|
* @deprecated Use read instead. |
48
|
|
|
*/ |
49
|
2 |
|
public function loadMessages($directory, MessageCatalogue $catalogue) |
50
|
|
|
{ |
51
|
|
|
return $this->read($directory, $catalogue); |
52
|
|
|
} |
53
|
|
|
|
54
|
2 |
|
/** |
55
|
2 |
|
* Loads translation messages from a directory to the catalogue. |
56
|
2 |
|
* |
57
|
2 |
|
* @param string $directory the directory to look into |
58
|
2 |
|
* @param MessageCatalogue $catalogue the catalogue |
59
|
2 |
|
*/ |
60
|
2 |
|
public function read($directory, MessageCatalogue $catalogue) |
61
|
2 |
|
{ |
62
|
|
|
if (!is_dir($directory)) { |
63
|
|
|
return; |
64
|
|
|
} |
65
|
|
|
|
66
|
|
|
// load any existing translation files |
67
|
|
|
$patterns = $this->getTranslationFilePatterns($catalogue); |
68
|
|
|
$files = $this->getTranslationFiles($directory, $patterns); |
69
|
|
|
foreach ($files as $file) { |
70
|
|
|
$domain = $this->getDomainFromFilename($file->getFilename(), $patterns); |
71
|
|
|
$catalogue->addCatalogue($this->loader->load($file->getPathname(), $catalogue->getLocale(), $domain)); |
72
|
|
|
} |
73
|
|
|
} |
74
|
|
|
|
75
|
|
|
protected function getTranslationFiles($directory, $patterns) |
76
|
|
|
{ |
77
|
|
|
$finder = new Finder(); |
78
|
|
|
foreach ($patterns as $pattern) { |
79
|
|
|
$finder->name($pattern); |
80
|
|
|
} |
81
|
|
|
|
82
|
|
|
return $finder |
83
|
|
|
->files() |
84
|
|
|
->in($directory); |
85
|
|
|
} |
86
|
|
|
|
87
|
|
|
protected function getDomainFromFilename($filename, $patterns) |
88
|
|
|
{ |
89
|
|
|
foreach ($patterns as $pattern) { |
90
|
|
|
$extension = str_replace('*.', '', $pattern); |
91
|
|
|
$length = strlen($extension); |
92
|
|
|
if (substr($filename, -$length) === $extension) { |
93
|
|
|
return substr($filename, 0, -1 * $length - 1); |
94
|
|
|
} |
95
|
|
|
} |
96
|
|
|
|
97
|
|
|
return $filename; |
98
|
|
|
} |
99
|
|
|
|
100
|
|
|
protected function getTranslationFilePatterns(MessageCatalogue $catalogue) |
101
|
|
|
{ |
102
|
|
|
if ($this->format && !is_array($this->format)) { |
103
|
|
|
$this->format = [$this->format]; |
|
|
|
|
104
|
|
|
} |
105
|
|
|
|
106
|
|
|
$patterns = []; |
107
|
|
|
foreach ($this->format as $ext) { |
|
|
|
|
108
|
|
|
$patterns[] = sprintf('*.%s.%s', $catalogue->getLocale(), $ext); |
109
|
|
|
} |
110
|
|
|
|
111
|
|
|
return $patterns; |
112
|
|
|
} |
113
|
|
|
} |
114
|
|
|
|
This class, trait or interface has been deprecated. The supplier of the file has supplied an explanatory message.
The explanatory message should give you some clue as to whether and when the type will be removed from the class and what other constant to use instead.