dbxapp 4.1.3
CMS, Shop, Workflows und modulare Geschäftsanwendungen
Loading...
Searching...
No Matches
dbxForm_fd_language_messages_test.php
Go to the documentation of this file.
1<?php
2
13
14require_once dirname(__DIR__, 2) . '/vendor/autoload.php';
15require_once dirname(__DIR__) . '/dbxKernel.php';
16
17dbx()->get_system_obj('dbxForm', 'load');
18dbx()->get_system_obj('dbxReport', 'load');
19
20$fail = static function (string $message): void {
21 fwrite(STDERR, "FAIL: {$message}\n");
22 exit(1);
23};
24
25$moduleRoot = dirname(__DIR__, 2) . DIRECTORY_SEPARATOR . 'modules';
26$groups = array();
27$iterator = new RecursiveIteratorIterator(
28 new RecursiveDirectoryIterator($moduleRoot, FilesystemIterator::SKIP_DOTS)
29);
30
31foreach ($iterator as $file) {
32 $path = str_replace('\\', '/', $file->getPathname());
33 if (
34 !$file->isFile() ||
35 !str_contains($path, '/fd/') ||
36 str_contains($path, '/fd/_backup/') ||
37 !str_ends_with($path, '.fd.php')
38 ) {
39 continue;
40 }
41
42 $name = $file->getFilename();
43 $variant = 'neutral';
44 if (preg_match('/_(de|en|es)\.fd\.php$/', $name, $match)) {
45 $variant = $match[1];
46 }
47 $base = preg_replace('/_(de|en|es)\.fd\.php$/', '.fd.php', $name);
48 $key = str_replace('\\', '/', $file->getPath()) . '/' . $base;
49 $groups[$key][$variant] = $file->getPathname();
50}
51
52if (!$groups) {
53 $fail('Keine FD-Dateien gefunden.');
54}
55
56$expected = array(
57 'de' => array(
58 'save_success' => 'Daten wurden gespeichert',
59 'save_error' => 'Daten konnten nicht gespeichert werden',
60 ),
61 'en' => array(
62 'save_success' => 'Data was saved',
63 'save_error' => 'Data could not be saved',
64 ),
65 'es' => array(
66 'save_success' => 'Los datos se guardaron',
67 'save_error' => 'Los datos no se pudieron guardar',
68 ),
69);
70
71$readFd = static function (string $path): array {
72 $fields = array();
73 $messages = array();
74 include $path;
75 return array(
76 'fields' => is_array($fields) ? array_values($fields) : array(),
77 'messages' => is_array($messages) ? $messages : array(),
78 );
79};
80
81$assertNoGermanUiText = static function (
82 array $fields,
83 array $messages,
84 string $path
85) use ($fail): void {
86 $uiKeys = array(
87 'label', 'tooltip', 'errormsg', 'placeholder',
88 'prompt', 'hint', 'options', 'data', 'group',
89 );
90 $germanWords = '~\b(?:'
91 . 'Daten|Bitte|nicht|keine?|konnten|wurde[n]?|gespeichert|'
92 . 'Speichern|Löschen|gelöscht|Benutzer|Kunde|Rechnung|'
93 . 'Rechnungsnummer|Artikel|Bestellung|Beschreibung|Bezeichnung|'
94 . 'auswählen|ausgewählt|aufsteigend|absteigend|Rolle[n]?|'
95 . 'Gruppe[n]?|verfügbar|verwenden|aktivieren|deaktivieren|'
96 . 'erlauben|eingeben|ungültig|erforderlich|Seite[n]?|Sprache|'
97 . 'Deutsch|Entwurf|Offen|Bezahlt|Zeilen|Sortierung|Suche|'
98 . 'Erstellen|Ändern|Bearbeiten|Zurück|Nein|Ja|Vorkasse|'
99 . 'Ueberweisung|Überweisung|Strasse|Straße|PLZ|Ort|Land|Summe|'
100 . 'Betreff|Rueckfrage|Rückfrage|Anfrage[n]?|Nachricht|'
101 . 'entfernen|ausblenden|hinzufuegen|hinzufügen'
102 . ')\b~iu';
103
104 $scan = static function (
105 $value,
106 string $location
107 ) use (&$scan, $germanWords, $fail, $path): void {
108 if (is_array($value)) {
109 foreach ($value as $key => $nested) {
110 $scan($nested, $location . '/' . (string)$key);
111 }
112 return;
113 }
114 if (
115 is_string($value) &&
116 preg_match($germanWords, html_entity_decode($value, ENT_QUOTES), $match)
117 ) {
118 $fail(
119 "{$path}: deutscher UI-Text '{$match[0]}' "
120 . "in {$location}."
121 );
122 }
123 };
124
125 foreach ($fields as $position => $field) {
126 foreach ($uiKeys as $key) {
127 if (array_key_exists($key, $field)) {
128 $scan($field[$key], "Feld {$position}/{$key}");
129 }
130 }
131 }
132 $scan($messages, 'Meldungen');
133};
134
135foreach ($groups as $key => $variants) {
136 if (!isset($variants['neutral']) && !isset($variants['de'])) {
137 $fail("Deutsche/neutrale Basis-FD fehlt: {$key}");
138 }
139 foreach (array('en', 'es') as $language) {
140 if (!isset($variants[$language])) {
141 $fail("Sprachversion {$language} fehlt: {$key}");
142 }
143 }
144
145 $sourcePath = $variants['de'] ?? $variants['neutral'];
146 $sourceFd = $readFd($sourcePath);
147 $sourceFields = $sourceFd['fields'];
148 $sourceMessageKeys = array_keys($sourceFd['messages']);
149 sort($sourceMessageKeys);
150 foreach ($variants as $variant => $path) {
151 $language = in_array($variant, array('en', 'es'), true) ? $variant : 'de';
152 $fd = $readFd($path);
153 $messages = $fd['messages'];
154 foreach ($expected[$language] as $messageKey => $message) {
155 if (($messages[$messageKey] ?? null) !== $message) {
156 $fail("{$path}: {$messageKey} ist nicht korrekt lokalisiert.");
157 }
158 }
159 if (($messages['save_succeass'] ?? null) !== $messages['save_success']) {
160 $fail("{$path}: Kompatibilitätsalias save_succeass fehlt.");
161 }
162
163 if (in_array($variant, array('en', 'es'), true)) {
164 $messageKeys = array_keys($messages);
165 sort($messageKeys);
166 if ($messageKeys !== $sourceMessageKeys) {
167 $fail(
168 "{$path}: Meldungsschlüssel weichen von der "
169 . 'deutschen FD ab.'
170 );
171 }
172 $assertNoGermanUiText($fd['fields'], $messages, $path);
173 if (count($fd['fields']) !== count($sourceFields)) {
174 $fail("{$path}: Feldanzahl weicht von der deutschen FD ab.");
175 }
176 $structuralKeys = array(
177 'name', 'type', 'index', 'length', 'default', 'rules',
178 'convert', 'protect', 'mask', 'tpl', 'js',
179 );
180 foreach ($sourceFields as $position => $sourceField) {
181 $targetField = $fd['fields'][$position] ?? array();
182 foreach ($structuralKeys as $fieldKey) {
183 if (
184 ($sourceField[$fieldKey] ?? null)
185 !== ($targetField[$fieldKey] ?? null)
186 ) {
187 $fail(
188 "{$path}: Feld {$position}/{$fieldKey} "
189 . 'weicht strukturell von der deutschen FD ab.'
190 );
191 }
192 }
193 }
194 }
195 }
196}
197
198$sourceLoader = new ReflectionMethod('dbxForm', 'get_dd_fields_source');
199$sourceLoader->setAccessible(true);
200
202$form->_dbx_modul = 'myInvoices';
203$form->_dbx_lng = 'en';
204$fields = $sourceLoader->invoke($form, 'fd:myInvoices|invoice-form');
205if (!$fields || $form->get_fd_message('save_success') !== $expected['en']['save_success']) {
206 $fail('dbxForm lädt die englische FD oder ihre Meldungen nicht.');
207}
208
210$messageOnlyForm->_dbx_lng = 'es';
211$messageOnlyForm->_fd = 'myInvoices|invoice-form';
212$messageOnlyForm->load_fd_messages();
213if (
214 $messageOnlyForm->get_fd_message('save_success')
215 !== $expected['es']['save_success'] ||
216 $messageOnlyForm->_flds !== array()
217) {
218 $fail('load_fd_messages() lädt die spanische FD nicht feldfrei.');
219}
221$formattedMessage->_messages = array(
222 'record' => 'Datensatz #{id}: {name}',
223);
224if (
225 $formattedMessage->format_fd_message(
226 'record',
227 array('id' => 17, 'name' => 'Test')
228 ) !== 'Datensatz #17: Test'
229) {
230 $fail('format_fd_message() ersetzt benannte FD-Platzhalter nicht.');
231}
232
233// Zweiter Lesevorgang prüft ausdrücklich den Runtime-/Session-Cache-Pfad.
234$form->clear();
235if (
236 $form->_messages !== array() ||
237 $form->_msg_success !== '#form_msg_success#' ||
238 $form->_msg_error !== '#form_msg_error#'
239) {
240 $fail('dbxForm-Reset behält Meldungen einer vorherigen FD.');
241}
242$form->_dbx_modul = 'myInvoices';
243$form->_dbx_lng = 'en';
244$sourceLoader->invoke($form, 'fd:myInvoices|invoice-form');
245if ($form->get_fd_message('save_succeass') !== $expected['en']['save_success']) {
246 $fail('dbxForm übernimmt FD-Meldungen nicht aus dem Cache.');
247}
248
250{
251 public $_fld_id = 'id';
252 public $_error = 'test-error';
253 public $_query = 'test-query';
254 public $_insert_id = 0;
255 public $result = 1;
256
257 public function save($dd, $post, $rid)
258 {
259 return $this->result;
260 }
261}
262
265$form->_rid = 1;
266if (!$form->save_post('test|record', 1, '', 0)) {
267 $fail('Test-DB-Stellvertreter meldet im Erfolgspfad einen Fehler.');
268}
269if ($form->_msg_success !== $expected['en']['save_success']) {
270 $fail('dbxForm verwendet save_success aus der englischen FD nicht.');
271}
272
273$form->clear();
274$form->_dbx_modul = 'myInvoices';
275$form->_dbx_lng = 'es';
276$sourceLoader->invoke($form, 'fd:myInvoices|invoice-form');
277$dbStub->result = 0;
278$form->oDB = $dbStub;
279$form->_rid = 1;
280if ($form->save_post('test|record', 1, '', 0)) {
281 $fail('Test-DB-Stellvertreter meldet im Fehlerpfad Erfolg.');
282}
283if (
284 $form->_msg_error !== $expected['es']['save_error'] ||
285 $form->_general_error !== $expected['es']['save_error']
286) {
287 $fail('dbxForm verwendet save_error aus der spanischen FD nicht.');
288}
289
291$report->_dbx_modul = 'myInvoices';
292$report->_dbx_lng = 'de';
293$report->_fd = 'myInvoices|invoice-form';
294$report->load_fd_messages();
295$dbStub->result = 1;
296$report->oDB = $dbStub;
297$report->_rid = 1;
298$report->save_post('test|record', 1, '', 0);
299if ($report->_msg_success !== $expected['de']['save_success']) {
300 $fail('dbxReport erbt die FD-Speichermeldungen nicht von dbxForm.');
301}
302
303echo 'OK: ' . count($groups)
304 . " FD-Gruppen sind dreisprachig; dbxForm und dbxReport verwenden ihre FD-Meldungen.\n";
$messages
Definition config.fd.php:2
if((string)($formActionPolicy['action'] ?? '') !=='dbxAction.save'||!dbx() ->check_action_token((string)($formActionPolicy['scope'] ?? ''),(string)($formActionRoute['params']['dbx_token'] ?? ''))) $report
foreach($groups as $key=> $variants) $sourceLoader
foreach( $iterator as $file) if(! $groups) $expected
if( $messageOnlyForm->get_fd_message('save_success') !==$expected['es']['save_success']|| $messageOnlyForm->_flds !==array()) $formattedMessage
if(! $fields|| $form->get_fd_message('save_success') !==$expected['en']['save_success']) $messageOnlyForm
foreach( $valid as $email) foreach($invalid as $email) $fd
exit
Definition index.php:146
DBX schema administration.