fs
1f0b1caf54
feat: module-owned i18n with merge-at-boot translation loading
...
Each module can now ship its own i18n/ directory with translation files
(default_de.json, default_en.json). At boot time, ModuleI18nLoader
preloads core translations then merges module translations on top via
Reflection into I18n::$strings — the t() helper stays unchanged.
- Add i18nPath property to ModuleManifest
- Add ModuleI18nLoader with Reflection-based preload
- Extract 59 module-exclusive keys from core i18n into module files
(notifications: 8, bookmarks: 41, addressbook: 10)
- Expand TranslationKeysTest to scan modules/ and validate against
merged core + module translations
- Add ModuleI18nContractTest for per-module de/en parity and completeness
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-19 22:08:34 +01:00
..
2026-03-19 19:00:29 +01:00
2026-03-19 18:30:14 +01:00
2026-03-19 18:57:03 +01:00
2026-03-19 18:52:36 +01:00
2026-03-19 18:52:36 +01:00
2026-03-19 18:52:36 +01:00
2026-03-19 18:52:36 +01:00
2026-03-19 18:25:19 +01:00
2026-03-19 18:25:19 +01:00
2026-03-18 22:19:56 +01:00
2026-03-19 19:13:51 +01:00
2026-03-19 19:13:51 +01:00
2026-03-19 19:05:29 +01:00
2026-03-19 19:05:29 +01:00
2026-03-19 19:05:29 +01:00
2026-03-19 19:12:25 +01:00
2026-03-19 19:12:25 +01:00
2026-03-19 19:12:25 +01:00
2026-03-19 19:12:25 +01:00
2026-03-19 19:12:25 +01:00
2026-03-19 18:25:19 +01:00
2026-03-19 18:25:19 +01:00
2026-03-19 18:25:19 +01:00
2026-03-19 18:25:19 +01:00
2026-03-19 18:25:19 +01:00
2026-03-19 18:25:19 +01:00
2026-03-19 18:25:19 +01:00
2026-03-19 18:25:19 +01:00
2026-03-19 18:25:19 +01:00
2026-03-19 18:57:03 +01:00
2026-03-19 18:52:36 +01:00
2026-03-19 18:52:36 +01:00
2026-03-19 18:52:36 +01:00
2026-03-19 18:52:36 +01:00
2026-03-18 22:19:56 +01:00
2026-03-13 14:38:58 +01:00
2026-03-18 22:19:56 +01:00
2026-03-10 15:40:07 +01:00
2026-03-19 19:03:10 +01:00
2026-03-19 19:03:10 +01:00
2026-03-19 19:03:10 +01:00
2026-03-19 19:03:10 +01:00
2026-03-19 19:04:28 +01:00
2026-03-19 19:04:28 +01:00
2026-03-19 19:04:28 +01:00
2026-03-19 19:04:28 +01:00
2026-03-19 19:02:04 +01:00
2026-03-19 19:02:04 +01:00
2026-03-19 19:02:04 +01:00
2026-03-19 19:02:04 +01:00
2026-03-10 21:20:08 +01:00
2026-03-19 19:59:08 +01:00
2026-03-19 19:59:08 +01:00
2026-03-19 18:34:02 +01:00
2026-03-19 18:34:02 +01:00
2026-03-19 18:34:02 +01:00
2026-03-19 18:34:02 +01:00
2026-03-06 00:44:52 +01:00
2026-03-10 21:20:08 +01:00
2026-03-19 18:25:19 +01:00
2026-03-19 18:25:19 +01:00
2026-03-19 18:25:19 +01:00
2026-03-19 18:25:19 +01:00
2026-03-19 19:29:45 +01:00
2026-03-19 19:29:45 +01:00
2026-03-19 19:29:45 +01:00
2026-03-18 22:19:56 +01:00
2026-03-19 18:30:14 +01:00
2026-03-19 18:57:03 +01:00
2026-03-19 22:08:34 +01:00
2026-03-19 18:30:14 +01:00
2026-03-19 18:30:14 +01:00
2026-03-19 19:00:29 +01:00
2026-03-19 19:00:29 +01:00
2026-03-19 18:30:14 +01:00
2026-03-10 15:40:07 +01:00
2026-03-10 21:20:08 +01:00
2026-03-10 21:20:08 +01:00
2026-03-19 18:48:16 +01:00
2026-03-19 18:48:16 +01:00
2026-03-05 08:26:51 +01:00
2026-03-10 21:20:08 +01:00
2026-03-19 19:08:28 +01:00
2026-03-19 19:08:28 +01:00
2026-03-19 19:08:28 +01:00
2026-03-19 19:11:03 +01:00
2026-03-19 19:11:03 +01:00
2026-03-19 19:11:03 +01:00
2026-03-19 19:11:03 +01:00
2026-03-19 19:11:03 +01:00
2026-03-19 19:11:03 +01:00