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
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.
DisplayNamesexige 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 conditionhtmlElementVersiondu rendu suivent d'autres chemins. liedconsomme des réserves existantes concernantresolvedOptions. Il ne compare pas les six chaînes à un appareil de référence.
Contents
- Sept valeurs et six appels de formatage
- Locales des constructeurs et provenance perdue
- Exemples absents et condition de rendu
- Réserves héritées et texte formaté
- Matrice de décision pour comparer les rapports
- Un relevé minimal lié au code source
- Questions fréquentes sur le rapport Intl
- Conclusion pratique
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 code | Information conservée |
|---|---|---|
dateTimeFormat | 963644400000 ; mois et nom de fuseau longs | Exemple de date avec locale et fuseau par défaut |
displayNames | type: 'language' ; .of('en-US') | Nom localisé de cette balise de langue |
listFormat | ['0', '1'] ; disjonction longue | Liste formatée de deux éléments |
numberFormat | 21000000 ; notation compacte, présentation longue | Exemple de nombre compact |
pluralRules | .select(1) avec options par défaut | Catégorie plurielle, pas nombre formaté |
relativeTimeFormat | 1, 'year' ; best-fit, expression numérique automatique, style long | Expression de temps relatif |
locale | Lectures réussies de resolvedOptions().locale des constructeurs | Chaî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 code | Résultat à cette couche | Explication non étayée à éviter |
|---|---|---|
| Un callback lève une exception | Son exemple devient undefined | Nommer une exception précise à partir du vide |
| Un constructeur sans arguments échoue | La collecte des locales ignore cet essai | Déclarer tout le constructeur non pris en charge |
| Le collecteur extérieur capture une erreur | Aucun rapport de module renvoyé | Dire que chaque exemple a été exécuté et a échoué |
htmlElementVersion est absent ou faux en contexte booléen | Le rendu sélectionne la carte bloquée | Attribuer directement la condition à la capacité Intl |
| Le rendu normal reçoit un exemple absent | La chaîne jointe peut comporter un vide | Inventer 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 code | Preuve concrète | Limite d'interprétation |
|---|---|---|
| Consommateur Intl | Sept clés .resolvedOptions reliées par OR | Noms pouvant influencer lied, pas nombre de tests |
| Enregistrement DateTimeFormat | Quatre cibles nommées dont resolvedOptions | Demande explicite de recherche dans cette révision |
| Enregistrement RelativeTimeFormat | Cible resolvedOptions | Autre demande explicite de recherche |
| Callbacks de formatage | Entrées et options fixes | Valeurs formatées sans verdict local par phrase de référence |
| Rendu | La valeur booléenne choisit le style de rejet | Pré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ée | Contexte nécessaire | Action suivante limitée |
|---|---|---|
| La phrase de date change | Horodatage fixe, options mois/fuseau, locale et fuseau par défaut | Comparer la configuration avant d'inférer un lieu |
| L'expression compacte change | 21000000, notation compacte, présentation longue, données régionales | Vérifier options identiques et révision d'exécution |
| Moins de valeurs distinctes dans l'agrégat | Réussites des constructeurs et déduplication | Examiner les résultats individuels sans deviner une API omise |
| Seul le nom localisé manque | Appel configuré type: 'language' | Séparer échec du callback et essai régional sans arguments |
| Mêmes exemples, style de réserve différent | Clé héritée réelle et condition de rendu | Examiner la réserve enregistrée, pas le texte |
| Toute la carte est annotée comme bloquée | Condition htmlElementVersion et présence d'Intl | Identifier 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
- CreepJS : collecteur et rendu Intl fixés
- CreepJS : fonctions d'erreur fixées
- CreepJS : enregistrements d'intégrité fixés
- ECMA-402 : services d'internationalisation
- MDN : constructeur Intl.DisplayNames
- MDN : DateTimeFormat.format
- MDN : ListFormat.format
- MDN : NumberFormat.format
- MDN : PluralRules.select
- MDN : RelativeTimeFormat.format
- BotBrowser : fuseau, locale et langues
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.
Cet article fait partie du guide : Qu'est-ce qu'une empreinte de navigateur ?
Articles Connexes
Signaux Math de CreepJS : lire les champs
EmpreinteCreepJS : rapport de fuseau et décalages
EmpreinteRapports audio CreepJS : rendu et valeurs absentes
EmpreinteRapport WebGL de CreepJS : contextes et signaux
PlateformeDonnées régionales Intl et formatage web portable
IdentitéFuseau horaire, locale et langue dans les API du 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.