diff --git a/frontend/src/metabase/lib/i18n.js b/frontend/src/metabase/lib/i18n.js index eeeee69e44965a0e8976f6102e2be05eedf146a6..c9552a9054dd25ef105747eb7145b2f1fc98752a 100644 --- a/frontend/src/metabase/lib/i18n.js +++ b/frontend/src/metabase/lib/i18n.js @@ -25,6 +25,13 @@ export function setLocalization(translationsObject) { moment.locale(locale); } +// Format a fixed timestamp in local time to see if the current locale defaults +// to using a 24 hour clock. +export function isLocale24Hour() { + const formattedTime = moment("2000-01-01T13:00:00").format("LT"); + return /^13:/.test(formattedTime); +} + // we delete msgid property since it's redundant, but have to add it back in to // make ttag happy function addMsgIds(translationsObject) { diff --git a/frontend/src/metabase/query_builder/components/filters/pickers/HoursMinutesInput.jsx b/frontend/src/metabase/query_builder/components/filters/pickers/HoursMinutesInput.jsx index 20e7dfd3d7e1803e8ad5b3edcf56757edc68f8ab..fdb298618ea39de278133667e7bccd991a7ddf22 100644 --- a/frontend/src/metabase/query_builder/components/filters/pickers/HoursMinutesInput.jsx +++ b/frontend/src/metabase/query_builder/components/filters/pickers/HoursMinutesInput.jsx @@ -2,6 +2,7 @@ import React from "react"; import NumericInput from "metabase/components/NumericInput"; import Icon from "metabase/components/Icon"; +import { isLocale24Hour } from "metabase/lib/i18n"; import cx from "classnames"; import moment from "moment"; @@ -12,7 +13,7 @@ const HoursMinutesInput = ({ onChangeHours, onChangeMinutes, onClear, - is24HourMode = false, + is24HourMode = isLocale24Hour(), }) => ( <div className="flex align-center"> <NumericInput diff --git a/frontend/test/metabase/lib/i18n.unit.spec.js b/frontend/test/metabase/lib/i18n.unit.spec.js new file mode 100644 index 0000000000000000000000000000000000000000..8a31a1166543b098db7ac74dfa45d31d40c22d49 --- /dev/null +++ b/frontend/test/metabase/lib/i18n.unit.spec.js @@ -0,0 +1,25 @@ +import moment from "moment"; + +import { isLocale24Hour } from "metabase/lib/i18n"; + +describe("isLocale24Hour", () => { + const testCases = [ + ["en", false], + ["en-us", false], + ["en-gb", true], + ["fr", true], + ["zh-cn", true], + ]; + for (const [locale, is24] of testCases) { + it(`should return ${is24} for '${locale}'`, () => { + // save locale before changing it + const startingLocale = moment.locale(); + + moment.locale(locale); + expect(isLocale24Hour()).toBe(is24); + + // reset locale + moment.locale(startingLocale); + }); + } +});