44 lines
1.7 KiB
Dart
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;
|
||
|
|
}
|
||
|
|
}
|