Zona horaria, locale e idioma en las API del navegador
Distingue zona horaria, locale, negociación de idioma y preferencias del sitio; configura cada campo y diagnostica desajustes regionales.
BotBrowser Team
Prefieres la documentación del producto mantenida?
Este artículo tiene una página equivalente en el centro de documentación. Usa los docs para el flujo canónico, las flags actuales y la referencia duradera.
Un navegador puede dar formato a una fecha con un locale, informar de otro idioma preferido, enviar una preferencia diferente al servidor y usar una zona horaria sin relación con el proxy. BotBrowser permite configurar la zona horaria, el locale y los idiomas, pero no garantiza el idioma que elige un sitio ni demuestra una ubicación física. La respuesta práctica es configurar cada campo en la capa que lo controla y, después, inspeccionar los valores de JavaScript y la respuesta HTTP que importan al flujo de trabajo.
La distinción útil es entre un valor predeterminado y una elección explícita. Intl.DateTimeFormat() sin argumentos usa el locale y la zona horaria predeterminados del entorno. Pasar un locale o timeZone explícito solicita un resultado diferente para esa llamada al formateador; no reescribe navigator.language, el encabezado Accept-Language de la solicitud, una cookie del sitio ni la zona horaria configurada en el navegador. Por tanto, una comprobación regional debe nombrar la señal que mide, en vez de tratar la palabra «locale» como un diagnóstico completo.
TL;DR
- La zona horaria controla cómo se presentan los instantes como hora civil local; una zona IANA no equivale a un desplazamiento UTC fijo.
- Un locale controla convenciones de formato, como los separadores decimales y los nombres de los meses; por sí solo no selecciona el idioma de un sitio.
navigator.languageynavigator.languagesdescriben las preferencias de idioma del navegador.Accept-Languagecomunica una preferencia al servidor, que puede negociar una respuesta o ignorarla.- Un sitio puede guardar una elección de idioma en una cookie o en una cuenta. Esa elección recordada es distinta tanto de las preferencias del navegador como de la negociación HTTP.
- Para cada campo de BotBrowser, un valor explícito de CLI tiene prioridad sobre
configsdel perfil seleccionado; si no hay un valor concreto,autoderiva el ajuste de la ruta proxy.--bot-locationes un control de geolocalización independiente.
Contenido
- Ver el vídeo
- Identifica la señal antes de cambiarla
- Valores predeterminados y opciones explícitas de Intl
- Una zona horaria no es un desplazamiento
- Preferencias de idioma y negociación HTTP
- Cookies e idioma de la aplicación
- Prioridad de BotBrowser por campo
- Tabla de decisión para la configuración
- Consulta de diagnóstico copiable
- Resolución de problemas según la capa observada
- Límites e interpretación segura
- Conclusión práctica
Ver el vídeo
El vídeo en inglés compara la zona horaria, el locale, las preferencias de idioma y el encabezado Accept-Language en una demostración controlada con una página local. Usa valores de prueba declarados y no representa a una persona real, una ruta proxy ni un resultado de geolocalización.
Identifica la señal antes de cambiarla
«Identidad regional» es un resumen práctico, no una única propiedad del navegador. Una página de prueba, una solicitud de red, una página renderizada por el servidor y un sitio después de iniciar sesión pueden reflejar decisiones distintas. Cuando dos observaciones no coincidan, anota dónde se obtuvo cada una: tiempo de ejecución de JavaScript, encabezados de solicitud, encabezados de respuesta, almacenamiento de la aplicación o una API que requiere permiso. Así se evita un ciclo de diagnóstico frecuente en el que se cambia un flag de locale para corregir contenido que en realidad seleccionó una cookie.
Los siguientes términos tienen un alcance deliberadamente acotado:
- Zona horaria es el conjunto de reglas que interpreta un instante como campos locales de fecha y hora. JavaScript la expone mediante métodos como
Intl.DateTimeFormat().resolvedOptions().timeZoney mediante los valores predeterminados de formato de fecha. - Locale es una preferencia de idioma y región BCP 47 que usan las API de internacionalización para dar formato o comparar. Algunos ejemplos son
en-GByde-DE; no es una ciudad ni una coordenada. - Preferencias de idioma son una lista ordenada que expone
navigator.languages; normalmente,navigator.languagerepresenta la preferencia principal. Sirven para negociar contenido, pero no obligan al servidor a usar una traducción concreta. - Geolocalización es un resultado de ubicación que se devuelve después de que una página solicite la API Geolocation y el contexto del navegador lo permita. No se deriva del formato de
Intlni debe inferirse de una cadena de zona horaria. - Idioma del sitio es el idioma que una aplicación elige para su propia interfaz o contenido. Puede depender de la solicitud, una URL, una cookie, una preferencia de cuenta o una política del servidor.
Por ejemplo, una página puede llamar a new Intl.NumberFormat('fr-FR') mientras el idioma principal del navegador sigue siendo en-US. Un servidor puede recibir una preferencia inglesa en Accept-Language y devolver contenido en francés porque la URL es /fr/. Después, el sitio puede guardar el francés en una cookie y seguir devolviéndolo en solicitudes posteriores. Ninguna de estas observaciones demuestra por sí sola que otra capa esté mal configurada.
Esta separación también ayuda a acotar las afirmaciones geográficas. Muchas ubicaciones pueden compartir una zona horaria, y un mismo país puede usar varias. Un locale no codifica una ubicación precisa. Una preferencia de idioma puede reflejar el idioma de trabajo de una persona, no el país del proxy. Tratar estos valores como una cadena estricta de país a país genera falsas alarmas y fomenta anulaciones innecesarias.
Valores predeterminados y opciones explícitas de Intl
La API de internacionalización de ECMAScript (Intl) ofrece formato sensible al locale. Al llamar a un formateador sin opciones de locale, se solicita al tiempo de ejecución que use su valor predeterminado. Proporcionar un locale explícito solicita que ese formateador use la etiqueta indicada. La diferencia se ve en el código y debe reflejarse en el diagnóstico:
const defaultDate = new Intl.DateTimeFormat().format(new Date());
const britishDate = new Intl.DateTimeFormat('en-GB').format(new Date());
const defaultNumber = new Intl.NumberFormat().format(1234567.89);
const frenchNumber = new Intl.NumberFormat('fr-FR').format(1234567.89);
La muestra no imprime intencionadamente ningún resultado fijo. Las cadenas formateadas pueden depender de los datos de locale incluidos en el tiempo de ejecución, del instante actual y de las opciones del formateador. Una comprobación reproducible de la aplicación debe fijar un instante de entrada e inspeccionar las opciones resueltas además de la cadena visible. Incluso así, solo describe ese tiempo de ejecución y esa entrada; no mide todos los procesos del navegador ni todos los workers.
resolvedOptions() es útil porque informa de los ajustes seleccionados para esa instancia del formateador. En un formateador predeterminado, locale y timeZone describen los valores predeterminados del tiempo de ejecución que resolvió. En uno creado con 'en-GB', el locale informa del resultado de resolver esa solicitud. No informa de navigator.language, de la configuración del perfil ni del idioma enviado en una solicitud HTTP posterior.
const defaultFormatter = new Intl.DateTimeFormat();
const explicitFormatter = new Intl.DateTimeFormat('en-GB', {
timeZone: 'Europe/London',
dateStyle: 'medium',
});
console.log(defaultFormatter.resolvedOptions());
console.log(explicitFormatter.resolvedOptions());
Solo se ilustra la forma; este fragmento no se ha ejecutado aquí, y las propiedades exactas o los valores formateados deben leerse en el tiempo de ejecución objetivo. La comparación más importante no es si la salida coincide con una captura esperada, sino si la aplicación usa un formateador predeterminado o proporciona explícitamente locales y opciones. Cuando la aplicación pasa su propio locale, cambiar el valor predeterminado del navegador puede no afectar esa llamada.
La misma regla se aplica al formato de fechas en el código de la aplicación. Una biblioteca puede usar Intl.DateTimeFormat() sin argumento de locale, pasar uno fijo o leer una preferencia del estado de la aplicación antes de crear el formateador. Busca en el código de la aplicación o inspecciona el límite de la llamada antes de cambiar la configuración del navegador. La guía de formato de fechas y horas explica cómo difieren la política de zona horaria de la aplicación y las alternativas portables de los valores predeterminados del navegador.
La correspondencia de locales tampoco es una orden para traducir texto arbitrario. Intl da formato a datos compatibles, compara cadenas o selecciona un locale entre una lista solicitada y los datos disponibles. No traduce una página, reescribe una URL ni anula la política de idioma específica de un producto. Un sitio que muestra texto inglés mientras su formateador numérico usa convenciones alemanas puede comportarse exactamente como lo configuraron sus desarrolladores.
Una zona horaria no es un desplazamiento
Un instante es un punto en la línea temporal UTC. Una zona horaria es un conjunto de reglas con nombre que asigna a los instantes campos de hora civil local y un desplazamiento. America/New_York puede usar distintos desplazamientos en distintas fechas según los datos de zona horaria aplicables. Una cadena fija como UTC-5 expresa un desplazamiento, no el mismo conjunto de reglas históricas y futuras. Por tanto, compara el nombre IANA cuando el requisito de la aplicación se refiere a las reglas horarias de una región, y compara el desplazamiento solo cuando el requisito se refiere a un instante concreto.
Date.prototype.getTimezoneOffset() devuelve un desplazamiento numérico para la fecha representada, en minutos y con la convención de signos de JavaScript. No es un identificador estable de región. Dos zonas con nombre pueden compartir un desplazamiento en un instante y diferir en otro. No interpretes una única lectura del desplazamiento como prueba de una zona horaria concreta ni como evidencia de que las transiciones estacionales coincidirán.
const instant = new Date('2026-01-15T12:00:00Z');
const zone = new Intl.DateTimeFormat().resolvedOptions().timeZone;
const offsetMinutes = instant.getTimezoneOffset();
console.log({ zone, offsetMinutes });
Consulta ilustrativa, no un resultado registrado de BotBrowser. El desplazamiento se calcula para la fecha seleccionada en la zona predeterminada del tiempo de ejecución. Para comparar dos fechas, crea fechas a ambos lados de la transición pertinente e inspecciona ambas; no presupongas una fecha o un resultado particular de transición DST sin consultar las reglas actuales de la región objetivo. Las bases de datos de zonas horarias y las normas legales pueden cambiar independientemente del código de la aplicación.
El locale y la zona horaria se pueden configurar de forma independiente. Un formato en-GB con hora de America/New_York puede ser una elección deliberada del producto: alguien que prefiere el idioma de Londres puede consultar un horario anclado a una oficina de Nueva York. A la inversa, un sitio puede necesitar que sus fechas se muestren en la zona horaria del evento mientras el texto circundante usa el idioma del navegador. La relación correcta depende del significado en la aplicación, no de una regla universal de «mismo país».
Las fechas sin hora requieren especial cuidado. Algunas bibliotecas y API interpretan una cadena como 2026-10-18 de forma distinta a un instante como 2026-10-18T09:00:00Z. Convertir un valor empresarial que solo contiene fecha en un instante puede cambiar el día del calendario que se muestra en otra zona horaria. Si el requisito es «la reunión empieza en este instante», conserva un instante y dale formato en una zona elegida. Si el requisito es «la oficina cierra en esta fecha local», conserva una fecha de calendario y evita añadir una conversión de zona horaria que cambie su significado.
Preferencias de idioma y negociación HTTP
navigator.language y navigator.languages son propiedades del tiempo de ejecución que describen los idiomas preferidos. La primera es el idioma principal; la segunda es una lista ordenada de preferencias cuando está disponible. El navegador también puede enviar un encabezado de solicitud Accept-Language, normalmente con ponderaciones de calidad. Ese encabezado es una entrada para la negociación del servidor, no una garantía de que la respuesta use el primer idioma ni siquiera uno de los idiomas enumerados.
Los servidores HTTP pueden usar Accept-Language para seleccionar una representación, pero el resultado también puede depender de la estructura de la URL, los valores predeterminados de la aplicación, las traducciones disponibles, el estado de autenticación o reglas explícitas del producto. El encabezado de respuesta Content-Language puede aportar evidencia útil sobre la representación, aunque no necesariamente describe todas las cadenas de una página compleja. Comprueba la solicitud y la respuesta reales asociadas a la ruta que investigas.
GET /account/ HTTP/1.1
Accept-Language: fr-CA,fr;q=0.9,en;q=0.8
Solicitud ilustrativa; este artículo no realizó ninguna solicitud de red. La lista de preferencias puede ayudar al servidor a elegir una representación francesa si la admite. El servidor también puede redirigir, usar el locale de la URL, requerir una elección del usuario o aplicar otra política. La referencia de MDN sobre Accept-Language describe el encabezado de solicitud y su papel en la negociación.
No trates el idioma del navegador, el formato por locale y el idioma HTTP como sinónimos. Un locale de-DE puede dar formato a decimales y fechas según las convenciones alemanas mientras la lista de idiomas contiene en-US,en. Una solicitud puede llevar una preferencia inglesa mientras la página crea explícitamente Intl.NumberFormat('de-DE'). Cada valor responde a una pregunta distinta: cómo da formato un formateador, qué prefiere el navegador y qué ofrece la solicitud al servidor.
La elección del servidor también puede variar por recurso. Una ruta de documento puede negociar HTML mientras un endpoint de API devuelve JSON independiente del idioma. Un script o una imagen quizá no use la misma lógica de selección que la página. Compara elementos equivalentes: método, URL, redirecciones, encabezados de solicitud, encabezados de respuesta y estado de autenticación deben coincidir antes de atribuir una diferencia a la lista de idiomas del navegador.
La documentación sobre proxy y geolocalización describe valores regionales derivados del proxy y anulaciones por ajuste. Una comprobación útil de la plataforma web sigue una preferencia de idioma desde las propiedades del navegador hasta la solicitud saliente y luego la compara con la representación seleccionada por el servidor. La ruta de red puede influir en los ajustes automáticos, pero no elimina la decisión de negociación independiente del servidor.
Cookies e idioma de la aplicación
Un sitio puede guardar una elección de idioma en una cookie, almacenamiento local, un perfil de cuenta o una URL. Cuando existe ese estado, la página puede seguir usando la elección guardada aunque el navegador envíe un valor distinto en Accept-Language. Un selector de idioma suele representar una preferencia explícita de la aplicación, que razonablemente puede prevalecer sobre la negociación automática. Borrar preferencias del navegador o cambiar --bot-languages no es una forma fiable de restablecer un ajuste de cuenta en el servidor.
Para diagnosticarlo, compara una sesión limpia con la existente solo cuando el flujo lo permita. Anota si la ruta incluye un prefijo de idioma como /fr/, si la respuesta redirige, si hay una cookie de idioma y si la cuenta guarda un locale. Evita borrar cookies o almacenamiento no relacionados: podrías eliminar evidencia necesaria para identificar la capa que decide y cambiar el estado de autenticación o consentimiento.
Sigue esta secuencia cuando una página se mantiene en el idioma «incorrecto»:
- Confirma la URL solicitada y cualquier prefijo de locale.
- Inspecciona el valor
Accept-Languagede la solicitud. - Inspecciona las redirecciones y los encabezados relacionados con el idioma de la respuesta final.
- Comprueba el selector de idioma del sitio, la cookie y la preferencia de cuenta.
- Compara un contexto limpio permitido con el contexto original y cambia una entrada cada vez.
La secuencia es un método de diagnóstico, no una promesa de que todos los sitios expongan su decisión de idioma. Una aplicación puede mostrar contenido en varios idiomas, omitir Content-Language o guardar preferencias en el servidor. Si no hay evidencia disponible, informa que la capa es desconocida en vez de inferirla de una sola etiqueta visible.
Prioridad de BotBrowser por campo
Los controles de zona horaria, locale e idiomas de BotBrowser son campos independientes. Los flags de línea de comandos pertinentes son --bot-timezone, --bot-locale y --bot-languages. Para cada campo, el orden documentado para valores concretos es flag CLI, luego configs del perfil seleccionado y, después, selección automática. Un valor para un campo no obliga a anular los demás.
| Campo | Flag CLI | Campo configs del perfil | Selección automática | Primera observación útil |
|---|---|---|---|---|
| Zona horaria | --bot-timezone | timezone | auto | Intl.DateTimeFormat().resolvedOptions().timeZone |
| Locale | --bot-locale | locale | auto | Intl.NumberFormat().resolvedOptions().locale |
| Idiomas | --bot-languages | languages | auto | navigator.language, navigator.languages, encabezado de solicitud |
Evalúa la prioridad por campo. Por ejemplo, un --bot-locale=en-GB explícito puede coexistir con una zona horaria definida por el perfil y una selección automática de idioma. La combinación resultante puede ser deliberada, pero documenta por qué se fija el locale para que un cambio posterior de perfil o de ruta no parezca ineficaz sin explicación. A la inversa, si un campo debe seguir la ruta, elimina valores explícitos obsoletos tanto del inicio como de la capa del perfil en vez de agregar otra anulación.
La palabra auto significa «delegar este campo a la selección automática»; no es una etiqueta de locale, zona horaria ni idioma. La documentación establece que un valor CLI concreto tiene prioridad sobre la configuración del perfil y describe auto como selección automática. No define el conflicto en el que la CLI proporciona explícitamente auto mientras el perfil proporciona un valor concreto. Trata esa combinación como no resuelta hasta confirmar el comportamiento de la versión aplicable; no infieras qué valor gana por cómo se escribe el flag.
La geolocalización es un control relacionado, pero distinto. --bot-location configura un resultado de ubicación para las páginas que solicitan geolocalización bajo los permisos aplicables al contexto. Las coordenadas no se deducen automáticamente de una zona horaria, y una zona horaria no demuestra coordenadas. La documentación sobre proxy y geolocalización trata las entradas de IP del proxy y los límites de consulta; no afirmes precisión a nivel de ciudad ni de coordenadas salvo que una fuente lo establezca para esa configuración concreta. Este artículo no afirma que un par de coordenadas vaya a coincidir necesariamente con una IP de salida.
La tabla por región de la guía de coherencia de proxy explica cómo revisar en conjunto el enrutamiento del proxy y las señales de identidad de red. Aquí, usa esa relación como contexto y no como una prueba de igualdad estricta: la ruta proxy puede influir en auto, mientras que los ajustes explícitos por campo y la política de la aplicación pueden producir excepciones válidas.
Tabla de decisión para la configuración
Elige el conjunto mínimo de valores explícitos que satisfaga el requisito de la aplicación. La tabla es una ayuda para decidir; los valores son ejemplos, no recomendaciones para todos los despliegues.
| Requisito | Zona horaria | Locale | Idiomas | Comprobación posterior |
|---|---|---|---|---|
| Dejar que la ruta controle los valores regionales predeterminados | Mantener automático | Mantener automático | Mantener automático | Leer los valores seleccionados y la ruta asignada a este contexto |
| Mantener estable el formato numérico entre rutas | Mantener automático salvo que sea necesario | Establecer --bot-locale o locale en el perfil | Mantener automático salvo que también se fije el idioma del contenido | Inspeccionar una llamada explícita y otra predeterminada a Intl.NumberFormat |
| Mantener la preferencia de interfaz al cambiar la ruta | Mantener automático salvo que sea necesario | Elegir solo si también debe fijarse el formato | Establecer --bot-languages o languages en el perfil | Inspeccionar por separado preferencias del runtime, encabezado y selección del sitio |
| Mostrar un evento según la hora civil de su sede | Establecer la zona IANA del evento en la capa responsable | Elegir independientemente el formato circundante | Elegir independientemente la negociación de contenido | Dar formato al mismo instante con una opción timeZone explícita |
| Investigar una elección de idioma persistente del sitio | No cambiar sin evidencia | No asumir que el locale selecciona el texto de la página | Comparar la lista del navegador con la solicitud | Revisar URL, redirecciones, cookies y preferencias de cuenta |
Si cambia una región pero la aplicación solo requiere un idioma fijo, establecer a la vez la zona horaria, el locale, los idiomas y las coordenadas crea cuatro vías de anulación que habrá que mantener. Prefiere un solo campo explícito cuando ese sea el único requisito. Si el navegador debe seguir un proxy en los tres ajustes admitidos, déjalos en automático y controla la asignación de ruta. Si distintos contextos usan intencionadamente rutas diferentes, valida cada contexto por separado.
Mantén un registro de configuración pequeño con una fila por campo: valor elegido, capa de origen (CLI, perfil o automático), responsable y motivo. No guardes credenciales en ese registro. Así la prioridad queda visible durante la revisión y se distingue «este valor lo proporcionó el perfil» de «lo seleccionó la ruta». Cuando una anulación deje de ser necesaria, elimínala en vez de conservar un valor duplicado como seguro.
Consulta de diagnóstico copiable
La siguiente consulta del navegador recopila una instantánea compacta de los valores pertinentes para el diagnóstico. Lee por separado los valores predeterminados y el formato explícito, y no carga una página ni muestra un aviso de geolocalización. Ejecútala únicamente en un contexto que tengas autorización para inspeccionar. La forma del resultado es ilustrativa y está marcada como not_run; no es una observación registrada.
function inspectRegionalDefaults() {
const defaultDate = new Intl.DateTimeFormat();
const explicitDate = new Intl.DateTimeFormat('en-GB', {
timeZone: 'Europe/London',
dateStyle: 'medium',
});
return {
navigatorLanguage: navigator.language,
navigatorLanguages: [...navigator.languages],
defaultDateOptions: defaultDate.resolvedOptions(),
explicitDateOptions: explicitDate.resolvedOptions(),
defaultNumberLocale: new Intl.NumberFormat().resolvedOptions().locale,
explicitNumberLocale: new Intl.NumberFormat('de-DE').resolvedOptions().locale,
note: 'illustrative query; not_run',
};
}
console.log(inspectRegionalDefaults());
Los valores del formateador explícito son intencionadamente distintos de los predeterminados. Esa diferencia demuestra que hay opciones por llamada, no un error de configuración del navegador. Para inspeccionar Accept-Language, captura una solicitud en la aplicación de prueba autorizada o usa sus herramientas de red; JavaScript no ofrece una API general para leer los encabezados salientes de las solicitudes del navegador. No incluyas credenciales del proxy ni datos privados de cuentas en un artefacto de diagnóstico público.
Al comparar el comportamiento del servidor, captura solo los metadatos mínimos pertinentes: URL solicitada, cadena de redirecciones, Accept-Language, estado de respuesta y encabezados de respuesta relacionados con el idioma. Redacta los valores de cookies. Si el sitio ofrece un selector de idioma, anota la acción y si la preferencia persiste tras abrir un contexto nuevo. Estos detalles son más útiles que una captura de pantalla con una página autenticada completa.
Resolución de problemas según la capa observada
| Observación | Capa que conviene inspeccionar | Siguiente comprobación discriminante |
|---|---|---|
| Difiere el formato de fecha predeterminado, pero coincide el formateador explícito | Valor predeterminado del runtime o elección del formateador de la aplicación | Comparar resolvedOptions() con las opciones explícitas del formateador |
resolvedOptions().timeZone difiere de la zona prevista | Selección de zona horaria por CLI, perfil o modo automático | Revisar --bot-timezone, timezone del perfil y después la asignación de ruta |
navigator.languages es el esperado, pero la página del servidor no | Negociación HTTP o estado del sitio | Inspeccionar encabezado de solicitud, redirección, locale de URL, cookie y preferencia de cuenta |
| Cambian los separadores numéricos, pero el idioma del texto es correcto | Formato por locale, no negociación de idioma | Inspeccionar los argumentos exactos del constructor Intl.NumberFormat |
| Difiere un contexto respecto de otro | Perfil, flags, ruta o estado existente de la aplicación por contexto | Comparar ambos contextos campo por campo y crear uno nuevo tras los cambios |
| Las coordenadas no coinciden con una ciudad inferida de la zona horaria | Configuración de geolocalización o permisos de la aplicación | Comprobar si se solicitó geolocalización y qué valor de --bot-location se aplica |
Cambia un responsable cada vez. Si hay un campo CLI explícito, cambiar el perfil no demostrará que el perfil fuera la fuente efectiva. Si el campo es automático, cambiar una cookie de idioma no demostrará que haya cambiado la ruta proxy. Anota la fuente actual de cada campo antes de cambiarla y luego repite la misma acción de la aplicación en un contexto nuevo para que el estado anterior de la página no oculte el resultado.
Evita usar una única página de prueba como oráculo universal. Una página mínima puede mostrar valores predeterminados del tiempo de ejecución, pero no los encabezados exactos de todas las solicitudes. Una captura de red muestra una solicitud, pero no lo que la aplicación almacena después. Una página renderizada revela el resultado visible, pero no qué fuente lo seleccionó. Combina las observaciones mínimas que respondan a la pregunta del flujo de trabajo y deja fuera señales no relacionadas.
Límites e interpretación segura
La documentación pública de BotBrowser describe la prioridad de configuración y los controles visibles para el navegador. El destino toma sus propias decisiones. Un servidor puede ignorar las preferencias de idioma, una aplicación JavaScript puede pasar opciones explícitas a Intl y un sitio puede recordar una elección del usuario. Leer correctamente una página no demuestra que todas las rutas, workers, frames o solicitudes futuras usen valores idénticos.
El comportamiento de la zona horaria depende de los datos de la zona con nombre y de la fecha que se formatea. No prometas un resultado correcto para todas las transiciones de horario de verano ni para todas las versiones de datos del sistema operativo basándote en una sola comprobación de la fecha actual. Usa una zona horaria IANA cuando necesites reglas regionales, prueba fechas representativas para la aplicación concreta y describe el tiempo de ejecución y la fecha examinados. Aquí no se representa ninguna ejecución de BotBrowser; estas afirmaciones describen límites de configuración documentados, no compatibilidad medida.
La geolocalización automática depende de las entradas configuradas y del comportamiento de consulta disponible; una zona horaria por sí sola no permite establecer latitud o longitud. No se garantiza ningún resultado de coordenadas a nivel de ciudad ni una coincidencia con una base de datos de IP, y los sitios quizá no soliciten ni respeten la geolocalización. El estado de los permisos y el tratamiento de la aplicación son condiciones independientes.
Las propiedades del navegador de este artículo sirven para pruebas de compatibilidad autorizadas, investigación de privacidad y depuración de aplicaciones. No prueban la identidad ni la presencia física de una persona. Usa cuentas y rutas de prueba autorizadas, evita recopilar más datos de los necesarios para responder a la pregunta e informa como desconocido aquello que no se haya observado, en vez de convertir una correlación plausible en un hecho.
Preguntas frecuentes
¿Cambiar un locale de Intl cambia navigator.language?
No. Proporcionar un locale a un constructor concreto de Intl cambia la resolución del locale de ese formateador. Por sí solo, no reescribe las propiedades de preferencia de idioma del navegador ni los encabezados de las solicitudes de red. Si la aplicación pasa opciones explícitas al formateador, inspecciona esos argumentos antes de cambiar la configuración del idioma del navegador.
¿Accept-Language obliga al sitio a mostrar ese idioma?
No. Es una preferencia de solicitud que el servidor puede usar durante la negociación de contenido. La aplicación puede dar prioridad a un locale de la URL, una cookie guardada, un ajuste de cuenta o un valor predeterminado del producto. Inspecciona por separado la solicitud y el estado del sitio; no supongas que el encabezado determina el idioma final.
¿La zona horaria y el locale siempre deben identificar el mismo país?
No. Cumplen funciones distintas y pueden diferir intencionadamente. Alguien puede preferir un locale para el formato mientras consulta un horario vinculado a la zona horaria de otra región. Elige los valores según los requisitos de la aplicación y luego comprueba si la presentación y el comportamiento de red resultantes los satisfacen.
¿Qué valor prevalece cuando difieren la CLI y el perfil?
Para cada campo compatible, un valor CLI concreto tiene prioridad sobre el valor configs del perfil seleccionado, seguido de la selección automática. La documentación no define si un auto explícito de CLI prevalece sobre un valor concreto del perfil. Resuelve la zona horaria, el locale y los idiomas de forma independiente; no supongas que un flag anula todo el grupo.
¿Basta una zona horaria para inferir coordenadas de geolocalización?
No. Una zona horaria es un conjunto de reglas compartido por varias ubicaciones, no una coordenada. La geolocalización es un resultado separado de la API del navegador que depende de su configuración y de los permisos. Si las coordenadas son un requisito, usa el control de ubicación documentado e inspecciona el resultado en la aplicación autorizada.
Fuentes
- BotBrowser: zona horaria, locale e idioma
- BotBrowser: proxy y geolocalización
- MDN: Intl
- MDN: Intl.DateTimeFormat
- MDN: Accept-Language
- MDN: Date
- ECMA-402: Internationalization API Specification
Conclusión práctica
Trata la zona horaria, el locale de formato, las preferencias de idioma del navegador, la negociación HTTP y el idioma que recuerda un sitio como entradas independientes. Primero identifica qué observación es incorrecta y luego sigue ese campo hasta quien lo controla: un valor CLI explícito, la configuración del perfil, la selección automática derivada del proxy, el código de la aplicación o el estado del sitio. Conserva solo las anulaciones que requiere el flujo de trabajo, repite la misma comprobación autorizada en un contexto nuevo y describe lo observado sin extenderlo a todos los workers, transiciones de fecha, rutas o coordenadas.
Este artículo forma parte de la guía: Superficies de identidad del navegador: panorama de coherencia
Artículos Relacionados
navigator.languages y localización: elegir el locale correcto
PlataformaDatos de región de Intl y formato web portátil
RedCoherencia de red del navegador para proteger la privacidad
IdentidadMétodos de validación del navegador que preservan la privacidad
IdentidadGestión de cookies del navegador para flujos multi-identidad
PlataformaFormato de fechas y portabilidad de zonas horarias
Lleva BotBrowser de la investigación a producción
Usa estas guías para entender el modelo y después avanzar hacia validación multiplataforma, contextos aislados y despliegue de navegador preparado para escalar.