feat: add module-specific locale support for i18n
Enhance the self-contained module architecture with locale/translation support:
ModuleDefinition changes:
- Add locales_path attribute for module-specific translations
- Add get_locales_dir() helper method
- Include locales in validate_structure() check
i18n module changes (app/utils/i18n.py):
- Add get_module_locale_dirs() to discover module locales
- Update load_translations() to merge module translations with core
- Module translations namespaced under module code (e.g., cms.title)
- Add _deep_merge() helper for nested dictionary merging
- Add _load_json_file() helper for cleaner JSON loading
CMS module locales:
- Add app/modules/cms/locales/ with translations for all 4 languages
- en.json, fr.json, de.json, lb.json with CMS-specific strings
- Covers: pages, page editing, SEO, navigation, publishing, homepage
sections, media library, themes, actions, and messages
Usage in templates:
{{ _("cms.title") }} -> "Content Management" (en)
{{ _("cms.pages.create") }} -> "Créer une page" (fr)
{{ _("cms.publishing.draft") }} -> "Entwurf" (de)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
126
app/modules/cms/locales/lb.json
Normal file
126
app/modules/cms/locales/lb.json
Normal file
@@ -0,0 +1,126 @@
|
||||
{
|
||||
"title": "Inhalts-Verwaltung",
|
||||
"description": "Verwaltet Inhaltsäiten, Mediebibliothéik an Händler-Themen",
|
||||
"pages": {
|
||||
"title": "Inhaltsäiten",
|
||||
"subtitle": "Verwaltet Plattform- an Händler-Inhaltsäiten",
|
||||
"create": "Säit erstellen",
|
||||
"edit": "Säit änneren",
|
||||
"delete": "Säit läschen",
|
||||
"list": "All Säiten",
|
||||
"empty": "Keng Säite fonnt",
|
||||
"empty_search": "Keng Säite passen op Är Sich",
|
||||
"create_first": "Éischt Säit erstellen"
|
||||
},
|
||||
"page": {
|
||||
"title": "Säitentitel",
|
||||
"slug": "Slug",
|
||||
"slug_help": "URL-sécher Kennung (Klengbuschtawen, Zuelen, Bindestricher)",
|
||||
"content": "Inhalt",
|
||||
"content_format": "Inhaltsformat",
|
||||
"format_html": "HTML",
|
||||
"format_markdown": "Markdown",
|
||||
"platform": "Plattform",
|
||||
"vendor_override": "Händler-Iwwerschreiwung",
|
||||
"vendor_override_none": "Keng (Plattform-Standard)",
|
||||
"vendor_override_help_default": "Dëst ass eng plattformwäit Standardsäit",
|
||||
"vendor_override_help_vendor": "Dës Säit iwwerschreift de Standard nëmme fir de gewielte Händler"
|
||||
},
|
||||
"tiers": {
|
||||
"platform": "Plattform-Marketing",
|
||||
"vendor_default": "Händler-Standard",
|
||||
"vendor_override": "Händler-Iwwerschreiwung"
|
||||
},
|
||||
"seo": {
|
||||
"title": "SEO & Metadaten",
|
||||
"meta_description": "Meta-Beschreiwung",
|
||||
"meta_description_help": "Zeechen (150-160 recommandéiert)",
|
||||
"meta_keywords": "Meta-Schlësselwierder",
|
||||
"meta_keywords_placeholder": "schlësselwuert1, schlësselwuert2, schlësselwuert3"
|
||||
},
|
||||
"navigation": {
|
||||
"title": "Navigatioun & Affichage",
|
||||
"display_order": "Uweisungsreiefolleg",
|
||||
"display_order_help": "Méi niddreg = éischt",
|
||||
"show_in_header": "Am Header weisen",
|
||||
"show_in_footer": "Am Footer weisen",
|
||||
"show_in_legal": "Am Rechtsberäich weisen",
|
||||
"show_in_legal_help": "Ënnescht Leist nieft dem Copyright"
|
||||
},
|
||||
"publishing": {
|
||||
"published": "Verëffentlecht",
|
||||
"draft": "Entworf",
|
||||
"publish_help": "Dës Säit ëffentlech siichtbar maachen"
|
||||
},
|
||||
"homepage": {
|
||||
"title": "Haaptsäit-Sektiounen",
|
||||
"subtitle": "Méisproochegen Inhalt",
|
||||
"loading": "Sektiounen ginn gelueden...",
|
||||
"hero": {
|
||||
"title": "Hero-Sektioun",
|
||||
"badge_text": "Badge-Text",
|
||||
"main_title": "Titel",
|
||||
"subtitle": "Ënnertitel",
|
||||
"buttons": "Knäpp",
|
||||
"add_button": "Knapp derbäisetzen"
|
||||
},
|
||||
"features": {
|
||||
"title": "Funktiounen-Sektioun",
|
||||
"section_title": "Sektiounstitel",
|
||||
"cards": "Funktiounskaarten",
|
||||
"add_card": "Kaart derbäisetzen",
|
||||
"icon": "Icon-Numm",
|
||||
"feature_title": "Titel",
|
||||
"feature_description": "Beschreiwung"
|
||||
},
|
||||
"pricing": {
|
||||
"title": "Präisser-Sektioun",
|
||||
"section_title": "Sektiounstitel",
|
||||
"use_tiers": "Abonnement-Stufen aus der Datebank benotzen",
|
||||
"use_tiers_help": "Wann aktivéiert, ginn d'Präiskaarten dynamesch aus Ärer Abonnement-Stufekonfiguratioun ofgeruff."
|
||||
},
|
||||
"cta": {
|
||||
"title": "Call-to-Action-Sektioun",
|
||||
"main_title": "Titel",
|
||||
"subtitle": "Ënnertitel",
|
||||
"buttons": "Knäpp",
|
||||
"add_button": "Knapp derbäisetzen"
|
||||
}
|
||||
},
|
||||
"media": {
|
||||
"title": "Mediebibliothéik",
|
||||
"upload": "Eroplueden",
|
||||
"upload_file": "Fichier eroplueden",
|
||||
"delete": "Läschen",
|
||||
"empty": "Keng Mediefichieren",
|
||||
"upload_first": "Luet Äre éischte Fichier erop"
|
||||
},
|
||||
"themes": {
|
||||
"title": "Händler-Themen",
|
||||
"subtitle": "Verwaltet Händler-Theme-Personnalisatiounen"
|
||||
},
|
||||
"actions": {
|
||||
"save": "Späicheren",
|
||||
"saving": "Späicheren...",
|
||||
"update": "Säit aktualiséieren",
|
||||
"create": "Säit erstellen",
|
||||
"cancel": "Ofbriechen",
|
||||
"back_to_list": "Zréck op d'Lëscht",
|
||||
"preview": "Virschau",
|
||||
"revert_to_default": "Op Standard zrécksetzen"
|
||||
},
|
||||
"messages": {
|
||||
"created": "Säit erfollegräich erstallt",
|
||||
"updated": "Säit erfollegräich aktualiséiert",
|
||||
"deleted": "Säit erfollegräich geläscht",
|
||||
"reverted": "Op Standardsäit zréckgesat",
|
||||
"error_loading": "Feeler beim Lueden vun der Säit",
|
||||
"error_saving": "Feeler beim Späichere vun der Säit",
|
||||
"confirm_delete": "Sidd Dir sécher, datt Dir dës Säit läsche wëllt?"
|
||||
},
|
||||
"filters": {
|
||||
"all_pages": "All Säiten",
|
||||
"all_platforms": "All Plattformen",
|
||||
"search_placeholder": "Säite sichen..."
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user