diff --git a/.eslintrc.yml b/.eslintrc.yml
index 98a497aa12a1bf8a768a883d43b2e2fedc52b186..2b881d5f201c32090ef1b746a1b884e5815b0742 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -8,11 +8,13 @@ globals:
 plugins:
   - import
   - html
+  - "@gitlab/i18n"
 settings:
   import/resolver:
     webpack:
       config: './config/webpack.config.js'
 rules:
+  "@gitlab/i18n/no-non-i18n-strings": error
   import/no-commonjs: error
   no-underscore-dangle:
     - error
@@ -31,3 +33,11 @@ rules:
   vue/no-use-v-if-with-v-for: off
   vue/no-v-html: off
   vue/use-v-on-exact: off
+overrides:
+  files:
+    # Vue is temporarily being disabled until the autofix errors are resolved
+    # Follow up issue https://gitlab.com/gitlab-org/gitlab-ce/issues/57969
+    - '*.vue'
+    - '**/spec/**/*'
+  rules:
+    "@gitlab/i18n/no-non-i18n-strings": off
diff --git a/app/assets/javascripts/awards_handler.js b/app/assets/javascripts/awards_handler.js
index 743f11625bcfb5ab84398689eb9a2819149e0eb3..aaab217964c49a53a76b47fbbed60a7f13bade33 100644
--- a/app/assets/javascripts/awards_handler.js
+++ b/app/assets/javascripts/awards_handler.js
@@ -1,4 +1,4 @@
-/* eslint-disable class-methods-use-this */
+/* eslint-disable class-methods-use-this, @gitlab/i18n/no-non-i18n-strings */
 
 import $ from 'jquery';
 import _ from 'underscore';
diff --git a/app/assets/javascripts/boards/stores/actions.js b/app/assets/javascripts/boards/stores/actions.js
index da82b52330a29eb1d3388c1cf9c67fdebdaf7130..d4f4df3ad75e7ed82ceca4de97b0cf9e40aebc58 100644
--- a/app/assets/javascripts/boards/stores/actions.js
+++ b/app/assets/javascripts/boards/stores/actions.js
@@ -1,4 +1,5 @@
 const notImplemented = () => {
+  /* eslint-disable-next-line @gitlab/i18n/no-non-i18n-strings */
   throw new Error('Not implemented!');
 };
 
diff --git a/app/assets/javascripts/boards/stores/mutations.js b/app/assets/javascripts/boards/stores/mutations.js
index 77ba68be07eec585464ca4ed9dab83569c476661..09eb8bb9b98ba170d48ce336ebee17b6a4b7c9a9 100644
--- a/app/assets/javascripts/boards/stores/mutations.js
+++ b/app/assets/javascripts/boards/stores/mutations.js
@@ -1,6 +1,7 @@
 import * as mutationTypes from './mutation_types';
 
 const notImplemented = () => {
+  /* eslint-disable-next-line @gitlab/i18n/no-non-i18n-strings */
   throw new Error('Not implemented!');
 };
 
diff --git a/app/assets/javascripts/lib/utils/autosave.js b/app/assets/javascripts/lib/utils/autosave.js
index 023c336db02f4d9af90fd105dbde701c707ff7d8..37896626053dc69ad6bd78c9f2356c4895ab61d8 100644
--- a/app/assets/javascripts/lib/utils/autosave.js
+++ b/app/assets/javascripts/lib/utils/autosave.js
@@ -29,4 +29,5 @@ export const updateDraft = (autosaveKey, text) => {
 };
 
 export const getDiscussionReplyKey = (noteableType, discussionId) =>
+  /* eslint-disable-next-line @gitlab/i18n/no-non-i18n-strings */
   ['Note', capitalizeFirstCharacter(noteableType), discussionId, 'Reply'].join('/');
diff --git a/app/assets/javascripts/lib/utils/notify.js b/app/assets/javascripts/lib/utils/notify.js
index d93873e0214cae2746dccde56c29cd808f02d68a..e7f6255e5f14cba10d214ab42c5d31fc8afcec86 100644
--- a/app/assets/javascripts/lib/utils/notify.js
+++ b/app/assets/javascripts/lib/utils/notify.js
@@ -12,6 +12,7 @@ function notificationGranted(message, opts, onclick) {
 }
 
 function notifyPermissions() {
+  /* eslint-disable-next-line @gitlab/i18n/no-non-i18n-strings */
   if ('Notification' in window) {
     return Notification.requestPermission();
   }
@@ -24,6 +25,7 @@ function notifyMe(message, body, icon, onclick) {
     icon: icon,
   };
   // Let's check if the browser supports notifications
+  /* eslint-disable-next-line @gitlab/i18n/no-non-i18n-strings */
   if (!('Notification' in window)) {
     // do nothing
   } else if (Notification.permission === 'granted') {
diff --git a/app/assets/javascripts/new_branch_form.js b/app/assets/javascripts/new_branch_form.js
index f338dbbb0a6ff2423ebffecb4ca1d85a9e66581f..98522c67696e04aaf3f078e11fc8f538d8d7febd 100644
--- a/app/assets/javascripts/new_branch_form.js
+++ b/app/assets/javascripts/new_branch_form.js
@@ -1,4 +1,4 @@
-/* eslint-disable func-names, no-var, one-var, consistent-return, no-return-assign, prefer-arrow-callback, prefer-template, no-shadow, no-else-return */
+/* eslint-disable func-names, no-var, one-var, consistent-return, no-return-assign, prefer-arrow-callback, prefer-template, no-shadow, no-else-return, @gitlab/i18n/no-non-i18n-strings */
 
 import $ from 'jquery';
 import RefSelectDropdown from './ref_select_dropdown';
diff --git a/app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js b/app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js
index 377dce6c746faa309f85f99f047926f267a7be7d..506e6075d1636b97eb09dbc7d25f7c2247ad524a 100644
--- a/app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js
+++ b/app/assets/javascripts/pages/projects/graphs/show/stat_graph_contributors_graph.js
@@ -124,11 +124,14 @@ export const ContributorsGraph = (function() {
   };
 
   ContributorsGraph.prototype.draw_x_axis = function() {
-    return this.svg
-      .append('g')
-      .attr('class', 'x axis')
-      .attr('transform', 'translate(0, ' + this.height + ')')
-      .call(this.x_axis);
+    return (
+      this.svg
+        .append('g')
+        .attr('class', 'x axis')
+        /* eslint-disable-next-line @gitlab/i18n/no-non-i18n-strings */
+        .attr('transform', 'translate(0, ' + this.height + ')')
+        .call(this.x_axis)
+    );
   };
 
   ContributorsGraph.prototype.draw_y_axis = function() {
@@ -205,6 +208,7 @@ export const ContributorsMasterGraph = (function(superClass) {
       .attr('height', this.height + this.MARGIN.top + this.MARGIN.bottom)
       .attr('class', 'tint-box')
       .append('g')
+      /* eslint-disable-next-line @gitlab/i18n/no-non-i18n-strings */
       .attr('transform', 'translate(' + this.MARGIN.left + ',' + this.MARGIN.top + ')');
     return this.svg;
   };
@@ -354,6 +358,7 @@ export const ContributorsAuthorGraph = (function(superClass) {
       .attr('height', this.height + this.MARGIN.top + this.MARGIN.bottom)
       .attr('class', 'spark')
       .append('g')
+      /* eslint-disable-next-line @gitlab/i18n/no-non-i18n-strings */
       .attr('transform', 'translate(' + this.MARGIN.left + ',' + this.MARGIN.top + ')');
     return this.svg;
   };
diff --git a/app/assets/javascripts/repository/graphql.js b/app/assets/javascripts/repository/graphql.js
index c64d16ef02a6b7aa97a98a515d778a02224e4f68..ef147ec15cbe05ac614c7ca966fb4c46060e309d 100644
--- a/app/assets/javascripts/repository/graphql.js
+++ b/app/assets/javascripts/repository/graphql.js
@@ -18,6 +18,7 @@ const defaultClient = createDefaultClient(
     cacheConfig: {
       fragmentMatcher,
       dataIdFromObject: obj => {
+        /* eslint-disable @gitlab/i18n/no-non-i18n-strings */
         // eslint-disable-next-line no-underscore-dangle
         switch (obj.__typename) {
           // We need to create a dynamic ID for each entry
@@ -33,6 +34,7 @@ const defaultClient = createDefaultClient(
             // eslint-disable-next-line no-underscore-dangle
             return obj.id || obj._id;
         }
+        /* eslint-enable @gitlab/i18n/no-non-i18n-strings */
       },
     },
   },
diff --git a/app/assets/javascripts/repository/utils/title.js b/app/assets/javascripts/repository/utils/title.js
index 4e194640e92311617f2d8110d6b2c16c45d54f88..87d54c012002bc38dfc0667f7adcba5bc4ebad2e 100644
--- a/app/assets/javascripts/repository/utils/title.js
+++ b/app/assets/javascripts/repository/utils/title.js
@@ -5,5 +5,6 @@ export const setTitle = (pathMatch, ref, project) => {
   const path = pathMatch.replace(/^\//, '');
   const isEmpty = path === '';
 
+  /* eslint-disable-next-line @gitlab/i18n/no-non-i18n-strings */
   document.title = `${isEmpty ? 'Files' : path} · ${ref} · ${project}`;
 };
diff --git a/app/assets/javascripts/search_autocomplete.js b/app/assets/javascripts/search_autocomplete.js
index 6aca4067ba77e92fbc2d4515762e0170619a91f0..842fb5e5b4f7e1f47284747b649a695fe2f9c5cd 100644
--- a/app/assets/javascripts/search_autocomplete.js
+++ b/app/assets/javascripts/search_autocomplete.js
@@ -447,9 +447,11 @@ export class SearchAutocomplete {
   onClick(item, $el, e) {
     if (window.location.pathname.indexOf(item.url) !== -1) {
       if (!e.metaKey) e.preventDefault();
+      /* eslint-disable-next-line @gitlab/i18n/no-non-i18n-strings */
       if (item.category === 'Projects') {
         this.projectInputEl.val(item.id);
       }
+      /* eslint-disable-next-line @gitlab/i18n/no-non-i18n-strings */
       if (item.category === 'Groups') {
         this.groupInputEl.val(item.id);
       }
diff --git a/app/assets/javascripts/users_select.js b/app/assets/javascripts/users_select.js
index 7e6f02b10af8d5ce24cdaeb89c546ed766bf862f..33cedf78331fe6d1388a5f24ba3b2b2e7b1cd6da 100644
--- a/app/assets/javascripts/users_select.js
+++ b/app/assets/javascripts/users_select.js
@@ -427,6 +427,7 @@ function UsersSelect(currentUser, els, options = {}) {
               const isActive = $el.hasClass('is-active');
               const previouslySelected = $dropdown
                 .closest('.selectbox')
+                /* eslint-disable-next-line @gitlab/i18n/no-non-i18n-strings */
                 .find("input[name='" + $dropdown.data('fieldName') + "'][value!=0]");
 
               // Enables support for limiting the number of users selected
diff --git a/package.json b/package.json
index ab7268642ecd4dfa2cc815aace39e9d35ff67098..0758c27c75bd3c93e30a0a51ea582f782b2698e9 100644
--- a/package.json
+++ b/package.json
@@ -147,6 +147,7 @@
   "devDependencies": {
     "@babel/plugin-transform-modules-commonjs": "^7.2.0",
     "@gitlab/eslint-config": "^1.6.0",
+    "@gitlab/eslint-plugin-i18n": "^1.0.0",
     "@vue/test-utils": "^1.0.0-beta.25",
     "axios-mock-adapter": "^1.15.0",
     "babel-jest": "^24.1.0",
diff --git a/yarn.lock b/yarn.lock
index b6d31ea08e6000ec77182a85a2de58cb94928739..dddf01414b22b30079f4081413adccea3f4f10ce 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -693,6 +693,13 @@
     eslint-plugin-promise "^4.1.1"
     eslint-plugin-vue "^5.0.0"
 
+"@gitlab/eslint-plugin-i18n@^1.0.0":
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/@gitlab/eslint-plugin-i18n/-/eslint-plugin-i18n-1.1.0.tgz#e494d599e644ce3a094ea85f87dbbda41a924c5e"
+  integrity sha512-Cwm7sLtQnUDqvxE9Ez8UMslyosPCpMVLxBnFb+2n6QcBZmXRao4aNSVRkmlsDZYgYegWhOGn3Qq3MLy4BSqauQ==
+  dependencies:
+    requireindex "~1.1.0"
+
 "@gitlab/svgs@^1.63.0":
   version "1.63.0"
   resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-1.63.0.tgz#9dd544026d203e4ce6efed72b05db68f710c4d49"
@@ -9439,6 +9446,11 @@ require-uncached@^1.0.3:
     caller-path "^0.1.0"
     resolve-from "^1.0.0"
 
+requireindex@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162"
+  integrity sha1-5UBLgVV+91225JxacgBIk/4D4WI=
+
 requires-port@1.x.x, requires-port@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"