# 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