Назад в Центр знаний
Отпечатки

Отчёт Intl CreepJS: поля и отсутствующие значения

Источники полей Intl в CreepJS: фиксированные входы, локали и ошибки. Различия форматирования не устанавливают личность или факт изменения API.

BotBrowser Team

Документация

Нужна структурированная документация по теме Отпечатки?

Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.

Отчёт Intl CreepJS объединяет образцы форматирования, сокращённый список локалей и унаследованную оценку. Источники этих значений различаются: пропуск строки не обязательно означает недоступность API, а изменение фразы само по себе не доказывает модификацию. BotBrowser поддерживает настройку часового пояса, локали и языков; это не гарантирует определённую классификацию CreepJS или одинаковые результаты региональных данных в разных сборках браузера. Интерпретация начинается с вызова, создавшего поле, включая его параметры и путь ошибки.

TL;DR

  • Зафиксированный сборщик Intl возвращает шесть образцов форматирования и строку локалей. Это не семь повторений одной проверки локали.
  • Сбор локалей вызывает конструкторы без аргументов, пропускает исключения и удаляет дубликаты. Строка теряет соответствие между конструкторами и локалями.
  • DisplayNames требует параметры. Попытка без аргументов может быть пропущена, даже если отдельно настроенный образец названия работает.
  • Ошибки отдельных callback превращаются в undefined; внешний сбой сборщика и условие htmlElementVersion в отображении относятся к другим путям.
  • lied получает существующие замечания к resolvedOptions. Он не вычисляется сравнением шести строк с эталонным устройством.

Contents

Схема исходного кода разделяет шесть форматировщиков с фиксированными входами, локали конструкторов без дубликатов, унаследованные замечания resolvedOptions и условие отображения htmlElementVersion.

Семь значений и шесть вызовов форматирования

Ревизия CreepJS 10aa6724cd33a1015db1574211890518cd04f0cc определяет нужный сборщик в src/intl/index.ts. Возвращаемый объект содержит dateTimeFormat, displayNames, listFormat, numberFormat, pluralRules, relativeTimeFormat, locale и lied. Первые шесть - результаты форматирования. Седьмое видимое значение, locale, поступает из отдельного цикла конструкторов. Оценка - ещё одно свойство, а не восьмая форматированная фраза. Разделение этих категорий не позволяет принять подпись отчёта за сам вызов API. Сравнение полей часового пояса CreepJS отделяет разрешённый идентификатор от исторического отбора кандидатов и двух путей вычисления текущего смещения; эти источники полей отличаются от форматированных образцов Intl.

Образец даты форматирует фиксированную числовую метку 963644400000, запрашивая длинное название месяца и часового пояса. Явные локаль и пояс не задаются. Метка выбрана исходным кодом, а не обозначает момент открытия детектора посетителем. MDN указывает, что DateTimeFormat.format() принимает дату или временную метку, причём форматирование может различаться между реализациями. Поэтому название месяца или пояса требует контекста форматировщика до сравнения результатов.

Образец названия использует new Intl.DisplayNames(undefined, { type: 'language' }).of('en-US'). Здесь en-US - языковая метка, для которой требуется название, а не явно запрошенная локаль языка этого названия. Первый аргумент - undefined, поэтому действует разрешение локали по умолчанию. Переведённое название английского нельзя переименовывать в заявленный предпочтительный язык посетителя. Входной язык и язык результата занимают разные позиции в вызове.

Образец списка форматирует строки ['0', '1'] с style: 'long' и type: 'disjunction'. Числовой образец форматирует 21000000 с компактной нотацией и длинным компактным представлением. Параметры намеренно выбирают выражения, зависящие от языка. Изменение союза, сокращения или пробелов может отражать данные форматирования, а не изменение числа на входе. Таблица разделяет параметры и типы входов, создающие пунктуацию списка и компактную числовую запись.

Поле результатаВызов или фиксированный входСохранённая информация
dateTimeFormat963644400000; длинные месяц и название поясаОбразец даты с локалью и поясом по умолчанию
displayNamestype: 'language'; .of('en-US')Локализованное название языковой метки
listFormat['0', '1']; длинная дизъюнкцияФорматированный список двух элементов
numberFormat21000000; компактная нотация, длинное представлениеОбразец компактного числа
pluralRules.select(1) с параметрами по умолчаниюМетка категории множественности, не форматированное число
relativeTimeFormat1, 'year'; best-fit, автоматическая числовая формулировка, длинный стильФраза относительного времени
localeУспешные чтения resolvedOptions().locale конструкторовСтрока без дубликатов и без названий конструкторов

PluralRules().select(1) возвращает категорию для переданного числа, а RelativeTimeFormat(...).format(1, 'year') создаёт относительную фразу на соответствующем языке. Ни один вызов не читает текущий год из часов. Явный параметр numeric: 'auto' допускает лексическую фразу, если она существует в локали; он не требует цифру в каждом языке. Руководство по форматированию Intl рассматривает выбор локали и резервные варианты в приложениях - отдельную задачу от происхождения полей детектора.

Локали конструкторов и потерянное происхождение

Функция getLocale по порядку пробует семь конструкторов: Collator, DateTimeFormat, DisplayNames, ListFormat, NumberFormat, PluralRules и RelativeTimeFormat. Каждая попытка вызывает конструктор без аргументов, читает resolvedOptions().locale и добавляет значение при успешном завершении. Каждая окружена try/catch. Исключение возвращает накопленный список без изменений, а не добавляет именованный маркер ошибки. Затем сборщик удаляет повторения через Set.

Это не диагностическая таблица по конструкторам. В гипотетическом случае несколько успешных конструкторов разрешают одну локаль. Результат содержит её один раз независимо от количества источников. Если два конструктора разрешаются по-разному, остаются разные значения в порядке вставки, но соответствие конкретному конструктору теряется. После этого '' + locale превращает массив в строку. Таковы преобразования исходного кода, а не наблюдавшаяся запись выполнения браузера.

DisplayNames показывает конкретное различие требований конструктора и доступности функции. MDN определяет обязательный аргумент options с type. Поэтому вызов без аргументов может завершиться исключением даже в реализации с поддержкой правильно настроенного Intl.DisplayNames. Функция пропускает такую попытку. Отдельный образец displayNames, напротив, передаёт type: 'language'. Его работа совместима с пропуском конструктора в сборе локалей: вызовы задавали разные вопросы.

У Collator обратная асимметрия. Он участвует в цикле локалей, но среди шести образцов нет сравнения колляции. Его присутствие в подсказке конструкторов не означает, что модуль сортировал или сравнивал две строки. По коду можно установить запрос разрешённой локали; точность или порядок сортировки требуют другой операции. Это не позволяет превратить подсказку в выдуманный перечень выполненных тестов.

Агрегированная строка также отличается от navigator.languages и HTTP-заголовка Accept-Language. Ни один не используется на входе этого цикла. Они могут иметь значение в более широком исследовании, но разбиение строки локалей CreepJS по запятым не восстанавливает их значения. Анализ часового пояса, локали и языков разделяет настройки и точки наблюдения, не превращая разные представления в универсальное правило равенства.

Отсутствующие образцы и условие отображения

Каждый callback форматирования обёрнут общей функцией caniuse. В просмотренном src/errors/index.ts исключение callback возвращает undefined. Intl использует именно форму callback без последующего обхода цепочки свойств. Недоступный конструктор, отвергнутый параметр и ошибка форматирования могут дать одинаковое отсутствующее значение. Функция не прикрепляет к нему категорию исключения. Один пропуск не позволяет различить перечисленные причины.

У внешней getIntl() есть собственный try/catch. Если ошибка достигает внешней области, модуль записывает неуспешный тест, вызывает сбор ошибки и не возвращает результат модуля. Это отличается от сбоя одного callback при наличии остального объекта. Обратное также важно: достижение записи passed: true не утверждает наличие каждого образца. Исключения callback могли уже превратиться в undefined внутри успешного внешнего пути.

Отображение добавляет ещё один слой. В зафиксированной ревизии intlHTML(fp) проверяет !fp.htmlElementVersion перед обычным путём вывода Intl. Условие называет отчёт HTML-элементов, а не fp.intl. При истинном условии функция возвращает карточку Intl с отметками блокировки. Это свойство просмотренного кода, а не заявление о реальном сбое Intl в браузере. Название заблокированной карточки само по себе не доказывает недоступность определённого конструктора интернационализации.

Если условие допускает обычный путь, отображение деструктурирует fp.intl || {} и соединяет локаль с образцами через <br>. Отдельное отсутствующее значение может занять пустую позицию строки. Порядок вывода: локаль, дата, название, число, относительное время, список и категория множественности. Он отличается от порядка свойств объекта. Подсчёт строк без проверки порядка исходного кода может приписать фразу неправильному форматировщику.

Состояние исходного кодаРезультат на данном слоеНеобоснованное объяснение
Callback образца выбрасывает исключениеОбразец становится undefinedНазвать конкретное исключение по пустоте
Один конструктор без аргументов завершается ошибкойНакопление локалей пропускает попыткуОбъявить весь конструктор неподдерживаемым
Внешний сборщик ловит ошибкуОтчёт модуля не возвращаетсяСчитать все образцы отдельно проверенными и проваленными
htmlElementVersion отсутствует или ложно в булевом контекстеВыбирается ветка заблокированной карточкиПриписать условие напрямую доступности Intl
Обычный вывод получает отсутствующий образецВ объединённой строке возможна пустая позицияПодставить выдуманную локализованную фразу

Эти случаи задают конкретную последовательность диагностики: найти ветку отображения, установить наличие объекта Intl, затем определить callback при пропуске одного значения. Такой порядок не выводит диагноз API из визуальной заглушки. В записи поддержки также различаются «нет поля», «нет модуля» и «ветка заблокированной карточки»: доказательства различны, даже если интерфейс делает их похожими. Выполнение браузера для этих случаев, полученных из исходников, не заявляется.

Унаследованные замечания и форматированный текст

Сборщик Intl инициализирует lied чтением семи ключей lieProps, заканчивающихся на .resolvedOptions, по одному на конструктор. JavaScript || сохраняет первый операнд, истинный в булевом контексте; если таких нет, выражение возвращает false. Это не цикл форматирования шести строк с проверкой эталонных фраз. Код образцов впоследствии не превращает изменённый месяц, компактное число или категорию множественности в локальный результат lied.

Различие важно при сравнении значка или предупреждения с текстом. Гипотетически два отчёта могут содержать разные строки и при этом не иметь истинного унаследованного замечания. Другой случай сохранит одинаковые фразы, но унаследует замечание о методе resolvedOptions. Ни один пример здесь не является измерением. Они показывают, почему форматированные данные и оценка целостности должны оставаться отдельными полями, а не выводиться друг из друга.

Покрытие производителей проверяется отдельно от имён потребителя. Просмотренный src/lies/index.ts явно регистрирует Intl.DateTimeFormat с целями format, formatRange, formatToParts и resolvedOptions. Также явно регистрируется Intl.RelativeTimeFormat с resolvedOptions. Эти две регистрации не превращают семь потребляемых ключей в доказательство семи равнозначных проверок производителей. Утверждение ограничено просмотренными регистрациями; это не аудит всех возможных изменений в остальных частях проекта.

Слой исходниковКонкретное свидетельствоГраница интерпретации
Потребитель IntlСемь ключей .resolvedOptions через ORИмена, влияющие на lied, не число тестов
Регистрация DateTimeFormatЧетыре цели, включая resolvedOptionsЯвный запрос поиска в данной ревизии
Регистрация RelativeTimeFormatЦель resolvedOptionsЕщё один явный запрос поиска
Callback форматированияФиксированные входы и параметрыЗначения без локального сравнения с эталонной строкой
ОтображениеБулево значение выбирает стиль отклоненияПредставление замечания, не вероятность

Отображение снова использует булеву оценку для класса отклонения и стиля значка. Отдельное условие LowerEntropy.TIME_ZONE может влиять на стиль, когда унаследованное замечание не выбрано. Поэтому цветному значку требуется соответствующее условие исходного кода. Это не документированный процент уверенности и не диагноз настройки продукта. Ревизия, ключ замечания и слой отчёта информативнее одного цвета.

Матрица решений для сравнения отчётов

Первое сравнение должно установить предмет изменения. Другая дата, другой агрегат локалей, отсутствующий результат callback и истинное унаследованное замечание - четыре разных вывода. Скриншот может скрыть различия, особенно после удаления дубликатов в цикле. Прежде чем приписывать отличие настройке браузера, нужно сохранить имя поля и точную ревизию, определяющую входы и преобразования.

Исследуемое отличиеНужный контекстОграниченное следующее действие
Изменилась фраза датыФиксированная метка, параметры месяца/пояса, локаль и пояс по умолчаниюСравнить настройки до вывода о местоположении
Изменилась компактная запись21000000, компактная нотация, длинный стиль, региональные данныеПроверить одинаковые параметры и ревизию среды
В агрегате меньше разных значенийУспехи конструкторов и удаление дубликатовСмотреть отдельные результаты, не угадывать отсутствующий API
Нет только названия языкаНастроенный вызов type: 'language'Отделить сбой callback от попытки локали без аргументов
Образцы совпадают, стиль замечания различаетсяРеальный унаследованный ключ и условие выводаИсследовать записанное замечание, не текст
Вся карточка помечена блокировкойУсловие htmlElementVersion и наличие IntlСначала установить выбранную ветку отображения

При сравнении дат изменение только часового пояса браузера отличается от изменения числовой метки. Исходник фиксирует вторую, оставляя первый по умолчанию. Нельзя называть фразу даты захваченным показанием часов. Если будущая ревизия задаст явный пояс, контракт сравнения изменится, даже если интерфейс продолжит называть строку просто датой.

При сравнении списков и чисел строки сохраняют на правильном уровне. Список содержит строки 0 и 1, числовой образец - число 21000000. Объединение в поле «числовое форматирование» удалит отличие пунктуации списка от записи числа. Точные различия могут требовать проверки региональных данных, но нормализованное отображение приложения не доказывает совпадения исходного результата детектора.

Короткая строка локалей не означает автоматическую регрессию. Удаление дубликатов может свернуть несколько успешных разрешений в одну запись, а исключения - удалить попытки конструкторов из накопления. Последующие доказательства для этих путей различны. Если происхождение по конструкторам не сохранено, итоговый агрегат не восстановит его. Угаданная связь локали с одним из семи имён добавила бы информацию, которой отчёт уже не содержит.

Минимальная запись с привязкой к исходникам

Запись поддержки может сохранить пользу сравнения без экспорта полного результата детектора или устойчивого идентификационного отпечатка. Предлагаемые поля: sourceRevision, reportField, constructor, fixedInput, options, collectionState и displayBranch. При исследовании унаследованного замечания сохраняют его ключ и предоставивший его слой. Это предлагаемые диагностические поля, а не утверждение, что CreepJS возвращает объект такой схемы.

Параметры даты должны различать пропущенный пояс и явно выбранный. Образцу названия нужно сохранить type: 'language', а не только имя конструктора. Запись цикла локалей должна обозначать пропущенную попытку вместо выдуманной локали. Эти различия служат конкретными входами матрицы; для них не нужны посторонние заголовки запросов, текст страницы или географическая история человека.

Документация BotBrowser описывает --bot-timezone, --bot-locale и --bot-languages как отдельные настройки с автоматическими значениями и явными переопределениями. Источник этих утверждений - документация продукта; CreepJS и MDN не документируют BotBrowser. Настройка задаёт желаемую конфигурацию, но не доказывает одинаковость региональных данных между версиями, реальное местоположение или принятие внешним сервисом. Один цвет предупреждения не обосновывает рекомендацию изменить настройку.

Когда наблюдаемая запись не содержит нужного поля, оставшийся вывод должен быть узким. Без соответствия конструкторам нельзя определить их отдельные локали; пустой результат не называет исключение; замечание без ключа не локализует метод. Практическое решение - получить минимальный недостающий вход сравнения. Подмена этих неизвестных названием устройства сделала бы отчёт категоричнее, но объяснение менее точным.

Вопросы об интерпретации отчёта Intl

Показывает ли дата время запуска детектора?

Исходник задаёт фиксированную метку 963644400000. Время сбора - другая запись. Длинные названия месяца и пояса форматируют исторический вход согласно контексту; локализованная фраза не превращает постоянное число в измерение текущих часов.

Почему поддерживаемый DisplayNames отсутствует при сборе локалей?

Функция локалей не передаёт параметры, а образец названия передаёт type: 'language'. Требования конструктора в MDN объясняют разные пути. Функция ловит исключение и пропускает попытку при накоплении локалей.

Одна локаль означает один работающий конструктор?

Нет. Set удаляет повторные успешные значения перед преобразованием в строку. Несколько конструкторов могут дать одинаковое значение. Агрегат не сохраняет число успешных конструкторов или таблицу соответствия каждого своей локали.

Означает ли lied несовпадение текста с эталоном?

Зафиксированный сборщик потребляет существующие замечания по семи ключам. Callback создают значения без локального сравнения с ожидаемой фразой. Для интерпретации нужно происхождение замечания; один текст не восстанавливает исходный результат проверки целостности.

Доказывает ли заблокированная карточка отключение Intl?

Просмотренная ветка проверяет htmlElementVersion. Поэтому отметка блокировки недостаточна для установления сбоя интернационализации. Объект Intl, состояния callback и выбранную ветку изучают отдельно до объяснения на уровне API.

Устанавливает ли локаль физическую страну посетителя?

Разрешённая локаль описывает выбор службы интернационализации, а не измерение положения. Она не заменяет предпочтения, гражданство или текущую страну человека. Строка не содержит согласованного определения позиции или контекста для такого вывода.

Источники

Практический вывод

Отчёт Intl поддаётся интерпретации, когда каждое значение связано с конструктором, фиксированным входом, параметрами и путём ошибки. Агрегат локалей без дубликатов отделяют от шести образцов; унаследованные ключи и реальное условие вывода проверяют до оценки пропусков и стилей. Если контекста нет, получают недостающее поле вместо приписывания идентичности устройству или изменения настроек на основании подписи.

#fingerprinting#приватность#Locale

Эта статья входит в руководство: Что такое отпечаток браузера?

Переведите BotBrowser из исследований в продакшн

Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.