# python: Rilevamento personalizzato dell'impostazione regionale
URL: https://generaltranslation.com/it/docs/python/tutorials/custom-locale-detection.mdx
---
title: Rilevamento personalizzato dell'impostazione regionale
description: Come personalizzare il rilevamento dell'impostazione regionale con get_locale e come funziona il comportamento predefinito
---
## Comportamento predefinito
Quando non viene fornito alcun callback `get_locale` a [`initialize_gt`](/docs/python/api/initialize-gt), GT rileva automaticamente l'impostazione regionale dell'utente dall'header HTTP `Accept-Language` a ogni richiesta:
1. Legge l'header `Accept-Language` (ad es. `en-US,en;q=0.9,es;q=0.8`)
2. Lo analizza in un elenco di impostazioni regionali ordinato per valore di qualità (in ordine decrescente)
3. Lo confronta con i `locales` configurati per trovare la corrispondenza migliore
4. Se non trova alcuna corrispondenza, usa `default_locale` come fallback
Questo significa che, fin da subito, gli utenti ricevono i contenuti nella lingua richiesta dal browser, purché siano disponibili le relative traduzioni.
```python
from flask import Flask
from gt_flask import initialize_gt
app = Flask(__name__)
# Nessun get_locale — per impostazione predefinita viene eseguito il parsing di Accept-Language
initialize_gt(
app,
default_locale="en",
locales=["es", "fr"],
)
```
```python
from fastapi import FastAPI
from gt_fastapi import initialize_gt
app = FastAPI()
# Nessun get_locale — per impostazione predefinita viene eseguito il parsing di Accept-Language
initialize_gt(
app,
default_locale="en",
locales=["es", "fr"],
)
```
***
## `get_locale` personalizzato
Per usare un comportamento diverso da quello predefinito, passa una callback `get_locale` a `initialize_gt`. Riceve l'oggetto della richiesta e deve restituire una stringa che rappresenta l'impostazione regionale.
```python
from flask import Flask
from gt_flask import initialize_gt
app = Flask(__name__)
def get_locale(request) -> str:
# Controlla prima il parametro di query
locale = request.args.get("lang")
if locale:
return locale
# Poi controlla un cookie
locale = request.cookies.get("locale")
if locale:
return locale
# Altrimenti usa il valore predefinito
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:
# Controlla prima il parametro di query
locale = request.query_params.get("lang")
if locale:
return locale
# Poi controlla un cookie
locale = request.cookies.get("locale")
if locale:
return locale
# Altrimenti usa il valore predefinito
return "en"
initialize_gt(
app,
default_locale="en",
locales=["es", "fr"],
get_locale=get_locale,
)
```
***
## Come funziona internamente
* **FastAPI**: `initialize_gt` registra un middleware HTTP che viene eseguito a ogni richiesta. Se viene fornito `get_locale`, chiama `get_locale(request)`. In caso contrario, analizza `Accept-Language`. L'impostazione regionale risolta viene impostata in `I18nManager`, da cui [`t()`](/docs/python/api/t) legge.
* **Flask**: `initialize_gt` registra un hook `before_request` con la stessa logica.
***
## Pattern comuni
### Prefisso del percorso dell'URL
Ricava l'impostazione regionale dal percorso dell'URL (ad es. `/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"
```
### Profilo utente
Ricava l'impostazione regionale dalle preferenze di un utente autenticato:
```python
def get_locale(request) -> str:
user = get_current_user(request) # la tua logica di autenticazione
if user and user.preferred_locale:
return user.preferred_locale
return "en"
```
### Sottodominio
Rileva l'impostazione regionale da un sottodominio come `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"
```
***
## Note
* La funzione `get_locale` deve sempre restituire una stringa di impostazione regionale valida
* Se restituisce un'impostazione regionale per cui non hai traduzioni, `t()` userà come fallback il contenuto originale di `default_locale`
* La funzione riceve l'oggetto request grezzo del framework — `Request` per FastAPI, `request` di Flask per Flask
* Puoi usare [`get_locale()`](/docs/python/api/get-locale) anche altrove nel codice per recuperare l'impostazione regionale risolta