1 | <?php |
||
2 | |||
3 | namespace Translation\Services; |
||
4 | |||
5 | use Illuminate\Http\Request; |
||
0 ignored issues
–
show
|
|||
6 | use Translation\Repositories\LanguageRepository; |
||
7 | |||
8 | class UriLocalizer |
||
9 | { |
||
10 | /** |
||
11 | * @param LanguageRepository $languageRepository |
||
12 | * @param Request $request |
||
13 | */ |
||
14 | public function __construct(LanguageRepository $languageRepository, Request $request) |
||
15 | { |
||
16 | $this->request = $request; |
||
0 ignored issues
–
show
|
|||
17 | $this->availableLocales = $languageRepository->availableLocales(); |
||
0 ignored issues
–
show
|
|||
18 | } |
||
19 | |||
20 | /** |
||
21 | * Returns the locale present in the current url, if any. |
||
22 | * |
||
23 | * @param integer $segment Index of the segment containing locale info |
||
24 | * @return string |
||
25 | */ |
||
26 | public function localeFromRequest($segment = 0) |
||
27 | { |
||
28 | $url = $this->request->getUri(); |
||
29 | return $this->getLocaleFromUrl($url, $segment); |
||
30 | } |
||
31 | |||
32 | /** |
||
33 | * Localizes the given url to the given locale. Removes domain if present. |
||
34 | * Ex: /home => /es/home, /en/home => /es/home, http://www.domain.com/en/home => /en/home, https:://domain.com/ => /en |
||
35 | * If a non zero segment index is given, and the url doesn't have enought segments, the url is unchanged. |
||
36 | * |
||
37 | * @param string $url |
||
38 | * @param string $locale |
||
39 | * @param integer $segment Index of the segment containing locale info |
||
40 | * @return string |
||
41 | */ |
||
42 | public function localize($url, $locale, $segment = 0) |
||
43 | { |
||
44 | $cleanUrl = $this->cleanUrl($url, $segment); |
||
45 | $parsedUrl = $this->parseUrl($cleanUrl, $segment); |
||
46 | |||
47 | // Check if there are enough segments, if not return url unchanged: |
||
48 | if (count($parsedUrl['segments']) >= $segment) { |
||
49 | array_splice($parsedUrl['segments'], $segment, 0, $locale); |
||
50 | } |
||
51 | return $this->pathFromParsedUrl($parsedUrl); |
||
52 | } |
||
53 | |||
54 | /** |
||
55 | * Extract the first valid locale from a url |
||
56 | * |
||
57 | * @param string $url |
||
58 | * @param integer $segment Index of the segment containing locale info |
||
59 | * @return string|null $locale |
||
60 | */ |
||
61 | public function getLocaleFromUrl($url, $segment = 0) |
||
62 | { |
||
63 | return $this->parseUrl($url, $segment)['locale']; |
||
64 | } |
||
65 | |||
66 | /** |
||
67 | * Removes the domain and locale (if present) of a given url. |
||
68 | * Ex: http://www.domain.com/locale/random => /random, https://www.domain.com/random => /random, http://domain.com/random?param=value => /random?param=value |
||
69 | * |
||
70 | * @param string $url |
||
71 | * @param integer $segment Index of the segment containing locale info |
||
72 | * @return string |
||
73 | */ |
||
74 | public function cleanUrl($url, $segment = 0) |
||
75 | { |
||
76 | $parsedUrl = $this->parseUrl($url, $segment); |
||
77 | // Remove locale from segments: |
||
78 | if ($parsedUrl['locale']) { |
||
79 | unset($parsedUrl['segments'][$segment]); |
||
80 | $parsedUrl['locale'] = false; |
||
81 | } |
||
82 | return $this->pathFromParsedUrl($parsedUrl); |
||
83 | } |
||
84 | |||
85 | /** |
||
86 | * Parses the given url in a similar way to PHP's parse_url, with the following differences: |
||
87 | * Forward and trailling slashed are removed from the path value. |
||
88 | * A new "segments" key replaces 'path', with the uri segments in array form ('/es/random/thing' => ['es', 'random', 'thing']) |
||
89 | * A 'locale' key is added, with the value of the locale found in the current url |
||
90 | * |
||
91 | * @param string $url |
||
92 | * @param integer $segment Index of the segment containing locale info |
||
93 | * @return mixed |
||
94 | */ |
||
95 | protected function parseUrl($url, $segment = 0) |
||
96 | { |
||
97 | $parsedUrl = parse_url($url); |
||
98 | $parsedUrl['segments'] = array_values(array_filter(explode('/', $parsedUrl['path']), 'strlen')); |
||
99 | $localeCandidate = array_get($parsedUrl['segments'], $segment, false); |
||
100 | $parsedUrl['locale'] = in_array($localeCandidate, $this->availableLocales) ? $localeCandidate : null; |
||
101 | $parsedUrl['query'] = array_get($parsedUrl, 'query', false); |
||
102 | $parsedUrl['fragment'] = array_get($parsedUrl, 'fragment', false); |
||
103 | unset($parsedUrl['path']); |
||
104 | return $parsedUrl; |
||
105 | } |
||
106 | |||
107 | /** |
||
108 | * Returns the uri for the given parsed url based on its segments, query and fragment |
||
109 | * |
||
110 | * @return string |
||
111 | */ |
||
112 | protected function pathFromParsedUrl($parsedUrl) |
||
113 | { |
||
114 | $path = '/' . implode('/', $parsedUrl['segments']); |
||
115 | if ($parsedUrl['query']) { |
||
116 | $path .= "?{$parsedUrl['query']}"; |
||
117 | } |
||
118 | if ($parsedUrl['fragment']) { |
||
119 | $path .= "#{$parsedUrl['fragment']}"; |
||
120 | } |
||
121 | return $path; |
||
122 | } |
||
123 | |||
124 | /** |
||
125 | * Remove the front slash from a string |
||
126 | * |
||
127 | * @param string $path |
||
128 | * @return string |
||
129 | */ |
||
130 | protected function removeFrontSlash($path) |
||
131 | { |
||
132 | return strlen($path) > 0 && substr($path, 0, 1) === '/' ? substr($path, 1) : $path; |
||
133 | } |
||
134 | |||
135 | /** |
||
136 | * Remove the trailing slash from a string |
||
137 | * |
||
138 | * @param string $path |
||
139 | * @return string |
||
140 | */ |
||
141 | protected function removeTrailingSlash($path) |
||
142 | { |
||
143 | return strlen($path) > 0 && substr($path, -1) === '/' ? substr($path, 0, -1) : $path; |
||
144 | } |
||
145 | } |
||
146 |
The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g.
excluded_paths: ["lib/*"]
, you can move it to the dependency path list as follows:For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths