-
Notifications
You must be signed in to change notification settings - Fork 5
/
TranslationLoader.php
108 lines (95 loc) · 3.05 KB
/
TranslationLoader.php
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php
/*
* This file is part of the PHP Translation package.
*
* (c) PHP Translation team <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Translation\PlatformAdapter\Flysystem;
use League\Flysystem\Filesystem;
use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Loader\LoaderInterface;
/**
* TranslationLoader loads translation messages from translation files.
*
* @author Tobias Nyholm <[email protected]>
*/
final class TranslationLoader implements \Translation\SymfonyStorage\TranslationLoader
{
/**
* Loaders used for import.
*
* @var LoaderInterface[]
*/
private $loaders = [];
/**
* @var Filesystem
*/
private $filesystem;
/**
* @param Filesystem $filesystem
*/
public function __construct(Filesystem $filesystem)
{
$this->filesystem = $filesystem;
}
/**
* Adds a loader to the translation extractor.
*
* @param string $format The format of the loader
* @param LoaderInterface $loader
*/
public function addLoader($format, LoaderInterface $loader)
{
$this->loaders[$format] = $loader;
}
/**
* Loads translation messages from a directory to the catalogue.
*
* @param string $directory the directory to look into
* @param MessageCatalogue $catalogue the catalogue
*/
public function loadMessages($directory, MessageCatalogue $catalogue)
{
if (!$this->filesystem->has($directory)) {
return;
}
foreach ($this->loaders as $format => $loader) {
// load any existing translation files
$extension = $catalogue->getLocale().'.'.$format;
$files = $this->filesystem->listFiles($directory, true);
foreach ($files as $file) {
$path = $file['path'];
$filename = $this->basename($path);
$domain = substr($filename, 0, -1 * strlen($extension) - 1);
$catalogue->addCatalogue($loader->load($path, $catalogue->getLocale(), $domain));
}
}
}
/**
* Gets the filename from a given path.
*
* PHP's basename() does not properly support streams or filenames beginning with a non-US-ASCII character.
*
* @author Drupal 8.2
*
* @param string $path
*
* @return string
*/
private function basename($path)
{
$separators = '/';
if (DIRECTORY_SEPARATOR != '/') {
// For Windows OS add special separator.
$separators .= DIRECTORY_SEPARATOR;
}
// Remove right-most slashes when $path points to directory.
$path = rtrim($path, $separators);
// Returns the trailing part of the $path starting after one of the directory separators.
$filename = preg_match('@[^'.preg_quote($separators, '@').']+$@', $path, $matches) ? $matches[0] : '';
return $filename;
}
}