diff --git a/bin/generate.dart b/bin/generate.dart index cb006022..8cb54e1b 100644 --- a/bin/generate.dart +++ b/bin/generate.dart @@ -105,7 +105,7 @@ void handleLangFiles(GenerateOptions options) async { final output = Directory.fromUri(Uri.parse(options.outputDir!)); final sourcePath = Directory(path.join(current.path, source.path)); final outputPath = - Directory(path.join(current.path, output.path, options.outputFile)); + Directory(path.join(current.path, output.path, options.outputFile)); if (!await sourcePath.exists()) { stderr.writeln('Source path does not exist'); @@ -157,9 +157,9 @@ void generateFile(List<FileSystemEntity> files, Directory outputPath, case 'keys': await _writeKeys(classBuilder, files, options.skipUnnecessaryKeys); break; - // case 'csv': - // await _writeCsv(classBuilder, files); - // break; + // case 'csv': + // await _writeCsv(classBuilder, files); + // break; default: stderr.writeln('Format not supported'); } @@ -180,8 +180,11 @@ abstract class LocaleKeys { final fileData = File(files.first.path); - Map<String, dynamic> translations = - json.decode(await fileData.readAsString()); + final result = json.decode(await fileData.readAsString()); + + Map<String, dynamic> translations = result is List<dynamic> + ? convertJsonListToMap(result) + : result; file += _resolve(translations, skipUnnecessaryKeys); @@ -204,7 +207,7 @@ String _resolve(Map<String, dynamic> translations, bool? skipUnnecessaryKeys, if (translations[key] is Map) { // If key does not contain keys for plural(), gender() etc. and option is enabled -> ignore it ignoreKey = !containsPreservedKeywords( - translations[key] as Map<String, dynamic>) && + translations[key] as Map<String, dynamic>) && canIgnoreKeys; var nextAccKey = key; @@ -219,10 +222,10 @@ String _resolve(Map<String, dynamic> translations, bool? skipUnnecessaryKeys, if (!_preservedKeywords.contains(key)) { accKey != null && !ignoreKey ? fileContent += - ' static const ${accKey.replaceAll('.', '_')}_$key = \'$accKey.$key\';\n' + ' static const ${accKey.replaceAll('.', '_')}_$key = \'$accKey.$key\';\n' : !ignoreKey - ? fileContent += ' static const $key = \'$key\';\n' - : null; + ? fileContent += ' static const $key = \'$key\';\n' + : null; } } @@ -254,21 +257,38 @@ class CodegenLoader extends AssetLoader{ for (var file in files) { final localeName = - path.basename(file.path).replaceFirst('.json', '').replaceAll('-', '_'); + path.basename(file.path).replaceFirst('.json', '').replaceAll('-', '_'); listLocales.add('"$localeName": $localeName'); final fileData = File(file.path); - Map<String, dynamic>? data = json.decode(await fileData.readAsString()); + final result = json.decode(await fileData.readAsString()); + + + + Map<String, dynamic>? data = result is List<dynamic> + ? convertJsonListToMap(result) + : result; final mapString = const JsonEncoder.withIndent(' ').convert(data); gFile += 'static const Map<String,dynamic> $localeName = $mapString;\n'; } gFile += - 'static const Map<String, Map<String,dynamic>> mapLocales = {${listLocales.join(', ')}};'; + 'static const Map<String, Map<String,dynamic>> mapLocales = {${listLocales.join(', ')}};'; classBuilder.writeln(gFile); } +Map<String, dynamic> convertJsonListToMap(List<dynamic> data) { + final Map<String, dynamic> result = {}; + + for (dynamic rows in data) { + Map<String, dynamic> row = rows as Map<String, dynamic>; + result[row[row.keys.first]] = row; + } + + return result; +} + // _writeCsv(StringBuffer classBuilder, List<FileSystemEntity> files) async { // List<String> listLocales = List(); // final fileData = File(files.first.path);