Retour au Centre de connaissances
Empreinte

Rapport Intl CreepJS : champs et valeurs absentes

Relier les champs Intl de CreepJS aux entrées, locales et erreurs, sans transformer une différence de format en identité ou en verdict de modification.

BotBrowser Team

Documentation

Vous voulez la documentation structurée pour Empreinte ?

Cet article fait partie de la bibliothèque éditoriale. Pour les étapes de configuration, la référence et les mises à jour continues, passez directement à la section docs.

Un rapport Intl CreepJS réunit des exemples formatés, une liste condensée de locales et une évaluation héritée. Leurs origines diffèrent : une ligne manquante ne signifie pas forcément qu'une API est indisponible, et une phrase différente ne constitue pas en elle-même un constat de modification. BotBrowser permet de configurer fuseau horaire, locale et langues ; il ne garantit pas de classement CreepJS particulier ni de résultats régionaux identiques entre versions du navigateur. L'interprétation commence par l'appel produisant chaque champ, ses options et son chemin d'échec.

TL;DR

  • Le collecteur Intl fixé renvoie six exemples de formatage et une chaîne de locales. Il n'exécute pas sept copies du même test régional.
  • La collecte des locales utilise des constructeurs sans arguments, ignore les exceptions et supprime les doublons. La chaîne perd l'association entre constructeurs et locales.
  • DisplayNames exige des options. Son essai sans arguments peut être ignoré alors que l'exemple de nom configuré séparément fonctionne.
  • Les exceptions des callbacks deviennent undefined ; un échec extérieur et la condition htmlElementVersion du rendu suivent d'autres chemins.
  • lied consomme des réserves existantes concernant resolvedOptions. Il ne compare pas les six chaînes à un appareil de référence.

Contents

Schéma du code séparant six formateurs à entrées fixes, les locales dédupliquées des constructeurs, les réserves héritées de resolvedOptions et la condition de rendu htmlElementVersion.

Sept valeurs et six appels de formatage

La révision CreepJS 10aa6724cd33a1015db1574211890518cd04f0cc définit le collecteur concerné dans src/intl/index.ts. Son objet contient dateTimeFormat, displayNames, listFormat, numberFormat, pluralRules, relativeTimeFormat, locale et lied. Les six premiers sont des résultats formatés. La septième valeur visible, locale, provient d'une boucle distincte. L'évaluation est une autre propriété, pas une huitième phrase formatée. Garder ces catégories évite de confondre l'étiquette du rapport avec l'appel d'API. La comparaison des champs de fuseau CreepJS sépare l’identifiant résolu de la réduction historique des candidats et des deux calculs de décalage de la date courante ; ces producteurs de fuseau sont distincts de ces exemples Intl formatés.

L'exemple de date formate l'horodatage numérique fixe 963644400000, en demandant mois long et nom long du fuseau. Il ne précise ni locale ni fuseau. Le nombre est une entrée choisie par le code, pas l'instant auquel le visiteur a ouvert le détecteur. MDN indique que DateTimeFormat.format() accepte une date ou un horodatage et que le format peut varier entre implémentations. Un nom de mois ou de fuseau nécessite donc le contexte du formateur avant de servir à une comparaison.

L'exemple de nom utilise new Intl.DisplayNames(undefined, { type: 'language' }).of('en-US'). Ici, en-US est la balise de langue à nommer ; ce n'est pas la locale explicitement demandée pour la langue du nom. Le premier argument vaut undefined, laissant agir la résolution par défaut. Un nom traduit de l'anglais n'est pas la langue préférée déclarée du visiteur. Langue d'entrée et langue de sortie occupent des positions différentes dans cet appel.

L'exemple de liste formate les deux chaînes ['0', '1'] avec style: 'long' et type: 'disjunction'. Celui de nombre formate 21000000 avec notation compacte et présentation compacte longue. Ces options sélectionnent volontairement des expressions dépendant de la langue. Changer de conjonction, d'abréviation ou d'espacement peut relever des données de formatage sans changer le nombre d'entrée. Le tableau distingue les options et types d'entrée produisant ponctuation de liste et expression numérique compacte.

Champ renvoyéAppel ou entrée fixe du codeInformation conservée
dateTimeFormat963644400000 ; mois et nom de fuseau longsExemple de date avec locale et fuseau par défaut
displayNamestype: 'language' ; .of('en-US')Nom localisé de cette balise de langue
listFormat['0', '1'] ; disjonction longueListe formatée de deux éléments
numberFormat21000000 ; notation compacte, présentation longueExemple de nombre compact
pluralRules.select(1) avec options par défautCatégorie plurielle, pas nombre formaté
relativeTimeFormat1, 'year' ; best-fit, expression numérique automatique, style longExpression de temps relatif
localeLectures réussies de resolvedOptions().locale des constructeursChaîne dédupliquée sans noms de constructeurs

PluralRules().select(1) renvoie une catégorie associée au nombre fourni, tandis que RelativeTimeFormat(...).format(1, 'year') produit une expression relative dépendant de la langue. Aucun ne lit l'année courante d'une horloge. L'option explicite numeric: 'auto' permet une expression lexicale lorsque la locale en possède une ; elle n'oblige pas chaque locale à utiliser un chiffre. Le guide du formatage Intl traite sélection régionale et repli applicatifs, distincts du traçage des champs du détecteur.

Locales des constructeurs et provenance perdue

La fonction getLocale essaie sept constructeurs dans l'ordre : Collator, DateTimeFormat, DisplayNames, ListFormat, NumberFormat, PluralRules et RelativeTimeFormat. Chaque essai appelle le constructeur sans arguments, lit resolvedOptions().locale et ajoute sa valeur si la séquence aboutit. Chaque tentative possède son try/catch. Une exception renvoie la liste accumulée inchangée ; elle n'ajoute pas de marqueur d'échec nommé. Le collecteur supprime ensuite les doublons avec Set.

Cette opération ne constitue pas un tableau diagnostique par constructeur. Dans un cas hypothétique, plusieurs constructeurs réussis peuvent résoudre la même locale. Le résultat la contient une seule fois, quel que soit le nombre de contributeurs. Si deux constructeurs résolvent différemment, les valeurs distinctes restent dans leur ordre d'insertion, mais leur association avec chaque constructeur disparaît. Puis '' + locale convertit le tableau en chaîne. Ces transformations sont définies par le code, pas issues d'une capture de navigateur observée.

DisplayNames distingue concrètement exigences de construction et capacité. MDN impose un argument options avec un type. La construction sans arguments peut donc échouer même si l'implémentation prend en charge Intl.DisplayNames correctement configuré. La fonction ignore cet essai. À l'inverse, l'exemple distinct displayNames fournit type: 'language'. Sa réussite est compatible avec l'omission du constructeur dans la collecte des locales : les deux appels ne posaient pas la même question.

Collator présente l'asymétrie inverse. Il participe à la boucle des locales, mais aucune des six sorties ne compare un ordre de collation. Sa présence dans l'infobulle des constructeurs ne signifie pas que le module a trié ou comparé deux chaînes. Le code permet de constater qu'il a demandé sa locale résolue ; précision ou résultat d'ordre exigeraient une autre opération. Cette distinction empêche de transformer l'infobulle en inventaire de tests inexistants.

La chaîne agrégée diffère aussi de navigator.languages et de l'en-tête HTTP Accept-Language. Aucun n'est une entrée de la boucle de ce collecteur. Ces interfaces peuvent compter dans une enquête plus large, mais décomposer la ligne CreepJS séparée par des virgules ne permet pas de retrouver leurs valeurs. L'analyse fuseau, locale et langues sépare réglages et points d'observation ; elle ne transforme pas leurs représentations différentes en règle universelle d'égalité.

Exemples absents et condition de rendu

Chaque callback de formatage est enveloppé dans la fonction partagée caniuse. Dans le src/errors/index.ts inspecté, une exception de callback renvoie undefined. Les appels Intl utilisent cette forme sans parcourir ensuite une chaîne de propriétés. Constructeur indisponible, option rejetée et exception de formatage peuvent donc produire la même valeur absente. La fonction n'attache pas la catégorie d'exception à cette valeur. L'absence du résultat ne suffit pas à distinguer ces causes.

La fonction extérieure getIntl() possède son propre try/catch. Si une erreur atteint cette portée, le module enregistre un test échoué, appelle la capture d'erreurs et ne renvoie aucun résultat du module. Cela diffère d'un seul callback échoué alors que le reste de l'objet existe. Inversement, atteindre le journal passed: true n'affirme pas que chaque exemple possède une valeur : des exceptions de callbacks peuvent déjà être devenues undefined dans le chemin extérieur réussi.

Le rendu ajoute une couche. Dans la révision fixée, intlHTML(fp) teste !fp.htmlElementVersion avant son chemin Intl normal. Cette condition nomme le rapport des éléments HTML, pas fp.intl. Lorsqu'elle est vraie, la fonction renvoie la carte Intl annotée comme bloquée. C'est une propriété du code de rendu inspecté, pas un constat d'échec Intl dans un navigateur réel. L'étiquette d'une carte bloquée ne démontre pas à elle seule l'indisponibilité d'un constructeur d'internationalisation.

Lorsque la condition permet le chemin normal, le rendu déstructure fp.intl || {} et joint locale et exemples avec <br>. Une valeur individuelle absente peut occuper une position vide dans la chaîne. L'ordre visuel est locale, date, nom, nombre, temps relatif, liste et catégorie plurielle ; ce n'est pas l'ordre des propriétés renvoyées. Compter les lignes sans vérifier l'ordre du code peut attribuer une phrase au mauvais formateur.

État du codeRésultat à cette coucheExplication non étayée à éviter
Un callback lève une exceptionSon exemple devient undefinedNommer une exception précise à partir du vide
Un constructeur sans arguments échoueLa collecte des locales ignore cet essaiDéclarer tout le constructeur non pris en charge
Le collecteur extérieur capture une erreurAucun rapport de module renvoyéDire que chaque exemple a été exécuté et a échoué
htmlElementVersion est absent ou faux en contexte booléenLe rendu sélectionne la carte bloquéeAttribuer directement la condition à la capacité Intl
Le rendu normal reçoit un exemple absentLa chaîne jointe peut comporter un videInventer une expression localisée pour le remplacer

Ces cas définissent une séquence diagnostique concrète : repérer la branche de rendu, déterminer si un objet Intl existe, puis identifier le callback si une seule valeur manque. Cet ordre évite de diagnostiquer une API à partir d'un repli visuel. Il distingue aussi dans les relevés « champ absent », « module absent » et « branche de carte bloquée » : les preuves diffèrent même si l'interface les rapproche. Aucune exécution de navigateur n'est revendiquée pour ces cas dérivés du code.

Réserves héritées et texte formaté

Le collecteur Intl initialise lied en lisant sept clés lieProps finissant par .resolvedOptions, une par constructeur cité. L'opérateur JavaScript || conserve le premier opérande vrai en contexte booléen ; l'expression retombe sur false si aucun ne l'est. Ce n'est pas une boucle formatant six chaînes pour les comparer à des phrases de référence. Le code des exemples ne transforme pas ensuite un mois, un nombre compact ou une catégorie plurielle différents en constat local lied.

Cela compte pour comparer badge ou avertissement et texte affiché. Deux rapports pourraient, hypothétiquement, présenter des chaînes différentes tout en n'ayant aucune réserve héritée vraie. Un autre cas garderait les mêmes phrases mais hériterait d'une réserve sur resolvedOptions. Aucun n'est ici un résultat mesuré. Ces cas montrent pourquoi données formatées et évaluation d'intégrité doivent rester séparées, plutôt que déduites l'une de l'autre.

La couverture des producteurs doit être vérifiée séparément des noms consommés. Le src/lies/index.ts inspecté enregistre explicitement Intl.DateTimeFormat avec des cibles comprenant format, formatRange, formatToParts et resolvedOptions. Il enregistre également Intl.RelativeTimeFormat avec resolvedOptions. Ces deux enregistrements ne font pas des sept clés consommées la preuve de sept contrôles producteurs équivalents. Le constat se limite aux enregistrements inspectés ; ce n'est pas un audit de toute mutation possible ailleurs dans le projet.

Couche du codePreuve concrèteLimite d'interprétation
Consommateur IntlSept clés .resolvedOptions reliées par ORNoms pouvant influencer lied, pas nombre de tests
Enregistrement DateTimeFormatQuatre cibles nommées dont resolvedOptionsDemande explicite de recherche dans cette révision
Enregistrement RelativeTimeFormatCible resolvedOptionsAutre demande explicite de recherche
Callbacks de formatageEntrées et options fixesValeurs formatées sans verdict local par phrase de référence
RenduLa valeur booléenne choisit le style de rejetPrésentation d'une réserve enregistrée, pas probabilité

Le rendu utilise encore la valeur booléenne pour sa classe de rejet et son badge. Une condition séparée LowerEntropy.TIME_ZONE peut modifier le style lorsque la réserve héritée n'est pas sélectionnée. Un badge coloré nécessite donc sa condition de rendu. Ce n'est ni un pourcentage de confiance documenté ni un diagnostic du réglage à changer. Révision, clé de réserve et couche du rapport informent davantage que la couleur.

Matrice de décision pour comparer les rapports

La première comparaison doit identifier le changement. Phrase de date différente, agrégat régional différent, callback absent et réserve héritée vraie sont quatre constats distincts. Une capture peut masquer ces différences, surtout après déduplication dans la boucle. Avant d'attribuer l'écart à un réglage du navigateur, conserver le champ et la révision exacte qui définissent ses entrées et transformations.

Différence étudiéeContexte nécessaireAction suivante limitée
La phrase de date changeHorodatage fixe, options mois/fuseau, locale et fuseau par défautComparer la configuration avant d'inférer un lieu
L'expression compacte change21000000, notation compacte, présentation longue, données régionalesVérifier options identiques et révision d'exécution
Moins de valeurs distinctes dans l'agrégatRéussites des constructeurs et déduplicationExaminer les résultats individuels sans deviner une API omise
Seul le nom localisé manqueAppel configuré type: 'language'Séparer échec du callback et essai régional sans arguments
Mêmes exemples, style de réserve différentClé héritée réelle et condition de renduExaminer la réserve enregistrée, pas le texte
Toute la carte est annotée comme bloquéeCondition htmlElementVersion et présence d'IntlIdentifier d'abord la branche de rendu

Pour la date, modifier seulement le fuseau du navigateur diffère d'une modification de l'horodatage numérique. Le code fixe le second et laisse le premier par défaut. Le relevé ne doit pas appeler la phrase obtenue une valeur d'horloge capturée. Une future révision fournissant un fuseau explicite changerait le contrat de comparaison, même si l'interface conserve l'étiquette de date.

Pour listes et nombres, conserver les chaînes au bon niveau. La liste contient les chaînes 0 et 1 ; l'exemple numérique contient le nombre 21000000. Les remplacer par un seul champ « format numérique » efface la différence entre ponctuation de liste et notation du nombre. Un écart exact peut justifier l'inspection des données régionales, mais un affichage normalisé choisi par une application ne prouve pas que la sortie originale du détecteur correspondait.

Une chaîne régionale plus courte n'est pas automatiquement une régression. La déduplication peut réduire plusieurs résolutions réussies à une entrée ; les exceptions peuvent retirer des essais de constructeurs. Les preuves suivantes diffèrent selon le chemin. Sans provenance par constructeur conservée, l'agrégat ne peut la reconstruire. Associer au hasard une locale à l'un des sept noms ajouterait une information que le rapport ne contient plus.

Un relevé minimal lié au code source

Un relevé d'assistance peut rendre la comparaison utile sans exporter le résultat complet ou une empreinte stable d'identité. Les champs proposés incluent sourceRevision, reportField, constructor, fixedInput, options, collectionState et displayBranch. Pour une réserve héritée, conserver sa clé et la couche l'ayant fournie. Ce sont des champs diagnostiques proposés, pas un schéma que CreepJS serait censé renvoyer.

Les options de date doivent distinguer fuseau omis et fuseau choisi explicitement. L'exemple de nom doit conserver type: 'language', pas seulement le constructeur. Un relevé de boucle doit identifier une tentative ignorée plutôt que lui inventer une locale. Ces distinctions alimentent concrètement la matrice ; elles ne nécessitent ni en-têtes sans rapport, ni texte de page, ni historique géographique d'une personne.

La documentation BotBrowser décrit --bot-timezone, --bot-locale et --bot-languages comme des contrôles séparés avec valeurs automatiques et remplacements explicites. Cette documentation étaye les affirmations de configuration ; CreepJS et MDN ne documentent pas BotBrowser. Un réglage peut définir l'intention de configuration sans prouver des données identiques entre versions, un lieu réel ou l'acceptation par un service externe. La seule couleur d'un avertissement ne justifie aucun changement de réglage.

Lorsqu'un relevé observé manque du champ pertinent, la conclusion doit rester limitée. L'absence d'association constructeur-locale empêche une conclusion individuelle ; un callback vide n'identifie pas son exception ; une réserve sans clé ne localise pas la méthode. Le remède pratique consiste à obtenir la plus petite entrée manquante. Remplacer ces inconnues par une étiquette d'appareil rendrait le rapport plus catégorique et son explication moins exacte.

Questions fréquentes sur le rapport Intl

La date indique-t-elle le moment d'exécution du détecteur ?

Le code fournit l'horodatage fixe 963644400000. L'instant de collecte relève d'un autre enregistrement. Les options de mois et fuseau longs formatent cette entrée historique selon le contexte ; une phrase localisée ne transforme pas le nombre fixe en mesure de l'horloge courante.

Pourquoi un DisplayNames pris en charge manque-t-il dans les locales ?

La fonction de locale ne fournit aucune option, alors que l'exemple de nom fournit type: 'language'. Les exigences MDN expliquent leurs chemins différents. La fonction capture l'exception du constructeur et omet cet essai de son accumulation.

Une seule locale signifie-t-elle un seul constructeur réussi ?

Non. Set supprime les valeurs réussies répétées avant conversion en chaîne. Plusieurs constructeurs peuvent contribuer la même valeur. L'agrégat ne conserve ni nombre de constructeurs réussis ni tableau associant chacun à sa locale.

lied signifie-t-il que le texte échoue face à une référence ?

Le collecteur fixé consomme des réserves existantes par sept clés. Ses callbacks produisent des valeurs sans comparaison locale à une phrase attendue. Interpréter la réserve exige sa provenance ; comparer seulement le texte ne retrouve pas le constat d'intégrité initial.

Une carte Intl bloquée prouve-t-elle la désactivation d'Intl ?

La branche inspectée vérifie htmlElementVersion. Une annotation bloquée ne suffit donc pas à identifier un échec d'internationalisation. Objet Intl, états des callbacks et branche sélectionnée doivent être examinés séparément avant une explication au niveau API.

Une locale établit-elle le pays physique d'un visiteur ?

Une locale résolue décrit le choix du service d'internationalisation, pas une mesure de position. Elle ne remplace ni préférence, ni citoyenneté, ni pays actuel. La chaîne ne contient ni position consentie ni contexte permettant cette inférence.

Sources

Conclusion pratique

Le rapport Intl devient interprétable lorsque chaque valeur reste liée à son constructeur, son entrée fixe, ses options et son chemin d'échec. Séparer l'agrégat dédupliqué des six exemples ; retracer clés héritées et condition réelle du rendu avant d'interpréter valeurs absentes ou styles. Si ce contexte manque, obtenir le champ absent plutôt qu'attribuer une identité d'appareil ou modifier la configuration sur la base d'une étiquette.

#fingerprinting#confidentialité#Locale

Cet article fait partie du guide : Qu'est-ce qu'une empreinte de navigateur ?

Faites passer BotBrowser de la recherche à la production

Utilisez ces guides pour comprendre le modèle, puis passez à la validation multi-plateforme, aux contextes isolés et au déploiement navigateur prêt pour l'échelle.