diff --git a/dist/README.md b/dist/README.md
index a64c1196075..362a483a664 100644
--- a/dist/README.md
+++ b/dist/README.md
@@ -14,22 +14,46 @@ or the un-minified version as:
```
-To support IE9, put:
+### To support IE9
+
+*Before* the plotly.js script tag, add:
```html
```
-before the plotly.js script tag.
+### To support MathJax
-To add MathJax, put
+*Before* the plotly.js script tag, add:
```html
```
-before the plotly.js script tag. You can grab the relevant MathJax files in `./dist/extras/mathjax/`.
+You can grab the relevant MathJax files in `./dist/extras/mathjax/`.
+
+### To include localization
+
+Plotly.js defaults to US English (en-US) and includes British English (en) in the standard bundle.
+Many other localizations are available - here is an example using Swiss-German (de-CH),
+see the contents of this directory for the full list.
+They are also available on our CDN as https://cdn.plot.ly/plotly-locale-de-ch-latest.js OR https://cdn.plot.ly/plotly-locale-de-ch-1.31.2.js
+Note that the file names are all lowercase, even though the region is uppercase when you apply a locale.
+
+*After* the plotly.js script tag, add:
+
+```html
+
+
+```
+
+The first line loads and registers the locale definition with plotly.js, the second sets it as the default for all Plotly plots.
+You can also include multiple locale definitions and apply them to each plot separately as a `config` parameter:
+
+```js
+Plotly.newPlot(graphDiv, data, layout, {locale: 'de-CH'})
+```
# Bundle information
@@ -84,7 +108,7 @@ The `basic` partial bundle contains the `scatter`, `bar` and `pie` trace modules
### plotly.js cartesian
-The `cartesian` partial bundle contains the `scatter`, `bar`, `box`, `heatmap`, `histogram`, `histogram2d`, `histogram2dcontour`, `pie`, `contour` and `scatterternary` trace modules.
+The `cartesian` partial bundle contains the `scatter`, `bar`, `box`, `heatmap`, `histogram`, `histogram2d`, `histogram2dcontour`, `pie`, `contour`, `scatterternary` and `violin` trace modules.
| Way to import | Location |
|---------------|----------|
diff --git a/dist/plotly-locale-af.js b/dist/plotly-locale-af.js
new file mode 100644
index 00000000000..ffe1997ff17
--- /dev/null
+++ b/dist/plotly-locale-af.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"af",dictionary:{},format:{days:["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],shortDays:["Son","Maan","Dins","Woens","Don","Vry","Sat"],months:["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"],shortMonths:["Jan","Feb","Mrt","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-am.js b/dist/plotly-locale-am.js
new file mode 100644
index 00000000000..b86fb9eb0f8
--- /dev/null
+++ b/dist/plotly-locale-am.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"am",dictionary:{},format:{days:["\u1230\u1295\u12f4\u12ed","\u1218\u1295\u12f4\u12ed","\u1275\u12e9\u1235\u12f4\u12ed","\u12cc\u1295\u1235\u12f4\u12ed","\u1270\u122d\u1230\u12f4\u12ed","\u134d\u122b\u12ed\u12f4\u12ed","\u1233\u1270\u122d\u12f4\u12ed"],shortDays:["\u1230\u1295\u12f4","\u1218\u1295\u12f4","\u1275\u12e9\u1235","\u12cc\u1295\u1235","\u1270\u122d\u1230","\u134d\u122b\u12ed","\u1233\u1270\u122d"],months:["\u1303\u1295\u12cb\u122a","\u1348\u1265\u122d\u12cb\u122a","\u121b\u122d\u127d","\u12a0\u1355\u122a\u120d","\u121c\u12ed","\u1301\u1295","\u1301\u120b\u12ed","\u12a6\u1308\u1235\u1275","\u1234\u1355\u1274\u121d\u1260\u122d","\u12a6\u12ad\u1276\u1260\u122d","\u1296\u126c\u121d\u1260\u122d","\u12f2\u1234\u121d\u1260\u122d"],shortMonths:["\u1303\u1295\u12cb","\u1348\u1265\u122d","\u121b\u122d\u127d","\u12a0\u1355\u122a","\u121c\u12ed","\u1301\u1295","\u1301\u120b\u12ed","\u12a6\u1308\u1235","\u1234\u1355\u1274","\u12a6\u12ad\u1276","\u1296\u126c\u121d","\u12f2\u1234\u121d"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-ar-dz.js b/dist/plotly-locale-ar-dz.js
new file mode 100644
index 00000000000..207dcc555a8
--- /dev/null
+++ b/dist/plotly-locale-ar-dz.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"ar-DZ",dictionary:{},format:{days:["\u0627\u0644\u0623\u062d\u062f","\u0627\u0644\u0627\u062b\u0646\u064a\u0646","\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621","\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621","\u0627\u0644\u062e\u0645\u064a\u0633","\u0627\u0644\u062c\u0645\u0639\u0629","\u0627\u0644\u0633\u0628\u062a"],shortDays:["\u0627\u0644\u0623\u062d\u062f","\u0627\u0644\u0627\u062b\u0646\u064a\u0646","\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621","\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621","\u0627\u0644\u062e\u0645\u064a\u0633","\u0627\u0644\u062c\u0645\u0639\u0629","\u0627\u0644\u0633\u0628\u062a"],months:["\u062c\u0627\u0646\u0641\u064a","\u0641\u064a\u0641\u0631\u064a","\u0645\u0627\u0631\u0633","\u0623\u0641\u0631\u064a\u0644","\u0645\u0627\u064a","\u062c\u0648\u0627\u0646","\u062c\u0648\u064a\u0644\u064a\u0629","\u0623\u0648\u062a","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"],shortMonths:["1","2","3","4","5","6","7","8","9","10","11","12"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-ar-eg.js b/dist/plotly-locale-ar-eg.js
new file mode 100644
index 00000000000..a35e66cb1d3
--- /dev/null
+++ b/dist/plotly-locale-ar-eg.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"ar-EG",dictionary:{},format:{days:["\u0627\u0644\u0623\u062d\u062f","\u0627\u0644\u0627\u062b\u0646\u064a\u0646","\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621","\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621","\u0627\u0644\u062e\u0645\u064a\u0633","\u0627\u0644\u062c\u0645\u0639\u0629","\u0627\u0644\u0633\u0628\u062a"],shortDays:["\u0623\u062d\u062f","\u0627\u062b\u0646\u064a\u0646","\u062b\u0644\u0627\u062b\u0627\u0621","\u0623\u0631\u0628\u0639\u0627\u0621","\u062e\u0645\u064a\u0633","\u062c\u0645\u0639\u0629","\u0633\u0628\u062a"],months:["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0625\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0629","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"],shortMonths:["1","2","3","4","5","6","7","8","9","10","11","12"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-ar.js b/dist/plotly-locale-ar.js
new file mode 100644
index 00000000000..5ff10426f8f
--- /dev/null
+++ b/dist/plotly-locale-ar.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"ar",dictionary:{},format:{days:["\u0627\u0644\u0623\u062d\u062f","\u0627\u0644\u0627\u062b\u0646\u064a\u0646","\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621","\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621","\u0627\u0644\u062e\u0645\u064a\u0633","\u0627\u0644\u062c\u0645\u0639\u0629","\u0627\u0644\u0633\u0628\u062a"],shortDays:["\u0627\u0644\u0623\u062d\u062f","\u0627\u0644\u0627\u062b\u0646\u064a\u0646","\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621","\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621","\u0627\u0644\u062e\u0645\u064a\u0633","\u0627\u0644\u062c\u0645\u0639\u0629","\u0627\u0644\u0633\u0628\u062a"],months:["\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a","\u0634\u0628\u0627\u0637","\u0622\u0630\u0627\u0631","\u0646\u064a\u0633\u0627\u0646","\u0622\u0630\u0627\u0631","\u062d\u0632\u064a\u0631\u0627\u0646","\u062a\u0645\u0648\u0632","\u0622\u0628","\u0623\u064a\u0644\u0648\u0644","\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644","\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a","\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"],shortMonths:["1","2","3","4","5","6","7","8","9","10","11","12"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-az.js b/dist/plotly-locale-az.js
new file mode 100644
index 00000000000..b404f009025
--- /dev/null
+++ b/dist/plotly-locale-az.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"az",dictionary:{},format:{days:["Bazar","Bazar ert\u0259si","\xc7\u0259r\u015f\u0259nb\u0259 ax\u015fam\u0131","\xc7\u0259r\u015f\u0259nb\u0259","C\xfcm\u0259 ax\u015fam\u0131","C\xfcm\u0259","\u015e\u0259nb\u0259"],shortDays:["B","Be","\xc7a","\xc7","Ca","C","\u015e"],months:["Yanvar","Fevral","Mart","Aprel","May","\u0130yun","\u0130yul","Avqust","Sentyabr","Oktyabr","Noyabr","Dekabr"],shortMonths:["Yan","Fev","Mar","Apr","May","\u0130yun","\u0130yul","Avq","Sen","Okt","Noy","Dek"],date:"%d.%m.%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-bg.js b/dist/plotly-locale-bg.js
new file mode 100644
index 00000000000..b9026b0bae8
--- /dev/null
+++ b/dist/plotly-locale-bg.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"bg",dictionary:{},format:{days:["\u041d\u0435\u0434\u0435\u043b\u044f","\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a","\u0412\u0442\u043e\u0440\u043d\u0438\u043a","\u0421\u0440\u044f\u0434\u0430","\u0427\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a","\u041f\u0435\u0442\u044a\u043a","\u0421\u044a\u0431\u043e\u0442\u0430"],shortDays:["\u041d\u0435\u0434","\u041f\u043e\u043d","\u0412\u0442\u043e","\u0421\u0440\u044f","\u0427\u0435\u0442","\u041f\u0435\u0442","\u0421\u044a\u0431"],months:["\u042f\u043d\u0443\u0430\u0440\u0438","\u0424\u0435\u0432\u0440\u0443\u0430\u0440\u0438","\u041c\u0430\u0440\u0442","\u0410\u043f\u0440\u0438\u043b","\u041c\u0430\u0439","\u042e\u043d\u0438","\u042e\u043b\u0438","\u0410\u0432\u0433\u0443\u0441\u0442","\u0421\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438","\u041e\u043a\u0442\u043e\u043c\u0432\u0440\u0438","\u041d\u043e\u0435\u043c\u0432\u0440\u0438","\u0414\u0435\u043a\u0435\u043c\u0432\u0440\u0438"],shortMonths:["\u042f\u043d\u0443","\u0424\u0435\u0432","\u041c\u0430\u0440","\u0410\u043f\u0440","\u041c\u0430\u0439","\u042e\u043d\u0438","\u042e\u043b\u0438","\u0410\u0432\u0433","\u0421\u0435\u043f","\u041e\u043a\u0442","\u041d\u043e\u0432","\u0414\u0435\u043a"],date:"%d.%m.%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-bs.js b/dist/plotly-locale-bs.js
new file mode 100644
index 00000000000..2264f8e9361
--- /dev/null
+++ b/dist/plotly-locale-bs.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"bs",dictionary:{},format:{days:["Nedelja","Ponedeljak","Utorak","Srijeda","\u010cetvrtak","Petak","Subota"],shortDays:["Ned","Pon","Uto","Sri","\u010cet","Pet","Sub"],months:["Januar","Februar","Mart","April","Maj","Juni","Juli","August","Septembar","Oktobar","Novembar","Decembar"],shortMonths:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],date:"%d.%m.%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-ca.js b/dist/plotly-locale-ca.js
new file mode 100644
index 00000000000..ab8cbc89845
--- /dev/null
+++ b/dist/plotly-locale-ca.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"ca",dictionary:{},format:{days:["Diumenge","Dilluns","Dimarts","Dimecres","Dijous","Divendres","Dissabte"],shortDays:["Dug","Dln","Dmt","Dmc","Djs","Dvn","Dsb"],months:["Gener","Febrer","Mar\xe7","Abril","Maig","Juny","Juliol","Agost","Setembre","Octubre","Novembre","Desembre"],shortMonths:["Gen","Feb","Mar","Abr","Mai","Jun","Jul","Ago","Set","Oct","Nov","Des"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-cs.js b/dist/plotly-locale-cs.js
new file mode 100644
index 00000000000..ab522dfc36b
--- /dev/null
+++ b/dist/plotly-locale-cs.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"cs",dictionary:{},format:{days:["ned\u011ble","pond\u011bl\xed","\xfater\xfd","st\u0159eda","\u010dtvrtek","p\xe1tek","sobota"],shortDays:["ne","po","\xfat","st","\u010dt","p\xe1","so"],months:["leden","\xfanor","b\u0159ezen","duben","kv\u011bten","\u010derven","\u010dervenec","srpen","z\xe1\u0159\xed","\u0159\xedjen","listopad","prosinec"],shortMonths:["led","\xfano","b\u0159e","dub","kv\u011b","\u010der","\u010dvc","srp","z\xe1\u0159","\u0159\xedj","lis","pro"],date:"%d.%m.%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-da.js b/dist/plotly-locale-da.js
new file mode 100644
index 00000000000..67332babb37
--- /dev/null
+++ b/dist/plotly-locale-da.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"da",dictionary:{},format:{days:["S\xf8ndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","L\xf8rdag"],shortDays:["S\xf8n","Man","Tir","Ons","Tor","Fre","L\xf8r"],months:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],shortMonths:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],date:"%d-%m-%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-de-ch.js b/dist/plotly-locale-de-ch.js
new file mode 100644
index 00000000000..f86362d3cb5
--- /dev/null
+++ b/dist/plotly-locale-de-ch.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"de-CH",dictionary:{},format:{days:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],shortDays:["So","Mo","Di","Mi","Do","Fr","Sa"],months:["Januar","Februar","M\xe4rz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],shortMonths:["Jan","Feb","M\xe4r","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],date:"%d.%m.%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-de.js b/dist/plotly-locale-de.js
new file mode 100644
index 00000000000..5f8e8407cbb
--- /dev/null
+++ b/dist/plotly-locale-de.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"de",dictionary:{},format:{days:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],shortDays:["So","Mo","Di","Mi","Do","Fr","Sa"],months:["Januar","Februar","M\xe4rz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],shortMonths:["Jan","Feb","M\xe4r","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],date:"%d.%m.%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-el.js b/dist/plotly-locale-el.js
new file mode 100644
index 00000000000..e8dd7130859
--- /dev/null
+++ b/dist/plotly-locale-el.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"el",dictionary:{},format:{days:["\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae","\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1","\u03a4\u03c1\u03af\u03c4\u03b7","\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7","\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7","\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae","\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf"],shortDays:["\u039a\u03c5\u03c1","\u0394\u03b5\u03c5","\u03a4\u03c1\u03b9","\u03a4\u03b5\u03c4","\u03a0\u03b5\u03bc","\u03a0\u03b1\u03c1","\u03a3\u03b1\u03b2"],months:["\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2","\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2","\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2","\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2","\u039c\u03ac\u03b9\u03bf\u03c2","\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2","\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2","\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2","\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2","\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2","\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2","\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2"],shortMonths:["\u0399\u03b1\u03bd","\u03a6\u03b5\u03b2","\u039c\u03b1\u03c1","\u0391\u03c0\u03c1","\u039c\u03b1\u03b9","\u0399\u03bf\u03c5\u03bd","\u0399\u03bf\u03c5\u03bb","\u0391\u03c5\u03b3","\u03a3\u03b5\u03c0","\u039f\u03ba\u03c4","\u039d\u03bf\u03b5","\u0394\u03b5\u03ba"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-en-us.js b/dist/plotly-locale-en-us.js
deleted file mode 100644
index b091f1616d2..00000000000
--- a/dist/plotly-locale-en-us.js
+++ /dev/null
@@ -1 +0,0 @@
-Plotly.register({moduleType:"locale",name:"en-US",dictionary:{"Click to enter Colorscale title":"Click to enter Colorscale title"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-en.js b/dist/plotly-locale-en.js
deleted file mode 100644
index 17c53abca69..00000000000
--- a/dist/plotly-locale-en.js
+++ /dev/null
@@ -1 +0,0 @@
-Plotly.register({moduleType:"locale",name:"en",dictionary:{"Click to enter Colorscale title":"Click to enter Colourscale title"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-eo.js b/dist/plotly-locale-eo.js
new file mode 100644
index 00000000000..362c571253e
--- /dev/null
+++ b/dist/plotly-locale-eo.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"eo",dictionary:{},format:{days:["Diman\u0109o","Lundo","Mardo","Merkredo","\u0134a\u016ddo","Vendredo","Sabato"],shortDays:["Dim","Lun","Mar","Mer","\u0134a\u016d","Ven","Sab"],months:["Januaro","Februaro","Marto","Aprilo","Majo","Junio","Julio","A\u016dgusto","Septembro","Oktobro","Novembro","Decembro"],shortMonths:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","A\u016dg","Sep","Okt","Nov","Dec"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-es-ar.js b/dist/plotly-locale-es-ar.js
new file mode 100644
index 00000000000..ab35da45e38
--- /dev/null
+++ b/dist/plotly-locale-es-ar.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"es-AR",dictionary:{},format:{days:["Domingo","Lunes","Martes","Mi\xe9rcoles","Jueves","Viernes","S\xe1bado"],shortDays:["Dom","Lun","Mar","Mi\xe9","Juv","Vie","S\xe1b"],months:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],shortMonths:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-es-pe.js b/dist/plotly-locale-es-pe.js
new file mode 100644
index 00000000000..ce1ddfa24b8
--- /dev/null
+++ b/dist/plotly-locale-es-pe.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"es-PE",dictionary:{},format:{days:["Domingo","Lunes","Martes","Mi\xe9rcoles","Jueves","Viernes","S\xe1bado"],shortDays:["Dom","Lun","Mar","Mi\xe9","Jue","Vie","Sab"],months:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],shortMonths:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-es.js b/dist/plotly-locale-es.js
new file mode 100644
index 00000000000..9b5a4ec9ac5
--- /dev/null
+++ b/dist/plotly-locale-es.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"es",dictionary:{},format:{days:["Domingo","Lunes","Martes","Mi\xe9rcoles","Jueves","Viernes","S\xe1bado"],shortDays:["Dom","Lun","Mar","Mi\xe9","Juv","Vie","S\xe1b"],months:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],shortMonths:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-et.js b/dist/plotly-locale-et.js
new file mode 100644
index 00000000000..851dfbba6f7
--- /dev/null
+++ b/dist/plotly-locale-et.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"et",dictionary:{},format:{days:["P\xfchap\xe4ev","Esmasp\xe4ev","Teisip\xe4ev","Kolmap\xe4ev","Neljap\xe4ev","Reede","Laup\xe4ev"],shortDays:["P\xfchap","Esmasp","Teisip","Kolmap","Neljap","Reede","Laup"],months:["Jaanuar","Veebruar","M\xe4rts","Aprill","Mai","Juuni","Juuli","August","September","Oktoober","November","Detsember"],shortMonths:["Jaan","Veebr","M\xe4rts","Apr","Mai","Juuni","Juuli","Aug","Sept","Okt","Nov","Dets"],date:"%d.%m.%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-eu.js b/dist/plotly-locale-eu.js
new file mode 100644
index 00000000000..ea1b639d133
--- /dev/null
+++ b/dist/plotly-locale-eu.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"eu",dictionary:{},format:{days:["Igandea","Astelehena","Asteartea","Asteazkena","Osteguna","Ostirala","Larunbata"],shortDays:["Iga","Ast","Ast","Ast","Ost","Ost","Lar"],months:["Urtarrila","Otsaila","Martxoa","Apirila","Maiatza","Ekaina","Uztaila","Abuztua","Iraila","Urria","Azaroa","Abendua"],shortMonths:["Urt","Ots","Mar","Api","Mai","Eka","Uzt","Abu","Ira","Urr","Aza","Abe"],date:"%Y/%m/%d"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-fa.js b/dist/plotly-locale-fa.js
new file mode 100644
index 00000000000..212eb36e273
--- /dev/null
+++ b/dist/plotly-locale-fa.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"fa",dictionary:{},format:{days:["\u064a\u06a9\u0634\u0646\u0628\u0647","\u062f\u0648\u0634\u0646\u0628\u0647","\u0633\u0647\u200c\u0634\u0646\u0628\u0647","\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647","\u067e\u0646\u062c\u0634\u0646\u0628\u0647","\u062c\u0645\u0639\u0647","\u0634\u0646\u0628\u0647"],shortDays:["\u064a","\u062f","\u0633","\u0686","\u067e","\u062c","\u0634"],months:["\u0641\u0631\u0648\u0631\u062f\u064a\u0646","\u0627\u0631\u062f\u064a\u0628\u0647\u0634\u062a","\u062e\u0631\u062f\u0627\u062f","\u062a\u064a\u0631","\u0645\u0631\u062f\u0627\u062f","\u0634\u0647\u0631\u064a\u0648\u0631","\u0645\u0647\u0631","\u0622\u0628\u0627\u0646","\u0622\u0630\u0631","\u062f\u064a","\u0628\u0647\u0645\u0646","\u0627\u0633\u0641\u0646\u062f"],shortMonths:["1","2","3","4","5","6","7","8","9","10","11","12"],date:"%Y/%m/%d"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-fi.js b/dist/plotly-locale-fi.js
new file mode 100644
index 00000000000..b7ce5419761
--- /dev/null
+++ b/dist/plotly-locale-fi.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"fi",dictionary:{},format:{days:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],shortDays:["Su","Ma","Ti","Ke","To","Pe","Su"],months:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kes\xe4kuu","Hein\xe4kuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],shortMonths:["Tammi","Helmi","Maalis","Huhti","Touko","Kes\xe4","Hein\xe4","Elo","Syys","Loka","Marras","Joulu"],date:"%d.%m.%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-fo.js b/dist/plotly-locale-fo.js
new file mode 100644
index 00000000000..428ee3ff9f3
--- /dev/null
+++ b/dist/plotly-locale-fo.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"fo",dictionary:{},format:{days:["Sunnudagur","M\xe1nadagur","T\xfdsdagur","Mikudagur","H\xf3sdagur","Fr\xedggjadagur","Leyardagur"],shortDays:["Sun","M\xe1n","T\xfds","Mik","H\xf3s","Fr\xed","Ley"],months:["Januar","Februar","Mars","Apr\xedl","Mei","Juni","Juli","August","September","Oktober","November","Desember"],shortMonths:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],date:"%d-%m-%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-fr-ch.js b/dist/plotly-locale-fr-ch.js
new file mode 100644
index 00000000000..e632be05124
--- /dev/null
+++ b/dist/plotly-locale-fr-ch.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"fr-CH",dictionary:{},format:{days:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],shortDays:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],months:["Janvier","F\xe9vrier","Mars","Avril","Mai","Juin","Juillet","Ao\xfbt","Septembre","Octobre","Novembre","D\xe9cembre"],shortMonths:["Jan","F\xe9v","Mar","Avr","Mai","Jun","Jul","Ao\xfb","Sep","Oct","Nov","D\xe9c"],date:"%d.%m.%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-fr.js b/dist/plotly-locale-fr.js
new file mode 100644
index 00000000000..8e61d3e89ff
--- /dev/null
+++ b/dist/plotly-locale-fr.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"fr",dictionary:{},format:{days:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],shortDays:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],months:["Janvier","F\xe9vrier","Mars","Avril","Mai","Juin","Juillet","Ao\xfbt","Septembre","Octobre","Novembre","D\xe9cembre"],shortMonths:["Jan","F\xe9v","Mar","Avr","Mai","Jun","Jul","Ao\xfb","Sep","Oct","Nov","D\xe9c"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-gl.js b/dist/plotly-locale-gl.js
new file mode 100644
index 00000000000..cd2c4a4fd06
--- /dev/null
+++ b/dist/plotly-locale-gl.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"gl",dictionary:{},format:{days:["Domingo","Luns","Martes","M\xe9rcores","Xoves","Venres","S\xe1bado"],shortDays:["Dom","Lun","Mar","M\xe9r","Xov","Ven","S\xe1b"],months:["Xaneiro","Febreiro","Marzo","Abril","Maio","Xu\xf1o","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],shortMonths:["Xan","Feb","Mar","Abr","Mai","Xu\xf1","Xul","Ago","Set","Out","Nov","Dec"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-gu.js b/dist/plotly-locale-gu.js
new file mode 100644
index 00000000000..ab48b700b75
--- /dev/null
+++ b/dist/plotly-locale-gu.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"gu",dictionary:{},format:{days:["\u0ab0\u0ab5\u0abf\u0ab5\u0abe\u0ab0","\u0ab8\u0acb\u0aae\u0ab5\u0abe\u0ab0","\u0aae\u0a82\u0a97\u0ab3\u0ab5\u0abe\u0ab0","\u0aac\u0ac1\u0aa7\u0ab5\u0abe\u0ab0","\u0a97\u0ac1\u0ab0\u0ac1\u0ab5\u0abe\u0ab0","\u0ab6\u0ac1\u0a95\u0acd\u0ab0\u0ab5\u0abe\u0ab0","\u0ab6\u0aa8\u0abf\u0ab5\u0abe\u0ab0"],shortDays:["\u0ab0\u0ab5\u0abf","\u0ab8\u0acb\u0aae","\u0aae\u0a82\u0a97\u0ab3","\u0aac\u0ac1\u0aa7","\u0a97\u0ac1\u0ab0\u0ac1","\u0ab6\u0ac1\u0a95\u0acd\u0ab0","\u0ab6\u0aa8\u0abf"],months:["\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1\u0a86\u0ab0\u0ac0","\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1\u0a86\u0ab0\u0ac0","\u0aae\u0abe\u0ab0\u0acd\u0a9a","\u0a8f\u0aaa\u0acd\u0ab0\u0abf\u0ab2","\u0aae\u0ac7","\u0a9c\u0ac2\u0aa8","\u0a9c\u0ac1\u0ab2\u0abe\u0a88","\u0a91\u0a97\u0ab8\u0acd\u0a9f","\u0ab8\u0aaa\u0acd\u0a9f\u0ac7\u0aae\u0acd\u0aac\u0ab0","\u0a91\u0a95\u0acd\u0a9f\u0acb\u0aac\u0ab0","\u0aa8\u0ab5\u0ac7\u0aae\u0acd\u0aac\u0ab0","\u0aa1\u0abf\u0ab8\u0ac7\u0aae\u0acd\u0aac\u0ab0"],shortMonths:["\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1","\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1","\u0aae\u0abe\u0ab0\u0acd\u0a9a","\u0a8f\u0aaa\u0acd\u0ab0\u0abf\u0ab2","\u0aae\u0ac7","\u0a9c\u0ac2\u0aa8","\u0a9c\u0ac1\u0ab2\u0abe\u0a88","\u0a91\u0a97\u0ab8\u0acd\u0a9f","\u0ab8\u0aaa\u0acd\u0a9f\u0ac7","\u0a91\u0a95\u0acd\u0a9f\u0acb","\u0aa8\u0ab5\u0ac7","\u0aa1\u0abf\u0ab8\u0ac7"],date:"%d-%b-%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-he.js b/dist/plotly-locale-he.js
new file mode 100644
index 00000000000..cfc4f88a9e5
--- /dev/null
+++ b/dist/plotly-locale-he.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"he",dictionary:{},format:{days:["\u05e8\u05d0\u05e9\u05d5\u05df","\u05e9\u05e0\u05d9","\u05e9\u05dc\u05d9\u05e9\u05d9","\u05e8\u05d1\u05d9\u05e2\u05d9","\u05d7\u05de\u05d9\u05e9\u05d9","\u05e9\u05d9\u05e9\u05d9","\u05e9\u05d1\u05ea"],shortDays:["\u05d0'","\u05d1'","\u05d2'","\u05d3'","\u05d4'","\u05d5'","\u05e9\u05d1\u05ea"],months:["\u05d9\u05e0\u05d5\u05d0\u05e8","\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8","\u05de\u05e8\u05e5","\u05d0\u05e4\u05e8\u05d9\u05dc","\u05de\u05d0\u05d9","\u05d9\u05d5\u05e0\u05d9","\u05d9\u05d5\u05dc\u05d9","\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8","\u05e1\u05e4\u05d8\u05de\u05d1\u05e8","\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8","\u05e0\u05d5\u05d1\u05de\u05d1\u05e8","\u05d3\u05e6\u05de\u05d1\u05e8"],shortMonths:["1","2","3","4","5","6","7","8","9","10","11","12"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-hi-in.js b/dist/plotly-locale-hi-in.js
new file mode 100644
index 00000000000..bd8b970cc53
--- /dev/null
+++ b/dist/plotly-locale-hi-in.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"hi-IN",dictionary:{},format:{days:["\u0930\u0935\u093f\u0935\u093e\u0930","\u0938\u094b\u092e\u0935\u093e\u0930","\u092e\u0902\u0917\u0932\u0935\u093e\u0930","\u092c\u0941\u0927\u0935\u093e\u0930","\u0917\u0941\u0930\u0941\u0935\u093e\u0930","\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930","\u0936\u0928\u093f\u0935\u093e\u0930"],shortDays:["\u0930\u0935\u093f","\u0938\u094b\u092e","\u092e\u0902\u0917\u0932","\u092c\u0941\u0927","\u0917\u0941\u0930\u0941","\u0936\u0941\u0915\u094d\u0930","\u0936\u0928\u093f"],months:["\u091c\u0928\u0935\u0930\u0940"," \u092b\u0930\u0935\u0930\u0940","\u092e\u093e\u0930\u094d\u091a","\u0905\u092a\u094d\u0930\u0948\u0932","\u092e\u0908","\u091c\u0942\u0928","\u091c\u0941\u0932\u093e\u0908","\u0905\u0917\u0938\u094d\u0924","\u0938\u093f\u0924\u092e\u094d\u092c\u0930","\u0905\u0915\u094d\u091f\u0942\u092c\u0930","\u0928\u0935\u092e\u094d\u092c\u0930","\u0926\u093f\u0938\u092e\u094d\u092c\u0930"],shortMonths:["\u091c\u0928","\u092b\u0930","\u092e\u093e\u0930\u094d\u091a","\u0905\u092a\u094d\u0930\u0948","\u092e\u0908","\u091c\u0942\u0928","\u091c\u0941\u0932\u093e\u0908","\u0905\u0917","\u0938\u093f\u0924","\u0905\u0915\u094d\u091f\u0942","\u0928\u0935","\u0926\u093f\u0938"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-hr.js b/dist/plotly-locale-hr.js
new file mode 100644
index 00000000000..9436c217fb6
--- /dev/null
+++ b/dist/plotly-locale-hr.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"hr",dictionary:{},format:{days:["Nedjelja","Ponedjeljak","Utorak","Srijeda","\u010cetvrtak","Petak","Subota"],shortDays:["Ned","Pon","Uto","Sri","\u010cet","Pet","Sub"],months:["Sije\u010danj","Velja\u010da","O\u017eujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],shortMonths:["Sij","Velj","O\u017eu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],date:"%d.%m.%Y."}});
\ No newline at end of file
diff --git a/dist/plotly-locale-hu.js b/dist/plotly-locale-hu.js
new file mode 100644
index 00000000000..3fdb74f5f4f
--- /dev/null
+++ b/dist/plotly-locale-hu.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"hu",dictionary:{},format:{days:["Vas\xe1rnap","H\xe9tf\xf6","Kedd","Szerda","Cs\xfct\xf6rt\xf6k","P\xe9ntek","Szombat"],shortDays:["Vas","H\xe9t","Ked","Sze","Cs\xfc","P\xe9n","Szo"],months:["Janu\xe1r","Febru\xe1r","M\xe1rcius","\xc1prilis","M\xe1jus","J\xfanius","J\xfalius","Augusztus","Szeptember","Okt\xf3ber","November","December"],shortMonths:["Jan","Feb","M\xe1r","\xc1pr","M\xe1j","J\xfan","J\xfal","Aug","Szep","Okt","Nov","Dec"],date:"%Y-%m-%d"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-hy.js b/dist/plotly-locale-hy.js
new file mode 100644
index 00000000000..da43bb6705b
--- /dev/null
+++ b/dist/plotly-locale-hy.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"hy",dictionary:{},format:{days:["\u056f\u056b\u0580\u0561\u056f\u056b","\u0565\u056f\u0578\u0582\u0577\u0561\u0562\u0569\u056b","\u0565\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b","\u0579\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b","\u0570\u056b\u0576\u0563\u0577\u0561\u0562\u0569\u056b","\u0578\u0582\u0580\u0562\u0561\u0569","\u0577\u0561\u0562\u0561\u0569"],shortDays:["\u056f\u056b\u0580","\u0565\u0580\u056f","\u0565\u0580\u0584","\u0579\u0580\u0584","\u0570\u0576\u0563","\u0578\u0582\u0580\u0562","\u0577\u0562\u0569"],months:["\u0540\u0578\u0582\u0576\u057e\u0561\u0580","\u0553\u0565\u057f\u0580\u057e\u0561\u0580","\u0544\u0561\u0580\u057f","\u0531\u057a\u0580\u056b\u056c","\u0544\u0561\u0575\u056b\u057d","\u0540\u0578\u0582\u0576\u056b\u057d","\u0540\u0578\u0582\u056c\u056b\u057d","\u0555\u0563\u0578\u057d\u057f\u0578\u057d","\u054d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580","\u0540\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580","\u0546\u0578\u0575\u0565\u0574\u0562\u0565\u0580","\u0534\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580"],shortMonths:["\u0540\u0578\u0582\u0576\u057e","\u0553\u0565\u057f\u0580","\u0544\u0561\u0580\u057f","\u0531\u057a\u0580","\u0544\u0561\u0575\u056b\u057d","\u0540\u0578\u0582\u0576\u056b\u057d","\u0540\u0578\u0582\u056c","\u0555\u0563\u057d","\u054d\u0565\u057a","\u0540\u0578\u056f","\u0546\u0578\u0575","\u0534\u0565\u056f"],date:"%d.%m.%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-id.js b/dist/plotly-locale-id.js
new file mode 100644
index 00000000000..7c11ec5ecce
--- /dev/null
+++ b/dist/plotly-locale-id.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"id",dictionary:{},format:{days:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],shortDays:["Min","Sen","Sel","Rab","kam","Jum","Sab"],months:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember"],shortMonths:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agus","Sep","Okt","Nop","Des"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-is.js b/dist/plotly-locale-is.js
new file mode 100644
index 00000000000..c9695f3e4cb
--- /dev/null
+++ b/dist/plotly-locale-is.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"is",dictionary:{},format:{days:["Sunnudagur","M\xe1nudagur","\xderi\xf0judagur","Mi\xf0vikudagur","Fimmtudagur","F\xf6studagur","Laugardagur"],shortDays:["Sun","M\xe1n","\xderi","Mi\xf0","Fim","F\xf6s","Lau"],months:["Jan\xfaar","Febr\xfaar","Mars","Apr\xedl","Ma\xed","J\xfan\xed","J\xfal\xed","\xc1g\xfast","September","Okt\xf3ber","N\xf3vember","Desember"],shortMonths:["Jan","Feb","Mar","Apr","Ma\xed","J\xfan","J\xfal","\xc1g\xfa","Sep","Okt","N\xf3v","Des"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-it.js b/dist/plotly-locale-it.js
new file mode 100644
index 00000000000..0e19a40655f
--- /dev/null
+++ b/dist/plotly-locale-it.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"it",dictionary:{},format:{days:["Domenica","Luned\xec","Marted\xec","Mercoled\xec","Gioved\xec","Venerd\xec","Sabato"],shortDays:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],months:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],shortMonths:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-ja.js b/dist/plotly-locale-ja.js
new file mode 100644
index 00000000000..f2b943baf57
--- /dev/null
+++ b/dist/plotly-locale-ja.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"ja",dictionary:{},format:{days:["\u65e5\u66dc\u65e5","\u6708\u66dc\u65e5","\u706b\u66dc\u65e5","\u6c34\u66dc\u65e5","\u6728\u66dc\u65e5","\u91d1\u66dc\u65e5","\u571f\u66dc\u65e5"],shortDays:["\u65e5","\u6708","\u706b","\u6c34","\u6728","\u91d1","\u571f"],months:["1\u6708","2\u6708","3\u6708","4\u6708","5\u6708","6\u6708","7\u6708","8\u6708","9\u6708","10\u6708","11\u6708","12\u6708"],shortMonths:["1\u6708","2\u6708","3\u6708","4\u6708","5\u6708","6\u6708","7\u6708","8\u6708","9\u6708","10\u6708","11\u6708","12\u6708"],date:"%Y/%m/%d"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-ka.js b/dist/plotly-locale-ka.js
new file mode 100644
index 00000000000..69af4229053
--- /dev/null
+++ b/dist/plotly-locale-ka.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"ka",dictionary:{},format:{days:["\u10d9\u10d5\u10d8\u10e0\u10d0","\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8","\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8","\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8","\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8","\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10d8","\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8"],shortDays:["\u10d9\u10d5","\u10dd\u10e0\u10e8","\u10e1\u10d0\u10db","\u10dd\u10d7\u10ee","\u10ee\u10e3\u10d7","\u10de\u10d0\u10e0","\u10e8\u10d0\u10d1"],months:["\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10d8","\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10d8","\u10db\u10d0\u10e0\u10e2\u10d8","\u10d0\u10de\u10e0\u10d8\u10da\u10d8","\u10db\u10d0\u10d8\u10e1\u10d8","\u10d8\u10d5\u10dc\u10d8\u10e1\u10d8","\u10d8\u10d5\u10da\u10d8\u10e1\u10d8","\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10dd","\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10d8","\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10d8","\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10d8","\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10d8"],shortMonths:["\u10d8\u10d0\u10dc","\u10d7\u10d4\u10d1","\u10db\u10d0\u10e0","\u10d0\u10de\u10e0","\u10db\u10d0\u10d8\u10e1\u10d8","\u10d8\u10d5\u10dc","\u10d8\u10d5\u10da","\u10d0\u10d2\u10d5","\u10e1\u10d4\u10e5","\u10dd\u10e5\u10e2","\u10dc\u10dd\u10d4","\u10d3\u10d4\u10d9"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-km.js b/dist/plotly-locale-km.js
new file mode 100644
index 00000000000..9f65ead1271
--- /dev/null
+++ b/dist/plotly-locale-km.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"km",dictionary:{},format:{days:["\u1790\u17d2\u1784\u17c3\u200b\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799","\u1790\u17d2\u1784\u17c3\u200b\u1785\u1793\u17d2\u1791","\u1790\u17d2\u1784\u17c3\u200b\u17a2\u1784\u17d2\u1782\u17b6\u179a","\u1790\u17d2\u1784\u17c3\u200b\u1796\u17bb\u1792","\u1790\u17d2\u1784\u17c3\u200b\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17d2\u178f\u17b7\u17cd","\u1790\u17d2\u1784\u17c3\u200b\u179f\u17bb\u1780\u17d2\u179a","\u1790\u17d2\u1784\u17c3\u200b\u179f\u17c5\u179a\u17cd"],shortDays:["\u17a2\u17b6","\u1785\u1793\u17d2\u1791","\u17a2\u1784\u17d2\u1782","\u1796\u17bb\u1792","\u1796\u17d2\u179a\u17a0","\u179f\u17bb","\u179f\u17c5\u179a\u17cd"],months:["\u1781\u17c2\u200b\u1798\u1780\u179a\u17b6","\u1781\u17c2\u200b\u1780\u17bb\u1798\u17d2\u1797\u17c8","\u1781\u17c2\u200b\u1798\u17b7\u1793\u17b6","\u1781\u17c2\u200b\u1798\u17c1\u179f\u17b6","\u1781\u17c2\u200b\u17a7\u179f\u1797\u17b6","\u1781\u17c2\u200b\u1798\u17b7\u1790\u17bb\u1793\u17b6","\u1781\u17c2\u200b\u1780\u1780\u17d2\u1780\u178a\u17b6","\u1781\u17c2\u200b\u179f\u17b8\u17a0\u17b6","\u1781\u17c2\u200b\u1780\u1789\u17d2\u1789\u17b6","\u1781\u17c2\u200b\u178f\u17bb\u179b\u17b6","\u1781\u17c2\u200b\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6","\u1781\u17c2\u200b\u1792\u17d2\u1793\u17bc"],shortMonths:["\u1798\u1780","\u1780\u17bb","\u1798\u17b7\u1793\u17b6","\u1798\u17c1","\u17a7\u179f","\u1798\u17b7\u1790\u17bb","\u1780\u1780\u17d2\u1780","\u179f\u17b8","\u1780\u1789\u17d2\u1789\u17b6","\u178f\u17bb\u179b\u17b6","\u179c\u17b7\u1785\u17d2\u1786\u17b7","\u1792\u17d2\u1793\u17bc"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-ko.js b/dist/plotly-locale-ko.js
new file mode 100644
index 00000000000..30fa2dc3c4f
--- /dev/null
+++ b/dist/plotly-locale-ko.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"ko",dictionary:{},format:{days:["\uc77c\uc694\uc77c","\uc6d4\uc694\uc77c","\ud654\uc694\uc77c","\uc218\uc694\uc77c","\ubaa9\uc694\uc77c","\uae08\uc694\uc77c","\ud1a0\uc694\uc77c"],shortDays:["\uc77c","\uc6d4","\ud654","\uc218","\ubaa9","\uae08","\ud1a0"],months:["1\uc6d4","2\uc6d4","3\uc6d4","4\uc6d4","5\uc6d4","6\uc6d4","7\uc6d4","8\uc6d4","9\uc6d4","10\uc6d4","11\uc6d4","12\uc6d4"],shortMonths:["1\uc6d4","2\uc6d4","3\uc6d4","4\uc6d4","5\uc6d4","6\uc6d4","7\uc6d4","8\uc6d4","9\uc6d4","10\uc6d4","11\uc6d4","12\uc6d4"],date:"%Y-%m-%d"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-lt.js b/dist/plotly-locale-lt.js
new file mode 100644
index 00000000000..6da061bc16f
--- /dev/null
+++ b/dist/plotly-locale-lt.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"lt",dictionary:{},format:{days:["sekmadienis","pirmadienis","antradienis","tre\u010diadienis","ketvirtadienis","penktadienis","\u0161e\u0161tadienis"],shortDays:["sek","pir","ant","tre","ket","pen","\u0161e\u0161"],months:["Sausis","Vasaris","Kovas","Balandis","Gegu\u017e\u0117","Bir\u017eelis","Liepa","Rugpj\u016btis","Rugs\u0117jis","Spalis","Lapkritis","Gruodis"],shortMonths:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],date:"%Y-%m-%d"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-lv.js b/dist/plotly-locale-lv.js
new file mode 100644
index 00000000000..ade0fdfb41b
--- /dev/null
+++ b/dist/plotly-locale-lv.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"lv",dictionary:{},format:{days:["sv\u0113tdiena","pirmdiena","otrdiena","tre\u0161diena","ceturtdiena","piektdiena","sestdiena"],shortDays:["svt","prm","otr","tre","ctr","pkt","sst"],months:["Janv\u0101ris","Febru\u0101ris","Marts","Apr\u012blis","Maijs","J\u016bnijs","J\u016blijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],shortMonths:["Jan","Feb","Mar","Apr","Mai","J\u016bn","J\u016bl","Aug","Sep","Okt","Nov","Dec"],date:"%d-%m-%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-me-me.js b/dist/plotly-locale-me-me.js
new file mode 100644
index 00000000000..53e3348d5ba
--- /dev/null
+++ b/dist/plotly-locale-me-me.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"me-ME",dictionary:{},format:{days:["Ne\u0111elja","Pone\u0111eljak","Utorak","Srijeda","\u010cetvrtak","Petak","Subota"],shortDays:["Ne\u0111","Pon","Uto","Sri","\u010cet","Pet","Sub"],months:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"],shortMonths:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-me.js b/dist/plotly-locale-me.js
new file mode 100644
index 00000000000..7665823348c
--- /dev/null
+++ b/dist/plotly-locale-me.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"me",dictionary:{},format:{days:["\u041d\u0435\u0452\u0435\u0459\u0430","\u041f\u043e\u043d\u0435\u0452\u0435\u0459\u0430\u043a","\u0423\u0442\u043e\u0440\u0430\u043a","\u0421\u0440\u0438\u0458\u0435\u0434\u0430","\u0427\u0435\u0442\u0432\u0440\u0442\u0430\u043a","\u041f\u0435\u0442\u0430\u043a","\u0421\u0443\u0431\u043e\u0442\u0430"],shortDays:["\u041d\u0435\u0452","\u041f\u043e\u043d","\u0423\u0442\u043e","\u0421\u0440\u0438","\u0427\u0435\u0442","\u041f\u0435\u0442","\u0421\u0443\u0431"],months:["\u0408\u0430\u043d\u0443\u0430\u0440","\u0424\u0435\u0431\u0440\u0443\u0430\u0440","\u041c\u0430\u0440\u0442","\u0410\u043f\u0440\u0438\u043b","\u041c\u0430\u0458","\u0408\u0443\u043d","\u0408\u0443\u043b","\u0410\u0432\u0433\u0443\u0441\u0442","\u0421\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440","\u041e\u043a\u0442\u043e\u0431\u0430\u0440","\u041d\u043e\u0432\u0435\u043c\u0431\u0430\u0440","\u0414\u0435\u0446\u0435\u043c\u0431\u0430\u0440"],shortMonths:["\u0408\u0430\u043d","\u0424\u0435\u0431","\u041c\u0430\u0440","\u0410\u043f\u0440","\u041c\u0430\u0458","\u0408\u0443\u043d","\u0408\u0443\u043b","\u0410\u0432\u0433","\u0421\u0435\u043f","\u041e\u043a\u0442","\u041d\u043e\u0432","\u0414\u0435\u0446"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-mk.js b/dist/plotly-locale-mk.js
new file mode 100644
index 00000000000..1d59e58207c
--- /dev/null
+++ b/dist/plotly-locale-mk.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"mk",dictionary:{},format:{days:["\u041d\u0435\u0434\u0435\u043b\u0430","\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a","\u0412\u0442\u043e\u0440\u043d\u0438\u043a","\u0421\u0440\u0435\u0434\u0430","\u0427\u0435\u0442\u0432\u0440\u0442\u043e\u043a","\u041f\u0435\u0442\u043e\u043a","\u0421\u0430\u0431\u043e\u0442\u0430"],shortDays:["\u041d\u0435\u0434","\u041f\u043e\u043d","\u0412\u0442\u043e","\u0421\u0440\u0435","\u0427\u0435\u0442","\u041f\u0435\u0442","\u0421\u0430\u0431"],months:["\u0408\u0430\u043d\u0443\u0430\u0440\u0438","\u0424\u0435\u0432\u0440\u0443\u0430\u0440\u0438","\u041c\u0430\u0440\u0442","\u0410\u043f\u0440\u0438\u043b","\u041c\u0430\u0458","\u0408\u0443\u043d\u0438","\u0408\u0443\u043b\u0438","\u0410\u0432\u0433\u0443\u0441\u0442","\u0421\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438","\u041e\u043a\u0442\u043e\u043c\u0432\u0440\u0438","\u041d\u043e\u0435\u043c\u0432\u0440\u0438","\u0414\u0435\u043a\u0435\u043c\u0432\u0440\u0438"],shortMonths:["\u0408\u0430\u043d","\u0424\u0435\u0432","\u041c\u0430\u0440","\u0410\u043f\u0440","\u041c\u0430\u0458","\u0408\u0443\u043d","\u0408\u0443\u043b","\u0410\u0432\u0433","\u0421\u0435\u043f","\u041e\u043a\u0442","\u041d\u043e\u0432","\u0414\u0435\u043a"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-ml.js b/dist/plotly-locale-ml.js
new file mode 100644
index 00000000000..603c6622f25
--- /dev/null
+++ b/dist/plotly-locale-ml.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"ml",dictionary:{},format:{days:["\u0d1e\u0d3e\u0d2f\u0d30\u0d4d\u200d","\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d33\u0d4d\u200d","\u0d1a\u0d4a\u0d35\u0d4d\u0d35","\u0d2c\u0d41\u0d27\u0d28\u0d4d\u200d","\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d02","\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f","\u0d36\u0d28\u0d3f"],shortDays:["\u0d1e\u0d3e\u0d2f","\u0d24\u0d3f\u0d19\u0d4d\u0d15","\u0d1a\u0d4a\u0d35\u0d4d\u0d35","\u0d2c\u0d41\u0d27","\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d02","\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f","\u0d36\u0d28\u0d3f"],months:["\u0d1c\u0d28\u0d41\u0d35\u0d30\u0d3f","\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41\u0d35\u0d30\u0d3f","\u0d2e\u0d3e\u0d30\u0d4d\u200d\u0d1a\u0d4d\u0d1a\u0d4d","\u0d0f\u0d2a\u0d4d\u0d30\u0d3f\u0d32\u0d4d\u200d","\u0d2e\u0d47\u0d2f\u0d4d","\u0d1c\u0d42\u0d23\u0d4d\u200d","\u0d1c\u0d42\u0d32\u0d48","\u0d06\u0d17\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4d","\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d02\u0d2c\u0d30\u0d4d\u200d","\u0d12\u0d15\u0d4d\u0d1f\u0d4b\u0d2c\u0d30\u0d4d\u200d","\u0d28\u0d35\u0d02\u0d2c\u0d30\u0d4d\u200d","\u0d21\u0d3f\u0d38\u0d02\u0d2c\u0d30\u0d4d\u200d"],shortMonths:["\u0d1c\u0d28\u0d41","\u0d2b\u0d46\u0d2c\u0d4d","\u0d2e\u0d3e\u0d30\u0d4d\u200d","\u0d0f\u0d2a\u0d4d\u0d30\u0d3f","\u0d2e\u0d47\u0d2f\u0d4d","\u0d1c\u0d42\u0d23\u0d4d\u200d","\u0d1c\u0d42\u0d32\u0d3e","\u0d06\u0d17","\u0d38\u0d46\u0d2a\u0d4d","\u0d12\u0d15\u0d4d\u0d1f\u0d4b","\u0d28\u0d35\u0d02","\u0d21\u0d3f\u0d38"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-ms.js b/dist/plotly-locale-ms.js
new file mode 100644
index 00000000000..193e23d990e
--- /dev/null
+++ b/dist/plotly-locale-ms.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"ms",dictionary:{},format:{days:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],shortDays:["Aha","Isn","Sel","Rab","Kha","Jum","Sab"],months:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],shortMonths:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-mt.js b/dist/plotly-locale-mt.js
new file mode 100644
index 00000000000..8d6d075280d
--- /dev/null
+++ b/dist/plotly-locale-mt.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"mt",dictionary:{},format:{days:["Il-\u0126add","It-Tnejn","It-Tlieta","L-Erbg\u0127a","Il-\u0126amis","Il-\u0120img\u0127a","Is-Sibt"],shortDays:["\u0126ad","Tne","Tli","Erb","\u0126am","\u0120im","Sib"],months:["Jannar","Frar","Marzu","April","Mejju","\u0120unju","Lulju","Awissu","Settembru","Ottubru","Novembru","Di\u010bembru"],shortMonths:["Jan","Fra","Mar","Apr","Mej","\u0120un","Lul","Awi","Set","Ott","Nov","Di\u010b"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-nl-be.js b/dist/plotly-locale-nl-be.js
new file mode 100644
index 00000000000..f5de7d18b19
--- /dev/null
+++ b/dist/plotly-locale-nl-be.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"nl-BE",dictionary:{},format:{days:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],shortDays:["zon","maa","din","woe","don","vri","zat"],months:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],shortMonths:["jan","feb","maa","apr","mei","jun","jul","aug","sep","okt","nov","dec"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-nl.js b/dist/plotly-locale-nl.js
new file mode 100644
index 00000000000..a60155fa16c
--- /dev/null
+++ b/dist/plotly-locale-nl.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"nl",dictionary:{},format:{days:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],shortDays:["zon","maa","din","woe","don","vri","zat"],months:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],shortMonths:["jan","feb","maa","apr","mei","jun","jul","aug","sep","okt","nov","dec"],date:"%d-%m-%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-no.js b/dist/plotly-locale-no.js
new file mode 100644
index 00000000000..7d221b5c99a
--- /dev/null
+++ b/dist/plotly-locale-no.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"no",dictionary:{},format:{days:["S\xf8ndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","L\xf8rdag"],shortDays:["S\xf8n","Man","Tir","Ons","Tor","Fre","L\xf8r"],months:["Januar","Februar","Mars","April","Mai","Juni","Juli","August","September","Oktober","November","Desember"],shortMonths:["Jan","Feb","Mar","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Des"],date:"%d.%m.%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-pa.js b/dist/plotly-locale-pa.js
new file mode 100644
index 00000000000..37b86bad56b
--- /dev/null
+++ b/dist/plotly-locale-pa.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"pa",dictionary:{},format:{days:["\u0a10\u0a24\u0a35\u0a3e\u0a30","\u0a38\u0a4b\u0a2e\u0a35\u0a3e\u0a30","\u0a2e\u0a70\u0a17\u0a32\u0a35\u0a3e\u0a30","\u0a2c\u0a41\u0a71\u0a27\u0a35\u0a3e\u0a30","\u0a35\u0a40\u0a30\u0a35\u0a3e\u0a30","\u0a38\u0a3c\u0a41\u0a71\u0a15\u0a30\u0a35\u0a3e\u0a30","\u0a38\u0a3c\u0a28\u0a3f\u0a71\u0a1a\u0a30\u0a35\u0a3e\u0a30"],shortDays:["\u0a10\u0a24","\u0a38\u0a4b\u0a2e","\u0a2e\u0a70\u0a17\u0a32","\u0a2c\u0a41\u0a71\u0a27","\u0a35\u0a40\u0a30","\u0a38\u0a3c\u0a41\u0a71\u0a15\u0a30","\u0a38\u0a3c\u0a28\u0a3f\u0a71\u0a1a\u0a30"],months:["\u0a1c\u0a28\u0a35\u0a30\u0a40","\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40","\u0a2e\u0a3e\u0a30\u0a1a","\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32","\u0a2e\u0a08","\u0a1c\u0a42\u0a28","\u0a1c\u0a41\u0a32\u0a3e\u0a08","\u0a05\u0a17\u0a38\u0a24","\u0a38\u0a24\u0a70\u0a2c\u0a30","\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30","\u0a28\u0a35\u0a70\u0a2c\u0a30","\u0a26\u0a38\u0a70\u0a2c\u0a30"],shortMonths:["\u0a1c\u0a28","\u0a2b\u0a3c\u0a30","\u0a2e\u0a3e\u0a30","\u0a05\u0a2a\u0a4d\u0a30\u0a48","\u0a2e\u0a08","\u0a1c\u0a42\u0a28","\u0a1c\u0a41\u0a32\u0a3e","\u0a05\u0a17","\u0a38\u0a24\u0a70","\u0a05\u0a15","\u0a28\u0a35\u0a70","\u0a26\u0a38\u0a70"],date:"%d-%m-%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-pl.js b/dist/plotly-locale-pl.js
new file mode 100644
index 00000000000..8776d0b29b1
--- /dev/null
+++ b/dist/plotly-locale-pl.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"pl",dictionary:{},format:{days:["Niedziela","Poniedzialek","Wtorek","\u015aroda","Czwartek","Pi\u0105tek","Sobota"],shortDays:["Nie","Pn","Wt","\u015ar","Czw","Pt","So"],months:["Stycze\u0144","Luty","Marzec","Kwiecie\u0144","Maj","Czerwiec","Lipiec","Sierpie\u0144","Wrzesie\u0144","Pa\u017adziernik","Listopad","Grudzie\u0144"],shortMonths:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],date:"%Y-%m-%d"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-pt-br.js b/dist/plotly-locale-pt-br.js
new file mode 100644
index 00000000000..b2e911bdcd7
--- /dev/null
+++ b/dist/plotly-locale-pt-br.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"pt-BR",dictionary:{},format:{days:["Domingo","Segunda-feira","Ter\xe7a-feira","Quarta-feira","Quinta-feira","Sexta-feira","S\xe1bado"],shortDays:["Dom","Seg","Ter","Qua","Qui","Sex","S\xe1b"],months:["Janeiro","Fevereiro","Mar\xe7o","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],shortMonths:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-rm.js b/dist/plotly-locale-rm.js
new file mode 100644
index 00000000000..a9a34ac2c4b
--- /dev/null
+++ b/dist/plotly-locale-rm.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"rm",dictionary:{},format:{days:["Dumengia","Glindesdi","Mardi","Mesemna","Gievgia","Venderdi","Sonda"],shortDays:["Dum","Gli","Mar","Mes","Gie","Ven","Som"],months:["Schaner","Favrer","Mars","Avrigl","Matg","Zercladur","Fanadur","Avust","Settember","October","November","December"],shortMonths:["Scha","Fev","Mar","Avr","Matg","Zer","Fan","Avu","Sett","Oct","Nov","Dec"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-ro.js b/dist/plotly-locale-ro.js
new file mode 100644
index 00000000000..d1baf09d703
--- /dev/null
+++ b/dist/plotly-locale-ro.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"ro",dictionary:{},format:{days:["Duminic\u0103","Luni","Marti","Miercuri","Joi","Vineri","S\xe2mb\u0103t\u0103"],shortDays:["Dum","Lun","Mar","Mie","Joi","Vin","S\xe2m"],months:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],shortMonths:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Noi","Dec"],date:"%d.%m.%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-ru.js b/dist/plotly-locale-ru.js
new file mode 100644
index 00000000000..58deaa96a2e
--- /dev/null
+++ b/dist/plotly-locale-ru.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"ru",dictionary:{},format:{days:["\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435","\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a","\u0432\u0442\u043e\u0440\u043d\u0438\u043a","\u0441\u0440\u0435\u0434\u0430","\u0447\u0435\u0442\u0432\u0435\u0440\u0433","\u043f\u044f\u0442\u043d\u0438\u0446\u0430","\u0441\u0443\u0431\u0431\u043e\u0442\u0430"],shortDays:["\u0432\u0441\u043a","\u043f\u043d\u0434","\u0432\u0442\u0440","\u0441\u0440\u0434","\u0447\u0442\u0432","\u043f\u0442\u043d","\u0441\u0431\u0442"],months:["\u042f\u043d\u0432\u0430\u0440\u044c","\u0424\u0435\u0432\u0440\u0430\u043b\u044c","\u041c\u0430\u0440\u0442","\u0410\u043f\u0440\u0435\u043b\u044c","\u041c\u0430\u0439","\u0418\u044e\u043d\u044c","\u0418\u044e\u043b\u044c","\u0410\u0432\u0433\u0443\u0441\u0442","\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c","\u041e\u043a\u0442\u044f\u0431\u0440\u044c","\u041d\u043e\u044f\u0431\u0440\u044c","\u0414\u0435\u043a\u0430\u0431\u0440\u044c"],shortMonths:["\u042f\u043d\u0432","\u0424\u0435\u0432","\u041c\u0430\u0440","\u0410\u043f\u0440","\u041c\u0430\u0439","\u0418\u044e\u043d","\u0418\u044e\u043b","\u0410\u0432\u0433","\u0421\u0435\u043d","\u041e\u043a\u0442","\u041d\u043e\u044f","\u0414\u0435\u043a"],date:"%d.%m.%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-sk.js b/dist/plotly-locale-sk.js
new file mode 100644
index 00000000000..5d7d3880a5d
--- /dev/null
+++ b/dist/plotly-locale-sk.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"sk",dictionary:{},format:{days:["Nedel'a","Pondelok","Utorok","Streda","\u0160tvrtok","Piatok","Sobota"],shortDays:["Ned","Pon","Uto","Str","\u0160tv","Pia","Sob"],months:["Janu\xe1r","Febru\xe1r","Marec","Apr\xedl","M\xe1j","J\xfan","J\xfal","August","September","Okt\xf3ber","November","December"],shortMonths:["Jan","Feb","Mar","Apr","M\xe1j","J\xfan","J\xfal","Aug","Sep","Okt","Nov","Dec"],date:"%d.%m.%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-sl.js b/dist/plotly-locale-sl.js
new file mode 100644
index 00000000000..2653a4fee41
--- /dev/null
+++ b/dist/plotly-locale-sl.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"sl",dictionary:{},format:{days:["Nedelja","Ponedeljek","Torek","Sreda","\u010cetrtek","Petek","Sobota"],shortDays:["Ned","Pon","Tor","Sre","\u010cet","Pet","Sob"],months:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],shortMonths:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],date:"%d.%m.%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-sq.js b/dist/plotly-locale-sq.js
new file mode 100644
index 00000000000..fb947ec9b8f
--- /dev/null
+++ b/dist/plotly-locale-sq.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"sq",dictionary:{},format:{days:["E Diel","E H\xebn\xeb","E Mart\xeb","E M\xebrkur\xeb","E Enjte","E Premte","E Shtune"],shortDays:["Di","H\xeb","Ma","M\xeb","En","Pr","Sh"],months:["Janar","Shkurt","Mars","Prill","Maj","Qershor","Korrik","Gusht","Shtator","Tetor","N\xebntor","Dhjetor"],shortMonths:["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gus","Sht","Tet","N\xebn","Dhj"],date:"%d.%m.%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-sr-sr.js b/dist/plotly-locale-sr-sr.js
new file mode 100644
index 00000000000..b2b2d231b13
--- /dev/null
+++ b/dist/plotly-locale-sr-sr.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"sr-SR",dictionary:{},format:{days:["Nedelja","Ponedeljak","Utorak","Sreda","\u010cetvrtak","Petak","Subota"],shortDays:["Ned","Pon","Uto","Sre","\u010cet","Pet","Sub"],months:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"],shortMonths:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-sr.js b/dist/plotly-locale-sr.js
new file mode 100644
index 00000000000..5d3f2c08c6f
--- /dev/null
+++ b/dist/plotly-locale-sr.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"sr",dictionary:{},format:{days:["\u041d\u0435\u0434\u0435\u0459\u0430","\u041f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a","\u0423\u0442\u043e\u0440\u0430\u043a","\u0421\u0440\u0435\u0434\u0430","\u0427\u0435\u0442\u0432\u0440\u0442\u0430\u043a","\u041f\u0435\u0442\u0430\u043a","\u0421\u0443\u0431\u043e\u0442\u0430"],shortDays:["\u041d\u0435\u0434","\u041f\u043e\u043d","\u0423\u0442\u043e","\u0421\u0440\u0435","\u0427\u0435\u0442","\u041f\u0435\u0442","\u0421\u0443\u0431"],months:["\u0408\u0430\u043d\u0443\u0430\u0440","\u0424\u0435\u0431\u0440\u0443\u0430\u0440","\u041c\u0430\u0440\u0442","\u0410\u043f\u0440\u0438\u043b","\u041c\u0430\u0458","\u0408\u0443\u043d","\u0408\u0443\u043b","\u0410\u0432\u0433\u0443\u0441\u0442","\u0421\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440","\u041e\u043a\u0442\u043e\u0431\u0430\u0440","\u041d\u043e\u0432\u0435\u043c\u0431\u0430\u0440","\u0414\u0435\u0446\u0435\u043c\u0431\u0430\u0440"],shortMonths:["\u0408\u0430\u043d","\u0424\u0435\u0431","\u041c\u0430\u0440","\u0410\u043f\u0440","\u041c\u0430\u0458","\u0408\u0443\u043d","\u0408\u0443\u043b","\u0410\u0432\u0433","\u0421\u0435\u043f","\u041e\u043a\u0442","\u041d\u043e\u0432","\u0414\u0435\u0446"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-sv.js b/dist/plotly-locale-sv.js
new file mode 100644
index 00000000000..ccef6dfc47f
--- /dev/null
+++ b/dist/plotly-locale-sv.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"sv",dictionary:{},format:{days:["S\xf6ndag","M\xe5ndag","Tisdag","Onsdag","Torsdag","Fredag","L\xf6rdag"],shortDays:["S\xf6n","M\xe5n","Tis","Ons","Tor","Fre","L\xf6r"],months:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],shortMonths:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],date:"%Y-%m-%d"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-ta.js b/dist/plotly-locale-ta.js
new file mode 100644
index 00000000000..246be9cb730
--- /dev/null
+++ b/dist/plotly-locale-ta.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"ta",dictionary:{},format:{days:["\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bcd\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8","\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0b9f\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8","\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8","\u0baa\u0bc1\u0ba4\u0ba9\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8","\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8","\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8","\u0b9a\u0ba9\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8"],shortDays:["\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1","\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd","\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd","\u0baa\u0bc1\u0ba4\u0ba9\u0bcd","\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd","\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf","\u0b9a\u0ba9\u0bbf"],months:["\u0ba4\u0bc8","\u0bae\u0bbe\u0b9a\u0bbf","\u0baa\u0b99\u0bcd\u0b95\u0bc1\u0ba9\u0bbf","\u0b9a\u0bbf\u0ba4\u0bcd\u0ba4\u0bbf\u0bb0\u0bc8","\u0bb5\u0bc8\u0b95\u0bbe\u0b9a\u0bbf","\u0b86\u0ba9\u0bbf","\u0b86\u0b9f\u0bbf","\u0b86\u0bb5\u0ba3\u0bbf","\u0baa\u0bc1\u0bb0\u0b9f\u0bcd\u0b9f\u0bbe\u0b9a\u0bbf","\u0b90\u0baa\u0bcd\u0baa\u0b9a\u0bbf","\u0b95\u0bbe\u0bb0\u0bcd\u0ba4\u0bcd\u0ba4\u0bbf\u0b95\u0bc8","\u0bae\u0bbe\u0bb0\u0bcd\u0b95\u0bb4\u0bbf"],shortMonths:["\u0ba4\u0bc8","\u0bae\u0bbe\u0b9a\u0bbf","\u0baa\u0b99\u0bcd","\u0b9a\u0bbf\u0ba4\u0bcd","\u0bb5\u0bc8\u0b95\u0bbe","\u0b86\u0ba9\u0bbf","\u0b86\u0b9f\u0bbf","\u0b86\u0bb5","\u0baa\u0bc1\u0bb0","\u0b90\u0baa\u0bcd","\u0b95\u0bbe\u0bb0\u0bcd","\u0bae\u0bbe\u0bb0\u0bcd"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-th.js b/dist/plotly-locale-th.js
new file mode 100644
index 00000000000..e4953410e7f
--- /dev/null
+++ b/dist/plotly-locale-th.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"th",dictionary:{},format:{days:["\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c","\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c","\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23","\u0e1e\u0e38\u0e18","\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e1a\u0e14\u0e35","\u0e28\u0e38\u0e01\u0e23\u0e4c","\u0e40\u0e2a\u0e32\u0e23\u0e4c"],shortDays:["\u0e2d\u0e32.","\u0e08.","\u0e2d.","\u0e1e.","\u0e1e\u0e24.","\u0e28.","\u0e2a."],months:["\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21","\u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c","\u0e21\u0e35\u0e19\u0e32\u0e04\u0e21","\u0e40\u0e21\u0e29\u0e32\u0e22\u0e19","\u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21","\u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19","\u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21","\u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21","\u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19","\u0e15\u0e38\u0e25\u0e32\u0e04\u0e21","\u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19","\u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21"],shortMonths:["\u0e21.\u0e04.","\u0e01.\u0e1e.","\u0e21\u0e35.\u0e04.","\u0e40\u0e21.\u0e22.","\u0e1e.\u0e04.","\u0e21\u0e34.\u0e22.","\u0e01.\u0e04.","\u0e2a.\u0e04.","\u0e01.\u0e22.","\u0e15.\u0e04.","\u0e1e.\u0e22.","\u0e18.\u0e04."],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-tr.js b/dist/plotly-locale-tr.js
new file mode 100644
index 00000000000..9c2ed4455c9
--- /dev/null
+++ b/dist/plotly-locale-tr.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"tr",dictionary:{},format:{days:["Pazar","Pazartesi","Sal\u0131","\xc7ar\u015famba","Per\u015fembe","Cuma","Cumartesi"],shortDays:["Pz","Pt","Sa","\xc7a","Pe","Cu","Ct"],months:["Ocak","\u015eubat","Mart","Nisan","May\u0131s","Haziran","Temmuz","A\u011fustos","Eyl\xfcl","Ekim","Kas\u0131m","Aral\u0131k"],shortMonths:["Oca","\u015eub","Mar","Nis","May","Haz","Tem","A\u011fu","Eyl","Eki","Kas","Ara"],date:"%d.%m.%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-tt.js b/dist/plotly-locale-tt.js
new file mode 100644
index 00000000000..e23ccabd2b3
--- /dev/null
+++ b/dist/plotly-locale-tt.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"tt",dictionary:{},format:{days:["\u044f\u043a\u0448\u04d9\u043c\u0431\u0435","\u0434\u04af\u0448\u04d9\u043c\u0431\u0435","\u0441\u0438\u0448\u04d9\u043c\u0431\u0435","\u0447\u04d9\u0440\u0448\u04d9\u043c\u0431\u0435","\u043f\u04d9\u043d\u0497\u0435\u0448\u04d9\u043c\u0431\u0435","\u0497\u043e\u043c\u0433\u0430","\u0448\u0438\u043c\u0431\u04d9"],shortDays:["\u044f\u043a\u0448","\u0434\u04af\u0448","\u0441\u0438\u0448","\u0447\u04d9\u0440","\u043f\u04d9\u043d","\u0497\u043e\u043c","\u0448\u0438\u043c"],months:["\u0413\u044b\u043d\u0432\u0430\u0440","\u0424\u0435\u0432\u0440\u0430\u043b\u044c","\u041c\u0430\u0440\u0442","\u0410\u043f\u0440\u0435\u043b\u044c","\u041c\u0430\u0439","\u0418\u044e\u043d\u044c","\u0418\u044e\u043b\u044c","\u0410\u0432\u0433\u0443\u0441\u0442","\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c","\u041e\u043a\u0442\u044f\u0431\u0440\u044c","\u041d\u043e\u044f\u0431\u0440\u044c","\u0414\u0435\u043a\u0430\u0431\u0440\u044c"],shortMonths:["\u0413\u044b\u0439\u043d","\u0424\u0435\u0432","\u041c\u0430\u0440","\u0410\u043f\u0440","\u041c\u0430\u0439","\u0418\u044e\u043d","\u0418\u044e\u043b","\u0410\u0432\u0433","\u0421\u0435\u043d","\u041e\u043a\u0442","\u041d\u043e\u044f","\u0414\u0435\u043a"],date:"%d.%m.%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-uk.js b/dist/plotly-locale-uk.js
new file mode 100644
index 00000000000..0a258799e71
--- /dev/null
+++ b/dist/plotly-locale-uk.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"uk",dictionary:{},format:{days:["\u043d\u0435\u0434\u0456\u043b\u044f","\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a","\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a","\u0441\u0435\u0440\u0435\u0434\u0430","\u0447\u0435\u0442\u0432\u0435\u0440","\u043f'\u044f\u0442\u043d\u0438\u0446\u044f","\u0441\u0443\u0431\u043e\u0442\u0430"],shortDays:["\u043d\u0435\u0434","\u043f\u043d\u0434","\u0432\u0456\u0432","\u0441\u0440\u0434","\u0447\u0442\u0432","\u043f\u0442\u043d","\u0441\u0431\u0442"],months:["\u0421\u0456\u0447\u0435\u043d\u044c","\u041b\u044e\u0442\u0438\u0439","\u0411\u0435\u0440\u0435\u0437\u0435\u043d\u044c","\u041a\u0432\u0456\u0442\u0435\u043d\u044c","\u0422\u0440\u0430\u0432\u0435\u043d\u044c","\u0427\u0435\u0440\u0432\u0435\u043d\u044c","\u041b\u0438\u043f\u0435\u043d\u044c","\u0421\u0435\u0440\u043f\u0435\u043d\u044c","\u0412\u0435\u0440\u0435\u0441\u0435\u043d\u044c","\u0416\u043e\u0432\u0442\u0435\u043d\u044c","\u041b\u0438\u0441\u0442\u043e\u043f\u0430\u0434","\u0413\u0440\u0443\u0434\u0435\u043d\u044c"],shortMonths:["\u0421\u0456\u0447","\u041b\u044e\u0442","\u0411\u0435\u0440","\u041a\u0432\u0456","\u0422\u0440\u0430","\u0427\u0435\u0440","\u041b\u0438\u043f","\u0421\u0435\u0440","\u0412\u0435\u0440","\u0416\u043e\u0432","\u041b\u0438\u0441","\u0413\u0440\u0443"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-ur.js b/dist/plotly-locale-ur.js
new file mode 100644
index 00000000000..dc1075f40a0
--- /dev/null
+++ b/dist/plotly-locale-ur.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"ur",dictionary:{},format:{days:["\u0627\u062a\u0648\u0627\u0631","\u067e\u064a\u0631","\u0645\u0646\u06af\u0644","\u0628\u062f\u06be","\u062c\u0645\u0639\u0631\u0627\u062a","\u062c\u0645\u0639\u06c1","\u06c1\u0641\u062a\u06c1"],shortDays:["\u0627\u062a\u0648\u0627\u0631","\u067e\u064a\u0631","\u0645\u0646\u06af\u0644","\u0628\u062f\u06be","\u062c\u0645\u0639\u0631\u0627\u062a","\u062c\u0645\u0639\u06c1","\u06c1\u0641\u062a\u06c1"],months:["\u062c\u0646\u0648\u0631\u06cc","\u0641\u0631\u0648\u0631\u06cc","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u06cc\u0644","\u0645\u0626\u06cc","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0626\u06cc","\u0627\u06af\u0633\u062a","\u0633\u062a\u0645\u0628\u0631","\u0627\u06a9\u062a\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u062f\u0633\u0645\u0628\u0631"],shortMonths:["1","2","3","4","5","6","7","8","9","10","11","12"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-vi.js b/dist/plotly-locale-vi.js
new file mode 100644
index 00000000000..148d6260c5e
--- /dev/null
+++ b/dist/plotly-locale-vi.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"vi",dictionary:{},format:{days:["Ch\u1ee7 Nh\u1eadt","Th\u1ee9 Hai","Th\u1ee9 Ba","Th\u1ee9 T\u01b0","Th\u1ee9 N\u0103m","Th\u1ee9 S\xe1u","Th\u1ee9 B\u1ea3y"],shortDays:["CN","T2","T3","T4","T5","T6","T7"],months:["Th\xe1ng M\u1ed9t","Th\xe1ng Hai","Th\xe1ng Ba","Th\xe1ng T\u01b0","Th\xe1ng N\u0103m","Th\xe1ng S\xe1u","Th\xe1ng B\u1ea3y","Th\xe1ng T\xe1m","Th\xe1ng Ch\xedn","Th\xe1ng M\u01b0\u1eddi","Th\xe1ng M\u01b0\u1eddi M\u1ed9t","Th\xe1ng M\u01b0\u1eddi Hai"],shortMonths:["Th\xe1ng 1","Th\xe1ng 2","Th\xe1ng 3","Th\xe1ng 4","Th\xe1ng 5","Th\xe1ng 6","Th\xe1ng 7","Th\xe1ng 8","Th\xe1ng 9","Th\xe1ng 10","Th\xe1ng 11","Th\xe1ng 12"],date:"%d/%m/%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-zh-cn.js b/dist/plotly-locale-zh-cn.js
new file mode 100644
index 00000000000..01dac3c1564
--- /dev/null
+++ b/dist/plotly-locale-zh-cn.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"zh-CN",dictionary:{},format:{days:["\u661f\u671f\u65e5","\u661f\u671f\u4e00","\u661f\u671f\u4e8c","\u661f\u671f\u4e09","\u661f\u671f\u56db","\u661f\u671f\u4e94","\u661f\u671f\u516d"],shortDays:["\u5468\u65e5","\u5468\u4e00","\u5468\u4e8c","\u5468\u4e09","\u5468\u56db","\u5468\u4e94","\u5468\u516d"],months:["\u4e00\u6708","\u4e8c\u6708","\u4e09\u6708","\u56db\u6708","\u4e94\u6708","\u516d\u6708","\u4e03\u6708","\u516b\u6708","\u4e5d\u6708","\u5341\u6708","\u5341\u4e00\u6708","\u5341\u4e8c\u6708"],shortMonths:["\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341","\u5341\u4e00","\u5341\u4e8c"],date:"%Y-%m-%d"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-zh-hk.js b/dist/plotly-locale-zh-hk.js
new file mode 100644
index 00000000000..0e573a31611
--- /dev/null
+++ b/dist/plotly-locale-zh-hk.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"zh-HK",dictionary:{},format:{days:["\u661f\u671f\u65e5","\u661f\u671f\u4e00","\u661f\u671f\u4e8c","\u661f\u671f\u4e09","\u661f\u671f\u56db","\u661f\u671f\u4e94","\u661f\u671f\u516d"],shortDays:["\u5468\u65e5","\u5468\u4e00","\u5468\u4e8c","\u5468\u4e09","\u5468\u56db","\u5468\u4e94","\u5468\u516d"],months:["\u4e00\u6708","\u4e8c\u6708","\u4e09\u6708","\u56db\u6708","\u4e94\u6708","\u516d\u6708","\u4e03\u6708","\u516b\u6708","\u4e5d\u6708","\u5341\u6708","\u5341\u4e00\u6708","\u5341\u4e8c\u6708"],shortMonths:["\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341","\u5341\u4e00","\u5341\u4e8c"],date:"%d-%m-%Y"}});
\ No newline at end of file
diff --git a/dist/plotly-locale-zh-tw.js b/dist/plotly-locale-zh-tw.js
new file mode 100644
index 00000000000..dd2e808e8cc
--- /dev/null
+++ b/dist/plotly-locale-zh-tw.js
@@ -0,0 +1 @@
+Plotly.register({moduleType:"locale",name:"zh-TW",dictionary:{},format:{days:["\u661f\u671f\u65e5","\u661f\u671f\u4e00","\u661f\u671f\u4e8c","\u661f\u671f\u4e09","\u661f\u671f\u56db","\u661f\u671f\u4e94","\u661f\u671f\u516d"],shortDays:["\u5468\u65e5","\u5468\u4e00","\u5468\u4e8c","\u5468\u4e09","\u5468\u56db","\u5468\u4e94","\u5468\u516d"],months:["\u4e00\u6708","\u4e8c\u6708","\u4e09\u6708","\u56db\u6708","\u4e94\u6708","\u516d\u6708","\u4e03\u6708","\u516b\u6708","\u4e5d\u6708","\u5341\u6708","\u5341\u4e00\u6708","\u5341\u4e8c\u6708"],shortMonths:["\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341","\u5341\u4e00","\u5341\u4e8c"],date:"%Y/%m/%d"}});
\ No newline at end of file
diff --git a/lib/index-basic.js b/lib/index-basic.js
index 6bf47b0d84a..4c837e413ad 100644
--- a/lib/index-basic.js
+++ b/lib/index-basic.js
@@ -15,10 +15,4 @@ Plotly.register([
require('./pie')
]);
-// locales
-Plotly.register([
- require('./locale-en'),
- require('./locale-en-us')
-]);
-
module.exports = Plotly;
diff --git a/lib/index-cartesian.js b/lib/index-cartesian.js
index 6dc20783571..5818a717748 100644
--- a/lib/index-cartesian.js
+++ b/lib/index-cartesian.js
@@ -23,10 +23,4 @@ Plotly.register([
require('./violin')
]);
-// locales
-Plotly.register([
- require('./locale-en'),
- require('./locale-en-us')
-]);
-
module.exports = Plotly;
diff --git a/lib/index-finance.js b/lib/index-finance.js
index f53dee82c9f..4759344b760 100644
--- a/lib/index-finance.js
+++ b/lib/index-finance.js
@@ -18,10 +18,4 @@ Plotly.register([
require('./candlestick')
]);
-// locales
-Plotly.register([
- require('./locale-en'),
- require('./locale-en-us')
-]);
-
module.exports = Plotly;
diff --git a/lib/index-geo.js b/lib/index-geo.js
index 40dec26e9e9..2283f1f0489 100644
--- a/lib/index-geo.js
+++ b/lib/index-geo.js
@@ -15,10 +15,4 @@ Plotly.register([
require('./choropleth')
]);
-// locales
-Plotly.register([
- require('./locale-en'),
- require('./locale-en-us')
-]);
-
module.exports = Plotly;
diff --git a/lib/index-gl2d.js b/lib/index-gl2d.js
index 31128063e7a..9c24ec21267 100644
--- a/lib/index-gl2d.js
+++ b/lib/index-gl2d.js
@@ -18,10 +18,4 @@ Plotly.register([
require('./parcoords')
]);
-// locales
-Plotly.register([
- require('./locale-en'),
- require('./locale-en-us')
-]);
-
module.exports = Plotly;
diff --git a/lib/index-gl3d.js b/lib/index-gl3d.js
index b7a635e27f9..7134846cb7d 100644
--- a/lib/index-gl3d.js
+++ b/lib/index-gl3d.js
@@ -16,10 +16,4 @@ Plotly.register([
require('./mesh3d')
]);
-// locales
-Plotly.register([
- require('./locale-en'),
- require('./locale-en-us')
-]);
-
module.exports = Plotly;
diff --git a/lib/index-mapbox.js b/lib/index-mapbox.js
index 9c6ed2b4bf3..17b075b5f49 100644
--- a/lib/index-mapbox.js
+++ b/lib/index-mapbox.js
@@ -14,10 +14,4 @@ Plotly.register([
require('./scattermapbox')
]);
-// locales
-Plotly.register([
- require('./locale-en'),
- require('./locale-en-us')
-]);
-
module.exports = Plotly;
diff --git a/lib/index.js b/lib/index.js
index 131ff4e8511..7dac73a1f64 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -71,10 +71,4 @@ Plotly.register([
require('./calendars')
]);
-// locales
-Plotly.register([
- require('./locale-en.js'),
- require('./locale-en-us.js')
-]);
-
module.exports = Plotly;
diff --git a/lib/locale-en.js b/lib/locale-en.js
deleted file mode 100644
index ead5a904c11..00000000000
--- a/lib/locale-en.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
-* Copyright 2012-2017, Plotly, Inc.
-* All rights reserved.
-*
-* This source code is licensed under the MIT license found in the
-* LICENSE file in the root directory of this source tree.
-*/
-
-'use strict';
-
-module.exports = {
- moduleType: 'locale',
- name: 'en',
- dictionary: {
- 'Click to enter Colorscale title': 'Click to enter Colourscale title'
- }
-};
diff --git a/lib/locales/af.js b/lib/locales/af.js
new file mode 100644
index 00000000000..7b94d06d4f4
--- /dev/null
+++ b/lib/locales/af.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'af',
+ dictionary: {},
+ format: {
+ days: [
+ 'Sondag', 'Maandag', 'Dinsdag', 'Woensdag',
+ 'Donderdag', 'Vrydag', 'Saterdag'
+ ],
+ shortDays: ['Son', 'Maan', 'Dins', 'Woens', 'Don', 'Vry', 'Sat'],
+ months: [
+ 'Januarie', 'Februarie', 'Maart', 'April', 'Mei', 'Junie',
+ 'Julie', 'Augustus', 'September', 'Oktober', 'November', 'Desember'
+ ],
+ shortMonths: [
+ 'Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/am.js b/lib/locales/am.js
new file mode 100644
index 00000000000..635744b9391
--- /dev/null
+++ b/lib/locales/am.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'am',
+ dictionary: {},
+ format: {
+ days: ['ሰንዴይ', 'መንዴይ', 'ትዩስዴይ', 'ዌንስዴይ', 'ተርሰዴይ', 'ፍራይዴይ', 'ሳተርዴይ'],
+ shortDays: ['ሰንዴ', 'መንዴ', 'ትዩስ', 'ዌንስ', 'ተርሰ', 'ፍራይ', 'ሳተር'],
+ months: [
+ 'ጃንዋሪ', 'ፈብርዋሪ', 'ማርች', 'አፕሪል', 'ሜይ', 'ጁን',
+ 'ጁላይ', 'ኦገስት', 'ሴፕቴምበር', 'ኦክቶበር', 'ኖቬምበር', 'ዲሴምበር'
+ ],
+ shortMonths: [
+ 'ጃንዋ', 'ፈብር', 'ማርች', 'አፕሪ', 'ሜይ', 'ጁን',
+ 'ጁላይ', 'ኦገስ', 'ሴፕቴ', 'ኦክቶ', 'ኖቬም', 'ዲሴም'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/ar-dz.js b/lib/locales/ar-dz.js
new file mode 100644
index 00000000000..5a474f6a5a0
--- /dev/null
+++ b/lib/locales/ar-dz.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'ar-DZ',
+ dictionary: {},
+ format: {
+ days: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+ shortDays: [
+ 'الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء',
+ 'الخميس', 'الجمعة', 'السبت'
+ ],
+ months: [
+ 'جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان',
+ 'جويلية', 'أوت', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'
+ ],
+ shortMonths: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/ar-eg.js b/lib/locales/ar-eg.js
new file mode 100644
index 00000000000..ef6d7b3d845
--- /dev/null
+++ b/lib/locales/ar-eg.js
@@ -0,0 +1,25 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'ar-EG',
+ dictionary: {},
+ format: {
+ days: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+ shortDays: ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'],
+ months: [
+ 'يناير', 'فبراير', 'مارس', 'إبريل', 'مايو', 'يونية',
+ 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'
+ ],
+ shortMonths: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/ar.js b/lib/locales/ar.js
new file mode 100644
index 00000000000..ef4ab0702c7
--- /dev/null
+++ b/lib/locales/ar.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'ar',
+ dictionary: {},
+ format: {
+ days: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+ shortDays: [
+ 'الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء',
+ 'الخميس', 'الجمعة', 'السبت'
+ ],
+ months: [
+ 'كانون الثاني', 'شباط', 'آذار', 'نيسان', 'آذار', 'حزيران',
+ 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'
+ ],
+ shortMonths: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/az.js b/lib/locales/az.js
new file mode 100644
index 00000000000..9e02d18b639
--- /dev/null
+++ b/lib/locales/az.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'az',
+ dictionary: {},
+ format: {
+ days: [
+ 'Bazar', 'Bazar ertəsi', 'Çərşənbə axşamı', 'Çərşənbə',
+ 'Cümə axşamı', 'Cümə', 'Şənbə'
+ ],
+ shortDays: ['B', 'Be', 'Ça', 'Ç', 'Ca', 'C', 'Ş'],
+ months: [
+ 'Yanvar', 'Fevral', 'Mart', 'Aprel', 'May', 'İyun',
+ 'İyul', 'Avqust', 'Sentyabr', 'Oktyabr', 'Noyabr', 'Dekabr'
+ ],
+ shortMonths: [
+ 'Yan', 'Fev', 'Mar', 'Apr', 'May', 'İyun',
+ 'İyul', 'Avq', 'Sen', 'Okt', 'Noy', 'Dek'
+ ],
+ date: '%d.%m.%Y'
+ }
+};
diff --git a/lib/locales/bg.js b/lib/locales/bg.js
new file mode 100644
index 00000000000..c7346f5a8cc
--- /dev/null
+++ b/lib/locales/bg.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'bg',
+ dictionary: {},
+ format: {
+ days: ['Неделя', 'Понеделник', 'Вторник', 'Сряда', 'Четвъртък', 'Петък', 'Събота'],
+ shortDays: ['Нед', 'Пон', 'Вто', 'Сря', 'Чет', 'Пет', 'Съб'],
+ months: [
+ 'Януари', 'Февруари', 'Март', 'Април', 'Май', 'Юни',
+ 'Юли', 'Август', 'Септември', 'Октомври', 'Ноември', 'Декември'
+ ],
+ shortMonths: [
+ 'Яну', 'Фев', 'Мар', 'Апр', 'Май', 'Юни',
+ 'Юли', 'Авг', 'Сеп', 'Окт', 'Нов', 'Дек'
+ ],
+ date: '%d.%m.%Y'
+ }
+};
diff --git a/lib/locales/bs.js b/lib/locales/bs.js
new file mode 100644
index 00000000000..a538908d8b5
--- /dev/null
+++ b/lib/locales/bs.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'bs',
+ dictionary: {},
+ format: {
+ days: [
+ 'Nedelja', 'Ponedeljak', 'Utorak', 'Srijeda',
+ 'Četvrtak', 'Petak', 'Subota'
+ ],
+ shortDays: ['Ned', 'Pon', 'Uto', 'Sri', 'Čet', 'Pet', 'Sub'],
+ months: [
+ 'Januar', 'Februar', 'Mart', 'April', 'Maj', 'Juni',
+ 'Juli', 'August', 'Septembar', 'Oktobar', 'Novembar', 'Decembar'
+ ],
+ shortMonths: [
+ 'Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'
+ ],
+ date: '%d.%m.%Y'
+ }
+};
diff --git a/lib/locales/ca.js b/lib/locales/ca.js
new file mode 100644
index 00000000000..63d7b634d6d
--- /dev/null
+++ b/lib/locales/ca.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'ca',
+ dictionary: {},
+ format: {
+ days: [
+ 'Diumenge', 'Dilluns', 'Dimarts', 'Dimecres',
+ 'Dijous', 'Divendres', 'Dissabte'
+ ],
+ shortDays: ['Dug', 'Dln', 'Dmt', 'Dmc', 'Djs', 'Dvn', 'Dsb'],
+ months: [
+ 'Gener', 'Febrer', 'Març', 'Abril', 'Maig', 'Juny',
+ 'Juliol', 'Agost', 'Setembre', 'Octubre', 'Novembre', 'Desembre'
+ ],
+ shortMonths: [
+ 'Gen', 'Feb', 'Mar', 'Abr', 'Mai', 'Jun',
+ 'Jul', 'Ago', 'Set', 'Oct', 'Nov', 'Des'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/cs.js b/lib/locales/cs.js
new file mode 100644
index 00000000000..82da23f1a7a
--- /dev/null
+++ b/lib/locales/cs.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'cs',
+ dictionary: {},
+ format: {
+ days: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'],
+ shortDays: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],
+ months: [
+ 'leden', 'únor', 'březen', 'duben', 'květen', 'červen',
+ 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec'
+ ],
+ shortMonths: [
+ 'led', 'úno', 'bře', 'dub', 'kvě', 'čer',
+ 'čvc', 'srp', 'zář', 'říj', 'lis', 'pro'
+ ],
+ date: '%d.%m.%Y'
+ }
+};
diff --git a/lib/locales/da.js b/lib/locales/da.js
new file mode 100644
index 00000000000..9458ae7f07d
--- /dev/null
+++ b/lib/locales/da.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'da',
+ dictionary: {},
+ format: {
+ days: ['Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag'],
+ shortDays: ['Søn', 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'Lør'],
+ months: [
+ 'Januar', 'Februar', 'Marts', 'April', 'Maj', 'Juni',
+ 'Juli', 'August', 'September', 'Oktober', 'November', 'December'
+ ],
+ shortMonths: [
+ 'Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'
+ ],
+ date: '%d-%m-%Y'
+ }
+};
diff --git a/lib/locales/de-ch.js b/lib/locales/de-ch.js
new file mode 100644
index 00000000000..924cd6a1dee
--- /dev/null
+++ b/lib/locales/de-ch.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'de-CH',
+ dictionary: {},
+ format: {
+ days: [
+ 'Sonntag', 'Montag', 'Dienstag', 'Mittwoch',
+ 'Donnerstag', 'Freitag', 'Samstag'
+ ],
+ shortDays: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
+ months: [
+ 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni',
+ 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'
+ ],
+ shortMonths: [
+ 'Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'
+ ],
+ date: '%d.%m.%Y'
+ }
+};
diff --git a/lib/locales/de.js b/lib/locales/de.js
new file mode 100644
index 00000000000..dec3c8be8c5
--- /dev/null
+++ b/lib/locales/de.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'de',
+ dictionary: {},
+ format: {
+ days: [
+ 'Sonntag', 'Montag', 'Dienstag', 'Mittwoch',
+ 'Donnerstag', 'Freitag', 'Samstag'
+ ],
+ shortDays: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
+ months: [
+ 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni',
+ 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'
+ ],
+ shortMonths: [
+ 'Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'
+ ],
+ date: '%d.%m.%Y'
+ }
+};
diff --git a/lib/locales/el.js b/lib/locales/el.js
new file mode 100644
index 00000000000..7aa9a821666
--- /dev/null
+++ b/lib/locales/el.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'el',
+ dictionary: {},
+ format: {
+ days: ['Κυριακή', 'Δευτέρα', 'Τρίτη', 'Τετάρτη', 'Πέμπτη', 'Παρασκευή', 'Σάββατο'],
+ shortDays: ['Κυρ', 'Δευ', 'Τρι', 'Τετ', 'Πεμ', 'Παρ', 'Σαβ'],
+ months: [
+ 'Ιανουάριος', 'Φεβρουάριος', 'Μάρτιος', 'Απρίλιος', 'Μάιος', 'Ιούνιος',
+ 'Ιούλιος', 'Αύγουστος', 'Σεπτέμβριος', 'Οκτώβριος', 'Νοέμβριος', 'Δεκέμβριος'
+ ],
+ shortMonths: [
+ 'Ιαν', 'Φεβ', 'Μαρ', 'Απρ', 'Μαι', 'Ιουν',
+ 'Ιουλ', 'Αυγ', 'Σεπ', 'Οκτ', 'Νοε', 'Δεκ'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/eo.js b/lib/locales/eo.js
new file mode 100644
index 00000000000..616990c3c66
--- /dev/null
+++ b/lib/locales/eo.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'eo',
+ dictionary: {},
+ format: {
+ days: ['Dimanĉo', 'Lundo', 'Mardo', 'Merkredo', 'Ĵaŭdo', 'Vendredo', 'Sabato'],
+ shortDays: ['Dim', 'Lun', 'Mar', 'Mer', 'Ĵaŭ', 'Ven', 'Sab'],
+ months: [
+ 'Januaro', 'Februaro', 'Marto', 'Aprilo', 'Majo', 'Junio',
+ 'Julio', 'Aŭgusto', 'Septembro', 'Oktobro', 'Novembro', 'Decembro'
+ ],
+ shortMonths: [
+ 'Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun',
+ 'Jul', 'Aŭg', 'Sep', 'Okt', 'Nov', 'Dec'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/es-ar.js b/lib/locales/es-ar.js
new file mode 100644
index 00000000000..67b64987020
--- /dev/null
+++ b/lib/locales/es-ar.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'es-AR',
+ dictionary: {},
+ format: {
+ days: ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'],
+ shortDays: ['Dom', 'Lun', 'Mar', 'Mié', 'Juv', 'Vie', 'Sáb'],
+ months: [
+ 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio',
+ 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'
+ ],
+ shortMonths: [
+ 'Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun',
+ 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/es-pe.js b/lib/locales/es-pe.js
new file mode 100644
index 00000000000..94795067576
--- /dev/null
+++ b/lib/locales/es-pe.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'es-PE',
+ dictionary: {},
+ format: {
+ days: ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'],
+ shortDays: ['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sab'],
+ months: [
+ 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio',
+ 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'
+ ],
+ shortMonths: [
+ 'Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun',
+ 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/es.js b/lib/locales/es.js
new file mode 100644
index 00000000000..d090ef1985f
--- /dev/null
+++ b/lib/locales/es.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'es',
+ dictionary: {},
+ format: {
+ days: ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'],
+ shortDays: ['Dom', 'Lun', 'Mar', 'Mié', 'Juv', 'Vie', 'Sáb'],
+ months: [
+ 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio',
+ 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'
+ ],
+ shortMonths: [
+ 'Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun',
+ 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/et.js b/lib/locales/et.js
new file mode 100644
index 00000000000..4275f0c9f6c
--- /dev/null
+++ b/lib/locales/et.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'et',
+ dictionary: {},
+ format: {
+ days: [
+ 'Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev',
+ 'Neljapäev', 'Reede', 'Laupäev'
+ ],
+ shortDays: ['Pühap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'],
+ months: [
+ 'Jaanuar', 'Veebruar', 'Märts', 'Aprill', 'Mai', 'Juuni',
+ 'Juuli', 'August', 'September', 'Oktoober', 'November', 'Detsember'
+ ],
+ shortMonths: [
+ 'Jaan', 'Veebr', 'Märts', 'Apr', 'Mai', 'Juuni',
+ 'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'
+ ],
+ date: '%d.%m.%Y'
+ }
+};
diff --git a/lib/locales/eu.js b/lib/locales/eu.js
new file mode 100644
index 00000000000..eedd3097f50
--- /dev/null
+++ b/lib/locales/eu.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'eu',
+ dictionary: {},
+ format: {
+ days: [
+ 'Igandea', 'Astelehena', 'Asteartea', 'Asteazkena',
+ 'Osteguna', 'Ostirala', 'Larunbata'
+ ],
+ shortDays: ['Iga', 'Ast', 'Ast', 'Ast', 'Ost', 'Ost', 'Lar'],
+ months: [
+ 'Urtarrila', 'Otsaila', 'Martxoa', 'Apirila', 'Maiatza', 'Ekaina',
+ 'Uztaila', 'Abuztua', 'Iraila', 'Urria', 'Azaroa', 'Abendua'
+ ],
+ shortMonths: [
+ 'Urt', 'Ots', 'Mar', 'Api', 'Mai', 'Eka',
+ 'Uzt', 'Abu', 'Ira', 'Urr', 'Aza', 'Abe'
+ ],
+ date: '%Y/%m/%d'
+ }
+};
diff --git a/lib/locales/fa.js b/lib/locales/fa.js
new file mode 100644
index 00000000000..f9e2fd62634
--- /dev/null
+++ b/lib/locales/fa.js
@@ -0,0 +1,25 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'fa',
+ dictionary: {},
+ format: {
+ days: ['يکشنبه', 'دوشنبه', 'سهشنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],
+ shortDays: ['ي', 'د', 'س', 'چ', 'پ', 'ج', 'ش'],
+ months: [
+ 'فروردين', 'ارديبهشت', 'خرداد', 'تير', 'مرداد', 'شهريور',
+ 'مهر', 'آبان', 'آذر', 'دي', 'بهمن', 'اسفند'
+ ],
+ shortMonths: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ date: '%Y/%m/%d'
+ }
+};
diff --git a/lib/locales/fi.js b/lib/locales/fi.js
new file mode 100644
index 00000000000..4a00a946d1d
--- /dev/null
+++ b/lib/locales/fi.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'fi',
+ dictionary: {},
+ format: {
+ days: [
+ 'Sunnuntai', 'Maanantai', 'Tiistai', 'Keskiviikko',
+ 'Torstai', 'Perjantai', 'Lauantai'
+ ],
+ shortDays: ['Su', 'Ma', 'Ti', 'Ke', 'To', 'Pe', 'Su'],
+ months: [
+ 'Tammikuu', 'Helmikuu', 'Maaliskuu', 'Huhtikuu', 'Toukokuu', 'Kesäkuu',
+ 'Heinäkuu', 'Elokuu', 'Syyskuu', 'Lokakuu', 'Marraskuu', 'Joulukuu'
+ ],
+ shortMonths: [
+ 'Tammi', 'Helmi', 'Maalis', 'Huhti', 'Touko', 'Kesä',
+ 'Heinä', 'Elo', 'Syys', 'Loka', 'Marras', 'Joulu'
+ ],
+ date: '%d.%m.%Y'
+ }
+};
diff --git a/lib/locales/fo.js b/lib/locales/fo.js
new file mode 100644
index 00000000000..f4a1958d1a9
--- /dev/null
+++ b/lib/locales/fo.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'fo',
+ dictionary: {},
+ format: {
+ days: [
+ 'Sunnudagur', 'Mánadagur', 'Týsdagur', 'Mikudagur',
+ 'Hósdagur', 'Fríggjadagur', 'Leyardagur'
+ ],
+ shortDays: ['Sun', 'Mán', 'Týs', 'Mik', 'Hós', 'Frí', 'Ley'],
+ months: [
+ 'Januar', 'Februar', 'Mars', 'Apríl', 'Mei', 'Juni',
+ 'Juli', 'August', 'September', 'Oktober', 'November', 'Desember'
+ ],
+ shortMonths: [
+ 'Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'
+ ],
+ date: '%d-%m-%Y'
+ }
+};
diff --git a/lib/locales/fr-ch.js b/lib/locales/fr-ch.js
new file mode 100644
index 00000000000..e99d53de0b7
--- /dev/null
+++ b/lib/locales/fr-ch.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'fr-CH',
+ dictionary: {},
+ format: {
+ days: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
+ shortDays: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'],
+ months: [
+ 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin',
+ 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'
+ ],
+ shortMonths: [
+ 'Jan', 'Fév', 'Mar', 'Avr', 'Mai', 'Jun',
+ 'Jul', 'Aoû', 'Sep', 'Oct', 'Nov', 'Déc'
+ ],
+ date: '%d.%m.%Y'
+ }
+};
diff --git a/lib/locales/fr.js b/lib/locales/fr.js
new file mode 100644
index 00000000000..21a04980fa9
--- /dev/null
+++ b/lib/locales/fr.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'fr',
+ dictionary: {},
+ format: {
+ days: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
+ shortDays: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'],
+ months: [
+ 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin',
+ 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'
+ ],
+ shortMonths: [
+ 'Jan', 'Fév', 'Mar', 'Avr', 'Mai', 'Jun',
+ 'Jul', 'Aoû', 'Sep', 'Oct', 'Nov', 'Déc'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/gl.js b/lib/locales/gl.js
new file mode 100644
index 00000000000..45ca52ac32b
--- /dev/null
+++ b/lib/locales/gl.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'gl',
+ dictionary: {},
+ format: {
+ days: ['Domingo', 'Luns', 'Martes', 'Mércores', 'Xoves', 'Venres', 'Sábado'],
+ shortDays: ['Dom', 'Lun', 'Mar', 'Mér', 'Xov', 'Ven', 'Sáb'],
+ months: [
+ 'Xaneiro', 'Febreiro', 'Marzo', 'Abril', 'Maio', 'Xuño',
+ 'Xullo', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Decembro'
+ ],
+ shortMonths: [
+ 'Xan', 'Feb', 'Mar', 'Abr', 'Mai', 'Xuñ',
+ 'Xul', 'Ago', 'Set', 'Out', 'Nov', 'Dec'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/gu.js b/lib/locales/gu.js
new file mode 100644
index 00000000000..0a49026f5ea
--- /dev/null
+++ b/lib/locales/gu.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'gu',
+ dictionary: {},
+ format: {
+ days: ['રવિવાર', 'સોમવાર', 'મંગળવાર', 'બુધવાર', 'ગુરુવાર', 'શુક્રવાર', 'શનિવાર'],
+ shortDays: ['રવિ', 'સોમ', 'મંગળ', 'બુધ', 'ગુરુ', 'શુક્ર', 'શનિ'],
+ months: [
+ 'જાન્યુઆરી', 'ફેબ્રુઆરી', 'માર્ચ', 'એપ્રિલ', 'મે', 'જૂન',
+ 'જુલાઈ', 'ઑગસ્ટ', 'સપ્ટેમ્બર', 'ઑક્ટોબર', 'નવેમ્બર', 'ડિસેમ્બર'
+ ],
+ shortMonths: [
+ 'જાન્યુ', 'ફેબ્રુ', 'માર્ચ', 'એપ્રિલ', 'મે', 'જૂન',
+ 'જુલાઈ', 'ઑગસ્ટ', 'સપ્ટે', 'ઑક્ટો', 'નવે', 'ડિસે'
+ ],
+ date: '%d-%b-%Y'
+ }
+};
diff --git a/lib/locales/he.js b/lib/locales/he.js
new file mode 100644
index 00000000000..8fd66469017
--- /dev/null
+++ b/lib/locales/he.js
@@ -0,0 +1,25 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'he',
+ dictionary: {},
+ format: {
+ days: ['ראשון', 'שני', 'שלישי', 'רביעי', 'חמישי', 'שישי', 'שבת'],
+ shortDays: ['א\'', 'ב\'', 'ג\'', 'ד\'', 'ה\'', 'ו\'', 'שבת'],
+ months: [
+ 'ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני',
+ 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'
+ ],
+ shortMonths: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/hi-in.js b/lib/locales/hi-in.js
new file mode 100644
index 00000000000..148943ef7d3
--- /dev/null
+++ b/lib/locales/hi-in.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'hi-IN',
+ dictionary: {},
+ format: {
+ days: ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरुवार', 'शुक्रवार', 'शनिवार'],
+ shortDays: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],
+ months: [
+ 'जनवरी', ' फरवरी', 'मार्च', 'अप्रैल', 'मई', 'जून',
+ 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'
+ ],
+ shortMonths: [
+ 'जन', 'फर', 'मार्च', 'अप्रै', 'मई', 'जून',
+ 'जुलाई', 'अग', 'सित', 'अक्टू', 'नव', 'दिस'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/hr.js b/lib/locales/hr.js
new file mode 100644
index 00000000000..39443132586
--- /dev/null
+++ b/lib/locales/hr.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'hr',
+ dictionary: {},
+ format: {
+ days: [
+ 'Nedjelja', 'Ponedjeljak', 'Utorak', 'Srijeda',
+ 'Četvrtak', 'Petak', 'Subota'
+ ],
+ shortDays: ['Ned', 'Pon', 'Uto', 'Sri', 'Čet', 'Pet', 'Sub'],
+ months: [
+ 'Siječanj', 'Veljača', 'Ožujak', 'Travanj', 'Svibanj', 'Lipanj',
+ 'Srpanj', 'Kolovoz', 'Rujan', 'Listopad', 'Studeni', 'Prosinac'
+ ],
+ shortMonths: [
+ 'Sij', 'Velj', 'Ožu', 'Tra', 'Svi', 'Lip',
+ 'Srp', 'Kol', 'Ruj', 'Lis', 'Stu', 'Pro'
+ ],
+ date: '%d.%m.%Y.'
+ }
+};
diff --git a/lib/locales/hu.js b/lib/locales/hu.js
new file mode 100644
index 00000000000..ca8c702f8af
--- /dev/null
+++ b/lib/locales/hu.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'hu',
+ dictionary: {},
+ format: {
+ days: ['Vasárnap', 'Hétfö', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'],
+ shortDays: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'],
+ months: [
+ 'Január', 'Február', 'Március', 'Április', 'Május', 'Június',
+ 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'
+ ],
+ shortMonths: [
+ 'Jan', 'Feb', 'Már', 'Ápr', 'Máj', 'Jún',
+ 'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'
+ ],
+ date: '%Y-%m-%d'
+ }
+};
diff --git a/lib/locales/hy.js b/lib/locales/hy.js
new file mode 100644
index 00000000000..3167b525edd
--- /dev/null
+++ b/lib/locales/hy.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'hy',
+ dictionary: {},
+ format: {
+ days: [
+ 'կիրակի', 'եկուշաբթի', 'երեքշաբթի', 'չորեքշաբթի',
+ 'հինգշաբթի', 'ուրբաթ', 'շաբաթ'
+ ],
+ shortDays: ['կիր', 'երկ', 'երք', 'չրք', 'հնգ', 'ուրբ', 'շբթ'],
+ months: [
+ 'Հունվար', 'Փետրվար', 'Մարտ', 'Ապրիլ', 'Մայիս', 'Հունիս',
+ 'Հուլիս', 'Օգոստոս', 'Սեպտեմբեր', 'Հոկտեմբեր', 'Նոյեմբեր', 'Դեկտեմբեր'
+ ],
+ shortMonths: [
+ 'Հունվ', 'Փետր', 'Մարտ', 'Ապր', 'Մայիս', 'Հունիս',
+ 'Հուլ', 'Օգս', 'Սեպ', 'Հոկ', 'Նոյ', 'Դեկ'
+ ],
+ date: '%d.%m.%Y'
+ }
+};
diff --git a/lib/locales/id.js b/lib/locales/id.js
new file mode 100644
index 00000000000..cc6d6466cd3
--- /dev/null
+++ b/lib/locales/id.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'id',
+ dictionary: {},
+ format: {
+ days: ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'],
+ shortDays: ['Min', 'Sen', 'Sel', 'Rab', 'kam', 'Jum', 'Sab'],
+ months: [
+ 'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',
+ 'Juli', 'Agustus', 'September', 'Oktober', 'Nopember', 'Desember'
+ ],
+ shortMonths: [
+ 'Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun',
+ 'Jul', 'Agus', 'Sep', 'Okt', 'Nop', 'Des'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/is.js b/lib/locales/is.js
new file mode 100644
index 00000000000..2da0327c688
--- /dev/null
+++ b/lib/locales/is.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'is',
+ dictionary: {},
+ format: {
+ days: [
+ 'Sunnudagur', 'Mánudagur', 'Þriðjudagur', 'Miðvikudagur',
+ 'Fimmtudagur', 'Föstudagur', 'Laugardagur'
+ ],
+ shortDays: ['Sun', 'Mán', 'Þri', 'Mið', 'Fim', 'Fös', 'Lau'],
+ months: [
+ 'Janúar', 'Febrúar', 'Mars', 'Apríl', 'Maí', 'Júní',
+ 'Júlí', 'Ágúst', 'September', 'Október', 'Nóvember', 'Desember'
+ ],
+ shortMonths: [
+ 'Jan', 'Feb', 'Mar', 'Apr', 'Maí', 'Jún',
+ 'Júl', 'Ágú', 'Sep', 'Okt', 'Nóv', 'Des'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/it.js b/lib/locales/it.js
new file mode 100644
index 00000000000..c7d83de4217
--- /dev/null
+++ b/lib/locales/it.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'it',
+ dictionary: {},
+ format: {
+ days: [
+ 'Domenica', 'Lunedì', 'Martedì', 'Mercoledì',
+ 'Giovedì', 'Venerdì', 'Sabato'
+ ],
+ shortDays: ['Dom', 'Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab'],
+ months: [
+ 'Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno',
+ 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'
+ ],
+ shortMonths: [
+ 'Gen', 'Feb', 'Mar', 'Apr', 'Mag', 'Giu',
+ 'Lug', 'Ago', 'Set', 'Ott', 'Nov', 'Dic'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/ja.js b/lib/locales/ja.js
new file mode 100644
index 00000000000..0438812226b
--- /dev/null
+++ b/lib/locales/ja.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'ja',
+ dictionary: {},
+ format: {
+ days: ['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'],
+ shortDays: ['日', '月', '火', '水', '木', '金', '土'],
+ months: [
+ '1月', '2月', '3月', '4月', '5月', '6月',
+ '7月', '8月', '9月', '10月', '11月', '12月'
+ ],
+ shortMonths: [
+ '1月', '2月', '3月', '4月', '5月', '6月',
+ '7月', '8月', '9月', '10月', '11月', '12月'
+ ],
+ date: '%Y/%m/%d'
+ }
+};
diff --git a/lib/locales/ka.js b/lib/locales/ka.js
new file mode 100644
index 00000000000..1afafcea4c0
--- /dev/null
+++ b/lib/locales/ka.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'ka',
+ dictionary: {},
+ format: {
+ days: [
+ 'კვირა', 'ორშაბათი', 'სამშაბათი', 'ოთხშაბათი',
+ 'ხუთშაბათი', 'პარასკევი', 'შაბათი'
+ ],
+ shortDays: ['კვ', 'ორშ', 'სამ', 'ოთხ', 'ხუთ', 'პარ', 'შაბ'],
+ months: [
+ 'იანვარი', 'თებერვალი', 'მარტი', 'აპრილი', 'მაისი', 'ივნისი',
+ 'ივლისი', 'აგვისტო', 'სექტემბერი', 'ოქტომბერი', 'ნოემბერი', 'დეკემბერი'
+ ],
+ shortMonths: [
+ 'იან', 'თებ', 'მარ', 'აპრ', 'მაისი', 'ივნ',
+ 'ივლ', 'აგვ', 'სექ', 'ოქტ', 'ნოე', 'დეკ'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/km.js b/lib/locales/km.js
new file mode 100644
index 00000000000..3a0a5f43e4a
--- /dev/null
+++ b/lib/locales/km.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'km',
+ dictionary: {},
+ format: {
+ days: [
+ 'ថ្ងៃអាទិត្យ', 'ថ្ងៃចន្ទ', 'ថ្ងៃអង្គារ', 'ថ្ងៃពុធ',
+ 'ថ្ងៃព្រហស្បត្តិ៍', 'ថ្ងៃសុក្រ', 'ថ្ងៃសៅរ៍'
+ ],
+ shortDays: ['អា', 'ចន្ទ', 'អង្គ', 'ពុធ', 'ព្រហ', 'សុ', 'សៅរ៍'],
+ months: [
+ 'ខែមករា', 'ខែកុម្ភៈ', 'ខែមិនា', 'ខែមេសា', 'ខែឧសភា', 'ខែមិថុនា',
+ 'ខែកក្កដា', 'ខែសីហា', 'ខែកញ្ញា', 'ខែតុលា', 'ខែវិច្ឆិកា', 'ខែធ្នូ'
+ ],
+ shortMonths: [
+ 'មក', 'កុ', 'មិនា', 'មេ', 'ឧស', 'មិថុ',
+ 'កក្ក', 'សី', 'កញ្ញា', 'តុលា', 'វិច្ឆិ', 'ធ្នូ'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/ko.js b/lib/locales/ko.js
new file mode 100644
index 00000000000..5e8022f2cc8
--- /dev/null
+++ b/lib/locales/ko.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'ko',
+ dictionary: {},
+ format: {
+ days: ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'],
+ shortDays: ['일', '월', '화', '수', '목', '금', '토'],
+ months: [
+ '1월', '2월', '3월', '4월', '5월', '6월',
+ '7월', '8월', '9월', '10월', '11월', '12월'
+ ],
+ shortMonths: [
+ '1월', '2월', '3월', '4월', '5월', '6월',
+ '7월', '8월', '9월', '10월', '11월', '12월'
+ ],
+ date: '%Y-%m-%d'
+ }
+};
diff --git a/lib/locales/lt.js b/lib/locales/lt.js
new file mode 100644
index 00000000000..00cdd84a510
--- /dev/null
+++ b/lib/locales/lt.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'lt',
+ dictionary: {},
+ format: {
+ days: [
+ 'sekmadienis', 'pirmadienis', 'antradienis', 'trečiadienis',
+ 'ketvirtadienis', 'penktadienis', 'šeštadienis'
+ ],
+ shortDays: ['sek', 'pir', 'ant', 'tre', 'ket', 'pen', 'šeš'],
+ months: [
+ 'Sausis', 'Vasaris', 'Kovas', 'Balandis', 'Gegužė', 'Birželis',
+ 'Liepa', 'Rugpjūtis', 'Rugsėjis', 'Spalis', 'Lapkritis', 'Gruodis'
+ ],
+ shortMonths: [
+ 'Sau', 'Vas', 'Kov', 'Bal', 'Geg', 'Bir',
+ 'Lie', 'Rugp', 'Rugs', 'Spa', 'Lap', 'Gru'
+ ],
+ date: '%Y-%m-%d'
+ }
+};
diff --git a/lib/locales/lv.js b/lib/locales/lv.js
new file mode 100644
index 00000000000..dfb09b91303
--- /dev/null
+++ b/lib/locales/lv.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'lv',
+ dictionary: {},
+ format: {
+ days: [
+ 'svētdiena', 'pirmdiena', 'otrdiena', 'trešdiena',
+ 'ceturtdiena', 'piektdiena', 'sestdiena'
+ ],
+ shortDays: ['svt', 'prm', 'otr', 'tre', 'ctr', 'pkt', 'sst'],
+ months: [
+ 'Janvāris', 'Februāris', 'Marts', 'Aprīlis', 'Maijs', 'Jūnijs',
+ 'Jūlijs', 'Augusts', 'Septembris', 'Oktobris', 'Novembris', 'Decembris'
+ ],
+ shortMonths: [
+ 'Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jūn',
+ 'Jūl', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'
+ ],
+ date: '%d-%m-%Y'
+ }
+};
diff --git a/lib/locales/me-me.js b/lib/locales/me-me.js
new file mode 100644
index 00000000000..a1a85aaad6e
--- /dev/null
+++ b/lib/locales/me-me.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'me-ME',
+ dictionary: {},
+ format: {
+ days: [
+ 'Neđelja', 'Poneđeljak', 'Utorak', 'Srijeda',
+ 'Četvrtak', 'Petak', 'Subota'
+ ],
+ shortDays: ['Neđ', 'Pon', 'Uto', 'Sri', 'Čet', 'Pet', 'Sub'],
+ months: [
+ 'Januar', 'Februar', 'Mart', 'April', 'Maj', 'Jun',
+ 'Jul', 'Avgust', 'Septembar', 'Oktobar', 'Novembar', 'Decembar'
+ ],
+ shortMonths: [
+ 'Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun',
+ 'Jul', 'Avg', 'Sep', 'Okt', 'Nov', 'Dec'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/me.js b/lib/locales/me.js
new file mode 100644
index 00000000000..1e53649ee8d
--- /dev/null
+++ b/lib/locales/me.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'me',
+ dictionary: {},
+ format: {
+ days: ['Неђеља', 'Понеђељак', 'Уторак', 'Сриједа', 'Четвртак', 'Петак', 'Субота'],
+ shortDays: ['Неђ', 'Пон', 'Уто', 'Сри', 'Чет', 'Пет', 'Суб'],
+ months: [
+ 'Јануар', 'Фебруар', 'Март', 'Април', 'Мај', 'Јун',
+ 'Јул', 'Август', 'Септембар', 'Октобар', 'Новембар', 'Децембар'
+ ],
+ shortMonths: [
+ 'Јан', 'Феб', 'Мар', 'Апр', 'Мај', 'Јун',
+ 'Јул', 'Авг', 'Сеп', 'Окт', 'Нов', 'Дец'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/mk.js b/lib/locales/mk.js
new file mode 100644
index 00000000000..81999ad04a5
--- /dev/null
+++ b/lib/locales/mk.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'mk',
+ dictionary: {},
+ format: {
+ days: ['Недела', 'Понеделник', 'Вторник', 'Среда', 'Четврток', 'Петок', 'Сабота'],
+ shortDays: ['Нед', 'Пон', 'Вто', 'Сре', 'Чет', 'Пет', 'Саб'],
+ months: [
+ 'Јануари', 'Февруари', 'Март', 'Април', 'Мај', 'Јуни',
+ 'Јули', 'Август', 'Септември', 'Октомври', 'Ноември', 'Декември'
+ ],
+ shortMonths: [
+ 'Јан', 'Фев', 'Мар', 'Апр', 'Мај', 'Јун',
+ 'Јул', 'Авг', 'Сеп', 'Окт', 'Нов', 'Дек'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/ml.js b/lib/locales/ml.js
new file mode 100644
index 00000000000..e29f510c894
--- /dev/null
+++ b/lib/locales/ml.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'ml',
+ dictionary: {},
+ format: {
+ days: ['ഞായര്', 'തിങ്കള്', 'ചൊവ്വ', 'ബുധന്', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],
+ shortDays: ['ഞായ', 'തിങ്ക', 'ചൊവ്വ', 'ബുധ', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],
+ months: [
+ 'ജനുവരി', 'ഫെബ്രുവരി', 'മാര്ച്ച്', 'ഏപ്രില്', 'മേയ്', 'ജൂണ്',
+ 'ജൂലൈ', 'ആഗസ്റ്റ്', 'സെപ്റ്റംബര്', 'ഒക്ടോബര്', 'നവംബര്', 'ഡിസംബര്'
+ ],
+ shortMonths: [
+ 'ജനു', 'ഫെബ്', 'മാര്', 'ഏപ്രി', 'മേയ്', 'ജൂണ്',
+ 'ജൂലാ', 'ആഗ', 'സെപ്', 'ഒക്ടോ', 'നവം', 'ഡിസ'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/ms.js b/lib/locales/ms.js
new file mode 100644
index 00000000000..23040e1a30f
--- /dev/null
+++ b/lib/locales/ms.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'ms',
+ dictionary: {},
+ format: {
+ days: ['Ahad', 'Isnin', 'Selasa', 'Rabu', 'Khamis', 'Jumaat', 'Sabtu'],
+ shortDays: ['Aha', 'Isn', 'Sel', 'Rab', 'Kha', 'Jum', 'Sab'],
+ months: [
+ 'Januari', 'Februari', 'Mac', 'April', 'Mei', 'Jun',
+ 'Julai', 'Ogos', 'September', 'Oktober', 'November', 'Disember'
+ ],
+ shortMonths: [
+ 'Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun',
+ 'Jul', 'Ogo', 'Sep', 'Okt', 'Nov', 'Dis'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/mt.js b/lib/locales/mt.js
new file mode 100644
index 00000000000..9b8a3c96100
--- /dev/null
+++ b/lib/locales/mt.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'mt',
+ dictionary: {},
+ format: {
+ days: [
+ 'Il-Ħadd', 'It-Tnejn', 'It-Tlieta', 'L-Erbgħa',
+ 'Il-Ħamis', 'Il-Ġimgħa', 'Is-Sibt'
+ ],
+ shortDays: ['Ħad', 'Tne', 'Tli', 'Erb', 'Ħam', 'Ġim', 'Sib'],
+ months: [
+ 'Jannar', 'Frar', 'Marzu', 'April', 'Mejju', 'Ġunju',
+ 'Lulju', 'Awissu', 'Settembru', 'Ottubru', 'Novembru', 'Diċembru'
+ ],
+ shortMonths: [
+ 'Jan', 'Fra', 'Mar', 'Apr', 'Mej', 'Ġun',
+ 'Lul', 'Awi', 'Set', 'Ott', 'Nov', 'Diċ'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/nl-be.js b/lib/locales/nl-be.js
new file mode 100644
index 00000000000..769f6212504
--- /dev/null
+++ b/lib/locales/nl-be.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'nl-BE',
+ dictionary: {},
+ format: {
+ days: [
+ 'zondag', 'maandag', 'dinsdag', 'woensdag',
+ 'donderdag', 'vrijdag', 'zaterdag'
+ ],
+ shortDays: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
+ months: [
+ 'januari', 'februari', 'maart', 'april', 'mei', 'juni',
+ 'juli', 'augustus', 'september', 'oktober', 'november', 'december'
+ ],
+ shortMonths: [
+ 'jan', 'feb', 'maa', 'apr', 'mei', 'jun',
+ 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/nl.js b/lib/locales/nl.js
new file mode 100644
index 00000000000..51459b9cc4d
--- /dev/null
+++ b/lib/locales/nl.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'nl',
+ dictionary: {},
+ format: {
+ days: [
+ 'zondag', 'maandag', 'dinsdag', 'woensdag',
+ 'donderdag', 'vrijdag', 'zaterdag'
+ ],
+ shortDays: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
+ months: [
+ 'januari', 'februari', 'maart', 'april', 'mei', 'juni',
+ 'juli', 'augustus', 'september', 'oktober', 'november', 'december'
+ ],
+ shortMonths: [
+ 'jan', 'feb', 'maa', 'apr', 'mei', 'jun',
+ 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'
+ ],
+ date: '%d-%m-%Y'
+ }
+};
diff --git a/lib/locales/no.js b/lib/locales/no.js
new file mode 100644
index 00000000000..1041ac38bb2
--- /dev/null
+++ b/lib/locales/no.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'no',
+ dictionary: {},
+ format: {
+ days: ['Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag'],
+ shortDays: ['Søn', 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'Lør'],
+ months: [
+ 'Januar', 'Februar', 'Mars', 'April', 'Mai', 'Juni',
+ 'Juli', 'August', 'September', 'Oktober', 'November', 'Desember'
+ ],
+ shortMonths: [
+ 'Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'
+ ],
+ date: '%d.%m.%Y'
+ }
+};
diff --git a/lib/locales/pa.js b/lib/locales/pa.js
new file mode 100644
index 00000000000..32c96a58870
--- /dev/null
+++ b/lib/locales/pa.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'pa',
+ dictionary: {},
+ format: {
+ days: [
+ 'ਐਤਵਾਰ', 'ਸੋਮਵਾਰ', 'ਮੰਗਲਵਾਰ', 'ਬੁੱਧਵਾਰ',
+ 'ਵੀਰਵਾਰ', 'ਸ਼ੁੱਕਰਵਾਰ', 'ਸ਼ਨਿੱਚਰਵਾਰ'
+ ],
+ shortDays: ['ਐਤ', 'ਸੋਮ', 'ਮੰਗਲ', 'ਬੁੱਧ', 'ਵੀਰ', 'ਸ਼ੁੱਕਰ', 'ਸ਼ਨਿੱਚਰ'],
+ months: [
+ 'ਜਨਵਰੀ', 'ਫ਼ਰਵਰੀ', 'ਮਾਰਚ', 'ਅਪ੍ਰੈਲ', 'ਮਈ', 'ਜੂਨ',
+ 'ਜੁਲਾਈ', 'ਅਗਸਤ', 'ਸਤੰਬਰ', 'ਅਕਤੂਬਰ', 'ਨਵੰਬਰ', 'ਦਸੰਬਰ'
+ ],
+ shortMonths: [
+ 'ਜਨ', 'ਫ਼ਰ', 'ਮਾਰ', 'ਅਪ੍ਰੈ', 'ਮਈ', 'ਜੂਨ',
+ 'ਜੁਲਾ', 'ਅਗ', 'ਸਤੰ', 'ਅਕ', 'ਨਵੰ', 'ਦਸੰ'
+ ],
+ date: '%d-%m-%Y'
+ }
+};
diff --git a/lib/locales/pl.js b/lib/locales/pl.js
new file mode 100644
index 00000000000..ee1d00244e8
--- /dev/null
+++ b/lib/locales/pl.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'pl',
+ dictionary: {},
+ format: {
+ days: [
+ 'Niedziela', 'Poniedzialek', 'Wtorek', 'Środa',
+ 'Czwartek', 'Piątek', 'Sobota'
+ ],
+ shortDays: ['Nie', 'Pn', 'Wt', 'Śr', 'Czw', 'Pt', 'So'],
+ months: [
+ 'Styczeń', 'Luty', 'Marzec', 'Kwiecień', 'Maj', 'Czerwiec',
+ 'Lipiec', 'Sierpień', 'Wrzesień', 'Październik', 'Listopad', 'Grudzień'
+ ],
+ shortMonths: [
+ 'Sty', 'Lu', 'Mar', 'Kw', 'Maj', 'Cze',
+ 'Lip', 'Sie', 'Wrz', 'Pa', 'Lis', 'Gru'
+ ],
+ date: '%Y-%m-%d'
+ }
+};
diff --git a/lib/locales/pt-br.js b/lib/locales/pt-br.js
new file mode 100644
index 00000000000..97ed7d1c6aa
--- /dev/null
+++ b/lib/locales/pt-br.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'pt-BR',
+ dictionary: {},
+ format: {
+ days: [
+ 'Domingo', 'Segunda-feira', 'Terça-feira', 'Quarta-feira',
+ 'Quinta-feira', 'Sexta-feira', 'Sábado'
+ ],
+ shortDays: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'],
+ months: [
+ 'Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho',
+ 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'
+ ],
+ shortMonths: [
+ 'Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun',
+ 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/rm.js b/lib/locales/rm.js
new file mode 100644
index 00000000000..451f76ac510
--- /dev/null
+++ b/lib/locales/rm.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'rm',
+ dictionary: {},
+ format: {
+ days: [
+ 'Dumengia', 'Glindesdi', 'Mardi', 'Mesemna',
+ 'Gievgia', 'Venderdi', 'Sonda'
+ ],
+ shortDays: ['Dum', 'Gli', 'Mar', 'Mes', 'Gie', 'Ven', 'Som'],
+ months: [
+ 'Schaner', 'Favrer', 'Mars', 'Avrigl', 'Matg', 'Zercladur',
+ 'Fanadur', 'Avust', 'Settember', 'October', 'November', 'December'
+ ],
+ shortMonths: [
+ 'Scha', 'Fev', 'Mar', 'Avr', 'Matg', 'Zer',
+ 'Fan', 'Avu', 'Sett', 'Oct', 'Nov', 'Dec'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/ro.js b/lib/locales/ro.js
new file mode 100644
index 00000000000..d5865ae040a
--- /dev/null
+++ b/lib/locales/ro.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'ro',
+ dictionary: {},
+ format: {
+ days: ['Duminică', 'Luni', 'Marti', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'],
+ shortDays: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'],
+ months: [
+ 'Ianuarie', 'Februarie', 'Martie', 'Aprilie', 'Mai', 'Iunie',
+ 'Iulie', 'August', 'Septembrie', 'Octombrie', 'Noiembrie', 'Decembrie'
+ ],
+ shortMonths: [
+ 'Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun',
+ 'Iul', 'Aug', 'Sep', 'Oct', 'Noi', 'Dec'
+ ],
+ date: '%d.%m.%Y'
+ }
+};
diff --git a/lib/locales/ru.js b/lib/locales/ru.js
new file mode 100644
index 00000000000..b5b1f6a46f1
--- /dev/null
+++ b/lib/locales/ru.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'ru',
+ dictionary: {},
+ format: {
+ days: [
+ 'воскресенье', 'понедельник', 'вторник', 'среда',
+ 'четверг', 'пятница', 'суббота'
+ ],
+ shortDays: ['вск', 'пнд', 'втр', 'срд', 'чтв', 'птн', 'сбт'],
+ months: [
+ 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь',
+ 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'
+ ],
+ shortMonths: [
+ 'Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн',
+ 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'
+ ],
+ date: '%d.%m.%Y'
+ }
+};
diff --git a/lib/locales/sk.js b/lib/locales/sk.js
new file mode 100644
index 00000000000..ec45ca71e41
--- /dev/null
+++ b/lib/locales/sk.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'sk',
+ dictionary: {},
+ format: {
+ days: ['Nedel\'a', 'Pondelok', 'Utorok', 'Streda', 'Štvrtok', 'Piatok', 'Sobota'],
+ shortDays: ['Ned', 'Pon', 'Uto', 'Str', 'Štv', 'Pia', 'Sob'],
+ months: [
+ 'Január', 'Február', 'Marec', 'Apríl', 'Máj', 'Jún',
+ 'Júl', 'August', 'September', 'Október', 'November', 'December'
+ ],
+ shortMonths: [
+ 'Jan', 'Feb', 'Mar', 'Apr', 'Máj', 'Jún',
+ 'Júl', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'
+ ],
+ date: '%d.%m.%Y'
+ }
+};
diff --git a/lib/locales/sl.js b/lib/locales/sl.js
new file mode 100644
index 00000000000..e1ef19406f8
--- /dev/null
+++ b/lib/locales/sl.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'sl',
+ dictionary: {},
+ format: {
+ days: ['Nedelja', 'Ponedeljek', 'Torek', 'Sreda', 'Četrtek', 'Petek', 'Sobota'],
+ shortDays: ['Ned', 'Pon', 'Tor', 'Sre', 'Čet', 'Pet', 'Sob'],
+ months: [
+ 'Januar', 'Februar', 'Marec', 'April', 'Maj', 'Junij',
+ 'Julij', 'Avgust', 'September', 'Oktober', 'November', 'December'
+ ],
+ shortMonths: [
+ 'Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun',
+ 'Jul', 'Avg', 'Sep', 'Okt', 'Nov', 'Dec'
+ ],
+ date: '%d.%m.%Y'
+ }
+};
diff --git a/lib/locales/sq.js b/lib/locales/sq.js
new file mode 100644
index 00000000000..4d16a024c57
--- /dev/null
+++ b/lib/locales/sq.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'sq',
+ dictionary: {},
+ format: {
+ days: [
+ 'E Diel', 'E Hënë', 'E Martë', 'E Mërkurë',
+ 'E Enjte', 'E Premte', 'E Shtune'
+ ],
+ shortDays: ['Di', 'Hë', 'Ma', 'Më', 'En', 'Pr', 'Sh'],
+ months: [
+ 'Janar', 'Shkurt', 'Mars', 'Prill', 'Maj', 'Qershor',
+ 'Korrik', 'Gusht', 'Shtator', 'Tetor', 'Nëntor', 'Dhjetor'
+ ],
+ shortMonths: [
+ 'Jan', 'Shk', 'Mar', 'Pri', 'Maj', 'Qer',
+ 'Kor', 'Gus', 'Sht', 'Tet', 'Nën', 'Dhj'
+ ],
+ date: '%d.%m.%Y'
+ }
+};
diff --git a/lib/locales/sr-sr.js b/lib/locales/sr-sr.js
new file mode 100644
index 00000000000..ce70bd6d769
--- /dev/null
+++ b/lib/locales/sr-sr.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'sr-SR',
+ dictionary: {},
+ format: {
+ days: ['Nedelja', 'Ponedeljak', 'Utorak', 'Sreda', 'Četvrtak', 'Petak', 'Subota'],
+ shortDays: ['Ned', 'Pon', 'Uto', 'Sre', 'Čet', 'Pet', 'Sub'],
+ months: [
+ 'Januar', 'Februar', 'Mart', 'April', 'Maj', 'Jun',
+ 'Jul', 'Avgust', 'Septembar', 'Oktobar', 'Novembar', 'Decembar'
+ ],
+ shortMonths: [
+ 'Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun',
+ 'Jul', 'Avg', 'Sep', 'Okt', 'Nov', 'Dec'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/sr.js b/lib/locales/sr.js
new file mode 100644
index 00000000000..849660d0951
--- /dev/null
+++ b/lib/locales/sr.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'sr',
+ dictionary: {},
+ format: {
+ days: ['Недеља', 'Понедељак', 'Уторак', 'Среда', 'Четвртак', 'Петак', 'Субота'],
+ shortDays: ['Нед', 'Пон', 'Уто', 'Сре', 'Чет', 'Пет', 'Суб'],
+ months: [
+ 'Јануар', 'Фебруар', 'Март', 'Април', 'Мај', 'Јун',
+ 'Јул', 'Август', 'Септембар', 'Октобар', 'Новембар', 'Децембар'
+ ],
+ shortMonths: [
+ 'Јан', 'Феб', 'Мар', 'Апр', 'Мај', 'Јун',
+ 'Јул', 'Авг', 'Сеп', 'Окт', 'Нов', 'Дец'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/sv.js b/lib/locales/sv.js
new file mode 100644
index 00000000000..4b4738a4e54
--- /dev/null
+++ b/lib/locales/sv.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'sv',
+ dictionary: {},
+ format: {
+ days: ['Söndag', 'Måndag', 'Tisdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lördag'],
+ shortDays: ['Sön', 'Mån', 'Tis', 'Ons', 'Tor', 'Fre', 'Lör'],
+ months: [
+ 'Januari', 'Februari', 'Mars', 'April', 'Maj', 'Juni',
+ 'Juli', 'Augusti', 'September', 'Oktober', 'November', 'December'
+ ],
+ shortMonths: [
+ 'Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'
+ ],
+ date: '%Y-%m-%d'
+ }
+};
diff --git a/lib/locales/ta.js b/lib/locales/ta.js
new file mode 100644
index 00000000000..0497af7c838
--- /dev/null
+++ b/lib/locales/ta.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'ta',
+ dictionary: {},
+ format: {
+ days: [
+ 'ஞாயிற்றுக்கிழமை', 'திங்கட்கிழமை', 'செவ்வாய்க்கிழமை', 'புதன்கிழமை',
+ 'வியாழக்கிழமை', 'வெள்ளிக்கிழமை', 'சனிக்கிழமை'
+ ],
+ shortDays: ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'],
+ months: [
+ 'தை', 'மாசி', 'பங்குனி', 'சித்திரை', 'வைகாசி', 'ஆனி',
+ 'ஆடி', 'ஆவணி', 'புரட்டாசி', 'ஐப்பசி', 'கார்த்திகை', 'மார்கழி'
+ ],
+ shortMonths: [
+ 'தை', 'மாசி', 'பங்', 'சித்', 'வைகா', 'ஆனி',
+ 'ஆடி', 'ஆவ', 'புர', 'ஐப்', 'கார்', 'மார்'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/th.js b/lib/locales/th.js
new file mode 100644
index 00000000000..1fca3eb3f5e
--- /dev/null
+++ b/lib/locales/th.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'th',
+ dictionary: {},
+ format: {
+ days: ['อาทิตย์', 'จันทร์', 'อังคาร', 'พุธ', 'พฤหัสบดี', 'ศุกร์', 'เสาร์'],
+ shortDays: ['อา.', 'จ.', 'อ.', 'พ.', 'พฤ.', 'ศ.', 'ส.'],
+ months: [
+ 'มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน', 'พฤษภาคม', 'มิถุนายน',
+ 'กรกฎาคม', 'สิงหาคม', 'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม'
+ ],
+ shortMonths: [
+ 'ม.ค.', 'ก.พ.', 'มี.ค.', 'เม.ย.', 'พ.ค.', 'มิ.ย.',
+ 'ก.ค.', 'ส.ค.', 'ก.ย.', 'ต.ค.', 'พ.ย.', 'ธ.ค.'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/tr.js b/lib/locales/tr.js
new file mode 100644
index 00000000000..bffe30abbcc
--- /dev/null
+++ b/lib/locales/tr.js
@@ -0,0 +1,28 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'tr',
+ dictionary: {},
+ format: {
+ days: ['Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'],
+ shortDays: ['Pz', 'Pt', 'Sa', 'Ça', 'Pe', 'Cu', 'Ct'],
+ months: [
+ 'Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran',
+ 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'
+ ],
+ shortMonths: [
+ 'Oca', 'Şub', 'Mar', 'Nis', 'May', 'Haz',
+ 'Tem', 'Ağu', 'Eyl', 'Eki', 'Kas', 'Ara'
+ ],
+ date: '%d.%m.%Y'
+ }
+};
diff --git a/lib/locales/tt.js b/lib/locales/tt.js
new file mode 100644
index 00000000000..17b4aaadff4
--- /dev/null
+++ b/lib/locales/tt.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'tt',
+ dictionary: {},
+ format: {
+ days: [
+ 'якшәмбе', 'дүшәмбе', 'сишәмбе', 'чәршәмбе',
+ 'пәнҗешәмбе', 'җомга', 'шимбә'
+ ],
+ shortDays: ['якш', 'дүш', 'сиш', 'чәр', 'пән', 'җом', 'шим'],
+ months: [
+ 'Гынвар', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь',
+ 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'
+ ],
+ shortMonths: [
+ 'Гыйн', 'Фев', 'Мар', 'Апр', 'Май', 'Июн',
+ 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'
+ ],
+ date: '%d.%m.%Y'
+ }
+};
diff --git a/lib/locales/uk.js b/lib/locales/uk.js
new file mode 100644
index 00000000000..bf38fcd2233
--- /dev/null
+++ b/lib/locales/uk.js
@@ -0,0 +1,31 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'uk',
+ dictionary: {},
+ format: {
+ days: [
+ 'неділя', 'понеділок', 'вівторок', 'середа',
+ 'четвер', 'п\'ятниця', 'субота'
+ ],
+ shortDays: ['нед', 'пнд', 'вів', 'срд', 'чтв', 'птн', 'сбт'],
+ months: [
+ 'Січень', 'Лютий', 'Березень', 'Квітень', 'Травень', 'Червень',
+ 'Липень', 'Серпень', 'Вересень', 'Жовтень', 'Листопад', 'Грудень'
+ ],
+ shortMonths: [
+ 'Січ', 'Лют', 'Бер', 'Кві', 'Тра', 'Чер',
+ 'Лип', 'Сер', 'Вер', 'Жов', 'Лис', 'Гру'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/ur.js b/lib/locales/ur.js
new file mode 100644
index 00000000000..01b270a84d5
--- /dev/null
+++ b/lib/locales/ur.js
@@ -0,0 +1,25 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'ur',
+ dictionary: {},
+ format: {
+ days: ['اتوار', 'پير', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'ہفتہ'],
+ shortDays: ['اتوار', 'پير', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'ہفتہ'],
+ months: [
+ 'جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون',
+ 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'
+ ],
+ shortMonths: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/vi.js b/lib/locales/vi.js
new file mode 100644
index 00000000000..cc352d05e88
--- /dev/null
+++ b/lib/locales/vi.js
@@ -0,0 +1,38 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'vi',
+ dictionary: {},
+ format: {
+ days: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'],
+ shortDays: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+ months: [
+ 'Tháng Một',
+ 'Tháng Hai',
+ 'Tháng Ba',
+ 'Tháng Tư',
+ 'Tháng Năm',
+ 'Tháng Sáu',
+ 'Tháng Bảy',
+ 'Tháng Tám',
+ 'Tháng Chín',
+ 'Tháng Mười',
+ 'Tháng Mười Một',
+ 'Tháng Mười Hai'
+ ],
+ shortMonths: [
+ 'Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6',
+ 'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'
+ ],
+ date: '%d/%m/%Y'
+ }
+};
diff --git a/lib/locales/zh-cn.js b/lib/locales/zh-cn.js
new file mode 100644
index 00000000000..e3c20b16291
--- /dev/null
+++ b/lib/locales/zh-cn.js
@@ -0,0 +1,22 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'zh-CN',
+ dictionary: {},
+ format: {
+ days: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
+ shortDays: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
+ months: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
+ shortMonths: ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二'],
+ date: '%Y-%m-%d'
+ }
+};
diff --git a/lib/locales/zh-hk.js b/lib/locales/zh-hk.js
new file mode 100644
index 00000000000..0b7a80c0277
--- /dev/null
+++ b/lib/locales/zh-hk.js
@@ -0,0 +1,22 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'zh-HK',
+ dictionary: {},
+ format: {
+ days: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
+ shortDays: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
+ months: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
+ shortMonths: ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二'],
+ date: '%d-%m-%Y'
+ }
+};
diff --git a/lib/locales/zh-tw.js b/lib/locales/zh-tw.js
new file mode 100644
index 00000000000..04ee9497f52
--- /dev/null
+++ b/lib/locales/zh-tw.js
@@ -0,0 +1,22 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'zh-TW',
+ dictionary: {},
+ format: {
+ days: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
+ shortDays: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
+ months: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
+ shortMonths: ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二'],
+ date: '%Y/%m/%d'
+ }
+};
diff --git a/package.json b/package.json
index 788d6af96b7..26da4f3e43b 100644
--- a/package.json
+++ b/package.json
@@ -144,6 +144,7 @@
"read-last-lines": "^1.1.0",
"requirejs": "^2.3.1",
"through2": "^2.0.3",
+ "true-case-path": "^1.0.2",
"watchify": "^3.9.0",
"xml2js": "^0.4.16"
}
diff --git a/src/core.js b/src/core.js
index b51b8e82ce9..820c646a99d 100644
--- a/src/core.js
+++ b/src/core.js
@@ -65,6 +65,12 @@ exports.register([
require('./components/rangeselector')
]);
+// locales en and en-US are required for default behavior
+exports.register([
+ require('./locale-en'),
+ require('./locale-en-us')
+]);
+
// plot icons
exports.Icons = require('../build/ploticon');
diff --git a/src/lib/dates.js b/src/lib/dates.js
index 7b959c1c2c4..0b0ba670fab 100644
--- a/src/lib/dates.js
+++ b/src/lib/dates.js
@@ -367,7 +367,7 @@ exports.cleanDate = function(v, dflt, calendar) {
* %{n}f where n is the max number of digits of fractional seconds
*/
var fracMatch = /%\d?f/g;
-function modDateFormat(fmt, x, calendar) {
+function modDateFormat(fmt, x, formatter, calendar) {
fmt = fmt.replace(fracMatch, function(match) {
var digits = Math.min(+(match.charAt(1)) || 6, 6),
@@ -387,7 +387,7 @@ function modDateFormat(fmt, x, calendar) {
return 'Invalid';
}
}
- return utcFormat(fmt)(d);
+ return formatter(fmt)(d);
}
/*
@@ -433,10 +433,12 @@ function formatTime(x, tr) {
return timeStr;
}
-var yearFormat = utcFormat('%Y'),
- monthFormat = utcFormat('%b %Y'),
- dayFormat = utcFormat('%b %-d'),
- yearMonthDayFormat = utcFormat('%b %-d, %Y');
+// TODO: do these strings need to be localized?
+// ie this gives "Dec 13, 2017" but some languages may want eg "13-Dec 2017"
+var yearFormatD3 = '%Y';
+var monthFormatD3 = '%b %Y';
+var dayFormatD3 = '%b %-d';
+var yearMonthDayFormatD3 = '%b %-d, %Y';
function yearFormatWorld(cDate) { return cDate.formatDate('yyyy'); }
function monthFormatWorld(cDate) { return cDate.formatDate('M yyyy'); }
@@ -450,6 +452,8 @@ function yearMonthDayFormatWorld(cDate) { return cDate.formatDate('M d, yyyy');
* fmt: optional, an explicit format string (d3 format, even for world calendars)
* tr: tickround ('y', 'm', 'd', 'M', 'S', or # digits)
* used if no explicit fmt is provided
+ * formatter: locale-aware d3 date formatter for standard gregorian calendars
+ * should be the result of exports.getD3DateFormat(gd)
* calendar: optional string, the world calendar system to use
*
* returns the date/time as a string, potentially with the leading portion
@@ -458,13 +462,13 @@ function yearMonthDayFormatWorld(cDate) { return cDate.formatDate('M d, yyyy');
* the axis may choose to strip things after it when they don't change from
* one tick to the next (as it does with automatic formatting)
*/
-exports.formatDate = function(x, fmt, tr, calendar) {
+exports.formatDate = function(x, fmt, tr, formatter, calendar) {
var headStr,
dateStr;
calendar = isWorldCalendar(calendar) && calendar;
- if(fmt) return modDateFormat(fmt, x, calendar);
+ if(fmt) return modDateFormat(fmt, x, formatter, calendar);
if(calendar) {
try {
@@ -488,14 +492,14 @@ exports.formatDate = function(x, fmt, tr, calendar) {
else {
var d = new Date(Math.floor(x + 0.05));
- if(tr === 'y') dateStr = yearFormat(d);
- else if(tr === 'm') dateStr = monthFormat(d);
+ if(tr === 'y') dateStr = formatter(yearFormatD3)(d);
+ else if(tr === 'm') dateStr = formatter(monthFormatD3)(d);
else if(tr === 'd') {
- headStr = yearFormat(d);
- dateStr = dayFormat(d);
+ headStr = formatter(yearFormatD3)(d);
+ dateStr = formatter(dayFormatD3)(d);
}
else {
- headStr = yearMonthDayFormat(d);
+ headStr = formatter(yearMonthDayFormatD3)(d);
dateStr = formatTime(x, tr);
}
}
diff --git a/src/lib/localize.js b/src/lib/localize.js
index 4a5e367c12c..8bd6c445e93 100644
--- a/src/lib/localize.js
+++ b/src/lib/localize.js
@@ -17,7 +17,7 @@ var Registry = require('../registry');
* @param {object} gd: the graphDiv for context
* gd._context.locale determines the language (& optional region/country)
* the dictionary for each locale may either be supplied in
- * gd._context.dictionaries or globally via Plotly.register
+ * gd._context.locales or globally via Plotly.register
* @param {string} s: the string to translate
*/
module.exports = function localize(gd, s) {
@@ -35,14 +35,14 @@ module.exports = function localize(gd, s) {
* fall back on the base.
*/
for(var i = 0; i < 2; i++) {
- var dicts = gd._context.dictionaries;
+ var locales = gd._context.locales;
for(var j = 0; j < 2; j++) {
- var dict = dicts[locale];
+ var dict = (locales[locale] || {}).dictionary;
if(dict) {
var out = dict[s];
if(out) return out;
}
- dicts = Registry.localeRegistry;
+ locales = Registry.localeRegistry;
}
var baseLocale = locale.split('-')[0];
diff --git a/lib/locale-en-us.js b/src/locale-en-us.js
similarity index 89%
rename from lib/locale-en-us.js
rename to src/locale-en-us.js
index 97996970ae0..015495311ca 100644
--- a/lib/locale-en-us.js
+++ b/src/locale-en-us.js
@@ -13,5 +13,8 @@ module.exports = {
name: 'en-US',
dictionary: {
'Click to enter Colorscale title': 'Click to enter Colorscale title'
+ },
+ format: {
+ date: '%m/%d/%Y'
}
};
diff --git a/src/locale-en.js b/src/locale-en.js
new file mode 100644
index 00000000000..33e4e455f42
--- /dev/null
+++ b/src/locale-en.js
@@ -0,0 +1,37 @@
+/**
+* Copyright 2012-2017, Plotly, Inc.
+* All rights reserved.
+*
+* This source code is licensed under the MIT license found in the
+* LICENSE file in the root directory of this source tree.
+*/
+
+'use strict';
+
+module.exports = {
+ moduleType: 'locale',
+ name: 'en',
+ dictionary: {
+ 'Click to enter Colorscale title': 'Click to enter Colourscale title'
+ },
+ format: {
+ days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],
+ shortDays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+ months: [
+ 'January', 'February', 'March', 'April', 'May', 'June',
+ 'July', 'August', 'September', 'October', 'November', 'December'
+ ],
+ shortMonths: [
+ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
+ ],
+ periods: ['AM', 'PM'],
+ dateTime: '%a %b %e %X %Y',
+ date: '%d/%m/%Y',
+ time: '%H:%M:%S',
+ decimal: '.',
+ thousands: ',',
+ grouping: [3],
+ currency: ['$', '']
+ }
+};
diff --git a/src/plot_api/plot_config.js b/src/plot_api/plot_config.js
index b1663e6b9ac..a6b3d579e90 100644
--- a/src/plot_api/plot_config.js
+++ b/src/plot_api/plot_config.js
@@ -21,13 +21,17 @@ module.exports = {
// no interactivity, for export or image generation
staticPlot: false,
- // we can edit titles, move annotations, etc - sets all pieces of `edits`
- // unless a separate `edits` config item overrides individual parts
+ /*
+ * we can edit titles, move annotations, etc - sets all pieces of `edits`
+ * unless a separate `edits` config item overrides individual parts
+ */
editable: false,
edits: {
- // annotationPosition: the main anchor of the annotation, which is the
- // text (if no arrow) or the arrow (which drags the whole thing leaving
- // the arrow length & direction unchanged)
+ /*
+ * annotationPosition: the main anchor of the annotation, which is the
+ * text (if no arrow) or the arrow (which drags the whole thing leaving
+ * the arrow length & direction unchanged)
+ */
annotationPosition: false,
// just for annotations with arrows, change the length and direction of the arrow
annotationTail: false,
@@ -43,8 +47,10 @@ module.exports = {
titleText: false
},
- // DO autosize once regardless of layout.autosize
- // (use default width or height values otherwise)
+ /*
+ * DO autosize once regardless of layout.autosize
+ * (use default width or height values otherwise)
+ */
autosizable: false,
// set the length of the undo/redo queue
@@ -68,7 +74,10 @@ module.exports = {
// enable axis pan/zoom drag handles
showAxisDragHandles: true,
- // enable direct range entry at the pan/zoom drag points (drag handles must be enabled above)
+ /*
+ * enable direct range entry at the pan/zoom drag points
+ * (drag handles must be enabled above)
+ */
showAxisRangeEntryBoxes: true,
// link to open this plot in plotly
@@ -86,18 +95,24 @@ module.exports = {
// display the mode bar (true, false, or 'hover')
displayModeBar: 'hover',
- // remove mode bar button by name
- // (see ./components/modebar/buttons.js for the list of names)
+ /*
+ * remove mode bar button by name
+ * (see ./components/modebar/buttons.js for the list of names)
+ */
modeBarButtonsToRemove: [],
- // add mode bar button using config objects
- // (see ./components/modebar/buttons.js for list of arguments)
+ /*
+ * add mode bar button using config objects
+ * (see ./components/modebar/buttons.js for list of arguments)
+ */
modeBarButtonsToAdd: [],
- // fully custom mode bar buttons as nested array,
- // where the outer arrays represents button groups, and
- // the inner arrays have buttons config objects or names of default buttons
- // (see ./components/modebar/buttons.js for more info)
+ /*
+ * fully custom mode bar buttons as nested array,
+ * where the outer arrays represents button groups, and
+ * the inner arrays have buttons config objects or names of default buttons
+ * (see ./components/modebar/buttons.js for more info)
+ */
modeBarButtons: false,
// add the plotly logo on the end of the mode bar
@@ -106,42 +121,65 @@ module.exports = {
// increase the pixel ratio for Gl plot images
plotGlPixelRatio: 2,
- // background setting function
- // 'transparent' sets the background `layout.paper_color`
- // 'opaque' blends bg color with white ensuring an opaque background
- // or any other custom function of gd
+ /*
+ * background setting function
+ * 'transparent' sets the background `layout.paper_color`
+ * 'opaque' blends bg color with white ensuring an opaque background
+ * or any other custom function of gd
+ */
setBackground: 'transparent',
// URL to topojson files used in geo charts
topojsonURL: 'https://cdn.plot.ly/',
- // Mapbox access token (required to plot mapbox trace types)
- // If using an Mapbox Atlas server, set this option to '',
- // so that plotly.js won't attempt to authenticate to the public Mapbox server.
+ /*
+ * Mapbox access token (required to plot mapbox trace types)
+ * If using an Mapbox Atlas server, set this option to '',
+ * so that plotly.js won't attempt to authenticate to the public Mapbox server.
+ */
mapboxAccessToken: null,
- // Turn all console logging on or off (errors will be thrown)
- // This should ONLY be set via Plotly.setPlotConfig
- // 0: no logs
- // 1: warnings and errors, but not informational messages
- // 2: verbose logs
+ /*
+ * Turn all console logging on or off (errors will be thrown)
+ * This should ONLY be set via Plotly.setPlotConfig
+ * 0: no logs
+ * 1: warnings and errors, but not informational messages
+ * 2: verbose logs
+ */
logging: 1,
- // Set global transform to be applied to all traces with no
- // specification needed
+ /*
+ * Set global transform to be applied to all traces with no
+ * specification needed
+ */
globalTransforms: [],
- // Which localization should we use?
- // Should be a string like 'en' or 'en-US'.
+ /*
+ * Which localization should we use?
+ * Should be a string like 'en' or 'en-US'.
+ */
locale: 'en-US',
- // Localization dictionaries
- // Dictionaries can be provided either here (specific to one chart) or globally
- // by registering them as modules.
- // Here `dictionaries` should be an object of objects
- // {'da': {'Reset axes': 'Nulstil aksler', ...}, ...}
- // When looking for a translation we look at these dictionaries first, then
- // the ones registered as modules. If those fail, we strip off any
- // regionalization ('en-US' -> 'en') and try each again
- dictionaries: {}
+ /*
+ * Localization definitions
+ * Locales can be provided either here (specific to one chart) or globally
+ * by registering them as modules.
+ * Should be an object of objects {locale: {dictionary: {...}, format: {...}}}
+ * {
+ * da: {
+ * dictionary: {'Reset axes': 'Nulstil aksler', ...},
+ * format: {months: [...], shortMonths: [...]}
+ * },
+ * ...
+ * }
+ * All parts are optional. When looking for translation or format fields, we
+ * look first for an exact match in a config locale, then in a registered
+ * module. If those fail, we strip off any regionalization ('en-US' -> 'en')
+ * and try each (config, registry) again. The final fallback for translation
+ * is untranslated (which is US English) and for formats is the base English
+ * (the only consequence being the last fallback date format %x is DD/MM/YYYY
+ * instead of MM/DD/YYYY). Currently `grouping` and `currency` are ignored
+ * for our automatic number formatting, but can be used in custom formats.
+ */
+ locales: {}
};
diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js
index a72ed431335..957762ec52b 100644
--- a/src/plots/cartesian/axes.js
+++ b/src/plots/cartesian/axes.js
@@ -1273,7 +1273,7 @@ function formatDate(ax, out, hover, extraPrecision) {
else tr = {y: 'm', m: 'd', d: 'M', M: 'S', S: 4}[tr];
}
- var dateStr = Lib.formatDate(out.x, fmt, tr, ax.calendar),
+ var dateStr = Lib.formatDate(out.x, fmt, tr, ax._dateFormat, ax.calendar),
headStr;
var splitIndex = dateStr.indexOf('\n');
@@ -1451,7 +1451,7 @@ function numFormat(v, ax, fmtoverride, hover) {
if(ax.hoverformat) tickformat = ax.hoverformat;
}
- if(tickformat) return d3.format(tickformat)(v).replace(/-/g, MINUS_SIGN);
+ if(tickformat) return ax._numFormat(tickformat)(v).replace(/-/g, MINUS_SIGN);
// 'epsilon' - rounding increment
var e = Math.pow(10, -tickRound) / 2;
diff --git a/src/plots/cartesian/set_convert.js b/src/plots/cartesian/set_convert.js
index a1ea55c76fd..82ac789be31 100644
--- a/src/plots/cartesian/set_convert.js
+++ b/src/plots/cartesian/set_convert.js
@@ -447,9 +447,19 @@ module.exports = function setConvert(ax, fullLayout) {
ax._min = [];
ax._max = [];
- // copy ref to fullLayout.separators so that
+ // Propagate localization into the axis so that
// methods in Axes can use it w/o having to pass fullLayout
+ // Default (non-d3) number formatting uses separators directly
+ // dates and d3-formatted numbers use the d3 locale
+ // Fall back on default format for dummy axes that don't care about formatting
+ var locale = fullLayout._d3locale;
+ if(ax.type === 'date') {
+ ax._dateFormat = locale ? locale.timeFormat.utc : d3.time.format.utc;
+ }
+ // occasionally we need _numFormat to pass through
+ // even though it won't be needed by this axis
ax._separators = fullLayout.separators;
+ ax._numFormat = locale ? locale.numberFormat : d3.format;
// and for bar charts and box plots: reset forced minimum tick spacing
delete ax._minDtick;
diff --git a/src/plots/layout_attributes.js b/src/plots/layout_attributes.js
index 86f473a6afb..3e07d25be92 100644
--- a/src/plots/layout_attributes.js
+++ b/src/plots/layout_attributes.js
@@ -147,12 +147,12 @@ module.exports = {
separators: {
valType: 'string',
role: 'style',
- dflt: '.,',
editType: 'plot',
description: [
'Sets the decimal and thousand separators.',
- 'For example, *. * puts a \'.\' before decimals and',
- 'a space between thousands.'
+ 'For example, *. * puts a \'.\' before decimals and a space',
+ 'between thousands. In English locales, dflt is *.,* but',
+ 'other locales may alter this default.'
].join(' ')
},
hidesources: {
diff --git a/src/plots/plots.js b/src/plots/plots.js
index db5d224674a..7fb5ade0c80 100644
--- a/src/plots/plots.js
+++ b/src/plots/plots.js
@@ -438,6 +438,8 @@ plots.supplyDefaults = function(gd) {
};
newFullLayout._traceWord = _(gd, 'trace');
+ var formatObj = getD3FormatObj(gd);
+
// first fill in what we can of layout without looking at data
// because fullData needs a few things from layout
@@ -447,7 +449,7 @@ plots.supplyDefaults = function(gd) {
var oldWidth = oldFullLayout.width,
oldHeight = oldFullLayout.height;
- plots.supplyLayoutGlobalDefaults(newLayout, newFullLayout);
+ plots.supplyLayoutGlobalDefaults(newLayout, newFullLayout, formatObj);
if(!newLayout.width) newFullLayout.width = oldWidth;
if(!newLayout.height) newFullLayout.height = oldHeight;
@@ -455,7 +457,7 @@ plots.supplyDefaults = function(gd) {
else {
// coerce the updated layout and autosize if needed
- plots.supplyLayoutGlobalDefaults(newLayout, newFullLayout);
+ plots.supplyLayoutGlobalDefaults(newLayout, newFullLayout, formatObj);
var missingWidthOrHeight = (!newLayout.width || !newLayout.height),
autosize = newFullLayout.autosize,
@@ -472,6 +474,8 @@ plots.supplyDefaults = function(gd) {
}
}
+ newFullLayout._d3locale = getFormatter(formatObj, newFullLayout.separators);
+
newFullLayout._initialAutoSizeIsDone = true;
// keep track of how many traces are inputted
@@ -563,6 +567,83 @@ function remapTransformedArrays(cd0, newTrace) {
}
}
+var formatKeys = [
+ 'days', 'shortDays', 'months', 'shortMonths', 'periods',
+ 'dateTime', 'date', 'time',
+ 'decimal', 'thousands', 'grouping', 'currency'
+];
+
+/**
+ * getD3FormatObj: use _context to get the d3.locale argument object.
+ * decimal and thousands can be overridden later by layout.separators
+ * grouping and currency are not presently used by our automatic number
+ * formatting system but can be used by custom formats.
+ *
+ * @returns {object} d3.locale format object
+ */
+function getD3FormatObj(gd) {
+ var locale = gd._context.locale;
+ if(!locale) locale === 'en-US';
+
+ var formatDone = false;
+ var formatObj = {};
+
+ function includeFormat(newFormat) {
+ var formatFinished = true;
+ for(var i = 0; i < formatKeys.length; i++) {
+ var formatKey = formatKeys[i];
+ if(!formatObj[formatKey]) {
+ if(newFormat[formatKey]) {
+ formatObj[formatKey] = newFormat[formatKey];
+ }
+ else formatFinished = false;
+ }
+ }
+ if(formatFinished) formatDone = true;
+ }
+
+ // same as localize, look for format parts in each format spec in the chain
+ for(var i = 0; i < 2; i++) {
+ var locales = gd._context.locales;
+ for(var j = 0; j < 2; j++) {
+ var formatj = (locales[locale] || {}).format;
+ if(formatj) {
+ includeFormat(formatj);
+ if(formatDone) break;
+ }
+ locales = Registry.localeRegistry;
+ }
+
+ var baseLocale = locale.split('-')[0];
+ if(formatDone || baseLocale === locale) break;
+ locale = baseLocale;
+ }
+
+ // lastly pick out defaults from english (non-US, as DMY is so much more common)
+ if(!formatDone) includeFormat(Registry.localeRegistry.en.format);
+
+ return formatObj;
+}
+
+/**
+ * getFormatter: combine the final separators with the locale formatting object
+ * we pulled earlier to generate number and time formatters
+ * TODO: remove separators in v2, only use locale, so we don't need this step?
+ *
+ * @param {object} formatObj: d3.locale format object
+ * @param {string} separators: length-2 string to override decimal and thousands
+ * separators in number formatting
+ *
+ * @returns {object} {numberFormat, timeFormat} d3 formatter factory functions
+ * for numbers and time
+ */
+function getFormatter(formatObj, separators) {
+ formatObj.decimal = separators.charAt(0);
+ formatObj.thousands = separators.charAt(1);
+
+ return d3.locale(formatObj);
+}
+
// Create storage for all of the data related to frames and transitions:
plots.createTransitionData = function(gd) {
// Set up the default keyframe if it doesn't exist:
@@ -1144,7 +1225,7 @@ function applyTransforms(fullTrace, fullData, layout, fullLayout) {
return dataOut;
}
-plots.supplyLayoutGlobalDefaults = function(layoutIn, layoutOut) {
+plots.supplyLayoutGlobalDefaults = function(layoutIn, layoutOut, formatObj) {
function coerce(attr, dflt) {
return Lib.coerce(layoutIn, layoutOut, plots.layoutAttributes, attr, dflt);
}
@@ -1183,7 +1264,7 @@ plots.supplyLayoutGlobalDefaults = function(layoutIn, layoutOut) {
coerce('paper_bgcolor');
- coerce('separators');
+ coerce('separators', formatObj.decimal + formatObj.thousands);
coerce('hidesources');
coerce('colorway');
diff --git a/src/registry.js b/src/registry.js
index b688c1df2dd..89cd47420e3 100644
--- a/src/registry.js
+++ b/src/registry.js
@@ -328,23 +328,42 @@ function getTraceType(traceType) {
* the dictionary mapping input strings to localized strings
* generally the keys should be the literal input strings, but
* if default translations are provided you can use any string as a key.
+ * @param {object} module.format
+ * a `d3.locale` format specifier for this locale
+ * any omitted keys we'll fall back on en-US
*/
exports.registerLocale = function(_module) {
var locale = _module.name;
var baseLocale = locale.split('-')[0];
var newDict = _module.dictionary;
+ var newFormat = _module.format;
+ var hasDict = newDict && Object.keys(newDict).length;
+ var hasFormat = newFormat && Object.keys(newFormat).length;
var locales = exports.localeRegistry;
+ var localeObj = locales[locale];
+ if(!localeObj) locales[locale] = localeObj = {};
+
// Should we use this dict for the base locale?
// In case we're overwriting a previous dict for this locale, check
// whether the base matches the full locale dict now. If we're not
// overwriting, locales[locale] is undefined so this just checks if
// baseLocale already had a dict or not.
- if(baseLocale !== locale && locales[baseLocale] === locales[locale]) {
- locales[baseLocale] = newDict;
+ // Same logic for dateFormats
+ if(baseLocale !== locale) {
+ var baseLocaleObj = locales[baseLocale];
+ if(!baseLocaleObj) locales[baseLocale] = baseLocaleObj = {};
+
+ if(hasDict && baseLocaleObj.dictionary === localeObj.dictionary) {
+ baseLocaleObj.dictionary = newDict;
+ }
+ if(hasFormat && baseLocaleObj.format === localeObj.format) {
+ baseLocaleObj.format = newFormat;
+ }
}
- locales[locale] = newDict;
+ if(hasDict) localeObj.dictionary = newDict;
+ if(hasFormat) localeObj.format = newFormat;
};
diff --git a/src/traces/carpet/axis_defaults.js b/src/traces/carpet/axis_defaults.js
index 8d155985d06..bf932626ffe 100644
--- a/src/traces/carpet/axis_defaults.js
+++ b/src/traces/carpet/axis_defaults.js
@@ -179,8 +179,6 @@ module.exports = function handleAxisDefaults(containerIn, containerOut, options)
}
}
- containerOut._separators = options.fullLayout.separators;
-
// fill in categories
containerOut._initialCategories = axType === 'category' ?
orderedCategories(letter, containerOut.categoryorder, containerOut.categoryarray, options.data) :
diff --git a/src/traces/contour/plot.js b/src/traces/contour/plot.js
index a4f13aa1a73..fff4b9bb234 100644
--- a/src/traces/contour/plot.js
+++ b/src/traces/contour/plot.js
@@ -421,7 +421,7 @@ exports.createLineClip = function(lineContainer, clipLinesForLabels, clips, uid)
exports.labelFormatter = function(contours, colorbar, fullLayout) {
if(contours.labelformat) {
- return d3.format(contours.labelformat);
+ return fullLayout._d3locale.numberFormat(contours.labelformat);
}
else {
var formatAxis;
@@ -431,7 +431,6 @@ exports.labelFormatter = function(contours, colorbar, fullLayout) {
else {
formatAxis = {
type: 'linear',
- _separators: '.,',
_id: 'ycontour',
nticks: (contours.end - contours.start) / contours.size,
showexponent: 'all',
diff --git a/src/traces/contour/style_defaults.js b/src/traces/contour/style_defaults.js
index 9a3c27a24c7..967c426dfb7 100644
--- a/src/traces/contour/style_defaults.js
+++ b/src/traces/contour/style_defaults.js
@@ -46,9 +46,5 @@ module.exports = function handleStyleDefaults(traceIn, traceOut, coerce, layout,
coerce('contours.labelformat');
}
- if(opts.hasHover !== false) {
- coerce('zhoverformat');
- // Needed for formatting of hoverlabel if format is not explicitly specified
- traceOut._separators = layout.separators;
- }
+ if(opts.hasHover !== false) coerce('zhoverformat');
};
diff --git a/src/traces/heatmap/hover.js b/src/traces/heatmap/hover.js
index f8ccaaf0bd9..2db26dfba48 100644
--- a/src/traces/heatmap/hover.js
+++ b/src/traces/heatmap/hover.js
@@ -29,7 +29,6 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode, hoverLay
zmask = cd0.zmask,
range = [trace.zmin, trace.zmax],
zhoverformat = trace.zhoverformat,
- _separators = trace._separators,
x2 = x,
y2 = y,
xl,
@@ -109,7 +108,8 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode, hoverLay
type: 'linear',
range: range,
hoverformat: zhoverformat,
- _separators: _separators
+ _separators: xa._separators,
+ _numFormat: xa._numFormat
};
var zLabelObj = Axes.tickText(dummyAx, zVal, 'hover');
zLabel = zLabelObj.text;
diff --git a/src/traces/heatmap/style_defaults.js b/src/traces/heatmap/style_defaults.js
index 522c374e3dc..1a627db1d5d 100644
--- a/src/traces/heatmap/style_defaults.js
+++ b/src/traces/heatmap/style_defaults.js
@@ -9,7 +9,7 @@
'use strict';
-module.exports = function handleStyleDefaults(traceIn, traceOut, coerce, layout) {
+module.exports = function handleStyleDefaults(traceIn, traceOut, coerce) {
var zsmooth = coerce('zsmooth');
if(zsmooth === false) {
// ensure that xgap and ygap are coerced only when zsmooth allows them to have an effect.
@@ -18,6 +18,4 @@ module.exports = function handleStyleDefaults(traceIn, traceOut, coerce, layout)
}
coerce('zhoverformat');
- // Needed for formatting of hoverlabel if format is not explicitly specified
- traceOut._separators = layout.separators;
};
diff --git a/tasks/bundle.js b/tasks/bundle.js
index a6d7cd3dd64..c88910646c7 100644
--- a/tasks/bundle.js
+++ b/tasks/bundle.js
@@ -60,10 +60,10 @@ constants.partialBundlePaths.forEach(function(pathObj) {
});
// "Browserify" the locales
-var localeGlob = path.join(constants.pathToLib, 'locale-*.js');
+var localeGlob = path.join(constants.pathToLib, 'locales', '*.js');
glob(localeGlob, function(err, files) {
files.forEach(function(file) {
- var outName = 'plotly-' + path.basename(file);
+ var outName = 'plotly-locale-' + path.basename(file);
var outPath = path.join(constants.pathToDist, outName);
wrapLocale(file, outPath);
});
diff --git a/tasks/pull_date_format.js b/tasks/pull_date_format.js
new file mode 100644
index 00000000000..ffda6c1e2e8
--- /dev/null
+++ b/tasks/pull_date_format.js
@@ -0,0 +1,169 @@
+var path = require('path');
+var fs = require('fs');
+var constants = require('./util/constants');
+var common = require('./util/common');
+
+var args = process.argv.slice(2);
+var argLocale = args[0];
+
+var pathToEn = path.join(constants.pathToSrc, 'locale-en.js');
+var pathToWCRegions = path.dirname(require.resolve('world-calendars/dist/regional/en-GB'));
+
+if(!argLocale) {
+ fs.readdir(pathToWCRegions, function(err, items) {
+ if(err) throw err;
+
+ items.forEach(function(item) {
+ var itemLocale = item.split('.')[0];
+ if(itemLocale.substr(0, 2) === 'en') {
+ console.log('skipping English ' + itemLocale);
+ return;
+ }
+ pullOneLocale(itemLocale);
+ });
+ });
+}
+else {
+ pullOneLocale(argLocale);
+}
+
+function pullOneLocale(locale) {
+ var pathToInput = path.join(pathToWCRegions, locale + '.js');
+ var pathToOutput = path.join(constants.pathToLib, 'locales', locale.toLowerCase() + '.js');
+
+ fs.readFile(pathToInput, 'utf8', function(err, wcCode) {
+ if(err) {
+ throw new Error('pull_date_format failed: ' + pathToInput + ' not found');
+ }
+
+ var preStartStr = 'prototype.regionalOptions';
+ var startStr = '] = {';
+ var endStr = '};';
+
+ var startIndex = wcCode.indexOf(startStr, wcCode.indexOf(preStartStr)) + startStr.length - 1;
+ var endIndex = wcCode.indexOf(endStr, startIndex) + 1;
+
+ var dataStr = wcCode.substr(startIndex, endIndex - startIndex);
+
+ // strip out `main.substitute(Chinese)?Digits` - we don't care about the digits field for now anyway
+ dataStr = dataStr.replace(/main[\.][A-Za-z]+\([^\)]*\)/g, '""');
+
+ dataStr = cleanHTMLEntities(dataStr);
+ var wcDataObj = eval('a=' + dataStr);
+
+ fs.readFile(pathToOutput, 'utf8', function(err, existingOutputText) {
+ var isNew = false;
+ if(err || !existingOutputText.trim()) {
+ existingOutputText = fs.readFileSync(pathToEn, 'utf8');
+ isNew = true;
+ }
+
+ var outObjStartStr = 'module.exports = ';
+ var outObjEndStr = '};';
+ var outObjStartIndex = existingOutputText.indexOf(outObjStartStr) + outObjStartStr.length;
+ var outObjEndIndex = existingOutputText.indexOf(outObjEndStr, outObjStartIndex) + 1;
+ var outPrefix = existingOutputText.substr(0, outObjStartIndex);
+ var outSuffix = existingOutputText.substr(outObjEndIndex);
+ var objText = existingOutputText.substr(outObjStartIndex, outObjEndIndex - outObjStartIndex);
+ var outObj;
+ try {
+ outObj = eval('a=' + objText);
+ }
+ catch(e) {
+ throw new Error(locale + '--' + objText);
+ }
+
+ if(isNew) {
+ outObj.name = locale;
+ outObj.dictionary = {};
+ outObj.format = {};
+ }
+
+ var format = outObj.format = (outObj.format || {});
+
+ format.days = wcDataObj.dayNames;
+ format.shortDays = wcDataObj.dayNamesShort;
+ format.months = wcDataObj.monthNames;
+ format.shortMonths = wcDataObj.monthNamesShort;
+ format.date = translateDateFormat(wcDataObj.dateFormat);
+ // leave out `dateTime` and `time` fields. We could include them as cmd line args later
+ // for now these will get inherited from english.
+
+ var outStr = JSON.stringify(outObj, null, 4)
+ .replace(/'/g, '\\\'') // escape single quotes
+ .replace(/"([A-Za-z]\w+)":/g, '$1:') // unquote simple identifier keys
+ .replace(/([^\\])"/g, '$1\'') // replace unescaped doublequotes with singlequotes
+ .replace(/\\"/g, '"'); // unescape escaped doublequotes
+
+ outStr = shortenArrays(outStr);
+
+ common.writeFile(pathToOutput, outPrefix + outStr + outSuffix, function() {
+ console.log('ok pull_date_format ' + locale);
+ });
+ });
+ });
+}
+
+/*
+ * Turn HTML entities into unicode - for explicit compatibility with SVG
+ * There are just a few in world-calendars that aren't already in unicode anyway.
+ */
+var entityMap = {
+ ccedil: '\u00e7',
+ auml: '\u00e4',
+ '#x10C': '\u010c'
+};
+function cleanHTMLEntities(s) {
+ return s.replace(/&([^;]+);/g, function(entity, entityID) {
+ var outChar = entityMap[entityID];
+ if(!outChar) {
+ throw new Error('no unicode character listed for ' + entity);
+ }
+ return outChar;
+ });
+}
+
+/*
+ * Convert world-calendars date format ('dd.mm.yyyy') to d3 ('%d.%m.%Y')
+ */
+function translateDateFormat(wcDateFormat) {
+ var out = wcDateFormat
+ .replace('yyyy', '%Y')
+ // bosnian (bs) uses 2-digit year in world-calendars, but I don't want to continue that!
+ .replace('yy', '%Y')
+ .replace('mm', '%m')
+ .replace('dd', '%d')
+ // gujarati (gu) uses short month name in world-calendars - keep it?
+ .replace('M', '%b');
+
+ return out;
+}
+
+/**
+ * Either put the whole array on one line, split it into 2 lines,
+ * or leave it as is (one line per item), whatever we can fit into 90 characters.
+ * A trailing comma may still be after the 90-character limit
+ */
+function shortenArrays(s) {
+ var maxLen = 91; // max line length plus one for the initial \n.
+
+ return s.replace(/(\n.+\[)\n([^\]]+)\n(\s*)\]/g, function(wholeMatch, prefix, arrayStr, bracketSpaces) {
+
+ var parts = arrayStr.trim().split(/,\n\s*/);
+
+ var singleLine = prefix + parts.join(', ') + ']';
+ if(singleLine.length <= maxLen) {
+ return singleLine;
+ }
+
+ var arraySpaces = bracketSpaces + ' ';
+ var splitPoint = Math.ceil(parts.length / 2);
+ var line1 = arraySpaces + parts.slice(0, splitPoint).join(', ') + ',';
+ var line2 = arraySpaces + parts.slice(splitPoint).join(', ');
+ if(line1.length <= maxLen && line2.length <= maxLen) {
+ return [prefix, line1, line2, bracketSpaces + ']'].join('\n');
+ }
+
+ return wholeMatch;
+ });
+}
diff --git a/tasks/stats.js b/tasks/stats.js
index 63227f1f5b4..ffe345b4e56 100644
--- a/tasks/stats.js
+++ b/tasks/stats.js
@@ -60,22 +60,46 @@ function getInfoContent() {
'',
'```',
'',
- 'To support IE9, put:',
+ '### To support IE9',
+ '',
+ '*Before* the plotly.js script tag, add:',
'',
'```html',
'',
'',
'```',
'',
- 'before the plotly.js script tag.',
+ '### To support MathJax',
'',
- 'To add MathJax, put',
+ '*Before* the plotly.js script tag, add:',
'',
'```html',
'',
'```',
'',
- 'before the plotly.js script tag. You can grab the relevant MathJax files in `./dist/extras/mathjax/`.',
+ 'You can grab the relevant MathJax files in `./dist/extras/mathjax/`.',
+ '',
+ '### To include localization',
+ '',
+ 'Plotly.js defaults to US English (en-US) and includes British English (en) in the standard bundle.',
+ 'Many other localizations are available - here is an example using Swiss-German (de-CH),',
+ 'see the contents of this directory for the full list.',
+ 'They are also available on our CDN as ' + cdnRoot + 'locale-de-ch-latest.js OR ' + cdnRoot + 'locale-de-ch-' + pkg.version + '.js',
+ 'Note that the file names are all lowercase, even though the region is uppercase when you apply a locale.',
+ '',
+ '*After* the plotly.js script tag, add:',
+ '',
+ '```html',
+ '',
+ '',
+ '```',
+ '',
+ 'The first line loads and registers the locale definition with plotly.js, the second sets it as the default for all Plotly plots.',
+ 'You can also include multiple locale definitions and apply them to each plot separately as a `config` parameter:',
+ '',
+ '```js',
+ 'Plotly.newPlot(graphDiv, data, layout, {locale: \'de-CH\'})',
+ '```',
''
];
}
diff --git a/tasks/test_syntax.js b/tasks/test_syntax.js
index 473415da3d2..9c6e9804bd6 100644
--- a/tasks/test_syntax.js
+++ b/tasks/test_syntax.js
@@ -6,6 +6,7 @@ var glob = require('glob');
var madge = require('madge');
var readLastLines = require('read-last-lines');
var eslint = require('eslint');
+var trueCasePath = require('true-case-path');
var constants = require('./util/constants');
var srcGlob = path.join(constants.pathToSrc, '**/*.js');
@@ -55,6 +56,8 @@ function assertJasmineSuites() {
* - check for header comment
* - check that we don't have any features that break in IE
* - check that we don't use getComputedStyle unexpectedly
+ * - check that require statements use lowercase (to match assertFileNames)
+ * or match the case of the source file
*/
function assertSrcContents() {
var licenseSrc = constants.licenseSrc;
@@ -70,6 +73,9 @@ function assertSrcContents() {
// Forbidden in IE in any context
var IE_BLACK_LIST = ['classList'];
+ // require'd built-in modules
+ var BUILTINS = ['events'];
+
var getComputedStyleCnt = 0;
glob(combineGlobs([srcGlob, libGlob]), function(err, files) {
@@ -100,7 +106,28 @@ function assertSrcContents() {
}
else if(node.type === 'Identifier' && node.source() === 'getComputedStyle') {
if(node.parent.source() !== 'window.getComputedStyle') {
- logs.push(file + ': getComputedStyle must be called as a `window` property.');
+ logs.push(file + ' : getComputedStyle must be called as a `window` property.');
+ }
+ }
+ else if(node.type === 'CallExpression' && node.callee.name === 'require') {
+ var pathNode = node.arguments[0];
+ var pathStr = pathNode.value;
+ if(pathNode.type !== 'Literal') {
+ logs.push(file + ' : You may only `require` literals.');
+ }
+ else if(BUILTINS.indexOf(pathStr) === -1) {
+ // node version 8.9.0+ can use require.resolve(request, {paths: [...]})
+ // and avoid this explicit conversion to the current location
+ if(pathStr.charAt(0) === '.') {
+ pathStr = path.relative(__dirname, path.join(path.dirname(file), pathStr));
+ }
+ var fullPath = require.resolve(pathStr);
+ var casedPath = trueCasePath(fullPath);
+
+ if(fullPath !== trueCasePath(fullPath)) {
+ logs.push(file + ' : `require` path is not case-correct:\n' +
+ fullPath + ' -> ' + casedPath);
+ }
}
}
});
diff --git a/test/jasmine/assets/supply_defaults.js b/test/jasmine/assets/supply_defaults.js
index 259950a647e..249b85cecf1 100644
--- a/test/jasmine/assets/supply_defaults.js
+++ b/test/jasmine/assets/supply_defaults.js
@@ -8,7 +8,7 @@ var Plots = require('@src/plots/plots');
module.exports = function supplyDefaults(gd) {
if(!gd._context) gd._context = {};
if(!gd._context.locale) gd._context.locale = 'en';
- if(!gd._context.dictionaries) gd._context.dictionaries = {};
+ if(!gd._context.locales) gd._context.locales = {};
Plots.supplyDefaults(gd);
};
diff --git a/test/jasmine/tests/bar_test.js b/test/jasmine/tests/bar_test.js
index 68c9cbb9700..756f678dcca 100644
--- a/test/jasmine/tests/bar_test.js
+++ b/test/jasmine/tests/bar_test.js
@@ -1522,7 +1522,7 @@ function mockBarPlot(dataWithoutTraceType, layout) {
data: dataWithTraceType,
layout: layout || {},
calcdata: [],
- _context: {locale: 'en', dictionaries: {}}
+ _context: {locale: 'en', locales: {}}
};
supplyAllDefaults(gd);
diff --git a/test/jasmine/tests/lib_date_test.js b/test/jasmine/tests/lib_date_test.js
index 592d111ed22..7a24ec16f01 100644
--- a/test/jasmine/tests/lib_date_test.js
+++ b/test/jasmine/tests/lib_date_test.js
@@ -7,6 +7,8 @@ var calComponent = require('@src/components/calendars');
// use only the parts of world-calendars that we've imported for our tests
var calendars = require('@src/components/calendars/calendars');
+var utcFormat = require('d3').time.format.utc;
+
describe('dates', function() {
'use strict';
@@ -308,7 +310,7 @@ describe('dates', function() {
expect(Lib.dateTime2ms(canonicalTick[calendar], calendar)).toBeDefined(calendar);
var sunday = Lib.dateTime2ms(canonicalSunday[calendar], calendar);
// convert back implicitly with gregorian calendar
- expect(Lib.formatDate(sunday, '%A')).toBe('Sunday', calendar);
+ expect(Lib.formatDate(sunday, '%A', null, utcFormat)).toBe('Sunday', calendar);
expect(Lib.dateTime2ms(dfltRange[calendar][0], calendar)).toBeDefined(calendar);
expect(Lib.dateTime2ms(dfltRange[calendar][1], calendar)).toBeDefined(calendar);
@@ -480,7 +482,7 @@ describe('dates', function() {
describe('formatDate', function() {
function assertFormatRounds(ms, calendar, results) {
['y', 'm', 'd', 'M', 'S', 1, 2, 3, 4].forEach(function(tr, i) {
- expect(Lib.formatDate(ms, '', tr, calendar))
+ expect(Lib.formatDate(ms, '', tr, utcFormat, calendar))
.toBe(results[i], calendar);
});
}
@@ -551,11 +553,11 @@ describe('dates', function() {
expectedCoptic = v[2];
// tickround is irrelevant here...
- expect(Lib.formatDate(ms, fmt, 'y'))
+ expect(Lib.formatDate(ms, fmt, 'y', utcFormat))
.toBe(expectedGregorian, fmt);
- expect(Lib.formatDate(ms, fmt, 4, 'gregorian'))
+ expect(Lib.formatDate(ms, fmt, 4, utcFormat, 'gregorian'))
.toBe(expectedGregorian, fmt);
- expect(Lib.formatDate(ms, fmt, 'y', 'coptic'))
+ expect(Lib.formatDate(ms, fmt, 'y', utcFormat, 'coptic'))
.toBe(expectedCoptic, fmt);
});
});
@@ -588,25 +590,25 @@ describe('dates', function() {
]);
// and using the custom format machinery
- expect(Lib.formatDate(-0.1, '%Y-%m-%d %H:%M:%S.%f'))
+ expect(Lib.formatDate(-0.1, '%Y-%m-%d %H:%M:%S.%f', null, utcFormat))
.toBe('1969-12-31 23:59:59.9999');
- expect(Lib.formatDate(-0.1, '%Y-%m-%d %H:%M:%S.%f', null, 'coptic'))
+ expect(Lib.formatDate(-0.1, '%Y-%m-%d %H:%M:%S.%f', null, utcFormat, 'coptic'))
.toBe('1686-04-22 23:59:59.9999');
});
it('should remove extra fractional second zeros', function() {
- expect(Lib.formatDate(0.1, '', 4)).toBe('00:00:00.0001\nJan 1, 1970');
- expect(Lib.formatDate(0.1, '', 3)).toBe('00:00:00\nJan 1, 1970');
- expect(Lib.formatDate(0.1, '', 0)).toBe('00:00:00\nJan 1, 1970');
- expect(Lib.formatDate(0.1, '', 'S')).toBe('00:00:00\nJan 1, 1970');
- expect(Lib.formatDate(0.1, '', 3, 'coptic'))
+ expect(Lib.formatDate(0.1, '', 4, utcFormat)).toBe('00:00:00.0001\nJan 1, 1970');
+ expect(Lib.formatDate(0.1, '', 3, utcFormat)).toBe('00:00:00\nJan 1, 1970');
+ expect(Lib.formatDate(0.1, '', 0, utcFormat)).toBe('00:00:00\nJan 1, 1970');
+ expect(Lib.formatDate(0.1, '', 'S', utcFormat)).toBe('00:00:00\nJan 1, 1970');
+ expect(Lib.formatDate(0.1, '', 3, utcFormat, 'coptic'))
.toBe('00:00:00\nKoi 23, 1686');
// because the decimal point is explicitly part of the format
// string here, we can't remove it OR the very first zero after it.
- expect(Lib.formatDate(0.1, '%S.%f')).toBe('00.0001');
- expect(Lib.formatDate(0.1, '%S.%3f')).toBe('00.0');
+ expect(Lib.formatDate(0.1, '%S.%f', null, utcFormat)).toBe('00.0001');
+ expect(Lib.formatDate(0.1, '%S.%3f', null, utcFormat)).toBe('00.0');
});
});
diff --git a/test/jasmine/tests/localize_test.js b/test/jasmine/tests/localize_test.js
index 4d1989a65e7..65394e6ef11 100644
--- a/test/jasmine/tests/localize_test.js
+++ b/test/jasmine/tests/localize_test.js
@@ -1,6 +1,8 @@
var Lib = require('@src/lib');
var _ = Lib._;
-var registry = require('@src/registry');
+var Registry = require('@src/registry');
+
+var d3 = require('d3');
var Plotly = require('@lib');
var createGraphDiv = require('../assets/create_graph_div');
@@ -11,80 +13,129 @@ describe('localization', function() {
'use strict';
var gd;
- var preregisteredDicts;
+ var preregisteredLocales;
beforeEach(function() {
gd = createGraphDiv();
- // empty out any dictionaries we might register by default
- preregisteredDicts = registry.localeRegistry;
- registry.localeRegistry = {};
+ // empty out any locales we might register by default
+ // we always need `en` format as it's the fallback
+ preregisteredLocales = Registry.localeRegistry;
+ Registry.localeRegistry = {en: {format: preregisteredLocales.en.format}};
});
afterEach(function() {
destroyGraphDiv();
- registry.localeRegistry = preregisteredDicts;
+ Registry.localeRegistry = preregisteredLocales;
});
- function plot(locale, dicts) {
+ function plot(locale, locales) {
var config = {};
if(locale) config.locale = locale;
- if(dicts) config.dictionaries = dicts;
+ if(locales) config.locales = locales;
+
+ return Plotly.newPlot(gd, [{x: ['2001-01-01', '2002-01-01'], y: [0.5, 3.5]}], {}, config);
+ }
- return Plotly.newPlot(gd, [{y: [1, 2]}], {}, config);
+ function firstXLabel() {
+ return d3.select(gd).select('.xtick').text();
}
- it('uses the input string if no dictionaries are provided', function(done) {
+ function firstYLabel() {
+ return d3.select(gd).select('.ytick').text();
+ }
+
+ var monthNums = ['!1', '!2', '!3', '!4', '!5', '!6', '!7', '!8', '!9', '!10', '!11', '!12'];
+ var monthLetters = ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'];
+ var dayLetters = ['s', 'm', 't', 'w', 't', 'f', 's'];
+
+ it('uses the input string and standard formats if no locales are provided', function(done) {
plot()
.then(function() {
['a', 'list of', 'Test strings 234!!!'].forEach(function(s) {
expect(_(gd, s)).toBe(s);
});
+ expect(firstXLabel()).toBe('Jan 2001');
+ expect(firstYLabel()).toBe('0.5');
})
.catch(failTest)
.then(done);
});
it('uses the region first, then language (registered case)', function(done) {
- plot('en-AU')
+ plot('eg-AU')
.then(function() {
expect(_(gd, 'dollar')).toBe('dollar');
// "en-GB" is registered first, so it gets copied into the base "en"
- Plotly.register({moduleType: 'locale', name: 'en-GB', dictionary: {dollar: 'pound'}});
- Plotly.register({moduleType: 'locale', name: 'en-US', dictionary: {dollar: 'greenback', cent: 'penny'}});
+ Plotly.register({
+ moduleType: 'locale',
+ name: 'eg-GB',
+ dictionary: {dollar: 'pound'},
+ format: {decimal: 'D'}
+ });
+ Plotly.register({
+ moduleType: 'locale',
+ name: 'eg-US',
+ dictionary: {dollar: 'greenback', cent: 'penny'},
+ format: {decimal: 'P', shortMonths: monthNums}
+ });
expect(_(gd, 'dollar')).toBe('pound');
// copying to the base happens at the dictionary level, so items missing
// from the first dictionary will not be picked up from later ones
expect(_(gd, 'cent')).toBe('cent');
- // "en-AU" is exactly what we're looking for.
- Plotly.register({moduleType: 'locale', name: 'en-AU', dictionary: {dollar: 'dollah'}});
+ // formatting changes need a redraw
+ expect(firstXLabel()).toBe('Jan 2001');
+ expect(firstYLabel()).toBe('0.5');
+ Plotly.redraw(gd);
+ expect(firstXLabel()).toBe('Jan 2001');
+ expect(firstYLabel()).toBe('0D5');
+
+ // "eg-AU" is exactly what we're looking for.
+ Plotly.register({
+ moduleType: 'locale',
+ name: 'eg-AU',
+ dictionary: {dollar: 'dollah'},
+ format: {decimal: '~', shortMonths: monthNums}
+ });
expect(_(gd, 'dollar')).toBe('dollah');
expect(_(gd, 'cent')).toBe('cent');
+
+ Plotly.redraw(gd);
+ expect(firstXLabel()).toBe('!1 2001');
+ expect(firstYLabel()).toBe('0~5');
})
.catch(failTest)
.then(done);
});
it('gives higher precedence to region than context vs registered', function(done) {
- // four dictionaries, highest to lowest priority
- // hopefully nobody will supply this many conflicting dictionaries, but
+ // four locales, highest to lowest priority
+ // hopefully nobody will supply this many conflicting locales, but
// if they do, this is what should happen!
var ctx_fr_QC = {
- a: 'a-ctx-QC'
+ dictionary: {a: 'a-ctx-QC'},
+ format: {decimal: '~'}
};
- Plotly.register({moduleType: 'locale', name: 'fr-QC', dictionary: {
- a: 'a-reg-QC', b: 'b-reg-QC'
- }});
+ Plotly.register({
+ moduleType: 'locale',
+ name: 'fr-QC',
+ dictionary: {a: 'a-reg-QC', b: 'b-reg-QC'},
+ format: {decimal: 'X', thousands: '@'}
+ });
var ctx_fr = {
- a: 'a-ctx', b: 'b-ctx', c: 'c-ctx'
+ dictionary: {a: 'a-ctx', b: 'b-ctx', c: 'c-ctx'},
+ format: {decimal: 'X', thousands: 'X', shortMonths: monthNums}
};
- Plotly.register({moduleType: 'locale', name: 'fr', dictionary: {
- a: 'a-reg', b: 'b-reg', c: 'c-reg', d: 'd-reg'
- }});
+ Plotly.register({
+ moduleType: 'locale',
+ name: 'fr',
+ dictionary: {a: 'a-reg', b: 'b-reg', c: 'c-reg', d: 'd-reg'},
+ format: {decimal: 'X', thousands: 'X', shortMonths: monthLetters, shortDays: dayLetters}
+ });
plot('fr-QC', {fr: ctx_fr, 'fr-QC': ctx_fr_QC})
.then(function() {
@@ -93,15 +144,91 @@ describe('localization', function() {
expect(_(gd, 'c')).toBe('c-ctx');
expect(_(gd, 'd')).toBe('d-reg');
expect(_(gd, 'e')).toBe('e');
+
+ expect(gd._fullLayout.separators).toBe('~@');
+ expect(firstXLabel()).toBe('!1 2001');
+ expect(firstYLabel()).toBe('0~5');
+ var d0 = new Date(0); // thursday, Jan 1 1970 (UTC)
+ // sanity check that d0 is what we think...
+ expect(d3.time.format.utc('%a %b %A %B')(d0)).toBe('Thu Jan Thursday January');
+ // full names were not overridden, so fall back on english
+ expect(gd._fullLayout.xaxis._dateFormat('%a %b %A %B')(d0)).toBe('t !1 Thursday January');
})
.catch(failTest)
.then(done);
});
- it('does not generate an automatic base language dictionary in context', function(done) {
- plot('fr', {'fr-QC': {fries: 'poutine'}})
+ it('does not generate an automatic base locale in context', function(done) {
+ plot('fr', {'fr-QC': {
+ dictionary: {fries: 'poutine'},
+ format: {decimal: '^', shortMonths: monthNums}
+ }})
.then(function() {
expect(_(gd, 'fries')).toBe('fries');
+ expect(firstXLabel()).toBe('Jan 2001');
+ expect(firstYLabel()).toBe('0.5');
+ })
+ .catch(failTest)
+ .then(done);
+ });
+
+ it('allows registering dictionary and format separately without overwriting the other', function() {
+ expect(Registry.localeRegistry.es).toBeUndefined();
+
+ var d1 = {I: 'Yo'};
+ var f1 = {decimal: 'ñ'};
+ var d2 = {You: 'Tú'};
+ var f2 = {thousands: '¿'};
+
+ Plotly.register({
+ moduleType: 'locale',
+ name: 'es',
+ dictionary: d1,
+ format: f1
+ });
+
+ expect(Registry.localeRegistry.es.dictionary).toBe(d1);
+ expect(Registry.localeRegistry.es.format).toBe(f1);
+
+ Plotly.register({
+ moduleType: 'locale',
+ name: 'es',
+ dictionary: d2
+ });
+
+ expect(Registry.localeRegistry.es.dictionary).toBe(d2);
+ expect(Registry.localeRegistry.es.format).toBe(f1);
+
+ Plotly.register({
+ moduleType: 'locale',
+ name: 'es',
+ format: f2
+ });
+
+ expect(Registry.localeRegistry.es.dictionary).toBe(d2);
+ expect(Registry.localeRegistry.es.format).toBe(f2);
+ });
+
+ it('uses number format for default but still supports explicit layout.separators', function(done) {
+ plot('da', {da: {format: {decimal: 'D', thousands: 'T'}}})
+ .then(function() {
+ expect(firstYLabel()).toBe('0D5');
+ expect(gd._fullLayout.separators).toBe('DT');
+
+ return Plotly.relayout(gd, {separators: 'p#'});
+ })
+ .then(function() {
+ expect(firstYLabel()).toBe('0p5');
+
+ return Plotly.relayout(gd, {'yaxis.tickformat': '.3f'});
+ })
+ .then(function() {
+ expect(firstYLabel()).toBe('0p500');
+
+ return Plotly.relayout(gd, {separators: null});
+ })
+ .then(function() {
+ expect(firstYLabel()).toBe('0D500');
})
.catch(failTest)
.then(done);
diff --git a/test/jasmine/tests/modebar_test.js b/test/jasmine/tests/modebar_test.js
index 425732ef006..9f0bd48b54e 100644
--- a/test/jasmine/tests/modebar_test.js
+++ b/test/jasmine/tests/modebar_test.js
@@ -39,7 +39,7 @@ describe('ModeBar', function() {
modeBarButtonsToRemove: [],
modeBarButtonsToAdd: [],
locale: 'en',
- dictionaries: {}
+ locales: {}
}
};
}
diff --git a/test/jasmine/tests/plots_test.js b/test/jasmine/tests/plots_test.js
index b6f31cab997..82d0f0e0e4c 100644
--- a/test/jasmine/tests/plots_test.js
+++ b/test/jasmine/tests/plots_test.js
@@ -160,11 +160,13 @@ describe('Test Plots', function() {
layoutOut,
expected;
+ var formatObj = require('@src/locale-en').format;
+
function supplyLayoutDefaults(layoutIn, layoutOut) {
layoutOut._dfltTitle = {
plot: 'ppplot'
};
- return Plots.supplyLayoutGlobalDefaults(layoutIn, layoutOut);
+ return Plots.supplyLayoutGlobalDefaults(layoutIn, layoutOut, formatObj);
}
beforeEach(function() {