1 | <?php |
||
2 | |||
3 | namespace Erykai\Translate; |
||
4 | |||
5 | /** |
||
6 | * |
||
7 | */ |
||
8 | trait TraitTranslate |
||
9 | { |
||
10 | /** |
||
11 | * @param string $dir |
||
12 | * create dir |
||
13 | */ |
||
14 | private function create(string $dir): void |
||
15 | { |
||
16 | if (!is_dir($dir) && !mkdir($dir, 0755, true) && !is_dir($dir)) { |
||
17 | throw new \RuntimeException(sprintf('Directory "%s" was not created', $dir)); |
||
18 | } |
||
19 | } |
||
20 | |||
21 | /** |
||
22 | * create dir defaults |
||
23 | */ |
||
24 | protected function dir($module): void |
||
25 | { |
||
26 | $this->create($this->getPath()); |
||
27 | $this->create("{$this->getPath()}/{$this->getSource()}"); |
||
28 | if ($module) { |
||
29 | $this->create("{$this->getPath()}/{$this->getSource()}/public"); |
||
30 | } |
||
31 | |||
32 | $this->create("{$this->getPath()}/{$this->getTarget()}"); |
||
33 | if ($module) { |
||
34 | $this->create("{$this->getPath()}/{$this->getTarget()}/public"); |
||
35 | } |
||
36 | } |
||
37 | |||
38 | /** |
||
39 | * create files .translate |
||
40 | */ |
||
41 | protected function file(string $module = null, ?string $keyArray = null): void |
||
42 | { |
||
43 | if ($module) { |
||
44 | $modulePath = dirname(__DIR__, 4) . "/modules/{$module}/translate"; |
||
45 | $this->create("{$modulePath}/{$this->getSource()}"); |
||
46 | $this->create("{$modulePath}/{$this->getSource()}/public"); |
||
47 | $this->create("{$modulePath}/{$this->getTarget()}"); |
||
48 | $this->create("{$modulePath}/{$this->getTarget()}/public"); |
||
49 | $this->setSourceFile("{$modulePath}/{$this->getSource()}/{$this->getData()->file}." . TRANSLATE_EXT); |
||
50 | $this->setTargetFile("{$modulePath}/{$this->getTarget()}/{$this->getData()->file}." . TRANSLATE_EXT); |
||
51 | } else { |
||
52 | $this->setSourceFile("{$this->getPath()}/{$this->getSource()}/{$this->getData()->file}." . TRANSLATE_EXT); |
||
53 | $this->setTargetFile("{$this->getPath()}/{$this->getTarget()}/{$this->getData()->file}." . TRANSLATE_EXT); |
||
54 | } |
||
55 | if ($keyArray) { |
||
56 | $this->array($keyArray); |
||
57 | } else { |
||
58 | $this->line(); |
||
59 | } |
||
60 | |||
61 | } |
||
62 | |||
63 | /** |
||
64 | * @return void |
||
65 | */ |
||
66 | protected function line(): void |
||
67 | { |
||
68 | if (!is_file($this->getSourceFile())) { |
||
69 | file_put_contents($this->getSourceFile(), $this->getData()->text . PHP_EOL); |
||
70 | } else if (!in_array($this->getData()->text . PHP_EOL, array_filter(file($this->getSourceFile())), true)) { |
||
71 | file_put_contents($this->getSourceFile(), $this->getData()->text . PHP_EOL, FILE_APPEND); |
||
72 | } |
||
73 | |||
74 | if (!is_file($this->getTargetFile())) { |
||
75 | file_put_contents($this->getTargetFile(), $this->translate(file_get_contents($this->getSourceFile())) . PHP_EOL); |
||
76 | } else { |
||
77 | $source = array_filter(file($this->getSourceFile())); |
||
78 | $target = array_filter(file($this->getTargetFile())); |
||
79 | $result = array_diff_key($source, $target); |
||
80 | $implode = implode("", $result); |
||
81 | if (count(array_filter(file($this->getSourceFile()))) > count(array_filter(file($this->getTargetFile())))) { |
||
82 | file_put_contents($this->getTargetFile(), $this->translate($implode) . PHP_EOL, FILE_APPEND); |
||
83 | } |
||
84 | |||
85 | } |
||
86 | } |
||
87 | |||
88 | /** |
||
89 | * @param string $keyArray |
||
90 | * @return void |
||
91 | */ |
||
92 | protected function array(string $keyArray): void |
||
93 | { |
||
94 | $text = $this->getData()->text; |
||
95 | $sourceFile = $this->getSourceFile(); |
||
96 | |||
97 | $contentSource = []; |
||
98 | if (is_file($sourceFile)) { |
||
99 | $contentSource = include $sourceFile; |
||
100 | } |
||
101 | if (!preg_match("/'$keyArray'\s*=>/", var_export($contentSource, true))) { |
||
102 | $this->insertNestedArrayValue($contentSource, $keyArray, $text); |
||
103 | $sourceContent = "<?php\n\nreturn " . $this->formatArraySyntax(var_export($contentSource, true)) . ";\n"; |
||
104 | file_put_contents($sourceFile, $sourceContent); |
||
105 | } |
||
106 | |||
107 | $targetFile = $this->getTargetFile(); |
||
108 | $contentTarget = []; |
||
109 | if (is_file($targetFile)) { |
||
110 | $contentTarget = include $targetFile; |
||
111 | } |
||
112 | if (!preg_match("/'$keyArray'\s*=>/", var_export($contentTarget, true))) { |
||
113 | $translatedText = $this->translate($text); |
||
114 | $this->insertNestedArrayValue($contentTarget, $keyArray, $translatedText); |
||
115 | $targetContent = "<?php\n\nreturn " . $this->formatArraySyntax(var_export($contentTarget, true)) . ";\n"; |
||
116 | file_put_contents($targetFile, $targetContent); |
||
117 | } |
||
118 | } |
||
119 | |||
120 | /** |
||
121 | * @param $array |
||
122 | * @param $path |
||
123 | * @param $value |
||
124 | * @return void |
||
125 | */ |
||
126 | private function insertNestedArrayValue(&$array, $path, $value): void |
||
127 | { |
||
128 | $keys = explode('.', $path); |
||
129 | while (count($keys) > 1) { |
||
130 | $key = array_shift($keys); |
||
131 | if (!isset($array[$key]) || !is_array($array[$key])) { |
||
132 | $array[$key] = []; |
||
133 | } |
||
134 | $array = &$array[$key]; |
||
135 | } |
||
136 | $array[array_shift($keys)] = $value; |
||
137 | } |
||
138 | |||
139 | /** |
||
140 | * @param $content |
||
141 | * @return array|string |
||
142 | */ |
||
143 | private function formatArraySyntax($content): array|string |
||
144 | { |
||
145 | return str_replace(['array (', ')'], ['[', ']'], $content); |
||
146 | } |
||
147 | |||
148 | private function replacePlaceholders($template, $values): string |
||
149 | { |
||
150 | if (!is_array($values)) { |
||
151 | $values = [$values]; |
||
152 | } |
||
153 | |||
154 | foreach ($values as $value) { |
||
155 | $template = preg_replace('/<#>/', $value, $template, 1); |
||
156 | } |
||
157 | return $template; |
||
158 | } |
||
159 | |||
160 | /** |
||
161 | * @param string $text |
||
162 | * @return mixed |
||
163 | * send server translate |
||
164 | */ |
||
165 | private function translate(string $text): mixed |
||
166 | { |
||
167 | $url = TRANSLATE_API_URL; |
||
168 | $ch = curl_init($url); |
||
169 | curl_setopt_array($ch, [ |
||
170 | CURLOPT_FOLLOWLOCATION => 1, |
||
171 | CURLOPT_RETURNTRANSFER => 1, |
||
172 | CURLOPT_POSTFIELDS => http_build_query([ |
||
173 | "key" => TRANSLATE_API_KEY, |
||
174 | "source" => "en", |
||
175 | "target" => $this->getTarget(), |
||
176 | "text" => $text, |
||
177 | "route" => $this->getData()->file |
||
178 | ]) |
||
179 | ]); |
||
180 | $response = curl_exec($ch); |
||
181 | curl_close($ch); |
||
182 | if (!$response) { |
||
183 | return $text; |
||
184 | } |
||
185 | $data = json_decode($response); |
||
0 ignored issues
–
show
Bug
introduced
by
![]() |
|||
186 | if ($data->status === "success") { |
||
187 | return trim($this->replacePlaceholders($data->translate, $this->getDynamic())); |
||
188 | } |
||
189 | return trim($this->replacePlaceholders($text, $this->getDynamic())); |
||
190 | } |
||
191 | |||
192 | } |