# python: Detección personalizada de configuración regional
URL: https://generaltranslation.com/es/docs/python/tutorials/custom-locale-detection.mdx
---
title: Detección personalizada de 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 callback `get_locale` a [`initialize_gt`](/docs/python/api/initialize-gt), GT detecta automáticamente la configuración regional del usuario a partir del encabezado HTTP `Accept-Language` en cada solicitud:
1. Lee el encabezado `Accept-Language` (p. ej., `en-US,en;q=0.9,es;q=0.8`)
2. Lo analiza y lo convierte en una lista de configuraciones regionales ordenadas por valor de calidad (de mayor a menor)
3. Lo compara con tus `locales` configurados para encontrar la mejor coincidencia
4. Usa `default_locale` como alternativa si no encuentra ninguna coincidencia
Esto significa que, desde el primer momento, los usuarios reciben contenido en el idioma que solicite su navegador, siempre que tengas traducciones para ese idioma.
```python
from flask import Flask
from gt_flask import initialize_gt
app = Flask(__name__)
# Sin get_locale: por defecto se analiza 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 se analiza Accept-Language
initialize_gt(
app,
default_locale="en",
locales=["es", "fr"],
)
```
***
## `get_locale` personalizado
Para sobrescribir el valor predeterminado, pasa una función de 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:
# Comprueba primero 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
# 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:
# Comprueba primero 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
# 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 `I18nManager`, que [`t()`](/docs/python/api/t) usa para leerla.
* **Flask**: `initialize_gt` registra un hook `before_request` con la misma lógica.
***
## Patrones comunes
### Prefijo de ruta de 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 de usuario
Busca la configuración regional en 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 a partir de 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 de configuración regional válida
* Si devuelve una configuración regional para la que no tienes traducciones, `t()` usará como alternativa 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 recuperar la configuración regional resuelta