diff --git a/config/schema/pathauto.schema.yml b/config/schema/pathauto.schema.yml
index 1da59f1..7fb0829 100644
--- a/config/schema/pathauto.schema.yml
+++ b/config/schema/pathauto.schema.yml
@@ -25,7 +25,8 @@ pathauto.settings:
     case:
       type: boolean
     ignore_words:
-      type: string
+      type: label
+      label: 'Strings to Remove'
     update_action:
       type: integer
     safe_tokens:
diff --git a/pathauto.config_translation.yml b/pathauto.config_translation.yml
new file mode 100644
index 0000000..28879e7
--- /dev/null
+++ b/pathauto.config_translation.yml
@@ -0,0 +1,5 @@
+pathauto.settings:
+  title: 'Pathauto settings'
+  base_route_name: pathauto.settings.form
+  names:
+    - pathauto.settings
diff --git a/src/AliasCleaner.php b/src/AliasCleaner.php
index f6c9508..01dde83 100644
--- a/src/AliasCleaner.php
+++ b/src/AliasCleaner.php
@@ -159,10 +159,24 @@ class AliasCleaner implements AliasCleanerInterface {
    * {@inheritdoc}
    */
   public function cleanString($string, array $options = []) {
-    if (empty($this->cleanStringCache)) {
+    $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 = [
+      // Restore config language.
+      $this->languageManager->setConfigOverrideLanguage($original_language);
+      $this->cleanStringCache[$langcode] = [
         'separator' => $config->get('separator'),
         'strings' => [],
         'transliterate' => $config->get('transliterate'),
@@ -179,11 +193,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:
@@ -196,14 +210,14 @@ class AliasCleaner implements AliasCleanerInterface {
       $ignore_words = $config->get('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';
         }
       }
     }
@@ -213,18 +227,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.
@@ -232,45 +238,45 @@ 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 (mb_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 = mb_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;
   }
