import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import '../providers/locale_provider.dart'; /// Lightweight runtime reader for builder-generated dynamic strings (Group-2). /// Generated Hybrid screens call: `DynamicStrings.of(context).tr('phone_number')` /// No heavy package, no ML model, no network: pure JSON maps (KBs) + Provider. /// Fallback chain: current lang -> English -> pretty key. Never crashes. /// /// Bootstrap loads embedded assets once (see main.dart): /// assets/translations_dynamic/en.json, hi.json /// Later, portal-backend diffs merge via LocaleProvider.updateFromServer(). class DynamicStrings { final LocaleProvider _provider; DynamicStrings._(this._provider); /// Listens to locale changes so Text rebuilds on language switch. static DynamicStrings of(BuildContext context) { return DynamicStrings._(Provider.of(context)); } String tr(String key) => _provider.trDynamic(key); /// Preload embedded asset tables. Call once before runApp finishes splash. static Future>> loadEmbedded() async { final out = >{}; for (final lang in LocaleProvider.supportedCodes) { try { final raw = await rootBundle.loadString('assets/translations_dynamic/$lang.json'); final decoded = jsonDecode(raw) as Map; out[lang] = decoded.map((k, v) => MapEntry( k.toString().trim().toLowerCase().replaceAll(RegExp(r'\s+'), '_'), v.toString(), )); } catch (_) { out[lang] = {}; } } return out; } }