diff --git a/core/includes/form.inc b/core/includes/form.inc index 44f0ad6..fb8a968 100644 --- a/core/includes/form.inc +++ b/core/includes/form.inc @@ -3833,6 +3833,9 @@ function form_validate_table($element, &$form_state) { * name must not be changed after initial creation. */ function form_process_machine_name($element, &$form_state) { + // We need to pass the langcode to the client. + $language = language(LANGUAGE_TYPE_INTERFACE); + // Apply default form element properties. $element += array( '#title' => t('Machine-readable name'), @@ -3899,6 +3902,7 @@ function form_process_machine_name($element, &$form_state) { 'machineName' => array( '#' . $source['#id'] => $element['#machine_name'], ), + 'language' => $language->langcode, ), ); $element['#attached']['library'][] = array('system', 'drupal.machine-name'); diff --git a/core/misc/machine-name.js b/core/misc/machine-name.js index 9ef6e47..a404264 100644 --- a/core/misc/machine-name.js +++ b/core/misc/machine-name.js @@ -42,19 +42,18 @@ Drupal.behaviors.machineName = { function machineNameHandler(e) { var data = e.data; - machine = self.transliterate($(e.target).val(), data.options); - // Set the machine name to the transliterated value. - if (machine !== '') { - if (machine !== data.options.replace) { - data.$target.val(machine); - data.$preview.html(data.options.field_prefix + Drupal.checkPlain(machine) + data.options.field_suffix); - } - data.$suffix.show(); - } - else { - data.$suffix.hide(); - data.$target.val(machine); - data.$preview.empty(); + var settings = data.options; + var baseValue = $(e.target).val(); + + var rx = new RegExp(settings.replace_pattern, 'g'); + var expected = baseValue.toLowerCase().replace(rx, settings.replace).substr(0, settings.maxlength); + + if(baseValue.toLowerCase() != expected) { + self.transliterate(baseValue, settings).done(function(machine) { + self.showMachineName(machine.substr(0, settings.maxlength), data); + }); + } else { + self.showMachineName(expected, data); } } @@ -124,6 +123,22 @@ Drupal.behaviors.machineName = { } }, + showMachineName: function (machine, data) { + // Set the machine name to the transliterated value. + if (machine !== '') { + if (machine !== data.options.replace) { + data.$target.val(machine); + data.$preview.html(data.options.field_prefix + Drupal.checkPlain(machine) + data.options.field_suffix); + } + data.$suffix.show(); + } + else { + data.$suffix.hide(); + data.$target.val(machine); + data.$preview.empty(); + } + }, + /** * Transliterate a human-readable name to a machine name. * @@ -141,8 +156,15 @@ Drupal.behaviors.machineName = { * The transliterated source string. */ transliterate: function (source, settings) { - var rx = new RegExp(settings.replace_pattern, 'g'); - return source.toLowerCase().replace(rx, settings.replace).substr(0, settings.maxlength); + return $.get(drupalSettings.basePath + 'machine_name/generate', { + text: source, + language: drupalSettings.language, + replace_pattern: settings.replace_pattern, + replace: settings.replace, + lowercase: true + }).pipe(function(r) { + return r; + }); } }; diff --git a/core/modules/system/lib/Drupal/system/SystemBundle.php b/core/modules/system/lib/Drupal/system/SystemBundle.php index 8662169..90c339e 100644 --- a/core/modules/system/lib/Drupal/system/SystemBundle.php +++ b/core/modules/system/lib/Drupal/system/SystemBundle.php @@ -8,6 +8,7 @@ namespace Drupal\system; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\HttpKernel\Bundle\Bundle; /** @@ -21,6 +22,8 @@ class SystemBundle extends Bundle { public function build(ContainerBuilder $container) { $container->register('access_check.cron', 'Drupal\system\Access\CronAccessCheck') ->addTag('access_check'); + $container->register('system.machine_name_controller', 'Drupal\system\MachineNameController') + ->addArgument(new Reference('transliteration')); // Register the various system plugin manager classes with the dependency // injection container. diff --git a/core/modules/system/system.routing.yml b/core/modules/system/system.routing.yml index 085895e..c5215cc 100644 --- a/core/modules/system/system.routing.yml +++ b/core/modules/system/system.routing.yml @@ -4,3 +4,9 @@ system.cron: _controller: '\Drupal\system\CronController::run' requirements: _access_system_cron: 'TRUE' +machine_name: + pattern: '/machine_name/generate' + defaults: + _controller: 'system.machine_name_controller:generate' + requirements: + _permission: 'access content'