Skip to content

Commit ee46743

Browse files
committed
Add active locale item to storybook toolbar
1 parent 8726549 commit ee46743

File tree

2 files changed

+48
-25
lines changed

2 files changed

+48
-25
lines changed

.storybook/preview.js

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,27 @@
1-
import React from "react";
1+
import React, { useEffect } from "react";
22
import { useAccessibleOutlineStyle } from "../src/react-components/input/useAccessibleOutlineStyle";
33
import "../src/react-components/styles/global.scss";
44
import { WrappedIntlProvider } from "../src/react-components/wrapped-intl-provider";
55
import { MINIMAL_VIEWPORTS } from "@storybook/addon-viewport";
6+
import { AVAILABLE_LOCALES } from "../src/assets/locales/locale_config";
7+
import { setLocale } from "../src/utils/i18n";
68

7-
const Layout = ({ children }) => {
9+
const Layout = ({ children, locale }) => {
810
useAccessibleOutlineStyle();
11+
12+
useEffect(
13+
() => {
14+
setLocale(locale);
15+
},
16+
[locale]
17+
);
18+
919
return <WrappedIntlProvider>{children}</WrappedIntlProvider>;
1020
};
1121

1222
export const decorators = [
13-
Story => (
14-
<Layout>
23+
(Story, context) => (
24+
<Layout locale={context.globals.locale}>
1525
<Story />
1626
</Layout>
1727
)
@@ -31,3 +41,18 @@ export const parameters = {
3141
}
3242
}
3343
};
44+
45+
const locales = Object.entries(AVAILABLE_LOCALES).map(([value, title]) => ({ title, value }));
46+
locales.unshift({ title: "Browser Default", value: "browser" });
47+
48+
export const globalTypes = {
49+
locale: {
50+
name: "Locale",
51+
description: "Active locale",
52+
defaultValue: "browser",
53+
toolbar: {
54+
icon: "globe",
55+
items: locales
56+
}
57+
}
58+
};

src/utils/i18n.js

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const cachedMessages = new Map();
88
let _locale = DEFAULT_LOCALE;
99
let _localeData = defaultLocaleData;
1010

11-
function findLocale() {
11+
function findLocale(locale) {
1212
const locales = (() => {
1313
if (navigator.languages) {
1414
return [...navigator.languages];
@@ -21,25 +21,23 @@ function findLocale() {
2121
}
2222
})();
2323

24-
const preferences = window.APP.store.state.preferences;
25-
26-
if (preferences.locale && preferences.locale !== "browser") {
27-
locales.unshift(preferences.locale);
24+
if (locale && locale !== "browser") {
25+
locales.unshift(locale);
2826
}
2927

3028
for (let i = 0; i < locales.length; i++) {
31-
const locale = locales[i];
32-
if (AVAILABLE_LOCALES.hasOwnProperty(locale)) {
33-
return locale;
29+
const curLocale = locales[i];
30+
if (AVAILABLE_LOCALES.hasOwnProperty(curLocale)) {
31+
return curLocale;
3432
}
35-
if (FALLBACK_LOCALES.hasOwnProperty(locale)) {
36-
FALLBACK_LOCALES.hasOwnProperty(locale);
33+
if (FALLBACK_LOCALES.hasOwnProperty(curLocale)) {
34+
FALLBACK_LOCALES.hasOwnProperty(curLocale);
3735
}
3836
// Also check the primary language subtag in case
3937
// we do not have an entry for full tag
4038
// See https://en.wikipedia.org/wiki/IETF_language_tag#Syntax_of_language_tags
4139
// and https://github.com/mozilla/hubs/pull/3350/files#diff-70ef5717d3da03ef288e8d15c2fda32c5237d7f37074421496f22403e4475bf1R16
42-
const primaryLanguageSubtag = locale.split("-")[0].toLowerCase();
40+
const primaryLanguageSubtag = curLocale.split("-")[0].toLowerCase();
4341
if (AVAILABLE_LOCALES.hasOwnProperty(primaryLanguageSubtag)) {
4442
return primaryLanguageSubtag;
4543
}
@@ -50,20 +48,20 @@ function findLocale() {
5048
return DEFAULT_LOCALE;
5149
}
5250

53-
function updateLocale() {
54-
const locale = findLocale();
51+
export function setLocale(locale) {
52+
const resolvedLocale = findLocale(locale);
5553

56-
if (locale === DEFAULT_LOCALE) {
57-
_locale = locale;
54+
if (resolvedLocale === DEFAULT_LOCALE) {
55+
_locale = resolvedLocale;
5856
_localeData = defaultLocaleData;
5957
document.body.dispatchEvent(new CustomEvent("locale-updated"));
6058
} else {
61-
if (cachedMessages.has(locale)) {
62-
_locale = locale;
59+
if (cachedMessages.has(resolvedLocale)) {
60+
_locale = resolvedLocale;
6361
document.body.dispatchEvent(new CustomEvent("locale-updated"));
6462
} else {
65-
import(`../assets/locales/${locale}.json`).then(({ default: localeData }) => {
66-
_locale = locale;
63+
import(`../assets/locales/${resolvedLocale}.json`).then(({ default: localeData }) => {
64+
_locale = resolvedLocale;
6765
_localeData = localeData;
6866
document.body.dispatchEvent(new CustomEvent("locale-updated"));
6967
});
@@ -74,9 +72,9 @@ function updateLocale() {
7472
const interval = window.setInterval(() => {
7573
if (window.APP && window.APP.store) {
7674
window.clearInterval(interval);
77-
updateLocale();
75+
setLocale(window.APP.store.state.preferences.locale);
7876
window.APP.store.addEventListener("statechanged", () => {
79-
updateLocale();
77+
setLocale(window.APP.store.state.preferences.locale);
8078
});
8179
}
8280
}, 100);

0 commit comments

Comments
 (0)