i18n(fr): apply review round 2

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
German KhokhlovandClaude Opus 5.5 committed 2026-10-28 17:55:20 +04:00
1 parent 4adb9113bc
commit e87001d0db
6 files changed
+122 -91

No files matched your search

+31 -31
View File
@@ -169,7 +169,7 @@
"other": "{count} SOURCES"
},
"OUTSIDE IMAGERY SWIPE": "HORS DE LA COMPARAISON D'IMAGES",
"{scene} / AUTHORED SHOT": "{scene} / PLAN CONÇU",
"{scene} / AUTHORED SHOT": "{scene} / PLAN SCÉNARISÉ",
"NEPAL FLOOD INCIDENT": "CRUE AU NÉPAL",
"Play {shot}": "Lire {shot}",
"current scene shot": "le plan actuel de la scène",
@@ -242,7 +242,7 @@
"Map tiles temporarily unavailable": "Tuiles de la carte temporairement indisponibles",
"Mapped names temporarily unavailable": "Noms cartographiés temporairement indisponibles",
"Overpass temporarily unavailable": "Overpass temporairement indisponible",
"Retrying mapped sites…": "Nouvel essai des sites cartographiés…",
"Retrying mapped sites…": "Nouvel essai : sites cartographiés…",
"Fetching mapped sites…": "Récupération des sites cartographiés…",
"{reason} — retrying in {seconds}s": "{reason} — nouvel essai dans {seconds} s",
"{reason} — retry pending": "{reason} — nouvel essai en attente",
@@ -286,7 +286,7 @@
"PILOT": "PILOTINE",
"SAR": "SAR",
"TUG": "REMORQUEUR",
"PORT TENDER": "SERVITUDE",
"PORT TENDER": "SERVITUDE PORT.",
"ANTI-POLLUTION": "ANTIPOLLUTION",
"LAW ENFORCE": "POLICE",
"MEDICAL": "MÉDICAL",
@@ -414,8 +414,8 @@
"Checking local ChatGPT OAuth sign-in…": "Vérification de la connexion OAuth ChatGPT locale…",
"Could not check ChatGPT sign-in.": "Impossible de vérifier la connexion ChatGPT.",
"ChatGPT OAuth selected for cloud voice. Your API key stays saved and available.": "OAuth ChatGPT sélectionné pour la voix cloud. Votre clé API reste enregistrée et disponible.",
"ChatGPT sign-in expired. Opening sign-in again…": "La connexion ChatGPT a expiré. Nouvelle ouverture de la connexion…",
"Opening ChatGPT sign-in in your browser…": "Ouverture de la connexion ChatGPT dans votre navigateur…",
"ChatGPT sign-in expired. Opening sign-in again…": "La session ChatGPT a expiré. Réouverture de la page de connexion…",
"Opening ChatGPT sign-in in your browser…": "Ouverture de la page de connexion ChatGPT dans votre navigateur…",
"Could not start ChatGPT sign-in on this machine.": "Impossible de lancer la connexion ChatGPT sur cette machine.",
"Finish ChatGPT sign-in in the browser. Waiting for it to complete…": "Terminez la connexion ChatGPT dans le navigateur. En attente de la fin…",
"ChatGPT sign-in timed out. Click {button} to try again.": "Délai de connexion ChatGPT dépassé. Cliquez sur « {button} » pour réessayer.",
@@ -473,7 +473,7 @@
"many": "{count} à proximité",
"other": "{count} à proximité"
},
"retrying mapped ALPR cameras": "nouvel essai des caméras LAPI cartographiées",
"retrying mapped ALPR cameras": "nouvel essai : caméras LAPI cartographiées",
"loading mapped ALPR cameras": "chargement des caméras LAPI cartographiées",
"No ALPR data for this area — US and Canada only": "Aucune donnée LAPI pour cette zone — États-Unis et Canada seulement",
"Zoom in to load mapped cameras": "Zoomez pour charger les caméras cartographiées",
@@ -634,8 +634,8 @@
"At the end of the road, turn {direction}": "Au bout de la route, tournez {direction}",
"At the end of the road, continue onto {road}": "Au bout de la route, continuez sur {road}",
"At the end of the road, continue": "Au bout de la route, continuez",
"Keep {direction} at the fork onto {road}": "À l'embranchement, restez {direction} sur {road}",
"Keep {direction} at the fork": "À l'embranchement, restez {direction}",
"Keep {direction} at the fork onto {road}": "À l'embranchement, continuez {direction} sur {road}",
"Keep {direction} at the fork": "À l'embranchement, continuez {direction}",
"Continue at the fork onto {road}": "À l'embranchement, continuez sur {road}",
"Continue at the fork": "À l'embranchement, continuez",
"Merge {direction} onto {road}": "Insérez-vous {direction} sur {road}",
@@ -815,7 +815,7 @@
"ORBIT REPLAY · {mission}": "REJEU DE L'ORBITE · {mission}",
"PAUSED · {title}": "PAUSE · {title}",
"UNSPECIFIED": "NON PRÉCISÉ",
"+{count} additional payload records": "+{count} enregistrements de charge utile supplémentaires",
"+{count} additional payload records": "Enregistrements de charge utile supplémentaires : +{count}",
"PAYLOAD DATA UNAVAILABLE": "DONNÉES DE CHARGE UTILE INDISPONIBLES",
"{value} KM DOWNRANGE": "DIST. SOL : {value} KM",
"POSITION UNAVAILABLE": "POSITION INDISPONIBLE",
@@ -1005,7 +1005,7 @@
"Imagery catalog unavailable": "Catalogue d'images indisponible",
"Catalog truncated · a newer clear day may exist": "Catalogue tronqué · un jour dégagé plus récent peut exister",
"{label} catalog unavailable · {detail}": "Catalogue {label} indisponible · {detail}",
"Daily overview for today may still be empty until the pass": "La vue d'ensemble quotidienne peut rester vide jusqu'au passage du satellite",
"Daily overview for today may still be empty until the pass": "La vue quotidienne d'aujourd'hui peut rester vide jusqu'au passage du satellite",
"Box and images cleared": "Zone et images effacées",
"MORE DETAIL · 30 m": "PLUS DE DÉTAIL · 30 m",
"Sentinel-2 and Landsat via HLS, 30 m, every 2–6 days": "Sentinel‑2 et Landsat via HLS, 30 m, tous les 2 à 6 jours",
@@ -1238,7 +1238,7 @@
"Vivid": "Forte",
"Image opacity; does not alter the observed values": "Opacité de l'image ; ne modifie pas les valeurs observées",
"View US radar": "Voir le radar des États-Unis",
"View Americas & Pacific": "Voir Amériques et Pacifique",
"View Americas & Pacific": "Voir les Amériques et le Pacifique",
"View coverage": "Voir la couverture",
"{value} strikes/km²/min ×10³ (15-minute density)": "{value} impacts/km²/min ×10³ (densité sur 15 minutes)",
"{value} dBZ radar reflectivity": "{value} dBZ de réflectivité radar",
@@ -1246,7 +1246,7 @@
"Map center is outside source coverage": "Le centre de la carte est hors de la couverture de la source",
"NOAA/NWS 15-minute lightning density derived from Vaisala NLDN/GLD360. Coverage 110°E across the Pacific/Americas to 0°, 25°S–80°N. Not a live strike count, global coverage or a safety warning.": "Densité de foudre sur 15 minutes de NOAA/NWS, dérivée de Vaisala NLDN/GLD360. Couverture de 110°E à 0° à travers le Pacifique et les Amériques, 25°S–80°N. Ce n'est ni un décompte d'impacts en direct, ni une couverture mondiale, ni une alerte de sécurité.",
"NOAA MRMS radar echoes indicate precipitation patterns, not rain rate, a storm warning or a future forecast. Native source approximately 1 km; display is limited to level 6. Frames use exact advertised observation times.": "Les échos radar NOAA MRMS indiquent la structure des précipitations, pas l'intensité de la pluie, une alerte d'orage ou une prévision. Résolution native d'environ 1 km ; l'affichage est limité au niveau 6. Les images utilisent les heures d'observation exactes publiées.",
"GOES-19/18 longwave infrared Band 14 regional; NESDIS global longwave mosaic. Clouds only dims everything but bright, cold cloud tops; a brightness filter, not a cloud mask. Coverage and freshness differ by region.": "Infrarouge grandes longueurs d'onde GOES-19/18, bande 14, régional ; mosaïque mondiale grandes longueurs d'onde NESDIS. Nuages seuls assombrit tout sauf les sommets nuageux brillants et froids ; c'est un filtre de luminosité, pas un masque de nuages. La couverture et la fraîcheur varient selon la région.",
"GOES-19/18 longwave infrared Band 14 regional; NESDIS global longwave mosaic. Clouds only dims everything but bright, cold cloud tops; a brightness filter, not a cloud mask. Coverage and freshness differ by region.": "Infrarouge grandes longueurs d'onde GOES-19/18, bande 14, régional ; mosaïque mondiale grandes longueurs d'onde NESDIS. « Nuages seuls » assombrit tout sauf les sommets nuageux brillants et froids ; c'est un filtre de luminosité, pas un masque de nuages. La couverture et la fraîcheur varient selon la région.",
"REGION": "RÉGION",
"IMAGE": "IMAGE",
"FILTER": "FILTRE",
@@ -1254,7 +1254,7 @@
"OPACITY": "OPACITÉ",
"Infrared decode failed": "Échec du décodage infrarouge",
"Weather prefetch unavailable": "Préchargement météo indisponible",
"Weather tiles unavailable · previous frame retained": "Tuiles météo indisponibles · image précédente conservée",
"Weather tiles unavailable · previous frame retained": "Tuiles indisp. · image précédente conservée",
"Some weather tiles unavailable": "Certaines tuiles météo indisponibles",
"Malformed weather manifest": "Manifeste météo mal formé",
"Weather request timed out": "Délai dépassé pour la requête météo",
@@ -1552,7 +1552,7 @@
"Copy failed": "Échec de la copie",
"Return map to straight-down view": "Remettre la carte en vue verticale",
"Tilt map to oblique view": "Incliner la carte en vue oblique",
"Reset map to north up. Current heading {heading} degrees": "Réorienter la carte nord en haut. Cap actuel {heading} degrés",
"Reset map to north up. Current heading {heading} degrees": "Réorienter la carte nord en haut. Orientation actuelle : {heading} degrés",
"Tilted view": "Vue inclinée",
"Straight-down view": "Vue verticale",
"North up": "Nord en haut",
@@ -1596,7 +1596,7 @@
"FRAME · LOADING": "IMAGE · CHARGEMENT",
"FRAME · UNAVAILABLE": "IMAGE · INDISPONIBLE",
"CALIBRATED": "CALIBRÉE",
"CURATED": "SÉLECTIONNÉE",
"CURATED": "VÉRIFIÉE",
"RAW PRIOR": "ESTIM. INITIALE",
"CCTV ON": "CCTV ON",
"CCTV OFF": "CCTV OFF",
@@ -1651,17 +1651,17 @@
"NO RECENT LOCATION MATCHES": "AUCUNE ACTU RÉCENTE POUR CE LIEU",
"{domain} · {age}": "{domain} · {age}",
"{value} KM/H": "{value} KM/H",
"CLOUD {pct}%": "NUAGES {pct} %",
"CLOUD UNKNOWN": "NUAGES INCONNUS",
"CLOUD {pct}%": "NÉBULOSITÉ {pct} %",
"CLOUD UNKNOWN": "NÉBULOSITÉ INCONNUE",
"{source} · LOCATION QUERY": "{source} · REQUÊTE DE LIEU",
"REGIONAL NEWS": "ACTUS RÉGIONALES",
"{label} · {radius} AIR/SEA WINDOW": "{label} · AIR/MER {radius}",
"{scope} · INSTALLATIONS {coverage}": "{scope} · INSTALLATIONS : {coverage}",
"CONTEXT STANDBY": "CONTEXTE EN VEILLE",
"ENABLE GLOBAL CONTEXT FOR PROXIMITY PINGS": "ACTIVER LE CONTEXTE GLOBAL POUR LES PINGS DE PROXIMITÉ",
"CONTACT LOST · LAST KNOWN READOUT · NOT AN ALL-CLEAR": "CONTACT PERDU · DERNIÈRE POSITION CONNUE · PAS UN FEU VERT",
"CONTACT LOST · LAST KNOWN READOUT · NOT AN ALL-CLEAR": "CONTACT PERDU · DERNIER RELEVÉ CONNU · PAS UN FEU VERT",
"CONTACT LOST · {subject}": "CONTACT PERDU · {subject}",
"SUBJECT LEFT ITS FEED · READOUT HOLDING LAST KNOWN": "SUJET SORTI DE SON FLUX · AFFICHAGE SUR LA DERNIÈRE POSITION CONNUE",
"SUBJECT LEFT ITS FEED · READOUT HOLDING LAST KNOWN": "CIBLE ABSENTE DU FLUX · DERNIER RELEVÉ CONSERVÉ",
"{cohort} · {contact}": "{cohort} · {contact}",
"NO AVAILABLE EXAMPLE": "AUCUN EXEMPLE DISPONIBLE",
"{cohort}, Unavailable": "{cohort}, indisponible",
@@ -1848,7 +1848,7 @@
"{state} · {source} · {detail}": "{state} · {source} · {detail}",
"never": "jamais",
"{source} · {loadingLabel}": "{source} · {loadingLabel}",
"{accepted} of {raw} records accepted": "{accepted} enregistrements acceptés sur {raw}",
"{accepted} of {raw} records accepted": "Enregistrements acceptés : {accepted} sur {raw}",
"incomplete snapshot": "instantané incomplet",
"{state} · {source} · {detail} · {ago}": "{state} · {source} · {detail} · {ago}",
"{state} · {source} · {ago} · retrying in {seconds}s": "{state} · {source} · {ago} · nouvel essai dans {seconds} s",
@@ -1980,7 +1980,7 @@
"PLAY": "LIRE",
"selected": "sélectionnée",
"nearest": "la plus proche",
"{action} {target} radio station": "{action} la station radio {target}",
"{action} {target} radio station": "{action} : station radio {target}",
"RADIO STATE UNCERTAIN": "ÉTAT RADIO INCERTAIN",
"SYNCING DIRECTORY": "SYNCHRO DE L'ANNUAIRE",
"RADIO READY": "RADIO PRÊTE",
@@ -2080,7 +2080,7 @@
"start here": "commencer ici",
"No box": "Aucune zone",
"Searching": "Recherche",
"Every day is empty here": "Tous les jours sont vides ici",
"Every day is empty here": "Aucune image trouvée ici",
"Sources off": "Sources désactivées",
"VS": "VS",
"Not set": "Non défini",
@@ -2102,7 +2102,7 @@
"Times, coverage, sources": "Heures, couverture, sources",
"HIDE EMPTY DAYS": "MASQUER LES JOURS VIDES",
"SHOW EMPTY DAYS · {count}": "AFFICHER LES JOURS VIDES · {count}",
"Days the probe found empty in this box": "Jours que la sonde a trouvés vides dans cette zone",
"Days the probe found empty in this box": "Jours sans image trouvée dans cette zone",
"image": "image",
"BASEMAP": "FOND DE CARTE",
"The basemap": "Le fond de carte",
@@ -2160,9 +2160,9 @@
"LOAD FAILED": "ÉCHEC DU CHARGEMENT",
"LIVE DATA OFF": "DONNÉES EN DIRECT DÉSACTIVÉES",
"MAPPED SITES LOADED": "SITES CARTOGRAPHIÉS CHARGÉS",
"RETRYING MAPPED SITES": "NOUVEL ESSAI SITES CARTOGRAPHIÉS",
"RETRYING MAPPED SITES": "NOUVEL ESSAI : SITES CARTOGRAPHIÉS",
"FETCHING MAPPED SITES": "RÉCUPÉRATION DES SITES CARTOGRAPHIÉS",
"RETRYING ALPR CAMERAS": "NOUVEL ESSAI CAMÉRAS LAPI",
"RETRYING ALPR CAMERAS": "NOUVEL ESSAI : CAMÉRAS LAPI",
"FETCHING ALPR CAMERAS": "RÉCUPÉRATION DES CAMÉRAS LAPI",
"OVERPASS TEMPORARILY UNAVAILABLE": "OVERPASS TEMPORAIREMENT INDISPONIBLE",
"OVERPASS RATE-LIMITED": "OVERPASS : LIMITE DE REQUÊTES ATTEINTE",
@@ -2374,10 +2374,10 @@
"Gemini token response did not include a valid model": "La réponse de Gemini ne contenait pas de modèle valide",
"Gemini token response did not include session settings": "La réponse de Gemini ne contenait pas les paramètres de session",
"Gemini session settings do not match the input mode": "Les paramètres de session Gemini ne correspondent pas au mode de saisie",
"Requesting microphone": "Demande du microphone",
"Requesting microphone": "Demande d'accès au microphone",
"Gemini could not submit this input. Start voice again.": "Gemini n'a pas pu envoyer cette saisie. Relancez la voix.",
"Connecting to Gemini": "Connexion à Gemini",
"Ask or command": "Question ou ordre",
"Ask or command": "Question ou commande",
"Gemini returned an oversized message": "Gemini a renvoyé un message trop volumineux",
"Gemini Live connection failed. Check network access, then start voice again.": "Échec de la connexion à Gemini Live. Vérifiez l'accès au réseau, puis relancez la voix.",
"Gemini Live connection ended. Start voice again for a new conversation.": "La connexion à Gemini Live est terminée. Relancez la voix pour une nouvelle conversation.",
@@ -2394,7 +2394,7 @@
"Gemini action history is full. Start voice again for a fresh session.": "L'historique des actions de Gemini est plein. Relancez la voix pour une nouvelle session.",
"Gemini requested too many simultaneous actions": "Gemini a demandé trop d'actions simultanées",
"Running command": "Commande en cours",
"Voice text command is too long": "La commande vocale écrite est trop longue",
"Voice text command is too long": "La commande écrite est trop longue",
"Gemini voice is not connected": "La voix Gemini n'est pas connectée",
"Gemini interrupted input exceeded its buffer or wait limit. Start voice again.": "La saisie interrompue de Gemini a dépassé sa limite de tampon ou d'attente. Relancez la voix.",
"Gemini Live connection is expiring. Start voice again for a new conversation.": "La connexion à Gemini Live expire. Relancez la voix pour une nouvelle conversation.",
@@ -2523,7 +2523,7 @@
"the flights layer loads by viewport": "la couche des vols se charge selon la vue",
"distance is ground distance, not overhead": "la distance est mesurée au sol jusqu'au point subsatellite, pas jusqu'au satellite",
"the count is a lower bound because at least one layer reached its retained limit.": "le décompte est un minimum, car au moins une couche a atteint sa limite de rétention.",
"{label} off": "{label} : désactivé",
"{label} off": "Couche désactivée : {label}",
"{label} loading": "{label} : chargement",
"{label} error": "{label} : erreur",
"counted the first {returned} loaded records": "{returned} premiers enregistrements chargés comptés",
@@ -2576,7 +2576,7 @@
"{name} is no longer loaded": "{name} n'est plus chargé",
"Unknown target layer: {target}": "Couche cible inconnue : {target}",
"nominal": "nominal",
"{label} on": "{label} : activé",
"{label} on": "Couche activée : {label}",
"Frame aircraft": "Cadrer les aéronefs",
"Frame military aircraft": "Cadrer les aéronefs militaires",
"Frame ships": "Cadrer les navires",
@@ -2693,7 +2693,7 @@
"Recent speech": "Propos récents",
"HERE": "ICI",
"Aircraft cockpit view": "Vue cockpit de l'aéronef",
"LEVEL": "NIVEAU",
"LEVEL": "HORIZON",
"Estimated destination direction": "Direction estimée de la destination",
"DEST ---°": "DEST ---°",
"OPTICAL PLANE · 01": "PLAN OPTIQUE · 01",
+7
View File
@@ -9,6 +9,13 @@ import {
/** Bind Radio input using a RadioControls receiver and supplied actions. */
export function bindRadioControls() {
if (!this._radioPanel) return;
// The markup's placeholder option is the station-tag "All"; markup cannot
// carry the 'radio tag' context the loaded list uses, so set it here.
const allTagOption = this._radioFilter?.querySelector?.(
'option[value="all"]',
);
if (allTagOption)
allTagOption.textContent = t('All', { context: 'radio tag' });
const tunerListenerOptions = {};
const setRadioDisclosure = (expanded, { returnFocus = false } = {}) => {
if (this.destroyed) return;
+1 -1
View File
@@ -122,7 +122,7 @@
<button id="radio-enable-btn" class="panel-layer-toggle" type="button" aria-pressed="false" data-i18n>ENABLE</button>
<label class="radio-filter-label" for="radio-filter" data-i18n>STATION TAG</label>
<select class="gev-field" id="radio-filter" aria-label="Filter stations by station tag" disabled data-i18n-aria-label>
<option value="all" data-i18n>All</option>
<option value="all" data-i18n-runtime>All</option>
</select>
</div>
<div id="radio-station-card" class="radio-station-card" aria-live="polite">
+4 -1
View File
@@ -963,7 +963,10 @@ export function progressStepLabel(step, label) {
: step
? spokenLabel(step, 24)
: t('Working');
return label ? `${base}: ${spokenLabel(label, 32)}` : base;
// The join is a catalog string so each language spaces its colon.
return label
? t('{name}: {state}', { name: base, state: spokenLabel(label, 32) })
: base;
}
/**
+13
View File
@@ -9,6 +9,7 @@ import {
spokenLabel,
} from './speech.js';
import { countWords, findHedges } from './speechLint.js';
import { setLocale } from '../i18n/index.js';
function envelope(name, result, args) {
return attachVoiceResult(name, result, args);
@@ -459,3 +460,15 @@ test('labels are bounded and cleaned before they are spoken', () => {
'background steps stay on screen',
);
});
test('progress step labels join through the catalog colon', () => {
setLocale('fr');
try {
assert.equal(
progressStepLabel('resolve', 'Capitol'),
'Recherche de lieux\u202f: Capitol',
);
} finally {
setLocale('en');
}
});