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")))