You are here

function _potx_process_config_schema in Translation template extractor 6.3

Same name and namespace in other branches
  1. 8 potx.inc \_potx_process_config_schema()
  2. 7.3 potx.inc \_potx_process_config_schema()
  3. 7.2 potx.inc \_potx_process_config_schema()

Recursively process config schema into a flat structure.

This structure is used to extract translatable strings from shipped configuration, and identifies every element by joining all of its parent keys (including itself) separated by the '+' symbol. It stores the schema elements in four sublists: 'translatables': the list of elements that are translatable. 'types': the list of elements that rely on other schema elements for their definition. generally, those with types other than "mapping". 'mappings': the list of elements that have a defined "mapping" property. 'contexts': the list of elements that have a defined context string, using the "translation context" property.

Note that 'types' and 'mappings' lists are not exclusive, i.e. an element can both have a 'type' definition and a separate 'mapping'.

Here is an example config schema:


  test_schema:
    type: mapping
    mapping:
      name:
        type: label
      content:
        type: text
        translation context: Test schema content
      test_filter:
        type: filter

And the resulting processed schema:


Array
(
  [translatables] => Array
    (
      [0] => test_schema+name
      [1] => test_schema+content
    )

  [types] => Array
    (
      [test_schema+test_filter] => filter
    )

  [mappings] => Array
    (
      [0] => test_schema
    )

  [contexts] => Array
    (
      [test_schema+content] => Test schema content
    )

)

Parameters

string $schema_prefix: All parent keys (including the element's key) joined by '+' symbol, e.g. image.style.*+effects+sequence

array $schema_data: The schema subtree belonging to the current element.

1 call to _potx_process_config_schema()
_potx_parse_yaml_file in ./potx.inc
Parse a YAML file for translatables. Drupal 8+.

File

./potx.inc, line 2148
Extraction API used by the web and command line interface.

Code

function _potx_process_config_schema($schema_prefix, $schema_data) {
  global $_potx_processed_schema;
  if (!isset($_potx_processed_schema)) {

    // The initial values for 'translatables' allows a limited support for
    // extracting translatable strings from contrib projects, until
    // https://www.drupal.org/node/1933988 gets in.
    $_potx_processed_schema = array(
      'translatables' => array(
        'label',
        'text',
        'date_format',
      ),
      'types' => array(),
      'mappings' => array(),
      'contexts' => array(
        'date_format' => 'PHP date format',
      ),
    );
  }

  // Elements can opt out of translation with a 'translatable: false' key.
  if (isset($schema_data['translatable']) && $schema_data['translatable'] === FALSE) {
    return;
  }

  // Do not process elements without a type, since the locale module strictly
  // requires translatable elements to be of base type 'string', and also we
  // can't traverse an element without knowing its type.
  if (!isset($schema_data['type'])) {
    return;
  }
  $type = $schema_data['type'];
  if (isset($schema_data['mapping'])) {
    foreach ($schema_data['mapping'] as $key => $element_data) {
      $element_key = $schema_prefix . '+' . $key;
      _potx_process_config_schema($element_key, $element_data);
    }
    if ($type != 'mapping') {
      $_potx_processed_schema['types'][$schema_prefix] = $type;
    }
    $_potx_processed_schema['mappings'][] = $schema_prefix;
  }
  else {
    if ($type == 'sequence') {
      _potx_process_config_schema($schema_prefix . '+sequence', $schema_data['sequence'][0]);
      $_potx_processed_schema['types'][$schema_prefix] = 'sequence';
    }
    elseif (in_array($type, $_potx_processed_schema['translatables']) || isset($schema_data['translatable']) && $schema_data['translatable'] === TRUE) {
      $_potx_processed_schema['translatables'][] = $schema_prefix;

      // Elements can define a context string, or inherit the context from their
      // defined type.
      if (isset($schema_data['translation context'])) {
        $_potx_processed_schema['contexts'][$schema_prefix] = $schema_data['translation context'];
      }
      elseif (isset($_potx_processed_schema['contexts'][$type])) {
        $_potx_processed_schema['contexts'][$schema_prefix] = $_potx_processed_schema['contexts'][$type];
      }
    }
    else {
      $_potx_processed_schema['types'][$schema_prefix] = $type;
    }
  }
}