-
Notifications
You must be signed in to change notification settings - Fork 84
/
Copy pathxml_asset_loader.dart
65 lines (57 loc) · 1.91 KB
/
xml_asset_loader.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import 'dart:developer';
import 'dart:ui';
import 'package:flutter/services.dart';
import 'package:xml/xml.dart';
import 'asset_loader.dart';
//Loader for multiple xml files
class XmlAssetLoader extends AssetLoader {
String getLocalePath(String basePath, Locale locale) {
return '$basePath/${localeToString(locale, separator: "-")}.xml';
}
@override
Future<Map<String, dynamic>> load(String path, Locale locale) async {
var localePath = getLocalePath(path, locale);
log('easy localization loader: load xml file $localePath');
var doc = XmlDocument.parse(await rootBundle.loadString(localePath));
doc.normalize();
assert(doc.lastChild != null, 'The XML file does not contain any node');
return convertXmlNodeToMap(doc.lastChild!);
}
}
//Loader for single xml file
class XmlSingleAssetLoader extends AssetLoader {
Map? xmlData;
@override
Future<Map<String, dynamic>> load(String path, Locale locale) async {
if (xmlData == null) {
log('easy localization loader: load xml file $path');
var doc = XmlDocument.parse(await rootBundle.loadString(path));
doc.normalize();
assert(doc.lastChild != null, 'The XML file does not contain any node');
xmlData = convertXmlNodeToMap(doc.lastChild!);
} else {
log('easy localization loader: Xml already loaded, read cache');
}
return xmlData![locale.toString()];
}
}
/// Convert xmlNode to Map
Map<String, dynamic> convertXmlNodeToMap(XmlNode xmlNode) {
final map = <String, dynamic>{};
for (final entry in xmlNode.children) {
if (entry is XmlElement) {
switch (entry.children.length) {
case 1:
map[entry.name.toString()] = entry.text;
break;
case 0:
print(entry.name.toString());
map[entry.name.toString()] = null;
break;
default:
map[entry.name.toString()] = convertXmlNodeToMap(entry);
}
}
}
return map;
}