From e7105b1d0415e5236057dcf3646d4a372d4d4675 Mon Sep 17 00:00:00 2001 From: Joachim Jellinek Date: Thu, 12 Mar 2026 17:19:10 +0000 Subject: [PATCH 1/6] Add script to generate translation SQL updates from config.json Includes generate_translation_sql.py for syncing indicator translations from config.json directly to the MySQL database, and the generated SQL that was applied to fix English descriptions stored in French translations. Co-Authored-By: Claude Sonnet 4.6 --- resources/generate_translation_sql.py | 38 +++++++++++++++++++++++++++ resources/update_translations.sql | 26 ++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 resources/generate_translation_sql.py create mode 100644 resources/update_translations.sql diff --git a/resources/generate_translation_sql.py b/resources/generate_translation_sql.py new file mode 100644 index 0000000..93289d2 --- /dev/null +++ b/resources/generate_translation_sql.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +""" +Generate SQL UPDATE statements to sync indicator translations from config.json +into the flowkit_ui_backend MySQL database. + +Usage: + python3 resources/generate_translation_sql.py > /tmp/update_translations.sql + tailscale ssh root@mobdash-sql-prod "mysql -u root -A flowkit_ui_backend" < /tmp/update_translations.sql + +Or pipe directly: + python3 resources/generate_translation_sql.py | tailscale ssh root@mobdash-sql-prod "mysql -u root -A flowkit_ui_backend" +""" + +import json +import os +import sys + +config_path = os.path.join(os.path.dirname(__file__), "config.json") + +with open(config_path) as f: + config = json.load(f) + +langs = {l["code"] for l in config["languages"] if not l.get("default")} + +print("-- Generated from config.json - updates indicator translations in flowkit_ui_backend") +print("-- Languages:", sorted(langs)) +print() + +for ind in config["indicators"]: + iid = ind["indicator_id"] + translation = {} + for key, val in ind.items(): + parts = key.rsplit("_", 1) + if len(parts) == 2 and parts[1] in langs: + translation.setdefault(parts[1], {})[parts[0]] = val + if translation: + escaped = json.dumps(translation, ensure_ascii=False).replace("'", "\\'") + print(f"UPDATE indicator SET translation = '{escaped}' WHERE indicator_id = '{iid}';") diff --git a/resources/update_translations.sql b/resources/update_translations.sql new file mode 100644 index 0000000..8046f87 --- /dev/null +++ b/resources/update_translations.sql @@ -0,0 +1,26 @@ +-- Generated from config.json - updates indicator translations in flowkit_ui_backend +-- Run against: mysql -u root -A flowkit_ui_backend + +UPDATE indicator SET translation = '{"fr": {"label": "Résidents", "description": "Estime le nombre de personnes résidant dans une zone pendant le mois sélectionné par l\'utilisateur.", "method": "L\'indicateur des résidents estime le nombre de personnes résidant dans chaque zone pendant le mois sélectionné par l\'utilisateur.\n\nL\'indicateur est calculé à partir de l\'indicateur d\'afflux net et du nombre de base de résidents dans la zone pendant une période de référence.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.residents'; +UPDATE indicator SET translation = '{"fr": {"label": "Habitants par km²", "description": "Estime le nombre moyen de personnes résidant par kilomètre carré d\'une zone pendant le mois sélectionné par l\'utilisateur.", "method": "L\'indicateur de résidents par kilomètre carré estime le nombre moyen de personnes résidant par kilomètre carré d\'une zone pendant le mois sélectionné par l\'utilisateur.\n\nL\'indicateur est calculé à partir de l\'indicateur des résidents et de la taille géographique de la zone.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.residents_perKm2'; +UPDATE indicator SET translation = '{"fr": {"label": "Différence entre les résidents", "description": "Estime la différence du nombre de résidents entre une période de référence et le mois sélectionné par l\'utilisateur.", "method": "Pour chaque zone, l\'indicateur de différence de résidents estime la différence du nombre de résidents entre une période de référence et le mois sélectionné par l\'utilisateur.\n\nL\'indicateur est calculé à partir de l\'indicateur de résidents et du nombre de résidents de référence dans la zone pendant une période de référence.\n\nSi le nombre de résidents a augmenté, l\'indicateur aura une valeur positive ; si le nombre de résidents a diminué, la valeur sera négative.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.residents_diffwithref'; +UPDATE indicator SET translation = '{"fr": {"label": "Variation en pourcentage de la différence de résidents", "description": "Estime la variation du nombre de résidents entre une période de référence et le mois sélectionné par l\'utilisateur, exprimée en pourcentage du nombre de résidents de référence.", "method": "L\'indicateur de variation en pourcentage du nombre de résidents estime la variation du nombre de résidents entre une période de référence et une période donnée, par rapport au nombre de résidents de la période de référence. La différence est exprimée en pourcentage d\'une valeur de référence calculée pour la période de référence.\n\nL\'indicateur est calculé à partir de l\'indicateur de résidents et du nombre de résidents de référence dans la zone pendant une période de référence.\n\nSi le nombre de résidents a augmenté, l\'indicateur aura une valeur positive ; si le nombre de résidents a diminué, la valeur sera négative.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.residents_pctchangewithref'; +UPDATE indicator SET translation = '{"fr": {"label": "Anomalie", "description": "Mesure l\'écart entre le nombre estimé de personnes résidant dans une zone donnée pendant le mois sélectionné par l\'utilisateur et le nombre de résidents estimé pendant la période de référence, exprimé sous la forme d\'un score d\'anomalie (score z).", "method": "L\'indicateur d\'anomalie des résidents mesure l\'écart entre le nombre estimé de personnes résidant dans une zone donnée pendant le mois sélectionné par l\'utilisateur et le nombre de résidents estimé pendant la période de référence, exprimé sous la forme d\'un score z.\n\nL\'indicateur est calculé à partir de l\'indicateur de différence de résidents et de l\'écart absolu moyen du nombre de résidents dans la zone pendant une période de référence.\n\nPour cet indicateur, une valeur positive supérieure à 3 indique une augmentation statistiquement significative du nombre de résidents dans une zone donnée ; une valeur inférieure à -3 indique une diminution statistiquement significative des résidents. Les valeurs entre 3 et -3 se situent dans les limites de la variation normale basée sur la période de référence.\n\nCet indicateur décrit l\'ampleur du caractère inhabituel du nombre de résidents dans une zone, compte tenu de l\'ampleur de la variation observée pendant la période de référence. Des valeurs absolues plus élevées indiquent un plus grand écart par rapport à la variation normale de la population, et donc une plus grande probabilité que le changement soit significatif. Des changements de la sorte pourraient être associés à des événements spécifiques ou causés par des problèmes techniques. Toutefois, des anomalies très importantes (valeurs absolues supérieures à 6) pourraient également indiquer un problème technique.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.abnormality'; +UPDATE indicator SET translation = '{"fr": {"label": "Résidents arrivés", "description": "Estime le nombre total de personnes qui ont déménagé dans une zone pendant le mois sélectionné par l\'utilisateur.", "method": "Pour chaque zone, l\'indicateur des résidents arrivés estime le nombre total de personnes qui ont déménagé vers une zone à partir de toute autre zone du pays pendant le mois sélectionné par l\'utilisateur.\n\nL\'indicateur est calculé à partir de la somme des comptages des abonnés dont le lieu de résidence a changé d\'une zone à une autre chaque mois.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.arrived'; +UPDATE indicator SET translation = '{"fr": {"label": "Résidents déplacés", "description": "Estime le nombre total de personnes qui ont déménagé hors d\'une zone pendant le mois sélectionné par l\'utilisateur.", "method": "Pour chaque zone, l\'indicateur des résidents déplacés estime le nombre total de personnes qui ont déménagé vers une zone à partir de toute autre zone du pays pendant le mois sélectionné par l\'utilisateur.\n\nL\'indicateur est calculé à partir de la somme des comptages des abonnés dont le lieu de résidence a changé d\'une zone à une autre chaque mois.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.departed'; +UPDATE indicator SET translation = '{"fr": {"label": "Afflux net", "description": "Estime la différence entre le nombre de personnes déménageant vers et hors d\'une zone pendant le mois sélectionné par l\'utilisateur.", "method": "Pour chaque zone, l\'indicateur d\'afflux net de résidents estime la différence entre le nombre de personnes ayant déménagé dans (résidents arrivés) et hors (résidents partis) d\'une zone pendant le mois sélectionné par l\'utilisateur.\n\nCet indicateur est calculé à partir des indicateurs relatifs aux résidents arrivés et partis.\n\nSi les personnes qui s\'installent dans la zone sont plus nombreuses que celles qui la quittent, l\'indicateur aura une valeur positive ; si les personnes qui quittent la zone sont plus nombreuses, la valeur sera négative.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.delta_arrived'; +UPDATE indicator SET translation = '{"fr": {"label": "Changement de résidence", "description": "Estime le nombre de personnes qui ont déménagé de la zone A à la zone B pendant le mois sélectionné par l\'utilisateur.", "method": "Pour chaque paire de zones, l\'indicateur de changement de résidence estime le nombre de personnes qui déménagent de la zone A à la zone B pendant le mois sélectionné par l\'utilisateur.\n\nL\'indicateur est calculé à partir du nombre d\'abonnés dont le lieu de résidence est passé de la zone A à la zone B pendant une période donnée.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'relocations.relocations'; +UPDATE indicator SET translation = '{"fr": {"label": "Différence de changements de résidence", "description": "Estime la variation du nombre de changements de résidence de la zone A vers la zone B entre une période de référence et le mois choisi par l\'utilisateur.", "method": "L\'indicateur de différence de changements de résidence estime la variation du nombre de changements de résidence de la zone A vers la zone B entre une période de référence et le mois sélectionné par l\'utilisateur.\n\nL\'indicateur est calculé à partir de l\'indicateur de changement de résidence et du nombre de changements de résidence de référence pendant une période de référence.\n\nSi le nombre de changements de résidence a augmenté, l\'indicateur aura une valeur positive ; si le nombre de changements de résidence a diminué, la valeur sera négative.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'relocations.relocations_diffwithref'; +UPDATE indicator SET translation = '{"fr": {"label": "Variation en pourcentage de la différence de changements de résidence", "description": "Estime la variation du nombre de changements de résidence de la zone A vers la zone B entre une période de référence et le mois choisi par l\'utilisateur, exprimée en pourcentage du nombre de changements de résidence de référence.", "method": "L\'indicateur de variation en pourcentage de la différence de changements de résidence estime la variation des changements de résidence de la zone A vers la zone B par rapport au nombre de changements de résidence entre ces zones pendant la période de référence. La différence est exprimée en pourcentage d\'une valeur de référence calculée pour la période de référence.\n\nL\'indicateur est calculé à partir de l\'indicateur de changements de résidence et du nombre de changements de résidence de référence pendant une période de référence.\n\nSi le nombre de changements de résidence a augmenté, l\'indicateur aura une valeur positive ; si le nombre de changements de résidence a diminué, la valeur sera négative.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'relocations.relocations_pctchangewithref'; +UPDATE indicator SET translation = '{"fr": {"label": "Anomalie des changements de résidence", "description": "Mesure l\'écart du nombre estimé de changements de résidence de la zone A vers la zone B pendant la période d\'intérêt par rapport au nombre de changements de résidence estimé pendant la période de référence, exprimé sous la forme d\'un score d\'anomalie (score z).", "method": "L\'indicateur d\'anomalie des changements de résidence mesure l\'écart entre le nombre estimé de changements de résidence de la zone A vers la zone B pendant le mois sélectionné par l\'utilisateur et le nombre de changements de résidence estimé pendant une période de référence, exprimé sous la forme d\'un score z.\n\nPour cet indicateur, une valeur positive supérieure à 3 indique une augmentation statistiquement significative du nombre de changements de résidence ; une valeur inférieure à -3 indique une diminution statistiquement significative des changements de résidence.\n\nCet indicateur décrit l\'ampleur du caractère inhabituel du nombre de changements de résidence de la zone A vers la zone B, compte tenu de l\'ampleur de la variation observée pendant la période de référence. Des valeurs absolues plus élevées indiquent un plus grand écart par rapport à la variation normale des changements de résidence , et donc une plus grande probabilité que le changement soit significatif. Des changements de la sorte pourraient être associés à des événements spécifiques ou causés par des problèmes techniques. Toutefois, des anomalies très importantes (valeurs absolues supérieures à 6) pourraient également indiquer un problème technique.\n\nNous calculons l\'indicateur d\'anomalie des changements de résidence en utilisant l\'indicateur de différence des changements de résidence et l\'écart absolu moyen du nombre de changements de résidence pendant une période de référence.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'relocations.abnormality'; +UPDATE indicator SET translation = '{"fr": {"label": "Présence", "description": "Estime le nombre de personnes présentes dans une zone donnée le ou les jours sélectionnés par l\'utilisateur.", "method": "L\'indicateur de présence estime le nombre de personnes présentes dans une zone donnée à un moment donné du ou des jours sélectionnés par l\'utilisateur.\n\nNous calculons l\'indicateur de présence à partir du nombre d\'abonnés uniques qui ont été actifs dans une zone donnée le ou les jours choisis par l\'utilisateur.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.presence'; +UPDATE indicator SET translation = '{"fr": {"label": "Présence par km²", "description": "Estime le nombre moyen de personnes présentes par kilomètre carré d\'une zone pendant le ou les jours sélectionnés par l\'utilisateur.", "method": "La présence par km² estime le nombre moyen de personnes présentes par kilomètre carré d\'une zone pendant le ou les jours sélectionnés par l\'utilisateur.\n\nL\'indicateur est calculé à partir de l\'indicateur de présence et de la taille géographique de la zone.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.presence_perKm2'; +UPDATE indicator SET translation = '{"fr": {"label": "Différence de présence", "description": "Estime la différence entre le nombre de personnes présentes dans une zone pendant le ou les jours sélectionnés par l\'utilisateur et le nombre de personnes présentes pendant une période de référence.", "method": "L\'indicateur de différence de présence estime la différence entre le nombre de personnes présentes dans une zone pendant le ou les jours sélectionnés par l\'utilisateur et le nombre de personnes présentes pendant une période de référence.\n\nL\'indicateur est calculé à partir de l\'indicateur de présence et du nombre de référence de personnes pendant une période de référence.\n\nSi le nombre de personnes présentes dans la zone a augmenté, l\'indicateur aura une valeur positive ; si le nombre a diminué, la valeur sera négative.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.presence_diffwithref'; +UPDATE indicator SET translation = '{"fr": {"label": "Variation en pourcentage de la différence de présence", "description": "Estime la variation du nombre de personnes présentes dans une zone au cours du ou des jours sélectionnés par l\'utilisateur par rapport au nombre de personnes présentes dans la zone pendant la période de référence, exprimée en pourcentage.", "method": "L\'indicateur de variation de présence en pourcentage estime la variation du nombre de personnes présentes dans une zone pendant le ou les jours sélectionnés par l\'utilisateur par rapport au nombre de personnes présentes dans la zone pendant la période de référence. La différence est exprimée en pourcentage d\'une valeur de référence calculée pour la période de référence.\n\nL\'indicateur est calculé à partir de l\'indicateur de présence et du nombre de référence de personnes pendant une période de référence.\n\nSi le nombre de personnes présentes dans la zone a augmenté, l\'indicateur aura une valeur positive ; si le nombre de personnes présentes dans la zone a diminué, la valeur sera négative.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.presence_pctchangewithref'; +UPDATE indicator SET translation = '{"fr": {"label": "Anomalie", "description": "Mesure l\'écart du nombre de personnes présentes dans une zone donnée pendant le ou les jours sélectionnés par l\'utilisateur par rapport à une période de référence, exprimé sous la forme d\'un score d\'anomalie (score z).", "method": "L\'indicateur d\'anomalie de présence mesure l\'écart du nombre de personnes présentes dans une zone donnée pendant le ou les jours sélectionnés par l\'utilisateur par rapport à une période de référence, exprimé sous la forme d\'un score z.\n\nPour cet indicateur, une valeur positive supérieure à 3 indique une augmentation statistiquement significative du nombre de personnes présentes dans une zone donnée ; une valeur inférieure à -3 indique une diminution statistiquement significative de la présence.\n\nCet indicateur décrit l\'ampleur du caractère inhabituel du nombre de personnes dans une zone, compte tenu de l\'ampleur de la variation observée pendant la période de référence. Des valeurs absolues plus élevées indiquent un plus grand écart par rapport à la variation normale de présence, et donc une plus grande probabilité que le changement soit significatif. Des changements de la sorte pourraient être associés à des événements spécifiques ou causés par des problèmes techniques. Toutefois, des anomalies très importantes (valeurs absolues supérieures à 6) pourraient également indiquer un problème technique.\n\nL\'indicateur est calculé à partir de l\'indicateur de différence de présence et de l\'écart absolu moyen de présence pendant une période de référence.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.abnormality'; +UPDATE indicator SET translation = '{"fr": {"label": "Déplacements entrants", "description": "Estime le nombre de déplacements dans une zone à partir d\'autres zones pendant le ou les jours sélectionnés par l\'utilisateur.", "method": "L\'indicateur des déplacements entrants estime le nombre de déplacements dans une zone à partir d\'autres zones pendant le ou les jours sélectionnés par l\'utilisateur. Lorsque les données indiquent des déplacements multiples entre les zones au cours d\'une même journée pour un abonné donné (de A à B, puis de B à C), l\'indicateur prend en compte tous les déplacements (AB, BC).\n\nÀ la différence de l\'indicateur des voyageurs entrants, qui ne compte qu\'une seule fois chaque abonné unique, cet indicateur inclut les déplacements multiples dans une zone par le même abonné.\n\nNous calculons l\'indicateur des déplacements entrants à partir de la somme des comptages des abonnés qui étaient présents dans une zone d\'intérêt après avoir été présents dans une autre zone pendant le ou les jours sélectionnés par l\'utilisateur.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.trips_in'; +UPDATE indicator SET translation = '{"fr": {"label": "Déplacements sortants", "description": "Estime le nombre de déplacements d\'une zone vers une autre zone pendant le ou les jours sélectionnés par l\'utilisateur.", "method": "L\'indicateur de déplacements sortants estime le nombre de déplacements d\'une zone vers une autre zone au cours du ou des jours sélectionnés par l\'utilisateur. Lorsque les données indiquent plusieurs déplacements dans une même journée pour un abonné donné (de A à B, puis de B à C), l\'indicateur prend en compte tous les déplacements (AB, BC).\n\nÀ la différence de l\'indicateur de voyageurs sortants qui ne compte qu\'une seule fois chaque abonné unique, cet indicateur inclut également les déplacements multiples d\'un même abonné hors d\'une zone.\n\nNous calculons l\'indicateur des déplacements entrants à partir de la somme des comptages des abonnés qui étaient présents dans une autre zone après avoir été présents dans une zone d\'intérêt pendant le ou les jours sélectionnés par l\'utilisateur.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.trips_out'; +UPDATE indicator SET translation = '{"fr": {"label": "Voyageurs", "description": "Estime le nombre de personnes qui visitent la zone B après avoir été présentes dans la zone A pendant le ou les jours sélectionnés par l\'utilisateur.", "method": "L\'indicateur de voyageurs estime le nombre de personnes qui visitent la zone B après avoir été présentes dans la zone A (c\'est-à-dire avoir voyagé de A à B) pendant le ou les jours sélectionnés par l\'utilisateur.\n\nNous calculons l\'indicateur de voyageurs à partir du nombre d\'abonnés qui étaient présents dans la zone B après avoir été présents dans la zone A au cours du ou des jours sélectionnés par l\'utilisateur.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'movements.travellers'; +UPDATE indicator SET translation = '{"fr": {"label": "Différence de voyageurs", "description": "Estime la variation du nombre de personnes voyageant de la zone A à B pendant une période donnée par rapport au nombre de base de voyageurs de A à B pendant une période de référence.", "method": "L\'indicateur de différence de voyageurs estime la variation du nombre de personnes voyageant de la zone A à la zone B pendant une période donnée par rapport au nombre de voyageurs de référence pendant une période de référence.\n\nSi le nombre de voyageurs a augmenté, l\'indicateur aura une valeur positive ; si le nombre de voyageurs a diminué, la valeur sera négative.\n\nNous calculons l\'indicateur de différence de voyageurs à partir de l\'indicateur de voyageurs et du nombre de référence de voyageurs entre des paires de zones pendant une période de référence.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'movements.travellers_diffwithref'; +UPDATE indicator SET translation = '{"fr": {"label": "Variation en pourcentage de la différence de voyageurs", "description": "Estime la variation du nombre de personnes voyageant de la zone A à B pendant le ou les jours sélectionnés par l\'utilisateur par rapport au nombre de référence de voyageurs de A à B pendant la période de référence, exprimée en pourcentage.", "method": "La variation en pourcentage de l\'indicateur de voyageurs estime la variation du nombre de personnes voyageant de la zone A à B pendant le ou les jours sélectionnés par l\'utilisateur par rapport au nombre de référence de voyageurs de A à B pendant la période de référence. La différence est exprimée en pourcentage d\'une valeur de référence calculée pour la période de référence.\n\nSi le nombre de voyageurs a augmenté, l\'indicateur aura une valeur positive ; si le nombre de voyageurs a diminué, la valeur sera négative.\n\nNous calculons le pourcentage de variation de l\'indicateur de différence de voyageurs à partir de l\'indicateur de voyageurs et du nombre de voyageurs de référence entre les paires de zones pendant le ou les jours sélectionnés par l\'utilisateur.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'movements.travellers_pctchangewithref'; +UPDATE indicator SET translation = '{"fr": {"label": "Anomalie", "description": "Mesure l\'écart entre le nombre estimé de personnes voyageant de la zone A à B pendant le ou les jours sélectionnés par l\'utilisateur et le nombre de voyageurs de A à B estimé pendant une période de référence, exprimé sous la forme d\'un score z.", "method": "L\'indicateur d\'anomalie des voyageurs mesure l\'écart entre le nombre estimé de personnes voyageant de la zone A à la zone B pendant le ou les jours sélectionnés par l\'utilisateur et le nombre de voyageurs de A à B estimé pendant une période de référence, exprimé sous la forme d\'un score z. \n\nPour cet indicateur, une valeur positive supérieure à 3 indique une augmentation statistiquement significative du nombre de voyageurs ; une valeur inférieure à -3 indique une diminution statistiquement significative.\n\nCet indicateur décrit l\'ampleur du caractère inhabituel du nombre de voyageurs de la zone A vers la zone B, compte tenu de l\'ampleur de la variation observée pendant la période de référence. Des valeurs absolues plus élevées indiquent un plus grand écart par rapport à la variation normale du nombre de voyageurs, et donc une plus grande probabilité que le changement soit significatif. Des changements de la sorte pourraient être associés à des événements spécifiques ou causés par des problèmes techniques. Toutefois, des anomalies très importantes (valeurs absolues supérieures à 6) pourraient également indiquer un problème technique.\n\nNous calculons l\'indicateur d\'anomalie des voyageurs en combinant l\'indicateur de différence des voyageurs et l\'écart absolu moyen du nombre de voyageurs entre des paires de zones pendant une période de référence.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'movements.abnormality'; From 85ab6cb5b306b198b1a40b5607daf7bf17cc688c Mon Sep 17 00:00:00 2001 From: Joachim Jellinek Date: Fri, 20 Mar 2026 12:30:04 +0000 Subject: [PATCH 2/6] Fixed escaping --- resources/generate_translation_sql.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/generate_translation_sql.py b/resources/generate_translation_sql.py index 93289d2..d9135a7 100644 --- a/resources/generate_translation_sql.py +++ b/resources/generate_translation_sql.py @@ -34,5 +34,5 @@ if len(parts) == 2 and parts[1] in langs: translation.setdefault(parts[1], {})[parts[0]] = val if translation: - escaped = json.dumps(translation, ensure_ascii=False).replace("'", "\\'") + escaped = json.dumps(translation, ensure_ascii=False).replace("\\", "\\\\").replace("'", "\\'") print(f"UPDATE indicator SET translation = '{escaped}' WHERE indicator_id = '{iid}';") From c65e231d7f52b890a4652defc279fccfcc60a373 Mon Sep 17 00:00:00 2001 From: Joachim Jellinek Date: Fri, 20 Mar 2026 12:30:40 +0000 Subject: [PATCH 3/6] proper SQL --- resources/update_translations.sql | 48 +++++++++++++++---------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/resources/update_translations.sql b/resources/update_translations.sql index 8046f87..ca7f0b6 100644 --- a/resources/update_translations.sql +++ b/resources/update_translations.sql @@ -1,26 +1,26 @@ -- Generated from config.json - updates indicator translations in flowkit_ui_backend --- Run against: mysql -u root -A flowkit_ui_backend +-- Languages: ['fr', 'ht'] -UPDATE indicator SET translation = '{"fr": {"label": "Résidents", "description": "Estime le nombre de personnes résidant dans une zone pendant le mois sélectionné par l\'utilisateur.", "method": "L\'indicateur des résidents estime le nombre de personnes résidant dans chaque zone pendant le mois sélectionné par l\'utilisateur.\n\nL\'indicateur est calculé à partir de l\'indicateur d\'afflux net et du nombre de base de résidents dans la zone pendant une période de référence.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.residents'; -UPDATE indicator SET translation = '{"fr": {"label": "Habitants par km²", "description": "Estime le nombre moyen de personnes résidant par kilomètre carré d\'une zone pendant le mois sélectionné par l\'utilisateur.", "method": "L\'indicateur de résidents par kilomètre carré estime le nombre moyen de personnes résidant par kilomètre carré d\'une zone pendant le mois sélectionné par l\'utilisateur.\n\nL\'indicateur est calculé à partir de l\'indicateur des résidents et de la taille géographique de la zone.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.residents_perKm2'; -UPDATE indicator SET translation = '{"fr": {"label": "Différence entre les résidents", "description": "Estime la différence du nombre de résidents entre une période de référence et le mois sélectionné par l\'utilisateur.", "method": "Pour chaque zone, l\'indicateur de différence de résidents estime la différence du nombre de résidents entre une période de référence et le mois sélectionné par l\'utilisateur.\n\nL\'indicateur est calculé à partir de l\'indicateur de résidents et du nombre de résidents de référence dans la zone pendant une période de référence.\n\nSi le nombre de résidents a augmenté, l\'indicateur aura une valeur positive ; si le nombre de résidents a diminué, la valeur sera négative.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.residents_diffwithref'; -UPDATE indicator SET translation = '{"fr": {"label": "Variation en pourcentage de la différence de résidents", "description": "Estime la variation du nombre de résidents entre une période de référence et le mois sélectionné par l\'utilisateur, exprimée en pourcentage du nombre de résidents de référence.", "method": "L\'indicateur de variation en pourcentage du nombre de résidents estime la variation du nombre de résidents entre une période de référence et une période donnée, par rapport au nombre de résidents de la période de référence. La différence est exprimée en pourcentage d\'une valeur de référence calculée pour la période de référence.\n\nL\'indicateur est calculé à partir de l\'indicateur de résidents et du nombre de résidents de référence dans la zone pendant une période de référence.\n\nSi le nombre de résidents a augmenté, l\'indicateur aura une valeur positive ; si le nombre de résidents a diminué, la valeur sera négative.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.residents_pctchangewithref'; -UPDATE indicator SET translation = '{"fr": {"label": "Anomalie", "description": "Mesure l\'écart entre le nombre estimé de personnes résidant dans une zone donnée pendant le mois sélectionné par l\'utilisateur et le nombre de résidents estimé pendant la période de référence, exprimé sous la forme d\'un score d\'anomalie (score z).", "method": "L\'indicateur d\'anomalie des résidents mesure l\'écart entre le nombre estimé de personnes résidant dans une zone donnée pendant le mois sélectionné par l\'utilisateur et le nombre de résidents estimé pendant la période de référence, exprimé sous la forme d\'un score z.\n\nL\'indicateur est calculé à partir de l\'indicateur de différence de résidents et de l\'écart absolu moyen du nombre de résidents dans la zone pendant une période de référence.\n\nPour cet indicateur, une valeur positive supérieure à 3 indique une augmentation statistiquement significative du nombre de résidents dans une zone donnée ; une valeur inférieure à -3 indique une diminution statistiquement significative des résidents. Les valeurs entre 3 et -3 se situent dans les limites de la variation normale basée sur la période de référence.\n\nCet indicateur décrit l\'ampleur du caractère inhabituel du nombre de résidents dans une zone, compte tenu de l\'ampleur de la variation observée pendant la période de référence. Des valeurs absolues plus élevées indiquent un plus grand écart par rapport à la variation normale de la population, et donc une plus grande probabilité que le changement soit significatif. Des changements de la sorte pourraient être associés à des événements spécifiques ou causés par des problèmes techniques. Toutefois, des anomalies très importantes (valeurs absolues supérieures à 6) pourraient également indiquer un problème technique.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.abnormality'; -UPDATE indicator SET translation = '{"fr": {"label": "Résidents arrivés", "description": "Estime le nombre total de personnes qui ont déménagé dans une zone pendant le mois sélectionné par l\'utilisateur.", "method": "Pour chaque zone, l\'indicateur des résidents arrivés estime le nombre total de personnes qui ont déménagé vers une zone à partir de toute autre zone du pays pendant le mois sélectionné par l\'utilisateur.\n\nL\'indicateur est calculé à partir de la somme des comptages des abonnés dont le lieu de résidence a changé d\'une zone à une autre chaque mois.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.arrived'; -UPDATE indicator SET translation = '{"fr": {"label": "Résidents déplacés", "description": "Estime le nombre total de personnes qui ont déménagé hors d\'une zone pendant le mois sélectionné par l\'utilisateur.", "method": "Pour chaque zone, l\'indicateur des résidents déplacés estime le nombre total de personnes qui ont déménagé vers une zone à partir de toute autre zone du pays pendant le mois sélectionné par l\'utilisateur.\n\nL\'indicateur est calculé à partir de la somme des comptages des abonnés dont le lieu de résidence a changé d\'une zone à une autre chaque mois.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.departed'; -UPDATE indicator SET translation = '{"fr": {"label": "Afflux net", "description": "Estime la différence entre le nombre de personnes déménageant vers et hors d\'une zone pendant le mois sélectionné par l\'utilisateur.", "method": "Pour chaque zone, l\'indicateur d\'afflux net de résidents estime la différence entre le nombre de personnes ayant déménagé dans (résidents arrivés) et hors (résidents partis) d\'une zone pendant le mois sélectionné par l\'utilisateur.\n\nCet indicateur est calculé à partir des indicateurs relatifs aux résidents arrivés et partis.\n\nSi les personnes qui s\'installent dans la zone sont plus nombreuses que celles qui la quittent, l\'indicateur aura une valeur positive ; si les personnes qui quittent la zone sont plus nombreuses, la valeur sera négative.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.delta_arrived'; -UPDATE indicator SET translation = '{"fr": {"label": "Changement de résidence", "description": "Estime le nombre de personnes qui ont déménagé de la zone A à la zone B pendant le mois sélectionné par l\'utilisateur.", "method": "Pour chaque paire de zones, l\'indicateur de changement de résidence estime le nombre de personnes qui déménagent de la zone A à la zone B pendant le mois sélectionné par l\'utilisateur.\n\nL\'indicateur est calculé à partir du nombre d\'abonnés dont le lieu de résidence est passé de la zone A à la zone B pendant une période donnée.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'relocations.relocations'; -UPDATE indicator SET translation = '{"fr": {"label": "Différence de changements de résidence", "description": "Estime la variation du nombre de changements de résidence de la zone A vers la zone B entre une période de référence et le mois choisi par l\'utilisateur.", "method": "L\'indicateur de différence de changements de résidence estime la variation du nombre de changements de résidence de la zone A vers la zone B entre une période de référence et le mois sélectionné par l\'utilisateur.\n\nL\'indicateur est calculé à partir de l\'indicateur de changement de résidence et du nombre de changements de résidence de référence pendant une période de référence.\n\nSi le nombre de changements de résidence a augmenté, l\'indicateur aura une valeur positive ; si le nombre de changements de résidence a diminué, la valeur sera négative.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'relocations.relocations_diffwithref'; -UPDATE indicator SET translation = '{"fr": {"label": "Variation en pourcentage de la différence de changements de résidence", "description": "Estime la variation du nombre de changements de résidence de la zone A vers la zone B entre une période de référence et le mois choisi par l\'utilisateur, exprimée en pourcentage du nombre de changements de résidence de référence.", "method": "L\'indicateur de variation en pourcentage de la différence de changements de résidence estime la variation des changements de résidence de la zone A vers la zone B par rapport au nombre de changements de résidence entre ces zones pendant la période de référence. La différence est exprimée en pourcentage d\'une valeur de référence calculée pour la période de référence.\n\nL\'indicateur est calculé à partir de l\'indicateur de changements de résidence et du nombre de changements de résidence de référence pendant une période de référence.\n\nSi le nombre de changements de résidence a augmenté, l\'indicateur aura une valeur positive ; si le nombre de changements de résidence a diminué, la valeur sera négative.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'relocations.relocations_pctchangewithref'; -UPDATE indicator SET translation = '{"fr": {"label": "Anomalie des changements de résidence", "description": "Mesure l\'écart du nombre estimé de changements de résidence de la zone A vers la zone B pendant la période d\'intérêt par rapport au nombre de changements de résidence estimé pendant la période de référence, exprimé sous la forme d\'un score d\'anomalie (score z).", "method": "L\'indicateur d\'anomalie des changements de résidence mesure l\'écart entre le nombre estimé de changements de résidence de la zone A vers la zone B pendant le mois sélectionné par l\'utilisateur et le nombre de changements de résidence estimé pendant une période de référence, exprimé sous la forme d\'un score z.\n\nPour cet indicateur, une valeur positive supérieure à 3 indique une augmentation statistiquement significative du nombre de changements de résidence ; une valeur inférieure à -3 indique une diminution statistiquement significative des changements de résidence.\n\nCet indicateur décrit l\'ampleur du caractère inhabituel du nombre de changements de résidence de la zone A vers la zone B, compte tenu de l\'ampleur de la variation observée pendant la période de référence. Des valeurs absolues plus élevées indiquent un plus grand écart par rapport à la variation normale des changements de résidence , et donc une plus grande probabilité que le changement soit significatif. Des changements de la sorte pourraient être associés à des événements spécifiques ou causés par des problèmes techniques. Toutefois, des anomalies très importantes (valeurs absolues supérieures à 6) pourraient également indiquer un problème technique.\n\nNous calculons l\'indicateur d\'anomalie des changements de résidence en utilisant l\'indicateur de différence des changements de résidence et l\'écart absolu moyen du nombre de changements de résidence pendant une période de référence.\n\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'relocations.abnormality'; -UPDATE indicator SET translation = '{"fr": {"label": "Présence", "description": "Estime le nombre de personnes présentes dans une zone donnée le ou les jours sélectionnés par l\'utilisateur.", "method": "L\'indicateur de présence estime le nombre de personnes présentes dans une zone donnée à un moment donné du ou des jours sélectionnés par l\'utilisateur.\n\nNous calculons l\'indicateur de présence à partir du nombre d\'abonnés uniques qui ont été actifs dans une zone donnée le ou les jours choisis par l\'utilisateur.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.presence'; -UPDATE indicator SET translation = '{"fr": {"label": "Présence par km²", "description": "Estime le nombre moyen de personnes présentes par kilomètre carré d\'une zone pendant le ou les jours sélectionnés par l\'utilisateur.", "method": "La présence par km² estime le nombre moyen de personnes présentes par kilomètre carré d\'une zone pendant le ou les jours sélectionnés par l\'utilisateur.\n\nL\'indicateur est calculé à partir de l\'indicateur de présence et de la taille géographique de la zone.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.presence_perKm2'; -UPDATE indicator SET translation = '{"fr": {"label": "Différence de présence", "description": "Estime la différence entre le nombre de personnes présentes dans une zone pendant le ou les jours sélectionnés par l\'utilisateur et le nombre de personnes présentes pendant une période de référence.", "method": "L\'indicateur de différence de présence estime la différence entre le nombre de personnes présentes dans une zone pendant le ou les jours sélectionnés par l\'utilisateur et le nombre de personnes présentes pendant une période de référence.\n\nL\'indicateur est calculé à partir de l\'indicateur de présence et du nombre de référence de personnes pendant une période de référence.\n\nSi le nombre de personnes présentes dans la zone a augmenté, l\'indicateur aura une valeur positive ; si le nombre a diminué, la valeur sera négative.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.presence_diffwithref'; -UPDATE indicator SET translation = '{"fr": {"label": "Variation en pourcentage de la différence de présence", "description": "Estime la variation du nombre de personnes présentes dans une zone au cours du ou des jours sélectionnés par l\'utilisateur par rapport au nombre de personnes présentes dans la zone pendant la période de référence, exprimée en pourcentage.", "method": "L\'indicateur de variation de présence en pourcentage estime la variation du nombre de personnes présentes dans une zone pendant le ou les jours sélectionnés par l\'utilisateur par rapport au nombre de personnes présentes dans la zone pendant la période de référence. La différence est exprimée en pourcentage d\'une valeur de référence calculée pour la période de référence.\n\nL\'indicateur est calculé à partir de l\'indicateur de présence et du nombre de référence de personnes pendant une période de référence.\n\nSi le nombre de personnes présentes dans la zone a augmenté, l\'indicateur aura une valeur positive ; si le nombre de personnes présentes dans la zone a diminué, la valeur sera négative.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.presence_pctchangewithref'; -UPDATE indicator SET translation = '{"fr": {"label": "Anomalie", "description": "Mesure l\'écart du nombre de personnes présentes dans une zone donnée pendant le ou les jours sélectionnés par l\'utilisateur par rapport à une période de référence, exprimé sous la forme d\'un score d\'anomalie (score z).", "method": "L\'indicateur d\'anomalie de présence mesure l\'écart du nombre de personnes présentes dans une zone donnée pendant le ou les jours sélectionnés par l\'utilisateur par rapport à une période de référence, exprimé sous la forme d\'un score z.\n\nPour cet indicateur, une valeur positive supérieure à 3 indique une augmentation statistiquement significative du nombre de personnes présentes dans une zone donnée ; une valeur inférieure à -3 indique une diminution statistiquement significative de la présence.\n\nCet indicateur décrit l\'ampleur du caractère inhabituel du nombre de personnes dans une zone, compte tenu de l\'ampleur de la variation observée pendant la période de référence. Des valeurs absolues plus élevées indiquent un plus grand écart par rapport à la variation normale de présence, et donc une plus grande probabilité que le changement soit significatif. Des changements de la sorte pourraient être associés à des événements spécifiques ou causés par des problèmes techniques. Toutefois, des anomalies très importantes (valeurs absolues supérieures à 6) pourraient également indiquer un problème technique.\n\nL\'indicateur est calculé à partir de l\'indicateur de différence de présence et de l\'écart absolu moyen de présence pendant une période de référence.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.abnormality'; -UPDATE indicator SET translation = '{"fr": {"label": "Déplacements entrants", "description": "Estime le nombre de déplacements dans une zone à partir d\'autres zones pendant le ou les jours sélectionnés par l\'utilisateur.", "method": "L\'indicateur des déplacements entrants estime le nombre de déplacements dans une zone à partir d\'autres zones pendant le ou les jours sélectionnés par l\'utilisateur. Lorsque les données indiquent des déplacements multiples entre les zones au cours d\'une même journée pour un abonné donné (de A à B, puis de B à C), l\'indicateur prend en compte tous les déplacements (AB, BC).\n\nÀ la différence de l\'indicateur des voyageurs entrants, qui ne compte qu\'une seule fois chaque abonné unique, cet indicateur inclut les déplacements multiples dans une zone par le même abonné.\n\nNous calculons l\'indicateur des déplacements entrants à partir de la somme des comptages des abonnés qui étaient présents dans une zone d\'intérêt après avoir été présents dans une autre zone pendant le ou les jours sélectionnés par l\'utilisateur.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.trips_in'; -UPDATE indicator SET translation = '{"fr": {"label": "Déplacements sortants", "description": "Estime le nombre de déplacements d\'une zone vers une autre zone pendant le ou les jours sélectionnés par l\'utilisateur.", "method": "L\'indicateur de déplacements sortants estime le nombre de déplacements d\'une zone vers une autre zone au cours du ou des jours sélectionnés par l\'utilisateur. Lorsque les données indiquent plusieurs déplacements dans une même journée pour un abonné donné (de A à B, puis de B à C), l\'indicateur prend en compte tous les déplacements (AB, BC).\n\nÀ la différence de l\'indicateur de voyageurs sortants qui ne compte qu\'une seule fois chaque abonné unique, cet indicateur inclut également les déplacements multiples d\'un même abonné hors d\'une zone.\n\nNous calculons l\'indicateur des déplacements entrants à partir de la somme des comptages des abonnés qui étaient présents dans une autre zone après avoir été présents dans une zone d\'intérêt pendant le ou les jours sélectionnés par l\'utilisateur.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.trips_out'; -UPDATE indicator SET translation = '{"fr": {"label": "Voyageurs", "description": "Estime le nombre de personnes qui visitent la zone B après avoir été présentes dans la zone A pendant le ou les jours sélectionnés par l\'utilisateur.", "method": "L\'indicateur de voyageurs estime le nombre de personnes qui visitent la zone B après avoir été présentes dans la zone A (c\'est-à-dire avoir voyagé de A à B) pendant le ou les jours sélectionnés par l\'utilisateur.\n\nNous calculons l\'indicateur de voyageurs à partir du nombre d\'abonnés qui étaient présents dans la zone B après avoir été présents dans la zone A au cours du ou des jours sélectionnés par l\'utilisateur.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'movements.travellers'; -UPDATE indicator SET translation = '{"fr": {"label": "Différence de voyageurs", "description": "Estime la variation du nombre de personnes voyageant de la zone A à B pendant une période donnée par rapport au nombre de base de voyageurs de A à B pendant une période de référence.", "method": "L\'indicateur de différence de voyageurs estime la variation du nombre de personnes voyageant de la zone A à la zone B pendant une période donnée par rapport au nombre de voyageurs de référence pendant une période de référence.\n\nSi le nombre de voyageurs a augmenté, l\'indicateur aura une valeur positive ; si le nombre de voyageurs a diminué, la valeur sera négative.\n\nNous calculons l\'indicateur de différence de voyageurs à partir de l\'indicateur de voyageurs et du nombre de référence de voyageurs entre des paires de zones pendant une période de référence.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'movements.travellers_diffwithref'; -UPDATE indicator SET translation = '{"fr": {"label": "Variation en pourcentage de la différence de voyageurs", "description": "Estime la variation du nombre de personnes voyageant de la zone A à B pendant le ou les jours sélectionnés par l\'utilisateur par rapport au nombre de référence de voyageurs de A à B pendant la période de référence, exprimée en pourcentage.", "method": "La variation en pourcentage de l\'indicateur de voyageurs estime la variation du nombre de personnes voyageant de la zone A à B pendant le ou les jours sélectionnés par l\'utilisateur par rapport au nombre de référence de voyageurs de A à B pendant la période de référence. La différence est exprimée en pourcentage d\'une valeur de référence calculée pour la période de référence.\n\nSi le nombre de voyageurs a augmenté, l\'indicateur aura une valeur positive ; si le nombre de voyageurs a diminué, la valeur sera négative.\n\nNous calculons le pourcentage de variation de l\'indicateur de différence de voyageurs à partir de l\'indicateur de voyageurs et du nombre de voyageurs de référence entre les paires de zones pendant le ou les jours sélectionnés par l\'utilisateur.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'movements.travellers_pctchangewithref'; -UPDATE indicator SET translation = '{"fr": {"label": "Anomalie", "description": "Mesure l\'écart entre le nombre estimé de personnes voyageant de la zone A à B pendant le ou les jours sélectionnés par l\'utilisateur et le nombre de voyageurs de A à B estimé pendant une période de référence, exprimé sous la forme d\'un score z.", "method": "L\'indicateur d\'anomalie des voyageurs mesure l\'écart entre le nombre estimé de personnes voyageant de la zone A à la zone B pendant le ou les jours sélectionnés par l\'utilisateur et le nombre de voyageurs de A à B estimé pendant une période de référence, exprimé sous la forme d\'un score z. \n\nPour cet indicateur, une valeur positive supérieure à 3 indique une augmentation statistiquement significative du nombre de voyageurs ; une valeur inférieure à -3 indique une diminution statistiquement significative.\n\nCet indicateur décrit l\'ampleur du caractère inhabituel du nombre de voyageurs de la zone A vers la zone B, compte tenu de l\'ampleur de la variation observée pendant la période de référence. Des valeurs absolues plus élevées indiquent un plus grand écart par rapport à la variation normale du nombre de voyageurs, et donc une plus grande probabilité que le changement soit significatif. Des changements de la sorte pourraient être associés à des événements spécifiques ou causés par des problèmes techniques. Toutefois, des anomalies très importantes (valeurs absolues supérieures à 6) pourraient également indiquer un problème technique.\n\nNous calculons l\'indicateur d\'anomalie des voyageurs en combinant l\'indicateur de différence des voyageurs et l\'écart absolu moyen du nombre de voyageurs entre des paires de zones pendant une période de référence.\n\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'movements.abnormality'; +UPDATE indicator SET translation = '{"fr": {"label": "Résidents", "description": "Estime le nombre de personnes résidant dans une zone pendant le mois sélectionné par l\'utilisateur.", "method": "L\'indicateur des résidents estime le nombre de personnes résidant dans chaque zone pendant le mois sélectionné par l\'utilisateur.\\n\\nL\'indicateur est calculé à partir de l\'indicateur d\'afflux net et du nombre de base de résidents dans la zone pendant une période de référence.\\n\\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.residents'; +UPDATE indicator SET translation = '{"fr": {"label": "Habitants par km²", "description": "Estime le nombre moyen de personnes résidant par kilomètre carré d\'une zone pendant le mois sélectionné par l\'utilisateur.", "method": "L\'indicateur de résidents par kilomètre carré estime le nombre moyen de personnes résidant par kilomètre carré d\'une zone pendant le mois sélectionné par l\'utilisateur.\\n\\nL\'indicateur est calculé à partir de l\'indicateur des résidents et de la taille géographique de la zone.\\n\\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.residents_perKm2'; +UPDATE indicator SET translation = '{"fr": {"label": "Différence entre les résidents", "description": "Estime la différence du nombre de résidents entre une période de référence et le mois sélectionné par l\'utilisateur.", "method": "Pour chaque zone, l\'indicateur de différence de résidents estime la différence du nombre de résidents entre une période de référence et le mois sélectionné par l\'utilisateur.\\n\\nL\'indicateur est calculé à partir de l\'indicateur de résidents et du nombre de résidents de référence dans la zone pendant une période de référence.\\n\\nSi le nombre de résidents a augmenté, l\'indicateur aura une valeur positive ; si le nombre de résidents a diminué, la valeur sera négative.\\n\\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.residents_diffwithref'; +UPDATE indicator SET translation = '{"fr": {"label": "Variation en pourcentage de la différence de résidents", "description": "Estime la variation du nombre de résidents entre une période de référence et le mois sélectionné par l\'utilisateur, exprimée en pourcentage du nombre de résidents de référence.", "method": "L\'indicateur de variation en pourcentage du nombre de résidents estime la variation du nombre de résidents entre une période de référence et une période donnée, par rapport au nombre de résidents de la période de référence. La différence est exprimée en pourcentage d\'une valeur de référence calculée pour la période de référence.\\n\\nL\'indicateur est calculé à partir de l\'indicateur de résidents et du nombre de résidents de référence dans la zone pendant une période de référence.\\n\\nSi le nombre de résidents a augmenté, l\'indicateur aura une valeur positive ; si le nombre de résidents a diminué, la valeur sera négative.\\n\\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.residents_pctchangewithref'; +UPDATE indicator SET translation = '{"fr": {"label": "Anomalie", "description": "Mesure l\'écart entre le nombre estimé de personnes résidant dans une zone donnée pendant le mois sélectionné par l\'utilisateur et le nombre de résidents estimé pendant la période de référence, exprimé sous la forme d\'un score d\'anomalie (score z).", "method": "L\'indicateur d\'anomalie des résidents mesure l\'écart entre le nombre estimé de personnes résidant dans une zone donnée pendant le mois sélectionné par l\'utilisateur et le nombre de résidents estimé pendant la période de référence, exprimé sous la forme d\'un score z.\\n\\nL\'indicateur est calculé à partir de l\'indicateur de différence de résidents et de l\'écart absolu moyen du nombre de résidents dans la zone pendant une période de référence.\\n\\nPour cet indicateur, une valeur positive supérieure à 3 indique une augmentation statistiquement significative du nombre de résidents dans une zone donnée ; une valeur inférieure à -3 indique une diminution statistiquement significative des résidents. Les valeurs entre 3 et -3 se situent dans les limites de la variation normale basée sur la période de référence.\\n\\nCet indicateur décrit l\'ampleur du caractère inhabituel du nombre de résidents dans une zone, compte tenu de l\'ampleur de la variation observée pendant la période de référence. Des valeurs absolues plus élevées indiquent un plus grand écart par rapport à la variation normale de la population, et donc une plus grande probabilité que le changement soit significatif. Des changements de la sorte pourraient être associés à des événements spécifiques ou causés par des problèmes techniques. Toutefois, des anomalies très importantes (valeurs absolues supérieures à 6) pourraient également indiquer un problème technique.\\n\\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.abnormality'; +UPDATE indicator SET translation = '{"fr": {"label": "Résidents arrivés", "description": "Estime le nombre total de personnes qui ont déménagé dans une zone pendant le mois sélectionné par l\'utilisateur.", "method": "Pour chaque zone, l\'indicateur des résidents arrivés estime le nombre total de personnes qui ont déménagé vers une zone à partir de toute autre zone du pays pendant le mois sélectionné par l\'utilisateur.\\n\\nL\'indicateur est calculé à partir de la somme des comptages des abonnés dont le lieu de résidence a changé d\'une zone à une autre chaque mois.\\n\\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.arrived'; +UPDATE indicator SET translation = '{"fr": {"label": "Résidents déplacés", "description": "Estime le nombre total de personnes qui ont déménagé hors d\'une zone pendant le mois sélectionné par l\'utilisateur.", "method": "Pour chaque zone, l\'indicateur des résidents déplacés estime le nombre total de personnes qui ont déménagé vers une zone à partir de toute autre zone du pays pendant le mois sélectionné par l\'utilisateur.\\n\\nL\'indicateur est calculé à partir de la somme des comptages des abonnés dont le lieu de résidence a changé d\'une zone à une autre chaque mois.\\n\\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.departed'; +UPDATE indicator SET translation = '{"fr": {"label": "Afflux net", "description": "Estime la différence entre le nombre de personnes déménageant vers et hors d\'une zone pendant le mois sélectionné par l\'utilisateur.", "method": "Pour chaque zone, l\'indicateur d\'afflux net de résidents estime la différence entre le nombre de personnes ayant déménagé dans (résidents arrivés) et hors (résidents partis) d\'une zone pendant le mois sélectionné par l\'utilisateur.\\n\\nCet indicateur est calculé à partir des indicateurs relatifs aux résidents arrivés et partis.\\n\\nSi les personnes qui s\'installent dans la zone sont plus nombreuses que celles qui la quittent, l\'indicateur aura une valeur positive ; si les personnes qui quittent la zone sont plus nombreuses, la valeur sera négative.\\n\\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'residents.delta_arrived'; +UPDATE indicator SET translation = '{"fr": {"label": "Changement de résidence", "description": "Estime le nombre de personnes qui ont déménagé de la zone A à la zone B pendant le mois sélectionné par l\'utilisateur.", "method": "Pour chaque paire de zones, l\'indicateur de changement de résidence estime le nombre de personnes qui déménagent de la zone A à la zone B pendant le mois sélectionné par l\'utilisateur.\\n\\nL\'indicateur est calculé à partir du nombre d\'abonnés dont le lieu de résidence est passé de la zone A à la zone B pendant une période donnée.\\n\\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'relocations.relocations'; +UPDATE indicator SET translation = '{"fr": {"label": "Différence de changements de résidence", "description": "Estime la variation du nombre de changements de résidence de la zone A vers la zone B entre une période de référence et le mois choisi par l\'utilisateur.", "method": "L\'indicateur de différence de changements de résidence estime la variation du nombre de changements de résidence de la zone A vers la zone B entre une période de référence et le mois sélectionné par l\'utilisateur.\\n\\nL\'indicateur est calculé à partir de l\'indicateur de changement de résidence et du nombre de changements de résidence de référence pendant une période de référence.\\n\\nSi le nombre de changements de résidence a augmenté, l\'indicateur aura une valeur positive ; si le nombre de changements de résidence a diminué, la valeur sera négative.\\n\\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'relocations.relocations_diffwithref'; +UPDATE indicator SET translation = '{"fr": {"label": "Variation en pourcentage de la différence de changements de résidence", "description": "Estime la variation du nombre de changements de résidence de la zone A vers la zone B entre une période de référence et le mois choisi par l\'utilisateur, exprimée en pourcentage du nombre de changements de résidence de référence.", "method": "L\'indicateur de variation en pourcentage de la différence de changements de résidence estime la variation des changements de résidence de la zone A vers la zone B par rapport au nombre de changements de résidence entre ces zones pendant la période de référence. La différence est exprimée en pourcentage d\'une valeur de référence calculée pour la période de référence.\\n\\nL\'indicateur est calculé à partir de l\'indicateur de changements de résidence et du nombre de changements de résidence de référence pendant une période de référence.\\n\\nSi le nombre de changements de résidence a augmenté, l\'indicateur aura une valeur positive ; si le nombre de changements de résidence a diminué, la valeur sera négative.\\n\\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'relocations.relocations_pctchangewithref'; +UPDATE indicator SET translation = '{"fr": {"label": "Anomalie des changements de résidence", "description": "Mesure l\'écart du nombre estimé de changements de résidence de la zone A vers la zone B pendant la période d\'intérêt par rapport au nombre de changements de résidence estimé pendant la période de référence, exprimé sous la forme d\'un score d\'anomalie (score z).", "method": "L\'indicateur d\'anomalie des changements de résidence mesure l\'écart entre le nombre estimé de changements de résidence de la zone A vers la zone B pendant le mois sélectionné par l\'utilisateur et le nombre de changements de résidence estimé pendant une période de référence, exprimé sous la forme d\'un score z.\\n\\nPour cet indicateur, une valeur positive supérieure à 3 indique une augmentation statistiquement significative du nombre de changements de résidence ; une valeur inférieure à -3 indique une diminution statistiquement significative des changements de résidence.\\n\\nCet indicateur décrit l\'ampleur du caractère inhabituel du nombre de changements de résidence de la zone A vers la zone B, compte tenu de l\'ampleur de la variation observée pendant la période de référence. Des valeurs absolues plus élevées indiquent un plus grand écart par rapport à la variation normale des changements de résidence , et donc une plus grande probabilité que le changement soit significatif. Des changements de la sorte pourraient être associés à des événements spécifiques ou causés par des problèmes techniques. Toutefois, des anomalies très importantes (valeurs absolues supérieures à 6) pourraient également indiquer un problème technique.\\n\\nNous calculons l\'indicateur d\'anomalie des changements de résidence en utilisant l\'indicateur de différence des changements de résidence et l\'écart absolu moyen du nombre de changements de résidence pendant une période de référence.\\n\\nL\'emplacement du domicile d\'un abonné est déterminé par la zone dans laquelle se trouve la tour de téléphonie cellulaire qui a acheminé le plus fréquemment le dernier événement réseau de l\'abonné (par exemple, un appel, un message SMS, ou des données mobiles) de la journée au cours des quatre semaines précédentes, avec une mise à jour mensuelle."}}' WHERE indicator_id = 'relocations.abnormality'; +UPDATE indicator SET translation = '{"fr": {"label": "Présence", "description": "Estime le nombre de personnes présentes dans une zone donnée le ou les jours sélectionnés par l\'utilisateur.", "method": "L\'indicateur de présence estime le nombre de personnes présentes dans une zone donnée à un moment donné du ou des jours sélectionnés par l\'utilisateur.\\n\\nNous calculons l\'indicateur de présence à partir du nombre d\'abonnés uniques qui ont été actifs dans une zone donnée le ou les jours choisis par l\'utilisateur.\\n\\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.presence'; +UPDATE indicator SET translation = '{"fr": {"label": "Présence par km²", "description": "Estime le nombre moyen de personnes présentes par kilomètre carré d\'une zone pendant le ou les jours sélectionnés par l\'utilisateur.", "method": "La présence par km² estime le nombre moyen de personnes présentes par kilomètre carré d\'une zone pendant le ou les jours sélectionnés par l\'utilisateur.\\n\\nL\'indicateur est calculé à partir de l\'indicateur de présence et de la taille géographique de la zone.\\n\\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.presence_perKm2'; +UPDATE indicator SET translation = '{"fr": {"label": "Différence de présence", "description": "Estime la différence entre le nombre de personnes présentes dans une zone pendant le ou les jours sélectionnés par l\'utilisateur et le nombre de personnes présentes pendant une période de référence.", "method": "L\'indicateur de différence de présence estime la différence entre le nombre de personnes présentes dans une zone pendant le ou les jours sélectionnés par l\'utilisateur et le nombre de personnes présentes pendant une période de référence.\\n\\nL\'indicateur est calculé à partir de l\'indicateur de présence et du nombre de référence de personnes pendant une période de référence.\\n\\nSi le nombre de personnes présentes dans la zone a augmenté, l\'indicateur aura une valeur positive ; si le nombre a diminué, la valeur sera négative.\\n\\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.presence_diffwithref'; +UPDATE indicator SET translation = '{"fr": {"label": "Variation en pourcentage de la différence de présence", "description": "Estime la variation du nombre de personnes présentes dans une zone au cours du ou des jours sélectionnés par l\'utilisateur par rapport au nombre de personnes présentes dans la zone pendant la période de référence, exprimée en pourcentage.", "method": "L\'indicateur de variation de présence en pourcentage estime la variation du nombre de personnes présentes dans une zone pendant le ou les jours sélectionnés par l\'utilisateur par rapport au nombre de personnes présentes dans la zone pendant la période de référence. La différence est exprimée en pourcentage d\'une valeur de référence calculée pour la période de référence.\\n\\nL\'indicateur est calculé à partir de l\'indicateur de présence et du nombre de référence de personnes pendant une période de référence.\\n\\nSi le nombre de personnes présentes dans la zone a augmenté, l\'indicateur aura une valeur positive ; si le nombre de personnes présentes dans la zone a diminué, la valeur sera négative.\\n\\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.presence_pctchangewithref'; +UPDATE indicator SET translation = '{"fr": {"label": "Anomalie", "description": "Mesure l\'écart du nombre de personnes présentes dans une zone donnée pendant le ou les jours sélectionnés par l\'utilisateur par rapport à une période de référence, exprimé sous la forme d\'un score d\'anomalie (score z).", "method": "L\'indicateur d\'anomalie de présence mesure l\'écart du nombre de personnes présentes dans une zone donnée pendant le ou les jours sélectionnés par l\'utilisateur par rapport à une période de référence, exprimé sous la forme d\'un score z.\\n\\nPour cet indicateur, une valeur positive supérieure à 3 indique une augmentation statistiquement significative du nombre de personnes présentes dans une zone donnée ; une valeur inférieure à -3 indique une diminution statistiquement significative de la présence.\\n\\nCet indicateur décrit l\'ampleur du caractère inhabituel du nombre de personnes dans une zone, compte tenu de l\'ampleur de la variation observée pendant la période de référence. Des valeurs absolues plus élevées indiquent un plus grand écart par rapport à la variation normale de présence, et donc une plus grande probabilité que le changement soit significatif. Des changements de la sorte pourraient être associés à des événements spécifiques ou causés par des problèmes techniques. Toutefois, des anomalies très importantes (valeurs absolues supérieures à 6) pourraient également indiquer un problème technique.\\n\\nL\'indicateur est calculé à partir de l\'indicateur de différence de présence et de l\'écart absolu moyen de présence pendant une période de référence.\\n\\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.abnormality'; +UPDATE indicator SET translation = '{"fr": {"label": "Déplacements entrants", "description": "Estime le nombre de déplacements dans une zone à partir d\'autres zones pendant le ou les jours sélectionnés par l\'utilisateur.", "method": "L\'indicateur des déplacements entrants estime le nombre de déplacements dans une zone à partir d\'autres zones pendant le ou les jours sélectionnés par l\'utilisateur. Lorsque les données indiquent des déplacements multiples entre les zones au cours d\'une même journée pour un abonné donné (de A à B, puis de B à C), l\'indicateur prend en compte tous les déplacements (AB, BC).\\n\\nÀ la différence de l\'indicateur des voyageurs entrants, qui ne compte qu\'une seule fois chaque abonné unique, cet indicateur inclut les déplacements multiples dans une zone par le même abonné.\\n\\nNous calculons l\'indicateur des déplacements entrants à partir de la somme des comptages des abonnés qui étaient présents dans une zone d\'intérêt après avoir été présents dans une autre zone pendant le ou les jours sélectionnés par l\'utilisateur.\\n\\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.trips_in'; +UPDATE indicator SET translation = '{"fr": {"label": "Déplacements sortants", "description": "Estime le nombre de déplacements d\'une zone vers une autre zone pendant le ou les jours sélectionnés par l\'utilisateur.", "method": "L\'indicateur de déplacements sortants estime le nombre de déplacements d\'une zone vers une autre zone au cours du ou des jours sélectionnés par l\'utilisateur. Lorsque les données indiquent plusieurs déplacements dans une même journée pour un abonné donné (de A à B, puis de B à C), l\'indicateur prend en compte tous les déplacements (AB, BC).\\n\\nÀ la différence de l\'indicateur de voyageurs sortants qui ne compte qu\'une seule fois chaque abonné unique, cet indicateur inclut également les déplacements multiples d\'un même abonné hors d\'une zone.\\n\\nNous calculons l\'indicateur des déplacements entrants à partir de la somme des comptages des abonnés qui étaient présents dans une autre zone après avoir été présents dans une zone d\'intérêt pendant le ou les jours sélectionnés par l\'utilisateur.\\n\\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'presence.trips_out'; +UPDATE indicator SET translation = '{"fr": {"label": "Voyageurs", "description": "Estime le nombre de personnes qui visitent la zone B après avoir été présentes dans la zone A pendant le ou les jours sélectionnés par l\'utilisateur.", "method": "L\'indicateur de voyageurs estime le nombre de personnes qui visitent la zone B après avoir été présentes dans la zone A (c\'est-à-dire avoir voyagé de A à B) pendant le ou les jours sélectionnés par l\'utilisateur.\\n\\nNous calculons l\'indicateur de voyageurs à partir du nombre d\'abonnés qui étaient présents dans la zone B après avoir été présents dans la zone A au cours du ou des jours sélectionnés par l\'utilisateur.\\n\\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'movements.travellers'; +UPDATE indicator SET translation = '{"fr": {"label": "Différence de voyageurs", "description": "Estime la variation du nombre de personnes voyageant de la zone A à B pendant une période donnée par rapport au nombre de base de voyageurs de A à B pendant une période de référence.", "method": "L\'indicateur de différence de voyageurs estime la variation du nombre de personnes voyageant de la zone A à la zone B pendant une période donnée par rapport au nombre de voyageurs de référence pendant une période de référence.\\n\\nSi le nombre de voyageurs a augmenté, l\'indicateur aura une valeur positive ; si le nombre de voyageurs a diminué, la valeur sera négative.\\n\\nNous calculons l\'indicateur de différence de voyageurs à partir de l\'indicateur de voyageurs et du nombre de référence de voyageurs entre des paires de zones pendant une période de référence.\\n\\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'movements.travellers_diffwithref'; +UPDATE indicator SET translation = '{"fr": {"label": "Variation en pourcentage de la différence de voyageurs", "description": "Estime la variation du nombre de personnes voyageant de la zone A à B pendant le ou les jours sélectionnés par l\'utilisateur par rapport au nombre de référence de voyageurs de A à B pendant la période de référence, exprimée en pourcentage.", "method": "La variation en pourcentage de l\'indicateur de voyageurs estime la variation du nombre de personnes voyageant de la zone A à B pendant le ou les jours sélectionnés par l\'utilisateur par rapport au nombre de référence de voyageurs de A à B pendant la période de référence. La différence est exprimée en pourcentage d\'une valeur de référence calculée pour la période de référence.\\n\\nSi le nombre de voyageurs a augmenté, l\'indicateur aura une valeur positive ; si le nombre de voyageurs a diminué, la valeur sera négative.\\n\\nNous calculons le pourcentage de variation de l\'indicateur de différence de voyageurs à partir de l\'indicateur de voyageurs et du nombre de voyageurs de référence entre les paires de zones pendant le ou les jours sélectionnés par l\'utilisateur.\\n\\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'movements.travellers_pctchangewithref'; +UPDATE indicator SET translation = '{"fr": {"label": "Anomalie", "description": "Mesure l\'écart entre le nombre estimé de personnes voyageant de la zone A à B pendant le ou les jours sélectionnés par l\'utilisateur et le nombre de voyageurs de A à B estimé pendant une période de référence, exprimé sous la forme d\'un score z.", "method": "L\'indicateur d\'anomalie des voyageurs mesure l\'écart entre le nombre estimé de personnes voyageant de la zone A à la zone B pendant le ou les jours sélectionnés par l\'utilisateur et le nombre de voyageurs de A à B estimé pendant une période de référence, exprimé sous la forme d\'un score z. \\n\\nPour cet indicateur, une valeur positive supérieure à 3 indique une augmentation statistiquement significative du nombre de voyageurs ; une valeur inférieure à -3 indique une diminution statistiquement significative.\\n\\nCet indicateur décrit l\'ampleur du caractère inhabituel du nombre de voyageurs de la zone A vers la zone B, compte tenu de l\'ampleur de la variation observée pendant la période de référence. Des valeurs absolues plus élevées indiquent un plus grand écart par rapport à la variation normale du nombre de voyageurs, et donc une plus grande probabilité que le changement soit significatif. Des changements de la sorte pourraient être associés à des événements spécifiques ou causés par des problèmes techniques. Toutefois, des anomalies très importantes (valeurs absolues supérieures à 6) pourraient également indiquer un problème technique.\\n\\nNous calculons l\'indicateur d\'anomalie des voyageurs en combinant l\'indicateur de différence des voyageurs et l\'écart absolu moyen du nombre de voyageurs entre des paires de zones pendant une période de référence.\\n\\nLes abonnés sont considérés comme ayant été présents dans une zone un jour donné lorsqu\'un événement réseau (par exemple un appel) est acheminé par une tour de téléphonie cellulaire dans cette zone."}}' WHERE indicator_id = 'movements.abnormality'; From 42d2429044bc5bbdd7bdf8bc9d94babd4516b132 Mon Sep 17 00:00:00 2001 From: Joachim Jellinek Date: Mon, 23 Mar 2026 11:33:08 +0000 Subject: [PATCH 4/6] Fixed formatting --- resources/generate_translation_sql.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/resources/generate_translation_sql.py b/resources/generate_translation_sql.py index d9135a7..be2b8b2 100644 --- a/resources/generate_translation_sql.py +++ b/resources/generate_translation_sql.py @@ -22,7 +22,9 @@ langs = {l["code"] for l in config["languages"] if not l.get("default")} -print("-- Generated from config.json - updates indicator translations in flowkit_ui_backend") +print( + "-- Generated from config.json - updates indicator translations in flowkit_ui_backend" +) print("-- Languages:", sorted(langs)) print() @@ -34,5 +36,11 @@ if len(parts) == 2 and parts[1] in langs: translation.setdefault(parts[1], {})[parts[0]] = val if translation: - escaped = json.dumps(translation, ensure_ascii=False).replace("\\", "\\\\").replace("'", "\\'") - print(f"UPDATE indicator SET translation = '{escaped}' WHERE indicator_id = '{iid}';") + escaped = ( + json.dumps(translation, ensure_ascii=False) + .replace("\\", "\\\\") + .replace("'", "\\'") + ) + print( + f"UPDATE indicator SET translation = '{escaped}' WHERE indicator_id = '{iid}';" + ) From 579217300b3656f2fde5ed3d36abefd6841a05f0 Mon Sep 17 00:00:00 2001 From: Joachim Jellinek Date: Mon, 23 Mar 2026 11:45:45 +0000 Subject: [PATCH 5/6] Charset correction in comments --- resources/generate_translation_sql.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/generate_translation_sql.py b/resources/generate_translation_sql.py index be2b8b2..90794fd 100644 --- a/resources/generate_translation_sql.py +++ b/resources/generate_translation_sql.py @@ -5,10 +5,10 @@ Usage: python3 resources/generate_translation_sql.py > /tmp/update_translations.sql - tailscale ssh root@mobdash-sql-prod "mysql -u root -A flowkit_ui_backend" < /tmp/update_translations.sql + tailscale ssh root@mobdash-sql-prod "mysql --default-character-set=utf8mb4 -u root -A flowkit_ui_backend" < /tmp/update_translations.sql Or pipe directly: - python3 resources/generate_translation_sql.py | tailscale ssh root@mobdash-sql-prod "mysql -u root -A flowkit_ui_backend" + python3 resources/generate_translation_sql.py | tailscale ssh root@mobdash-sql-prod "mysql --default-character-set=utf8mb4 -u root -A flowkit_ui_backend" """ import json From 372b6aed6ba602700b4d2529edf48bd1301021f5 Mon Sep 17 00:00:00 2001 From: Joachim Jellinek Date: Tue, 24 Mar 2026 16:34:08 +0000 Subject: [PATCH 6/6] Add populated_dates to TimeRange response Exposes the list of dates that actually have data (before gap-filling) alongside all_dates. The frontend uses this to snap the slider over empty months without a flicker. --- flowkit_ui_backend/impl/data_api_impl.py | 2 ++ flowkit_ui_backend/models/time_range.py | 1 + 2 files changed, 3 insertions(+) diff --git a/flowkit_ui_backend/impl/data_api_impl.py b/flowkit_ui_backend/impl/data_api_impl.py index 0e950be..0a2108d 100644 --- a/flowkit_ui_backend/impl/data_api_impl.py +++ b/flowkit_ui_backend/impl/data_api_impl.py @@ -256,6 +256,7 @@ async def get_time_range( logger.debug(f"Formatting dates...", date_format=date_format) dates = [row[0].strftime(date_format) for row in result] + populated_dates = dates[:] min_value = min([row[1] for row in result]) if len(result) > 0 else None max_value = max([row[2] for row in result]) if len(result) > 0 else None @@ -278,6 +279,7 @@ async def get_time_range( start_date=dates[0], end_date=dates[-1], all_dates=dates, + populated_dates=populated_dates, min_value=min_value, max_value=max_value, ) diff --git a/flowkit_ui_backend/models/time_range.py b/flowkit_ui_backend/models/time_range.py index 1490ab1..7b89ebd 100644 --- a/flowkit_ui_backend/models/time_range.py +++ b/flowkit_ui_backend/models/time_range.py @@ -34,6 +34,7 @@ class TimeRange(BaseModel): start_date: Optional[str] = None end_date: Optional[str] = None all_dates: Optional[List[str]] = None + populated_dates: Optional[List[str]] = None min_value: Optional[int] = None max_value: Optional[int] = None