# python: Detección personalizada de la configuración regional URL: https://generaltranslation.com/es/docs/python/tutorials/custom-locale-detection.mdx --- title: Detección personalizada de la configuración regional description: Cómo personalizar la detección de la configuración regional con get_locale y cómo funciona el comportamiento predeterminado --- ## Comportamiento predeterminado Cuando no se proporciona una función de callback `get_locale` a [`initialize_gt`](/docs/python/api/initialize-gt), GT detecta automáticamente la configuración regional del usuario a partir de la cabecera HTTP `Accept-Language` en cada solicitud: 1. Lee la cabecera `Accept-Language` (p. ej., `en-US,en;q=0.9,es;q=0.8`) 2. La analiza y la convierte en una lista de configuraciones regionales ordenadas por valor de calidad (de mayor a menor) 3. La compara con tus `locales` configurados para encontrar la mejor coincidencia 4. Recurre a `default_locale` si no encuentra ninguna coincidencia Esto significa que, sin configuración adicional, los usuarios reciben el contenido en el idioma que solicite su navegador, siempre que tengas traducciones disponibles para ese idioma. ```python from flask import Flask from gt_flask import initialize_gt app = Flask(__name__) # Sin get_locale: por defecto usa el análisis de Accept-Language initialize_gt( app, default_locale="en", locales=["es", "fr"], ) ``` ```python from fastapi import FastAPI from gt_fastapi import initialize_gt app = FastAPI() # Sin get_locale: por defecto usa el análisis de Accept-Language initialize_gt( app, default_locale="en", locales=["es", "fr"], ) ``` *** ## `get_locale` personalizado Para sobrescribir el valor predeterminado, pasa un callback `get_locale` a `initialize_gt`. Recibe el objeto de solicitud y debe devolver una cadena de configuración regional. ```python from flask import Flask from gt_flask import initialize_gt app = Flask(__name__) def get_locale(request) -> str: # Primero, comprueba el parámetro de consulta locale = request.args.get("lang") if locale: return locale # Después, comprueba una cookie locale = request.cookies.get("locale") if locale: return locale # Si no existe, usa el valor predeterminado return "en" initialize_gt( app, default_locale="en", locales=["es", "fr"], get_locale=get_locale, ) ``` ```python from fastapi import FastAPI, Request from gt_fastapi import initialize_gt app = FastAPI() def get_locale(request: Request) -> str: # Primero, comprueba el parámetro de consulta locale = request.query_params.get("lang") if locale: return locale # Después, comprueba una cookie locale = request.cookies.get("locale") if locale: return locale # Si no existe, usa el valor predeterminado return "en" initialize_gt( app, default_locale="en", locales=["es", "fr"], get_locale=get_locale, ) ``` *** ## Cómo funciona internamente * **FastAPI**: `initialize_gt` registra un middleware HTTP que se ejecuta en cada solicitud. Si se proporciona `get_locale`, llama a `get_locale(request)`. De lo contrario, analiza `Accept-Language`. La configuración regional resuelta se establece en el `I18nManager`, de donde la lee [`t()`](/docs/python/api/t). * **Flask**: `initialize_gt` registra un hook `before_request` con la misma lógica. *** ## Patrones comunes ### Prefijo de la ruta URL Extrae la configuración regional de la ruta de la URL (p. ej., `/es/about`, `/fr/home`): ```python def get_locale(request) -> str: parts = request.url.path.strip("/").split("/") supported = {"es", "fr", "de"} if parts and parts[0] in supported: return parts[0] return "en" ``` ### Perfil del usuario Obtén la configuración regional de las preferencias de un usuario autenticado: ```python def get_locale(request) -> str: user = get_current_user(request) # tu lógica de autenticación if user and user.preferred_locale: return user.preferred_locale return "en" ``` ### Subdominio Detecta la configuración regional desde un subdominio como `es.example.com`: ```python def get_locale(request) -> str: host = request.headers.get("host", "") subdomain = host.split(".")[0] if subdomain in ("es", "fr", "de"): return subdomain return "en" ``` *** ## Notas * Tu función `get_locale` siempre debe devolver una cadena válida de configuración regional * Si devuelve una configuración regional para la que no tienes traducciones, `t()` usará como respaldo el contenido original de `default_locale` * La función recibe el objeto de solicitud sin procesar del framework: `Request` para FastAPI y `request` de Flask para Flask * Puedes usar [`get_locale()`](/docs/python/api/get-locale) en otras partes de tu código para consultar la configuración regional resuelta