Files
authsec_flutter/lib/Utils/dynamic_strings.dart
T

44 lines
1.7 KiB
Dart

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<LocaleProvider>(context));
}
String tr(String key) => _provider.trDynamic(key);
/// Preload embedded asset tables. Call once before runApp finishes splash.
static Future<Map<String, Map<String, String>>> loadEmbedded() async {
final out = <String, Map<String, String>>{};
for (final lang in LocaleProvider.supportedCodes) {
try {
final raw = await rootBundle.loadString('assets/translations_dynamic/$lang.json');
final decoded = jsonDecode(raw) as Map<String, dynamic>;
out[lang] = decoded.map((k, v) => MapEntry(
k.toString().trim().toLowerCase().replaceAll(RegExp(r'\s+'), '_'),
v.toString(),
));
} catch (_) {
out[lang] = {};
}
}
return out;
}
}