blob: a721b9f5cc1e61115b2179217a70548d42a309f6 [file] [log] [blame] [edit]
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:convert';
import 'package:crypto/crypto.dart';
import 'message_file.dart';
import 'message_parser/message_parser.dart';
import 'parameterized_message.dart';
import 'placeholder.dart';
class ArbParser {
final bool addName;
ArbParser([this.addName = false]);
MessageFile parseMessageFile(Map<String, dynamic> arb) {
final locale = arb['@@locale'] as String?;
final context = arb['@@context'] as String?;
final messages = arb.keys
.where((key) => !key.startsWith('@'))
.map((key) => parseMessage(
arb[key] as String,
arb['@$key'] as Map<String, dynamic>?,
key,
'${context}_$locale',
))
.toList();
messages.sort((a, b) => a.name.compareTo(b.name));
return MessageFile(
messages,
locale,
context,
getHash(arb),
arb.keys.any((key) => key.startsWith('@') && !key.startsWith('@@')),
);
}
String getHash(Map<String, dynamic> arb) {
final digest = sha1.convert(arb.toString().codeUnits);
return base64Encode(digest.bytes).substring(0, 8);
}
ParameterizedMessage parseMessage(
String messageContent,
Map<String, dynamic>? metadata,
String name,
String debugString,
) {
final message = MessageParser.parse(
debugString,
messageContent,
name,
addId: addName,
);
final placeholdersMap = metadata?['placeholders'] as Map<String, dynamic>?;
final placeholdersWithMetadata = placeholdersMap?.map(
(name, metadata) {
final type = (metadata as Map<String, dynamic>)['type'] as String?;
return MapEntry(name, Placeholder(name, type ?? 'String'));
},
) ??
<String, Placeholder>{};
final placeholders = message.placeholders
.map((p) => placeholdersWithMetadata[p.name] ?? p)
.toList();
return ParameterizedMessage(message.message, message.name, placeholders);
}
}