diff --git a/frontend/src/metabase/app.js b/frontend/src/metabase/app.js
index 08357cbfc52c5f405f16e7ecda57fc8183c14746..affa0f0354a36ddecc2da6e266dfa851e4fc1e55 100644
--- a/frontend/src/metabase/app.js
+++ b/frontend/src/metabase/app.js
@@ -7,6 +7,12 @@ import 'number-to-locale-string';
 import { t } from "c-3po";
 global.t = t;
 
+// set the locale before loading anything else
+import { setLocalization } from "metabase/lib/i18n";
+if (window.MetabaseLocalization) {
+    setLocalization(window.MetabaseLocalization)
+}
+
 import React from 'react'
 import ReactDOM from 'react-dom'
 import { Provider } from 'react-redux'
@@ -24,8 +30,6 @@ import { Router, useRouterHistory } from "react-router";
 import { createHistory } from 'history'
 import { syncHistoryWithStore } from 'react-router-redux';
 
-import { loadLocale } from "metabase/lib/i18n";
-
 // remove trailing slash
 const BASENAME = window.MetabaseRoot.replace(/\/+$/, "");
 
@@ -62,9 +66,6 @@ function _init(reducers, getRoutes, callback) {
         window['ga-disable-' + MetabaseSettings.get('ga_code')] = MetabaseSettings.isTrackingEnabled() ? null : true;
     });
 
-    // TODO: detect user's prefered locale
-    loadLocale("de");
-
     if (callback) {
         callback(store);
     }
diff --git a/frontend/src/metabase/lib/i18n.js b/frontend/src/metabase/lib/i18n.js
index 23c27edb0b49a98194f31eef609dfe30e641901d..b9d62655cacc37cd065f8dcc6568ec0758b87cca 100644
--- a/frontend/src/metabase/lib/i18n.js
+++ b/frontend/src/metabase/lib/i18n.js
@@ -3,11 +3,16 @@ import MetabaseSettings from "metabase/lib/settings";
 import { addLocale, useLocale } from "c-3po";
 import { I18NApi } from "metabase/services";
 
-export async function loadLocale(locale) {
+export async function loadLocalization(locale) {
     // load and parse the locale
     const translationsObject = await I18NApi.locale({ locale });
+    setLocalization(translationsObject);
+}
+
+export function setLocalization(translationsObject) {
+    const locale = window.MetabaseLocalization.headers.language;
 
     // add and set locale with C-3PO
-    addLocale(locale, translationsObject);
+    addLocale(locale, window.MetabaseLocalization);
     useLocale(locale);
 }
diff --git a/resources/frontend_client/index_template.html b/resources/frontend_client/index_template.html
index 1986da16223f528586ea445f25a4973f3de42419..2f38621c68d0b47adb64c9fc4298944a9589d62e 100644
--- a/resources/frontend_client/index_template.html
+++ b/resources/frontend_client/index_template.html
@@ -16,6 +16,7 @@
         <script type="text/javascript">
             (function() {
                 window.MetabaseBootstrap = {{{bootstrap_json}}};
+                window.MetabaseLocalization = {{{localization_json}}};
 
                 var configuredRoot = {{{base_href}}};
                 var actualRoot = "/";
diff --git a/src/metabase/routes.clj b/src/metabase/routes.clj
index 469c73e3002cc7741c7cc8820ac843c87acb46fa..430a5f3f0f4e19a78b9f9bd4f0739b765e8c4de9 100644
--- a/src/metabase/routes.clj
+++ b/src/metabase/routes.clj
@@ -31,13 +31,18 @@
 (defn- load-template [path variables]
   (stencil/render-string (load-file-at-path path) variables))
 
+(defn- load-localization []
+  ;; TODO: detect language
+  (load-file-at-path "frontend_client/app/locales/de.json"))
+
 (defn- entrypoint [entry embeddable? {:keys [uri]}]
   (-> (if (init-status/complete?)
         (load-template (str "frontend_client/" entry ".html")
-                       {:bootstrap_json (escape-script (json/generate-string (public-settings/public-settings)))
-                        :uri            (escape-script (json/generate-string uri))
-                        :base_href      (escape-script (json/generate-string (base-href)))
-                        :embed_code     (when embeddable? (embed/head uri))})
+                       {:bootstrap_json    (escape-script (json/generate-string (public-settings/public-settings)))
+                        :localization_json (escape-script (load-localization))
+                        :uri               (escape-script (json/generate-string uri))
+                        :base_href         (escape-script (json/generate-string (base-href)))
+                        :embed_code        (when embeddable? (embed/head uri))})
         (load-file-at-path "frontend_client/init.html"))
       resp/response
       (resp/content-type "text/html; charset=utf-8")))