# Da titolo a URL: città → citta-di-torino, perché → perche

> Generatore di slug URL online da italiano (accenti corretti), spagnolo, francese, tedesco, inglese. Translit dei diacritici, batch CSV, separatore configurabile.

Strumento gratuito nel browser (nessun upload): https://www.mauriziofonte.it/strumenti/generatore-slug

Trasforma testo libero in **slug URL-friendly** con gestione corretta degli accenti italiani (città -> citta-di-torino, perché -> perche-funziona) e diacritici di altre 4 lingue europee. Batch CSV per liste, separatore configurabile (-, _.), max length con word boundary intelligente. Client-side via Unicode NFD normalize.

## Come usare il generatore

1. **Incolla il testo** - Titolo articolo, nome prodotto, frase libera. Il tool gestisce direttamente accenti italiani e diacritici di altre lingue europee senza pre-processing.
2. **Configura il separatore** - Default kebab-case (-) per URL slug. Underscore per filename (snake_case). Punto per nomenclatura specifica (es. dotted notation in alcuni package manager).
3. **Imposta max length** - Per SEO: titoli URL sotto 80 char sono ottimali. Il tool tronca al word boundary più vicino, evitando slug spezzati a metà parola.
4. **Batch CSV** - Per dataset (es. nomi categorie, titoli articoli da migrare), incolla nella textarea bulk una riga per voce. Output CSV con colonna originale e slug, importabile in Excel o pipeline ETL.

## Perché un altro slug generator

Tre fattori distintivi rispetto alle decine di slug generator generici.

**Italian-aware.** La maggior parte degli slug generator generici tratta gli accenti italiani in modo "creativo": l'accento scritto come apostrofo dopo la vocale si perde senza avviso (perdita d'informazione) oppure diventa un trattino, e lo slug di città finisce in `citta-`. Qui la pipeline è: lowercase locale-aware, applicazione translit map per caratteri speciali (ß->ss, æ->ae, ø->o), normalize Unicode NFD, strip combining diacriticals (\p{M}), replace separatori con kebab. Risultato: `città` -> `citta`, `perché` -> `perche` (e+combining acute droppato), `più` -> `piu`.

**Multi-lingua robusto.** Spagnolo (ñ->n, ¿/¡ droppati), francese (ç->c, œ->oe, æ->ae), tedesco (ß->ss, ä/ö/ü->a/o/u), inglese (apostrophes droppati: `it's` -> `its`). Per ogni lingua il behaviour è deterministico e documentato nelle FAQ.

**Word-boundary truncate.** Default max 80 char. Quando lo slug supera, il tool tronca al separatore più vicino dopo la metà della lunghezza target. Così `ricetta-pasta-al-pomodoro-classica-napoletana` (47 char) con max 30 diventa `ricetta-pasta-al-pomodoro`, non `ricetta-pasta-al-pomodoro-clas`. Le parole non vengono mai tagliate a metà.

## Glossario

- **Slug**: Versione URL-friendly di un titolo: lowercase, no spazi, no caratteri speciali, separatori normalizzati. Tipicamente usato come ultimo segmento di URL SEO-oriented.
- **Diacritic**: Segno grafico aggiunto a una lettera per modificare valore fonetico o significato. Italiano: accenti acuti e gravi (é/è, ó/ò). Spagnolo: tilde (n/n+tilde). Francese: cedille (c/c+cedille).
- **Unicode NFD**: Normalization Form Decomposed: scompone i caratteri composti (es. e+acute) in base + combining (es. e + U+0301). Permette di rimuovere i combining preservando le lettere base.
- **Kebab-case**: Convenzione di naming con parole minuscole separate da trattini: `my-tool-page`. Standard per URL slug e CSS class.
- **Word boundary truncation**: Tecnica di troncamento che taglia al confine di parola più vicino, evitando di interrompere parole a metà.

## Domande frequenti

### Come gestisce 'perché' (con apostrofo accento)?

Lo droppa. L'apostrofo come accento è un workaround tipografico italiano (errore ortografico in realtà), non Unicode. Il tool quindi lo rimuove insieme agli altri caratteri non-alphanumeric. Per evitare la perdita d'informazione, usa accento Unicode corretto: `perché` diventa `perche` via NFD strip, semantica preservata.

### I caratteri cinesi/giapponesi/cirillici cosa fanno?

Vengono droppati. Il tool produce solo ASCII alphanumeric + separatore. Per slug multilingua reali (es. siti cinesi con URL cinesi), serve una pipeline diversa: encoding URL diretto (encodeURIComponent) o transliterazione pinyin (lib pypinyin per cinese, kuroshiro per giapponese).

### Posso preservare maiuscole nello slug?

Si. Decheckare 'Lowercase' per mantenere il case originale. Tipico use case: identifier camelCase URL-safe (es. `userFullName` diventa `userFullName` dopo strip diacritics). Comunque non standard: la maggior parte dei web framework e CMS si aspettano slug lowercase.

### Il batch CSV gestisce delimitatori custom?

L'input batch ammette una stringa per riga. Output è CSV standard RFC 4180 con quoted strings. Per import in Excel: salva come.csv, apri in Excel con encoding UTF-8 selezionato. Per import in DB: usa `COPY` Postgres o `LOAD DATA INFILE` MySQL specificando comma come delimitatore.

### C'è un limite di lunghezza imposto?

Il tool non impone un limite fisso. Il max length del campo è configurable (0 = nessun limite). Default 80 è un compromesso ragionevole per URL SEO. Google indica che URL sopra ~75 char riducono CTR a parità di rank, sotto 60 è optimal. Slug è solo l'ultimo segmento, quindi 80 lascia spazio per il dominio + path prefix.

### Funziona offline?

Si., niente fetch al server. Bookmark per uso offline.

### Ci sono collisioni possibili?

Si, attese e by design. Esempio: `Città di Roma` e `Citta di Roma` producono entrambi `citta-di-roma`. Se serve unicità negli slug del database, aggiungi un id numerico in coda (`citta-di-roma-1`, `citta-di-roma-2`) o usa un UUID separato come primary key e lo slug come campo non-unico.

### Posso aggiungere un prefisso o suffisso allo slug?

Non in V1. Però è un text manipulation triviale: dopo aver generato lo slug, concatena come stringa: `'/blog/' + slug` o `slug + '-2026'`. Per workflow più complessi (es. timestamp prefix), uno script Python con la stessa pipeline è più adatto.

---
Uno strumento di Maurizio Fonte, senior backend engineer. Tutti gli strumenti: https://www.mauriziofonte.it/strumenti/
