diff --git a/config/schema/pathauto.schema.yml b/config/schema/pathauto.schema.yml
index ca04411..abd4019 100644
--- a/config/schema/pathauto.schema.yml
+++ b/config/schema/pathauto.schema.yml
@@ -23,11 +23,10 @@ pathauto.settings:
     reduce_ascii:
       type: boolean
     ignore_words:
-      type: string
+      type: label
+      label: 'Strings to Remove'
     case:
       type: boolean
-    ignore_words:
-      type: string
     update_action:
       type: integer
 
diff --git a/pathauto.config_translation.yml b/pathauto.config_translation.yml
new file mode 100644
index 0000000..7372ff8
--- /dev/null
+++ b/pathauto.config_translation.yml
@@ -0,0 +1,5 @@
+pathauto.settings:
+  title: 'Patterns settings'
+  base_route_name: path.admin_overview
+  names:
+    - pathauto.settings
diff --git a/pathauto.module b/pathauto.module
index 11d4234..2801f15 100644
--- a/pathauto.module
+++ b/pathauto.module
@@ -26,11 +26,6 @@ use Drupal\Core\Url;
 use Drupal\pathauto\PathautoFieldItemList;
 use Drupal\pathauto\PathautoItem;
 
-/**
- * The default ignore word list.
- */
-define('PATHAUTO_IGNORE_WORDS', 'a, an, as, at, before, but, by, for, from, is, in, into, like, of, off, on, onto, per, since, than, the, this, that, to, up, via, with');
-
 /**
  * Implements hook_hook_info().
  */
diff --git a/src/AliasCleaner.php b/src/AliasCleaner.php
index 340a266..ee2fea3 100644
--- a/src/AliasCleaner.php
+++ b/src/AliasCleaner.php
@@ -47,11 +47,11 @@ class AliasCleaner implements AliasCleanerInterface {
   /**
    * Calculated settings cache.
    *
-   * @todo Split this up into separate properties.
-   *
    * @var array
+   *
+   * @todo Split this up into separate properties.
    */
-  protected $cleanStringCache = array();
+  protected $cleanStringCache = [];
 
   /**
    * Transliteration service.
@@ -155,20 +155,34 @@ class AliasCleaner implements AliasCleanerInterface {
   /**
    * {@inheritdoc}
    */
-  public function cleanString($string, array $options = array()) {
-    if (empty($this->cleanStringCache)) {
+  public function cleanString($string, array $options = []) {
+    $langcode = NULL;
+    if (!empty($options['language'])) {
+      $langcode = $options['language']->getId();
+    }
+    elseif (!empty($options['langcode'])) {
+      $langcode = $options['langcode'];
+    }
+
+    if (empty($this->cleanStringCache[$langcode])) {
+      // Remember config language.
+      $original_language = $this->languageManager->getConfigOverrideLanguage();
+      // Set the language we need to fetch config from.
+      $this->languageManager->setConfigOverrideLanguage($this->languageManager->getLanguage($langcode));
       // Generate and cache variables used in this method.
       $config = $this->configFactory->get('pathauto.settings');
-      $this->cleanStringCache = array(
+      // Restore config language.
+      $this->languageManager->setConfigOverrideLanguage($original_language);
+      $this->cleanStringCache[$langcode] = [
         'separator' => $config->get('separator'),
-        'strings' => array(),
+        'strings' => [],
         'transliterate' => $config->get('transliterate'),
-        'punctuation' => array(),
+        'punctuation' => [],
         'reduce_ascii' => (bool) $config->get('reduce_ascii'),
         'ignore_words_regex' => FALSE,
         'lowercase' => (bool) $config->get('case'),
         'maxlength' => min($config->get('max_component_length'), $this->aliasStorageHelper->getAliasSchemaMaxLength()),
-      );
+      ];
 
       // Generate and cache the punctuation replacements for strtr().
       $punctuation = $this->getPunctuationCharacters();
@@ -176,11 +190,11 @@ class AliasCleaner implements AliasCleanerInterface {
         $action = $config->get('punctuation.' . $name);
         switch ($action) {
           case PathautoGeneratorInterface::PUNCTUATION_REMOVE:
-            $this->cleanStringCache['punctuation'][$details['value']] = '';
+            $this->cleanStringCache[$langcode]['punctuation'][$details['value']] = '';
             break;
 
           case PathautoGeneratorInterface::PUNCTUATION_REPLACE:
-            $this->cleanStringCache['punctuation'][$details['value']] = $this->cleanStringCache['separator'];
+            $this->cleanStringCache[$langcode]['punctuation'][$details['value']] = $this->cleanStringCache[$langcode]['separator'];
             break;
 
           case PathautoGeneratorInterface::PUNCTUATION_DO_NOTHING:
@@ -191,16 +205,16 @@ class AliasCleaner implements AliasCleanerInterface {
 
       // Generate and cache the ignored words regular expression.
       $ignore_words = $config->get('ignore_words');
-      $ignore_words_regex = preg_replace(array('/^[,\s]+|[,\s]+$/', '/[,\s]+/'), array('', '\b|\b'), $ignore_words);
+      $ignore_words_regex = preg_replace(['/^[,\s]+|[,\s]+$/', '/[,\s]+/'], ['', '\b|\b'], $ignore_words);
       if ($ignore_words_regex) {
-        $this->cleanStringCache['ignore_words_regex'] = '\b' . $ignore_words_regex . '\b';
+        $this->cleanStringCache[$langcode]['ignore_words_regex'] = '\b' . $ignore_words_regex . '\b';
         if (function_exists('mb_eregi_replace')) {
           mb_regex_encoding('UTF-8');
-          $this->cleanStringCache['ignore_words_callback'] = 'mb_eregi_replace';
+          $this->cleanStringCache[$langcode]['ignore_words_callback'] = 'mb_eregi_replace';
         }
         else {
-          $this->cleanStringCache['ignore_words_callback'] = 'preg_replace';
-          $this->cleanStringCache['ignore_words_regex'] = '/' . $this->cleanStringCache['ignore_words_regex'] . '/i';
+          $this->cleanStringCache[$langcode]['ignore_words_callback'] = 'preg_replace';
+          $this->cleanStringCache[$langcode]['ignore_words_regex'] = '/' . $this->cleanStringCache[$langcode]['ignore_words_regex'] . '/i';
         }
       }
     }
@@ -210,18 +224,10 @@ class AliasCleaner implements AliasCleanerInterface {
       return '';
     }
 
-    $langcode = NULL;
-    if (!empty($options['language'])) {
-      $langcode = $options['language']->getId();
-    }
-    elseif (!empty($options['langcode'])) {
-      $langcode = $options['langcode'];
-    }
-
     // Check if the string has already been processed, and if so return the
     // cached result.
-    if (isset($this->cleanStringCache['strings'][$langcode][(string) $string])) {
-      return $this->cleanStringCache['strings'][$langcode][(string) $string];
+    if (isset($this->cleanStringCache[$langcode]['strings'][(string) $string])) {
+      return $this->cleanStringCache[$langcode]['strings'][(string) $string];
     }
 
     // Remove all HTML tags from the string.
@@ -229,50 +235,49 @@ class AliasCleaner implements AliasCleanerInterface {
     $output = PlainTextOutput::renderFromHtml($output);
 
     // Optionally transliterate.
-    if ($this->cleanStringCache['transliterate']) {
+    if ($this->cleanStringCache[$langcode]['transliterate']) {
       // If the reduce strings to letters and numbers is enabled, don't bother
       // replacing unknown characters with a question mark. Use an empty string
       // instead.
-      $output = $this->transliteration->transliterate($output, $langcode, $this->cleanStringCache['reduce_ascii'] ? '' : '?');
+      $output = $this->transliteration->transliterate($output, $langcode, $this->cleanStringCache[$langcode]['reduce_ascii'] ? '' : '?');
     }
 
     // Replace or drop punctuation based on user settings.
-    $output = strtr($output, $this->cleanStringCache['punctuation']);
+    $output = strtr($output, $this->cleanStringCache[$langcode]['punctuation']);
 
     // Reduce strings to letters and numbers.
-    if ($this->cleanStringCache['reduce_ascii']) {
-      $output = preg_replace('/[^a-zA-Z0-9\/]+/', $this->cleanStringCache['separator'], $output);
+    if ($this->cleanStringCache[$langcode]['reduce_ascii']) {
+      $output = preg_replace('/[^a-zA-Z0-9\/]+/', $this->cleanStringCache[$langcode]['separator'], $output);
     }
 
     // Get rid of words that are on the ignore list.
-    if ($this->cleanStringCache['ignore_words_regex']) {
-      $words_removed = $this->cleanStringCache['ignore_words_callback']($this->cleanStringCache['ignore_words_regex'], '', $output);
+    if ($this->cleanStringCache[$langcode]['ignore_words_regex']) {
+      $words_removed = $this->cleanStringCache[$langcode]['ignore_words_callback']($this->cleanStringCache[$langcode]['ignore_words_regex'], '', $output);
       if (Unicode::strlen(trim($words_removed)) > 0) {
         $output = $words_removed;
       }
     }
 
     // Always replace whitespace with the separator.
-    $output = preg_replace('/\s+/', $this->cleanStringCache['separator'], $output);
+    $output = preg_replace('/\s+/', $this->cleanStringCache[$langcode]['separator'], $output);
 
     // Trim duplicates and remove trailing and leading separators.
-    $output = $this->getCleanSeparators($this->getCleanSeparators($output, $this->cleanStringCache['separator']));
+    $output = $this->getCleanSeparators($this->getCleanSeparators($output, $this->cleanStringCache[$langcode]['separator']));
 
     // Optionally convert to lower case.
-    if ($this->cleanStringCache['lowercase']) {
+    if ($this->cleanStringCache[$langcode]['lowercase']) {
       $output = Unicode::strtolower($output);
     }
 
     // Shorten to a logical place based on word boundaries.
-    $output = Unicode::truncate($output, $this->cleanStringCache['maxlength'], TRUE);
+    $output = Unicode::truncate($output, $this->cleanStringCache[$langcode]['maxlength'], TRUE);
 
     // Cache this result in the static array.
-    $this->cleanStringCache['strings'][$langcode][(string) $string] = $output;
+    $this->cleanStringCache[$langcode]['strings'][(string) $string] = $output;
 
     return $output;
   }
 
-
   /**
    * {@inheritdoc}
    */
