Parse `arb` files more completely
diff --git a/pkgs/messages_builder/lib/arb_parser.dart b/pkgs/messages_builder/lib/arb_parser.dart
index de115a3..05710ef 100644
--- a/pkgs/messages_builder/lib/arb_parser.dart
+++ b/pkgs/messages_builder/lib/arb_parser.dart
@@ -12,12 +12,17 @@
   MessageListWithMetadata parseMessageFile(Map<String, dynamic> arb) {
     final locale = arb['@@locale'] as String?;
     final context = arb['@@context'] as String?;
-    final isReference = (arb['@@x-reference'] as bool?) ?? false;
+    final templatePath = arb['@@x-template'] as String?;
     final messages = arb.keys
         .where((key) => !key.startsWith('@'))
         .map((key) => parseMessage(arb, key, '${context}_$locale'))
         .toList();
-    return MessageListWithMetadata(messages, locale, context, isReference);
+    return MessageListWithMetadata(
+      messages,
+      locale,
+      context,
+      templatePath == null,
+    );
   }
 
   MessageWithMetadata parseMessage(
@@ -35,6 +40,7 @@
     final messageMetadata = arb['@$messageKey'];
     if (messageMetadata != null) {
       final metadata = messageMetadata as Map<String, dynamic>;
+      final description = metadata['description'] as String?;
       final placeholdersMap = metadata['placeholders'] as Map<String, dynamic>?;
       final placeholders = placeholdersMap ?? <String, dynamic>{};
       final placeholdersWithMetadata = parsePlaceholderMetadata(placeholders);
@@ -45,6 +51,7 @@
                 orElse: () => placeholder,
               ))
           .toList();
+      message.description = description;
     }
     return message;
   }
@@ -57,7 +64,12 @@
       final placeholderName = entry.key;
       final placeholderData = entry.value as Map<String, dynamic>;
       final type = (placeholderData['type'] as String?) ?? 'String';
-      placeholderTypes.add(Placeholder(placeholderName, type));
+      final example = placeholderData['example'] as String?;
+      placeholderTypes.add(Placeholder(
+        name: placeholderName,
+        type: type,
+        example: example,
+      ));
     }
     return placeholderTypes;
   }
diff --git a/pkgs/messages_builder/lib/builder.dart b/pkgs/messages_builder/lib/builder.dart
index b878c5c..ab28971 100644
--- a/pkgs/messages_builder/lib/builder.dart
+++ b/pkgs/messages_builder/lib/builder.dart
@@ -117,15 +117,15 @@
     for (var context in contexts) {
       final filesWithContext = arbFiles.where((arb) => arb.context == context);
       if (filesWithContext
-              .where((element) => element.isReferenceForContext)
+              .where((element) => element.isTemplateResource)
               .length >
           1) {
-        throw ArgumentError('Multiple arb files are marked as reference');
+        throw ArgumentError('Multiple arb files are marked as templates.');
       }
       final localesInContext = filesWithContext.map((e) => e.locale).toList();
       if (localesInContext.length != localesInContext.toSet().length) {
         throw ArgumentError(
-            'Multiple arb files for the same context have the same locale');
+            'Multiple arb files for the same context have the same locale.');
       }
     }
   }
@@ -151,7 +151,7 @@
             .length ==
         1;
     final shouldGenerateDartLib =
-        arb.isReferenceForContext || isOnlyResourceForContext;
+        arb.isTemplateResource || isOnlyResourceForContext;
     return shouldGenerateDartLib;
   }
 
@@ -199,7 +199,7 @@
   MessageFileResource(this.assetId, this.messageList, this.hash);
 
   String get locale => messageList.locale!;
-  bool get isReferenceForContext => messageList.isReference;
+  bool get isTemplateResource => messageList.isTemplate;
   List<MessageWithMetadata> get messages => messageList.messages;
   String? get context => messageList.context;
 }
diff --git a/pkgs/messages_builder/lib/message_with_metadata.dart b/pkgs/messages_builder/lib/message_with_metadata.dart
index 4fc02b0..229600d 100644
--- a/pkgs/messages_builder/lib/message_with_metadata.dart
+++ b/pkgs/messages_builder/lib/message_with_metadata.dart
@@ -8,30 +8,33 @@
   final Message message;
   final String? name;
   List<Placeholder> placeholders;
+  String? description;
 
   MessageWithMetadata(this.message, List<String> arguments, this.name)
-      : placeholders = arguments.map(Placeholder.new).toList();
+      : placeholders =
+            arguments.map((argument) => Placeholder(name: argument)).toList();
 }
 
 class MessageListWithMetadata {
   final List<MessageWithMetadata> messages;
   final String? locale;
   final String? context;
-  final bool isReference;
+  final bool isTemplate;
 
   MessageListWithMetadata(
     this.messages,
     this.locale,
     this.context,
-    this.isReference,
+    this.isTemplate,
   );
 }
 
 class Placeholder {
   final String name;
   final String type;
+  final String? example;
 
-  Placeholder(this.name, [this.type = 'String']);
+  Placeholder({required this.name, this.type = 'String', this.example});
 
   @override
   String toString() {
diff --git a/pkgs/messages_builder/test/testdata/testarb.arb.dart b/pkgs/messages_builder/test/testdata/testarb.arb.dart
index 1f765bc..9f6d61e 100644
--- a/pkgs/messages_builder/test/testdata/testarb.arb.dart
+++ b/pkgs/messages_builder/test/testdata/testarb.arb.dart
@@ -5,7 +5,6 @@
 String arbFile = '''
 {
     "@@locale": "en",
-    "@@x-reference": true,
     "helloAndWelcome": "Welcome {firstName} von {lastName} <",
     "@helloAndWelcome": {
         "description": "Initial welcome message",