From a32e6a4eb3cc74a6234a580c1e8a8db90d3f5583 Mon Sep 17 00:00:00 2001
From: Paul Rosenzweig <paulrosenzweig@users.noreply.github.com>
Date: Thu, 3 Oct 2019 13:36:40 -0400
Subject: [PATCH] show am/pm if locale uses 12-hour clock (#11049)

---
 frontend/src/metabase/lib/i18n.js             |  7 ++++++
 .../filters/pickers/HoursMinutesInput.jsx     |  3 ++-
 frontend/test/metabase/lib/i18n.unit.spec.js  | 25 +++++++++++++++++++
 3 files changed, 34 insertions(+), 1 deletion(-)
 create mode 100644 frontend/test/metabase/lib/i18n.unit.spec.js

diff --git a/frontend/src/metabase/lib/i18n.js b/frontend/src/metabase/lib/i18n.js
index eeeee69e449..c9552a9054d 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 20e7dfd3d7e..fdb298618ea 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 00000000000..8a31a116654
--- /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);
+    });
+  }
+});
-- 
GitLab