From d7c09e0ebdc4d0458b78142bff6b7c97fe485ba2 Mon Sep 17 00:00:00 2001
From: Robin de Mourat
Date: Wed, 14 Aug 2024 16:33:55 +0200
Subject: [PATCH] internationalize numbers format
---
.../AlluvialImportExport.js | 4 +-
src/components/RadarChart/VisObject.js | 2 +-
.../LongitudinalTradeChart.js | 41 ++++---------------
.../TradeDynamicsChart/TradeDynamicsChart.js | 2 +
.../EffetsGuerreSurLevant.js | 6 +--
.../ExportationsSudEst/ExportationsSudEst.js | 4 +-
.../GuerreEtCroissance/GuerreEtCroissance.js | 10 ++---
.../GuerreEtCroissance/LineSeries.js | 6 +--
src/visualizations/Intro/Legend.js | 12 +++---
src/visualizations/Intro/PartnersObjects.js | 20 ++++-----
.../LevantNavigation/LevantNavigation.js | 8 ++--
.../PartDesEtrangersDansNavigation.js | 8 ++--
.../PartDesFrancaisDansProvenance.js | 10 ++---
.../StylesNavigation/StylesNavigation.js | 16 ++++----
14 files changed, 63 insertions(+), 86 deletions(-)
diff --git a/src/components/AlluvialImportExport/AlluvialImportExport.js b/src/components/AlluvialImportExport/AlluvialImportExport.js
index 8178afff..33762a29 100644
--- a/src/components/AlluvialImportExport/AlluvialImportExport.js
+++ b/src/components/AlluvialImportExport/AlluvialImportExport.js
@@ -560,7 +560,7 @@ export default function AlluvialImportExport({
{isTooSmallForText === false &&
- {formatNumber(value) + ' lt.'}
+ {formatNumber(value, lang) + ' lt.'}
}
@@ -675,7 +675,7 @@ export default function AlluvialImportExport({
>
}
- {isTooSmallForText === false && {`${formatNumber(value)} lt. ${isFraude ? ' (fraude ?)' : ''}`}}
+ {isTooSmallForText === false && {`${formatNumber(value, lang)} lt. ${isFraude ? ' (fraude ?)' : ''}`}}
)
})
diff --git a/src/components/RadarChart/VisObject.js b/src/components/RadarChart/VisObject.js
index 42d92a42..39d21e9f 100644
--- a/src/components/RadarChart/VisObject.js
+++ b/src/components/RadarChart/VisObject.js
@@ -106,7 +106,7 @@ const VisObject = ({
})
.map(([key, portion]) => `
- ${key} : ${(portion * 100).toFixed(2)}% (${formatNumber(absoluteData[key])} lt)
+ ${key} : ${(portion * 100).toFixed(2)}% (${formatNumber(absoluteData[key], lang)} lt)
`).join('\n')
}
diff --git a/src/components/TradeDynamicsChart/LongitudinalTradeChart.js b/src/components/TradeDynamicsChart/LongitudinalTradeChart.js
index e96c3b8a..702f023d 100644
--- a/src/components/TradeDynamicsChart/LongitudinalTradeChart.js
+++ b/src/components/TradeDynamicsChart/LongitudinalTradeChart.js
@@ -8,36 +8,10 @@ import cx from "classnames";
import ReactTooltip from "react-tooltip";
import colorsPalettes from "../../utils/colorPalettes";
-import { fixSvgDimension } from "../../utils/misc";
+import { fixSvgDimension, formatNumber } from "../../utils/misc";
const {marseilleColor} = colorsPalettes;
-/**
- * Improve the display of numbers
- * @param {string|number} str - the number to prettify
- * @returns {string}
- */
-const prettifyValue = (str) => {
- const inted = Math.round(+str) + "";
- let finalStr = "";
- let count = 0;
- for (let i = inted.length - 1; i >= 0; i--) {
- const char = inted[i];
- count++;
-
- finalStr = char + finalStr;
- if (count === 3) {
- count = 0;
- finalStr = " " + finalStr;
- }
- }
- if (finalStr[0] === ",") {
- finalStr = finalStr.slice(1);
- }
-
- return finalStr;
-};
-
/**
* Displays a double diagram displaying a histogram and a linechart, with optional additional annotations
* @param {array} data
@@ -88,6 +62,7 @@ const LongitudinalTradeChart = ({
colorScaleMessages,
annotations = [],
margins,
+ lang,
}) => {
const data = useMemo(
() =>
@@ -441,8 +416,8 @@ const LongitudinalTradeChart = ({
r: width * 0.005,
}}
fill={"transparent"}
- data-tip={`${datum.year} : ${prettifyValue(
- +datum[absoluteField]
+ data-tip={`${datum.year} : ${formatNumber(
+ parseInt(+datum[absoluteField]), lang
)} livres tournois.`}
data-for={cityName}
data-class="bar-tooltip"
@@ -508,12 +483,12 @@ const LongitudinalTradeChart = ({
stroke={colorsPalettes.generic.accent1}
title={`${datum.year}-${next.year}`}
strokeWidth={2}
- data-tip={`${datum.year} → ${prettifyValue(
- +datum[absoluteField]
+ data-tip={`${datum.year} → ${formatNumber(
+ parseInt(+datum[absoluteField]), lang
)} livres tournois
${
next.year
- } → ${prettifyValue(
- +next[absoluteField]
+ } → ${formatNumber(
+ parseInt(+next[absoluteField]), lang
)} livres tournois
(${
ratio > 0 ? "+" : ""
}${Math.round(ratio * 100)}%)`}
diff --git a/src/components/TradeDynamicsChart/TradeDynamicsChart.js b/src/components/TradeDynamicsChart/TradeDynamicsChart.js
index 45c10142..6200a050 100644
--- a/src/components/TradeDynamicsChart/TradeDynamicsChart.js
+++ b/src/components/TradeDynamicsChart/TradeDynamicsChart.js
@@ -184,6 +184,7 @@ const TradeDynamicsChart = (props) => {
{...{
startYear,
endYear,
+ lang,
}}
/>
);
@@ -227,6 +228,7 @@ const TradeDynamicsChart = (props) => {
{...{
startYear,
endYear,
+ lang
}}
/>
);
diff --git a/src/visualizations/EffetsGuerreSurLevant/EffetsGuerreSurLevant.js b/src/visualizations/EffetsGuerreSurLevant/EffetsGuerreSurLevant.js
index 6b11f8e7..3fe47ab5 100644
--- a/src/visualizations/EffetsGuerreSurLevant/EffetsGuerreSurLevant.js
+++ b/src/visualizations/EffetsGuerreSurLevant/EffetsGuerreSurLevant.js
@@ -124,15 +124,15 @@ export default function EffetsGuerreSurLevant({
title: translate('EffetsGuerreSurLevant', 'top-y-axis', lang),
// tickSpan: 100000000,
// domain: [0, 200000000],
- tickFormat: d => formatNumber(d) + ' lt.'
+ tickFormat: d => formatNumber(d, lang) + ' lt.'
},
tooltip: d => translate('EffetsGuerreSurLevant', 'top-tooltip', lang, {
year: d.year,
- value: formatNumber(parseInt(d.value)),
+ value: formatNumber(parseInt(d.value), lang),
particule: d.group === 'total' ? 'au' : 'de',
group: d.group
})
- // `En ${d.year}, Marseille a importé ${formatNumber(parseInt(d.value))} lt. depuis les partenaires ${d.group === 'total' ? 'au' : 'de'} ${d.group}`
+ // `En ${d.year}, Marseille a importé ${formatNumber(parseInt(d.value, lang))} lt. depuis les partenaires ${d.group === 'total' ? 'au' : 'de'} ${d.group}`
}
}
/>
diff --git a/src/visualizations/ExportationsSudEst/ExportationsSudEst.js b/src/visualizations/ExportationsSudEst/ExportationsSudEst.js
index bfff968f..5ac4c4e1 100644
--- a/src/visualizations/ExportationsSudEst/ExportationsSudEst.js
+++ b/src/visualizations/ExportationsSudEst/ExportationsSudEst.js
@@ -296,7 +296,7 @@ export default function ExportationsSudEst({
y={0}
fontSize={nationalFontScale(value)}
>
- {label === 'inconnue' ? translate('exportations-sud-est', 'unknown', lang) : label} ({formatNumber(parseInt(value))} lt.)
+ {label === 'inconnue' ? translate('exportations-sud-est', 'unknown', lang) : label} ({formatNumber(parseInt(value), lang)} lt.)
: null
@@ -347,7 +347,7 @@ export default function ExportationsSudEst({
y={0}
fontSize={localFontScale(value)}
>
- {label} ({formatNumber(parseInt(value))} lt.)
+ {label} ({formatNumber(parseInt(value), lang)} lt.)
: null
diff --git a/src/visualizations/GuerreEtCroissance/GuerreEtCroissance.js b/src/visualizations/GuerreEtCroissance/GuerreEtCroissance.js
index 2de9eea2..91a21416 100644
--- a/src/visualizations/GuerreEtCroissance/GuerreEtCroissance.js
+++ b/src/visualizations/GuerreEtCroissance/GuerreEtCroissance.js
@@ -98,28 +98,28 @@ export default function GuerreEtCroissance({
id: 'carrière',
source: 'Carriere',
label: translate('GuerreEtCroissance', 'navigation-interface-carriere', lang),
- tickFormat: d => formatNumber(d) + ' u.',
+ tickFormat: d => formatNumber(d, lang) + ' u.',
unit: 'u.',
},
{
id: 'entrées',
source: 'Navigo entrées',
label: translate('GuerreEtCroissance', 'navigation-interface-arrivals', lang),
- tickFormat: d => formatNumber(d) + ' u.',
+ tickFormat: d => formatNumber(d, lang) + ' u.',
unit: 'u.',
},
{
id: 'tonnage',
source: 'Navigo tonnage',
label: translate('GuerreEtCroissance', 'navigation-interface-tonnage', lang),
- tickFormat: d => formatNumber(d) + ' tx.',
+ tickFormat: d => formatNumber(d, lang) + ' tx.',
unit: 'tx.',
},
{
id: 'mileage',
source: 'Navigo mileage_total',
label: translate('GuerreEtCroissance', 'navigation-interface-distance', lang),
- tickFormat: d => formatNumber(d) + ' m.',
+ tickFormat: d => formatNumber(d, lang) + ' m.',
unit: 'm.',
},
];
@@ -346,7 +346,7 @@ export default function GuerreEtCroissance({
data={data[seriesId].filter(d => d.direction_ferme === direction)}
xScale={xScale}
yDomain={[0, 350000000]}
- tickFormat={d => formatNumber(d / 1000) + ' k lt.'}
+ tickFormat={d => formatNumber(d / 1000, lang) + ' k lt.'}
activeYear={activeYear}
onSetActiveYear={y => setActiveYear(y)}
gutter={gutter}
diff --git a/src/visualizations/GuerreEtCroissance/LineSeries.js b/src/visualizations/GuerreEtCroissance/LineSeries.js
index 16ebeab4..2524939c 100644
--- a/src/visualizations/GuerreEtCroissance/LineSeries.js
+++ b/src/visualizations/GuerreEtCroissance/LineSeries.js
@@ -227,10 +227,10 @@ const LineSeries = ({
translate('GuerreEtCroissance', 'tooltip', lang, {
year,
unit,
- value: formatNumber(parseInt(value)),
- loss: formatNumber(parseInt(data.find(d => d.year === year).peace_reg_memory))
+ value: formatNumber(parseInt(value, lang)),
+ loss: formatNumber(parseInt(data.find(d => d.year === year, lang).peace_reg_memory))
})
- // `En ${year}, valeur de ${formatNumber(parseInt(value))} (perte de ${formatNumber(parseInt(data.find(d => d.year === year).peace_reg_memory))})`
+ // `En ${year}, valeur de ${formatNumber(parseInt(value, lang))} (perte de ${formatNumber(parseInt(data.find(d => d.year === year, lang).peace_reg_memory))})`
}
/>
{
- translate('Intro', 'n-travels', lang, {count: formatNumber(maxShips)})
+ translate('Intro', 'n-travels', lang, {count: formatNumber(maxShips, lang)})
}
@@ -130,7 +130,7 @@ const Legend = ({
className="legend-indicator"
>
- {translate('Intro', 'n-travels', lang, {count: formatNumber(maxShips / 2)})}
+ {translate('Intro', 'n-travels', lang, {count: formatNumber(maxShips / 2, lang)})}
- {formatNumber(maxTonnage)} tx.
+ {formatNumber(maxTonnage, lang)} tx.
- {formatNumber(maxTonnage / 2)} tx.
+ {formatNumber(maxTonnage / 2, lang)} tx.
>
:
@@ -218,7 +218,7 @@ const Legend = ({
y={3}
className="legend-indicator"
>
- {formatNumber(maxAreaValue)} lt.
+ {formatNumber(maxAreaValue, lang)} lt.
- {formatNumber(minAreaValue)} lt.
+ {formatNumber(minAreaValue, lang)} lt.
>
diff --git a/src/visualizations/Intro/PartnersObjects.js b/src/visualizations/Intro/PartnersObjects.js
index 078aa895..098707e9 100644
--- a/src/visualizations/Intro/PartnersObjects.js
+++ b/src/visualizations/Intro/PartnersObjects.js
@@ -125,31 +125,31 @@ const PartnersObjects = ({
let tooltipText = '';
if (dataType === 'toflit18') {
if (dataScope === 'world') {
- // tooltipText = `La direction des fermes de Marseille a effectué un commerce total de ${formatNumber(parseInt(toflit_value))} lt. avec le partenaire ${partner} en 1789.`
+ // tooltipText = `La direction des fermes de Marseille a effectué un commerce total de ${formatNumber(parseInt(toflit_value, lang))} lt. avec le partenaire ${partner} en 1789.`
tooltipText = translate('Intro', 'tooltip-trade-world', lang, {
- count: formatNumber(parseInt(toflit_value)),
+ count: formatNumber(parseInt(toflit_value), lang),
partner
});
} else {
- // tooltipText = `La direction des fermes de ${partner} a effectué un commerce total de ${formatNumber(parseInt(toflit_value))} lt. en 1789.`
+ // tooltipText = `La direction des fermes de ${partner} a effectué un commerce total de ${formatNumber(parseInt(toflit_value, lang))} lt. en 1789.`
tooltipText = translate('Intro', 'tooltip-trade-france', lang, {
- count: formatNumber(parseInt(toflit_value)),
+ count: formatNumber(parseInt(toflit_value), lang),
partner
});
}
} else {
if (dataScope === 'world') {
- // tooltipText = `${formatNumber(parseInt(navigo_nb_ships))} voyages ont été effectués depuis les ports du partenaire ${partner} vers Marseille en 1789, pour un tonnage moyen de ${formatNumber(parseInt(navigo_mean_tonnage))} tonneaux.`
+ // tooltipText = `${formatNumber(parseInt(navigo_nb_ships, lang))} voyages ont été effectués depuis les ports du partenaire ${partner} vers Marseille en 1789, pour un tonnage moyen de ${formatNumber(parseInt(navigo_mean_tonnage, lang))} tonneaux.`
tooltipText = translate('Intro', 'tooltip-navigo-world', lang, {
- nb_ships: formatNumber(parseInt(navigo_nb_ships)),
- tonnage: formatNumber(parseInt(navigo_mean_tonnage)),
+ nb_ships: formatNumber(parseInt(navigo_nb_ships, lang)),
+ tonnage: formatNumber(parseInt(navigo_mean_tonnage, lang)),
partner
});
} else {
- // tooltipText = `${formatNumber(parseInt(navigo_nb_ships))} voyages ont été effectués depuis le port de ${partner} en 1787, pour un tonnage moyen de ${formatNumber(parseInt(navigo_mean_tonnage))} tonneaux.`
+ // tooltipText = `${formatNumber(parseInt(navigo_nb_ships, lang))} voyages ont été effectués depuis le port de ${partner} en 1787, pour un tonnage moyen de ${formatNumber(parseInt(navigo_mean_tonnage, lang))} tonneaux.`
tooltipText = translate('Intro', 'tooltip-navigo-france', lang, {
- nb_ships: formatNumber(parseInt(navigo_nb_ships)),
- tonnage: formatNumber(parseInt(navigo_mean_tonnage)),
+ nb_ships: formatNumber(parseInt(navigo_nb_ships, lang)),
+ tonnage: formatNumber(parseInt(navigo_mean_tonnage, lang)),
partner
});
}
diff --git a/src/visualizations/LevantNavigation/LevantNavigation.js b/src/visualizations/LevantNavigation/LevantNavigation.js
index 81de9c2c..27d37e8d 100644
--- a/src/visualizations/LevantNavigation/LevantNavigation.js
+++ b/src/visualizations/LevantNavigation/LevantNavigation.js
@@ -203,9 +203,9 @@ export default function LevantNavigation({
translate('LevantNavigation', 'tooltip', lang, {
count,
port,
- tonnage: formatNumber(tonnage)
+ tonnage: formatNumber(tonnage, lang)
})
- // `Selon le registre des patentes de Marseille, ${count} navires se sont rendus depuis le port de ${port} vers port phocéen dans les sept années étudiées, pour un total estimé de ${formatNumber(tonnage)} tonneaux cumulés.`
+ // `Selon le registre des patentes de Marseille, ${count} navires se sont rendus depuis le port de ${port} vers port phocéen dans les sept années étudiées, pour un total estimé de ${formatNumber(tonnage, lang)} tonneaux cumulés.`
}
>
- 40 000 tx.
+ {formatNumber(legendMaxTonnage, lang)} tx.
@@ -322,7 +322,7 @@ export default function LevantNavigation({
className="legend-label"
style={{ fontSize: gutter }}
>
- 20 000 tx.
+ {formatNumber(legendMinTonnage, lang)} tx.
diff --git a/src/visualizations/PartDesEtrangersDansNavigation/PartDesEtrangersDansNavigation.js b/src/visualizations/PartDesEtrangersDansNavigation/PartDesEtrangersDansNavigation.js
index 4f8bd25f..7a04bf3d 100644
--- a/src/visualizations/PartDesEtrangersDansNavigation/PartDesEtrangersDansNavigation.js
+++ b/src/visualizations/PartDesEtrangersDansNavigation/PartDesEtrangersDansNavigation.js
@@ -247,9 +247,9 @@ const flagToNationality = {
{label} ({parseInt(tonnage / marseilleSum * 100)}%)
diff --git a/src/visualizations/PartDesFrancaisDansProvenance/PartDesFrancaisDansProvenance.js b/src/visualizations/PartDesFrancaisDansProvenance/PartDesFrancaisDansProvenance.js
index f933a37f..5e29ae2d 100644
--- a/src/visualizations/PartDesFrancaisDansProvenance/PartDesFrancaisDansProvenance.js
+++ b/src/visualizations/PartDesFrancaisDansProvenance/PartDesFrancaisDansProvenance.js
@@ -95,9 +95,9 @@ export default function PartDesFrancaisDansProvenance({
year: d.year,
share: d.share_of_french.toFixed(2),
state: d.state,
- tonnage: formatNumber(d.tonnage_french)
+ tonnage: formatNumber(d.tonnage_french, lang)
})
- // `En ${d.year}, ${d.share_of_french.toFixed(2)}% des voyages partis de ports de ${d.state} et arrivés à Marseille étaient assurés par des navires français (${formatNumber(d.tonnage_french)} tx. cumulés)`
+ // `En ${d.year}, ${d.share_of_french.toFixed(2)}% des voyages partis de ports de ${d.state} et arrivés à Marseille étaient assurés par des navires français (${formatNumber(d.tonnage_french, lang)} tx. cumulés)`
}
}
/>
@@ -121,7 +121,7 @@ export default function PartDesFrancaisDansProvenance({
},
y: {
field: 'tonnage_french',
- tickFormat: d => formatNumber(d) + ' tx',
+ tickFormat: d => formatNumber(d, lang) + ' tx',
// domain: [0, 100],
title: translate('PartDesFrancaisDansProvenance', 'bottom-y-axis', lang),
sort: {
@@ -134,9 +134,9 @@ export default function PartDesFrancaisDansProvenance({
year: d.year,
share: d.share_of_french.toFixed(2),
state: d.state,
- tonnage: formatNumber(d.tonnage_french)
+ tonnage: formatNumber(d.tonnage_french, lang)
})
- // `En ${d.year}, ${d.share_of_french.toFixed(2)}% des voyages partis de ports de ${d.state} et arrivés à Marseille étaient assurés par des navires français (${formatNumber(d.tonnage_french)} tx. cumulés)`
+ // `En ${d.year}, ${d.share_of_french.toFixed(2)}% des voyages partis de ports de ${d.state} et arrivés à Marseille étaient assurés par des navires français (${formatNumber(d.tonnage_french, lang)} tx. cumulés)`
}
}
/>
diff --git a/src/visualizations/StylesNavigation/StylesNavigation.js b/src/visualizations/StylesNavigation/StylesNavigation.js
index 02fc77fb..56e53cae 100644
--- a/src/visualizations/StylesNavigation/StylesNavigation.js
+++ b/src/visualizations/StylesNavigation/StylesNavigation.js
@@ -204,7 +204,7 @@ const Provinces = ({
xmlns="http://www.w3.org/1999/xhtml"
className="legend-label"
>
- {translate('StylesNavigation', 'travels-tick', lang, {count: legendValues[0]})}
+ {translate('StylesNavigation', 'travels-tick', lang, {count: formatNumber(legendValues[0], lang)})}
@@ -218,7 +218,7 @@ const Provinces = ({
xmlns="http://www.w3.org/1999/xhtml"
className="legend-label"
>
- {translate('StylesNavigation', 'travels-tick', lang, {count: legendValues[1]})}
+ {translate('StylesNavigation', 'travels-tick', lang, {count: formatNumber(legendValues[1], lang)})}
@@ -438,8 +438,8 @@ export default function StylesNavigation({
width: cellWidth,
height: cellHeight,
id: 'méditerranée',
- title: translate('StylesNavigation', 'title-mediterrannee', lang, { count: formatNumber(travelsSums['méditerranée occidentale']) }),
- // title: `Europe méditerranéenne (${formatNumber(travelsSums['méditerranée occidentale'])} voyages vers Marseille consignés en temps de paix)`,
+ title: translate('StylesNavigation', 'title-mediterrannee', lang, { count: formatNumber(travelsSums['méditerranée occidentale'], lang) }),
+ // title: `Europe méditerranéenne (${formatNumber(travelsSums['méditerranée occidentale'], lang)} voyages vers Marseille consignés en temps de paix)`,
data: data.filter(({ category }) => category === 'méditerranée occidentale'),
color: colors['méditerranée occidentale'],
legendStep: 250,
@@ -462,8 +462,8 @@ export default function StylesNavigation({
width: cellWidth,
height: cellHeight,
id: 'ponant',
- title: translate('StylesNavigation', 'title-ponant', lang, { count: formatNumber(travelsSums['Ponant']) }),
- // title: `Ponant et Terre-Neuve (${formatNumber(travelsSums['Ponant'])} voyages vers Marseille consignés en temps de paix)`,
+ title: translate('StylesNavigation', 'title-ponant', lang, { count: formatNumber(travelsSums['Ponant'], lang) }),
+ // title: `Ponant et Terre-Neuve (${formatNumber(travelsSums['Ponant'], lang)} voyages vers Marseille consignés en temps de paix)`,
data: data.filter(({ category }) => category === 'Ponant'),
color: colors['Ponant'],
legendStep: 40,
@@ -484,8 +484,8 @@ export default function StylesNavigation({
width: cellWidth,
height: cellHeight,
id: 'empire',
- // title: `Empire ottoman et mer Noire (${formatNumber(travelsSums['empire ottoman'])} voyages vers Marseille consignés en temps de paix)`,
- title: translate('StylesNavigation', 'title-ottoman', lang, { count: formatNumber(travelsSums['empire ottoman']) }),
+ // title: `Empire ottoman et mer Noire (${formatNumber(travelsSums['empire ottoman'], lang)} voyages vers Marseille consignés en temps de paix)`,
+ title: translate('StylesNavigation', 'title-ottoman', lang, { count: formatNumber(travelsSums['empire ottoman'], lang) }),
data: data.filter(({ category }) => category === 'empire ottoman'),
color: colors['empire ottoman'],
tonnageValues,