$manifests Active module manifests (already sorted) * @param string $coreI18nDir Absolute path to the core i18n/ directory */ public static function preload(array $manifests, string $coreI18nDir): void { $locales = ['de', 'en']; $domain = I18n::$domain ?: 'default'; $prop = new ReflectionProperty(I18n::class, 'strings'); foreach ($locales as $locale) { // Load core file $coreFile = $coreI18nDir . '/' . $domain . '_' . $locale . '.json'; $merged = is_file($coreFile) ? (json_decode(file_get_contents($coreFile), true) ?: []) : []; // Merge each module's translations on top foreach ($manifests as $manifest) { if ($manifest->i18nPath === null) { continue; } $moduleFile = $manifest->i18nPath . '/' . $domain . '_' . $locale . '.json'; if (!is_file($moduleFile)) { continue; } $moduleStrings = json_decode(file_get_contents($moduleFile), true); if (is_array($moduleStrings)) { $merged = array_merge($merged, $moduleStrings); } } // Inject via Reflection into I18n::$strings $strings = $prop->getValue(); $strings[$domain][$locale] = $merged; $prop->setValue(null, $strings); } } }