# From title to URL: città → citta-di-torino, perché → perche

> Online URL slug generator free from Italian (proper accents), Spanish, French, German, English. Diacritic transliteration, batch CSV, configurable separator.

Free in-browser tool (no upload): https://www.mauriziofonte.it/tools/slug-generator

Turn free text into **URL-friendly slugs** with proper handling of Italian accents (città -> citta-di-torino, perché -> perche-funziona) and diacritics from 4 other European languages. Batch CSV for lists, configurable separator (-, _.), smart max length with word boundary. Client-side via Unicode NFD normalize.

## How to use the generator

1. **Paste the text** - Article title, product name, free phrase. The tool handles Italian accents and other European language diacritics directly, no pre-processing needed.
2. **Configure the separator** - Default kebab-case (-) for URL slugs. Underscore for filenames (snake_case). Dot for specific naming (e.g. dotted notation in some package managers).
3. **Set max length** - For SEO: URL titles below 80 chars are optimal. The tool truncates to the nearest word boundary, avoiding slugs broken in the middle of a word.
4. **Batch CSV** - For datasets (e.g. category names, article titles to migrate), paste in the bulk textarea one item per line. Output CSV with original and slug columns, importable into Excel or ETL pipeline.

## Why one more slug generator

Three differentiators vs the dozens of generic slug generators.

**Italian-aware.** Most generic slug generators handle Italian accents in "creative" ways: an accent typed as an apostrophe after the vowel is either dropped without notice (information loss) or turned into a dash, so the slug for città ends in `citta-`. Here the pipeline is: locale-aware lowercase, special-character translit map (ß->ss, æ->ae, ø->o), Unicode NFD normalize, strip combining diacriticals (\p{M}), replace separators with kebab. Result: `perché` -> `perche` (e+combining acute dropped), `più` -> `piu`.

**Robust multi-language.** Spanish (ñ->n, ¿/¡ dropped), French (ç->c, œ->oe, æ->ae), German (ß->ss, ä/ö/ü->a/o/u), English (apostrophes dropped: `it's` -> `its`). For each language the behaviour is deterministic and documented in the FAQ.

**Word-boundary truncate.** Default 80 chars max. When the slug exceeds, the tool truncates at the nearest separator after half the target length. So `tomato-pasta-classic-napoli-style-recipe` (40 chars) with max 25 becomes `tomato-pasta-classic`, not `tomato-pasta-classic-napo`. No mid-word cuts.

## Glossary

- **Slug**: URL-friendly version of a title: lowercase, no spaces, no special characters, normalized separators. Typically used as the last segment of SEO-oriented URLs.
- **Diacritic**: Graphic mark added to a letter to modify phonetic value or meaning. Italian: acute/grave accents (e/e accent). Spanish: tilde (n/n with tilde). French: cedilla (c/c with cedilla).
- **Unicode NFD**: Normalization Form Decomposed: decomposes composed characters (e.g. e+acute) into base + combining (e.g. e + U+0301). Allows removing the combining while preserving the base letters.
- **Kebab-case**: Naming convention with lowercase words separated by dashes: `my-tool-page`. Standard for URL slugs and CSS classes.
- **Word boundary truncation**: Truncation technique that cuts at the nearest word boundary, avoiding mid-word interruption.

## Frequently asked questions

### How does it handle 'perché (with apostrophe accent)?

Drops the apostrophe. Apostrophe-as-accent is an Italian typographic workaround (technically a spelling error), not Unicode. The tool removes it along with other non-alphanumeric characters. To avoid information loss use proper Unicode accent: `perché` becomes `perche` via NFD strip, semantics preserved.

### What happens to Chinese/Japanese/Cyrillic characters?

They are dropped. The tool produces only ASCII alphanumeric + separator. For real multilingual slugs (e.g. Chinese sites with Chinese URLs), you need a different pipeline: direct URL encoding (encodeURIComponent) or pinyin transliteration (pypinyin for Chinese, kuroshiro for Japanese).

### Can I preserve uppercase in the slug?

Yes. Uncheck 'Lowercase' to keep the original case. Typical use case: URL-safe camelCase identifiers (e.g. `userFullName` stays `userFullName` after diacritic strip). Not standard though: most web frameworks and CMSs expect lowercase slugs.

### Does the batch CSV handle custom delimiters?

The bulk input takes one string per line. Output is RFC 4180-standard CSV with quoted strings. To import into Excel: save as.csv, open in Excel with UTF-8 encoding selected. To import into a DB: use Postgres `COPY` or MySQL `LOAD DATA INFILE` with comma as delimiter.

### Is there a hardcoded length limit?

Nothing hardcoded. The field max length is configurable (0 = no limit). Default 80 is a reasonable compromise for SEO URLs. Google indicates that URLs above ~75 chars reduce CTR at equal rank, below 60 is optimal. Slug is just the last segment, so 80 leaves room for domain + path prefix.

### Does it work offline?

Yes., no server fetch. Bookmark for offline use.

### Are collisions possible?

Yes, expected and by design. Example: `City of Rome` and `City of  Rome` (extra space) both produce `city-of-rome`. If you need uniqueness in DB slugs, append a numeric ID (`city-of-rome-1`, `city-of-rome-2`) or use a separate UUID as primary key and the slug as a non-unique field.

### Can I add a prefix or suffix to the slug?

Not in V1. But it is trivial text manipulation: after generating the slug, concatenate as a string: `'/blog/' + slug` or `slug + '-2026'`. For more complex workflows (e.g. timestamp prefix), a Python script with the same pipeline is more suitable.

---
Tool by Maurizio Fonte, senior backend engineer. All tools: https://www.mauriziofonte.it/tools/
