import 'dart:convert'; import 'package:flutter/services.dart'; import 'package:venera/foundation/comic_source/comic_source.dart'; import '../foundation/app.dart'; extension AppTranslation on String { String _translate() { var locale = App.locale; var key = "${locale.languageCode}_${locale.countryCode}"; if (locale.languageCode == "en") { key = "en_US"; } return (translations[key]?[this]) ?? this; } String get tl => _translate(); String get tlEN => translations["en_US"]![this] ?? this; String tlParams(Map values) { var res = _translate(); for (var entry in values.entries) { res = res.replaceFirst("@${entry.key}", entry.value.toString()); } return res; } static late final Map> translations; static Future init() async { var data = await rootBundle.load("assets/translation.json"); var json = jsonDecode(utf8.decode(data.buffer.asUint8List())); translations = { for (var e in json.entries) e.key: Map.from(e.value) }; } /// Translate a string using specified comic source String ts(String sourceKey) { var comicSource = ComicSource.find(sourceKey); if (comicSource == null || comicSource.translations == null) { return this; } var locale = App.locale; var lc = locale.languageCode; var cc = locale.countryCode; var key = "$lc${cc == null ? "" : "_$cc"}"; return (comicSource.translations![key] ?? comicSource.translations![lc])?[this] ?? this; } } extension ListTranslation on List { List _translate() { return List.generate(length, (index) => this[index].tl); } List get tl => _translate(); }