diff --git a/potx.inc b/potx.inc
index 9e49f41..08ac7e8 100644
--- a/potx.inc
+++ b/potx.inc
@@ -1947,14 +1947,20 @@ function _potx_init_yaml_translation_patterns($path = '') {
  * The file is expected to be in the following format:
  * @code
  *   # A list of file matching patterns (as expected by fnmatch()).
- *   *.test_format.yml:
+ *   - matches: *.test_format.yml:
  *     # A sequence of translatable keys in the matched YAML files.
- *     - test_label
- *     - test_label_2:
+ *     translatable_keys:
+ *
+ *       # Using the shorthand form
+ *       - test_label
+ *
+ *       # Using the long form
+ *       - key: test_label_2
  *         # An optional key, used as context for the translatable string.
  *         context: label_2_context
- *     # To mark all top-level keys as translatable, use the '%top-level-key' string.
- *     - %top-level-key
+ *     # To mark all top-level keys as translatable,
+ *     #   use the 'top_level_translatables' setting (optional; default: FALSE).
+ *     top_level_translatables: TRUE
  * @endcode
  *
  * @param string $path
@@ -1965,17 +1971,26 @@ function _potx_load_yaml_translation_patterns($path) {
 
   $content = Yaml::parse(file_get_contents($path));
 
-  foreach ($content as $pattern => $list) {
-    foreach ($list as $value) {
-      if (is_array($value)) {
-        foreach ($value as $key => $context) {
-          $yaml_translation_patterns[$pattern]['keys'][] = $key;
-          $yaml_translation_patterns[$pattern]['contexts'][$key] = $context['context'];
-        }
+  if (isset($content['translation_patterns'])) {
+    $patterns = $content['translation_patterns'];
+    foreach ($patterns as $pattern) {
+      if (!isset($pattern['matches']) || !isset($pattern['translatable_keys'])) {
+        continue;
       }
-      else {
-        $yaml_translation_patterns[$pattern]['keys'][] = $value;
+
+      $match = $pattern['matches'];
+      $list = $pattern['translatable_keys'];
+      foreach ($list as $item) {
+        if (is_array($item)) {
+          $yaml_translation_patterns[$match]['keys'][] = $item['key'];
+          $yaml_translation_patterns[$match]['contexts'][$item['key']] = $item['context'];
+        }
+        else {
+          $yaml_translation_patterns[$match]['keys'][] = $item;
+        }
       }
+
+      $yaml_translation_patterns[$match]['top_level_translatables'] = isset($pattern['top_level_translatables']) ? $pattern['top_level_translatables'] : FALSE;
     }
   }
 }
@@ -2025,11 +2040,7 @@ function _potx_parse_yaml_file($code, $file_name, $file_path, $save_callback) {
  *   The list of translatable keys to look for, and (optionally) their contexts.
  */
 function _potx_find_yaml_translatables($yaml, $trans_list, $file_name, $save_callback) {
-  $extract_values = FALSE;
-  if (in_array('%top-level-key', $trans_list['keys'], TRUE)) {
-    $extract_values = TRUE;
-    $trans_list['keys'] = array_diff($trans_list['keys'], array('%top-level-key'));
-  }
+  $extract_values = $trans_list['top_level_translatables'];
 
   foreach ($yaml as $key => $value) {
 
diff --git a/tests/potx_test_8/yaml_translation_patterns.yml b/tests/potx_test_8/yaml_translation_patterns.yml
index 0f98b0e..fb23a63 100644
--- a/tests/potx_test_8/yaml_translation_patterns.yml
+++ b/tests/potx_test_8/yaml_translation_patterns.yml
@@ -1,5 +1,7 @@
-potx_test_8.*.yml:
-  - name
-  - test_label:
-      context: label_context
+translation_patterns:
+  - matches: 'potx_test_8.*.yml'
+    translatable_keys:
+      - name
+      - key: test_label
+        context: label_context
 
diff --git a/tests/potx_test_yml/yaml_translation_patterns.yml b/tests/potx_test_yml/yaml_translation_patterns.yml
index 9f72acc..27d2460 100644
--- a/tests/potx_test_yml/yaml_translation_patterns.yml
+++ b/tests/potx_test_yml/yaml_translation_patterns.yml
@@ -1,4 +1,6 @@
-potx_test_8.*.yml:
-  - trans
-  - test_field:
-      context: field_context
+translation_patterns:
+  - matches: 'potx_test_8.*.yml'
+    translatable_keys:
+      - trans
+      - key: test_field
+        context: field_context
diff --git a/yaml_translation_patterns.yml b/yaml_translation_patterns.yml
index 5523417..264b692 100644
--- a/yaml_translation_patterns.yml
+++ b/yaml_translation_patterns.yml
@@ -1,30 +1,30 @@
-'*.info.yml':
-  - name
-  - description
-  - package
-  - regions
-'*.routing.yml':
-  - _title:
-      context: _title_context
-'*.links.task.yml':
-  - title:
-      context: title_context
-'*.links.action.yml':
-  - title:
-      context: title_context
-'*.links.contextual.yml':
-  - title:
-      context: title_context
-'*.links.menu.yml':
-  - title:
-      context: title_context
-  - description
-'*.breakpoints.yml':
-  - label
-  - group
-'*.permissions.yml':
-  - title
-  - description
-  - %top-level-key
-'config/schema/*.yml':
-  - label
+translation_patterns:
+  - matches: '*.info.yml'
+    translatable_keys:
+      - name
+      - description
+      - package
+      - regions
+  - matches: '*.routing.yml'
+    translatable_keys:
+      - key: _title
+        context: _title_context
+  - matches: '*.links.*.yml'
+    translatable_keys:
+      - key: title
+        context: title_context
+  - matches: '*.links.menu.yml'
+    translatable_keys:
+      - description
+  - matches: '*.breakpoints.yml'
+    translatable_keys:
+      - label
+      - group
+  - matches: '*.permissions.yml'
+    top_level_translatables: true
+    translatable_keys:
+      - title
+      - description
+  - matches: 'config/schema/*.yml'
+    translatable_keys:
+      - label
