---
name: cinik-translator
description: Traduire et localiser des articles de blog médicaux Cinik (greffe de cheveux, médecine esthétique) du français vers l'anglais (UK) ou l'italien, avec détection/génération de SEO, internal linking et humanisation anti-IA. Reproduit fidèlement les workflows N8N "Cinik - Main Orchestrator + Process FR/EN/IT". Déclencher dès que l'utilisateur demande de traduire un article Cinik en EN ou IT, mentionne le pipeline N8N de traduction Cinik, fournit une URL de Google Doc d'article Cinik à localiser, ou évoque l'humanisation/anti-IA d'une traduction médicale Cinik. Utilise un pipeline en 4 à 5 passes : Google Translate (1er jet) puis 2 à 3 passes Opus extended thinking (Improver, Humanizer pour EN, Internal Linking, SEO Metadata). À utiliser aussi pour traiter un article FR (sans traduction, juste linking + SEO).
---

# Cinik Translator

Pipeline complet de traduction et localisation d'articles de blog Cinik (médical, greffe de cheveux). Reproduit les 4 workflows N8N opérationnels chez Tom.

## Vue d'ensemble du pipeline

L'article source est en français. Le pipeline diffère selon **le type de contenu** :

### Articles de blog Cinik (cibles : EN, IT)

```
FR (source)  : Internal Linking -> SEO Metadata -> Google Doc FR
EN (UK)      : Google Translate EN -> UK Improver -> UK Humanizer -> Internal Linking -> SEO Metadata -> Google Doc EN
IT           : Google Translate IT -> IT Improver                 -> Internal Linking -> SEO Metadata -> Google Doc IT
```

EN passe par 2 passes Opus (Improver + Humanizer), IT par 1 seule passe (Improver). FR ne traduit pas. Comportement identique au workflow N8N originel.

### Pages techniques Cinik (cibles : toutes les langues du site)

Les pages techniques (avec patterns CMS, slugs comme `greffe-de-cheveux/<page>`) sont traduites du français vers **toutes les langues du site** :

| Code | Langue | Notes |
|---|---|---|
| en | English (UK) | Pipeline complet : Improver + Humanizer |
| it | Italiano | Improver IT |
| es | Español | Improver générique |
| pt | Português | Improver générique |
| de | Deutsch | Improver générique |
| nl | Nederlands | Improver générique |
| ro | Română | Improver générique |
| he | עברית | Improver générique (RTL) |
| cs | Čeština | Improver générique |
| ru | Русский | Improver générique |
| pl | Polski | Improver générique |
| el | Ελληνικά | Improver générique |
| ar | العربية | Improver générique (RTL) |
| fa | فارسی | Improver générique (RTL) |
| tr | Türkçe | Improver générique |
| sr-Latn | Srpski (latinica) | **Toujours alphabet latin, jamais cyrillique** |
| hr | Hrvatski | Improver générique |

Pour les langues secondaires (tout sauf EN/IT), utiliser `prompts/improver-generic.md` paramétré par langue. Le rendu est moins poli qu'avec un prompt spécifique mais reste correct si la consigne anti-IA générique est suivie.

Pour les articles de blog, **ne jamais traduire au-delà de EN+IT** sans accord explicite.

## Comment décider blog vs page

- **Article de blog** : présence d'un H1 éditorial, pas de patterns CMS (`load-file-*`, `section__*`), généralement avec sources académiques NIH en bas. Cible : EN + IT.
- **Page technique** : présence de patterns CMS (codes en backticks, en-têtes `**▸ bloc-N · NOM**`, séparateurs box-drawing). Cible : toutes les langues du site.

En cas de doute, demander à Tom avant de lancer le pipeline complet.

## Modèle et thinking

Le workflow N8N originel utilise `anthropic/claude-opus-4.6`. Note pour Tom : il n'existe pas de "4.7", l'Opus actuel est 4.6 (équivalent au modèle qui fait tourner ce skill). À chaque passe créative (Improver, Humanizer, Internal Linking), exploiter le **extended thinking** : avant de produire l'output JSON, prendre le temps de vraiment analyser le texte phrase par phrase, repérer les marques d'IA, et reformuler avec attention. Pas de mode automatique. La qualité de la fluidification dépend de la profondeur de réflexion sur chaque paragraphe.

## Étape 0 : Récupérer l'article source

Trois sources possibles pour le doc à traduire :

1. **URL de Google Doc** collée dans le chat
2. **Carte Trello** (colonne "Images à Mettre" ou "A publier") qui contient le lien Google Doc dans sa description ou un commentaire. Voir `references/trello-workflow.md` pour le détail.
3. **Contenu markdown collé** ou fichier local

Pour un Google Doc, utiliser le MCP `google-docs` (`readDocument`) en récupérant le contenu en markdown. Vérifier que le contenu fait au moins 100 caractères, sinon arrêter et signaler.

**Cas particulier des pages techniques.** Certaines pages contiennent des **instructions CMS** (codes de templates, classes CSS, séparateurs box-drawing, marqueurs de blocs). Ces instructions ne doivent **jamais** être traduites. Voir la section "Patterns CMS" plus bas et le détail dans `references/cms-patterns.md`. Le script `scripts/translate.py` protège automatiquement la plupart des patterns, mais l'Improver et le Humanizer doivent aussi être avertis dans leur prompt.

## Patterns CMS à préserver (CRITIQUE)

Si l'article contient un ou plusieurs de ces signaux, c'est une page technique avec instructions CMS :

- des codes en backticks comme `load-file-hero-1`, `section__hero_1`, `theme_blue`, `ui__button`
- des lignes de séparation faites de caractères `━` ou `─` répétés
- des en-têtes au format `**▸ bloc-N · NOM**`
- des marqueurs emoji comme `**🥖 FIL D'ARIANE**` ou `**🔍 APERÇU GOOGLE**`
- des slugs URL relatifs comme `greffe-de-cheveux/greffe-avec-sedation`

Dans ce cas, **avant chaque passe Improver/Humanizer**, ajouter en tête du prompt cette consigne explicite :

```
IMPORTANT : ce texte contient des instructions CMS qui doivent rester intactes.
Ne traduis JAMAIS (= garder identique au source FR) :
- les codes entre backticks (ex: `load-file-hero-1`, `section__header__title`)
- les lignes de séparation ━━━ ou ───
- les en-têtes **▸ bloc-N · NOM DU BLOC** : le préfixe `bloc-N` et le NOM DU BLOC restent en source FR (ex: "bloc-4 · 3 COLONNES CIRCLE SLIDER" reste identique, ne devient PAS "blocco-4 · 3 COLONNE CIRCLE SLIDER")
- les marqueurs emoji + label (ex: **🥖 FIL D'ARIANE**, **🔍 APERÇU GOOGLE** restent en français)
- tous les labels structurels CMS en MAJUSCULES qui sont des annotations dev :
    PAGE TECHNIQUE, FIL D'ARIANE, APERÇU GOOGLE, SOUS-TITRE 1/2/3, CONTENU WYSIWYG,
    DESCRIPTION (entre parenthèses), 3 COLONNES TEXTE, Colonne 1/2/3, 2 CARTES DÉTAILLÉES,
    Carte 1/2, 7 ÉTAPES CLÉS, ÉTAPES, QUESTIONS / RÉPONSES, Sources académiques
- les classes CSS (theme_blue, button_blue, etc.)

Tu peux et dois TRADUIRE :
- le slug source dans **PAGE TECHNIQUE** • SLUG : il faut produire le slug équivalent dans la langue cible (ex: "greffe-de-cheveux/greffe-avec-sedation" devient "trapianto-di-capelli/trapianto-con-sedazione" en IT, "hair-transplant/transplant-with-sedation" en EN)
- les titres éditoriaux en MAJUSCULES (ex: "CONFORT MAXIMAL, ZÉRO STRESS" -> "COMFORT MASSIMO, ZERO STRESS")
- le contenu humain des sections
- les labels de boutons CTA (ex: "DIAGNOSTIC GRATUIT" -> "DIAGNOSI GRATUITA")
- les questions FAQ (Q1 · ...?)
- les titres de timeline (1. CONSULTATION PRÉ-ANESTHÉSIQUE -> 1. CONSULTO PRE-ANESTESIA)

Règle simple pour distinguer label structurel vs contenu éditorial :
- Si c'est un label visible uniquement par le développeur (annotation pour le CMS), GARDER en FR source
- Si c'est un texte affiché à l'utilisateur final sur le site, TRADUIRE
```

Référence complète : `references/cms-patterns.md`.

## Étape 1 : Détecter ou générer le SEO

Avant de traduire, il faut identifier :
- la langue source détectée
- le mot-clé principal
- le titre SEO et la meta description (existants ou à générer)
- l'URL canonique

**1a. Détection du SEO existant.** Utiliser le prompt dans `prompts/seo-detector.md`. Cherche les patterns `<title>`, `**MD**`, `**URL**`, `Title:`, etc. dans l'article. Output JSON.

**1b. Génération si absent.** Si `hasExistingSEO` est `false`, utiliser le prompt dans `prompts/seo-metadata-maker.md` pour générer titre, meta description et URL conformes aux règles anti-IA Cinik. Le prompt inclut les bannissements de patterns ("Ultimate Guide", "Discover", "Revolutionary", etc.) en EN, FR et IT.

**1c. Fusion.** Le résultat (existant ou généré) sert de référence pour toutes les passes suivantes. Stocker sous forme d'objet `seoData` avec `primaryKeyword`, `title`, `metaDescription`, `url`, `language`.

## Étape 2 : Premier jet via Google Translate

Si la langue cible n'est pas la langue source (donc EN ou IT depuis FR), faire passer l'article complet par Google Translate. **Important : ce premier jet est volontairement brut. C'est la base que les passes suivantes vont raffiner.**

Utiliser le script `scripts/translate.py` (basé sur `deep-translator`, sans clé API) :

```bash
python3 scripts/translate.py --source-lang fr --target-lang en --input article.md --output article-en-raw.md
```

Si `deep-translator` n'est pas dispo, fallback : utiliser `googletrans` ou recommander à Tom d'installer la lib (`pip install deep-translator --break-system-packages`).

Préserver les balises markdown, les liens, les blocs code et les URLs. Le script gère ça en chunkant les paragraphes et en évitant de toucher aux URLs.

## Étape 3 : Improver (passe de localisation)

Cette passe transforme le texte brut de Google Translate en texte qui sonne natif, en respectant les règles anti-IA Cinik.

Selon la cible :
- EN : utiliser le prompt complet dans `prompts/improver-en.md` (UK English, ~7400 chars de règles)
- IT : utiliser le prompt complet dans `prompts/improver-it.md` (italien, ~7800 chars)

Les deux prompts ont la même structure : vocabulaire interdit, patterns de contenu à éliminer, patterns linguistiques, règles de style, conclusions, voix.

**Comment travailler.** Lire le prompt en entier avant de commencer. Ensuite, lire le texte brut. Faire un premier passage mental section par section pour identifier les pires marques d'IA (importance gonflée, participes présents en chaîne, langage promotionnel). Réécrire en restant fidèle au sens. Output JSON `{"improved_text": "..."}`.

**Préserver impérativement** : les liens markdown, les URLs, les noms propres médicaux, les chiffres, les sources scientifiques.

## Étape 4 : Humanizer (EN uniquement)

Pour l'anglais seulement, après l'Improver, faire une seconde passe avec `prompts/humanizer-en.md`. Cette passe est plus exigeante : 3 lectures successives, identification des dernières marques d'IA, reformulation jusqu'à ce que le texte passe le test "un collègue suspecterait-il l'IA ?".

L'IT n'a pas cette passe dans le workflow N8N originel. Si le résultat IT semble trop brut, on peut faire une 2ème passe Improver sur le texte avant Internal Linking, mais ce n'est pas le défaut.

Output JSON `{"humanized_text": "..."}`.

## Étape 5 : Internal Linking (avec règle hreflang)

Enrichir l'article avec des liens internes vers d'autres pages Cinik. **Approche prioritaire : utiliser les hreflang du site source pour mapper les URLs**.

### Règle métier hreflang (Tom)

Pour chaque lien interne déjà présent dans l'article FR (vers `https://emrahcinik.com/fr/...`), au moment de produire la version dans la langue cible :

1. Fetcher l'URL FR avec le script `scripts/hreflang_lookup.py --url <URL_FR> --target-lang <code>`
2. Si le script retourne une URL équivalente (exit code 0) : remplacer l'URL FR par cette URL traduite, garder l'ancre traduite naturellement.
3. Si le script retourne `NO_EQUIVALENT_HOME_FALLBACK` ou `NO_EQUIVALENT` (exit code 1) : **garder l'ancre (texte du lien) mais supprimer le markdown link**. Le lecteur voit donc juste un mot ou une expression non liés.

Exemple :
```
Source FR : Voir [notre page sur la greffe FUE](https://emrahcinik.com/fr/greffe-fue/) pour plus de détails.

Si équivalent IT trouvé -> Vedi la nostra [pagina sul trapianto FUE](https://emrahcinik.com/it/trapianto-fue/) per maggiori dettagli.
Si pas d'équivalent IT -> Vedi la nostra pagina sul trapianto FUE per maggiori dettagli.
```

Cette règle évite les liens cassés ou les liens qui ramènent vers une home générique. Le site Cinik est la source de vérité.

### Anchor home obligatoire

En plus des liens existants traduits, ajouter **toujours** un lien vers la home dans la langue cible avec l'anchor approprié :

| Langue | URL home | Anchor |
|---|---|---|
| FR | `https://emrahcinik.com/fr/` | "greffe de cheveux en Turquie" |
| EN | `https://emrahcinik.com/en/` | "hair transplant in Turkey" |
| IT | `https://emrahcinik.com/it/` | "trapianto di capelli in Turchia" |
| ES | `https://emrahcinik.com/es/` | "trasplante de cabello en Turquía" |
| PT | `https://emrahcinik.com/pt/` | "transplante capilar na Turquia" |
| DE | `https://emrahcinik.com/de/` | "Haartransplantation in der Türkei" |
| NL | `https://emrahcinik.com/nl/` | "haartransplantatie in Turkije" |
| TR | `https://emrahcinik.com/tr/` | "Türkiye'de saç ekimi" |
| (autres) | `https://emrahcinik.com/{code}/` | équivalent dans la langue cible |

### Liens internes additionnels (au-delà des liens du source)

Pour ajouter de nouveaux liens internes (au-delà de ceux déjà dans le source FR), utiliser en priorité les hreflang : prendre des pages connexes en FR (mots-clés du paragraphe), fetcher leur page FR pour découvrir les hreflang, et lier vers la version dans la langue cible.

Les Google Sheets de pages par langue (`references/sources-databases.md`) restent disponibles en complément, mais avec la règle hreflang, elles deviennent secondaires.

### Prompts à utiliser

- FR : `prompts/internal-linking-fr.md` (long, inclut les règles anti-IA car FR ne passe pas par l'Improver)
- EN : `prompts/internal-linking-en.md` (court)
- IT : `prompts/internal-linking-it.md` (court)
- Autres langues : adapter le prompt EN ou IT à la langue cible

**Règles strictes.**
- Toujours un lien home avec l'anchor de la table ci-dessus
- Pas de doublon de lien vers la même URL
- Préserver les liens existants (en appliquant la règle hreflang)
- Format markdown
- Si l'URL d'un lien existant ne se traduit pas, garder l'ancre, virer le markdown link

Output JSON avec `enrichedArticleWithLinks`, `linksReplaced` (URLs FR remplacées par leur équivalent), `linksRemoved` (URLs FR sans équivalent, ancre conservée), `linksAdded` (nouveaux liens), `homePageIncluded`, `totalLinksAdded`.

## Étape 6 : SEO Metadata final

Si on a généré le SEO à l'étape 1b, c'est déjà fait. Sinon, adapter au target language : utiliser `prompts/seo-metadata-maker.md` qui gère FR/EN/IT en respectant les règles anti-IA spécifiques à chaque langue.

Output JSON avec `primaryKeyword`, `language`, `title` (≤ 70 chars, finit par `| Dr Cinik`), `titleCharCount`, `metaDescription` (150-160 chars), `metaDescCharCount`, `url`.

## Étape 7 : Créer le Google Doc final

Format à respecter dans le Google Doc :

```markdown
**URL** : https://emrahcinik.com/{lang}/{slug}

**<title>** : Titre SEO | Dr Cinik

**MD** : Meta description optimisée

---

# Titre H1 de l'article

[contenu enrichi avec liens internes]
```

Utiliser `mcp__google-docs__createDocument` avec `contentFormat: "markdown"`. Le titre du doc Google Drive doit être : `Cinik - {primaryKeyword} ({lang}) - {date}`.

Important : préférer cette création directe via MCP plutôt que d'écrire un .docx (cf. préférence utilisateur : pas de docx, uniquement markdown).

## Étape 8 : Validation finale et présentation à Tom

Avant de déclarer le travail terminé, vérifier :

- 0 em dash (U+2014) et 0 en dash (U+2013) dans le texte final
- titre SEO ≤ 70 caractères, finit par ` | Dr Cinik`
- meta description entre 150 et 160 caractères
- au moins un lien vers la home avec l'anchor exacte
- aucun doublon de lien
- liens markdown valides
- pas de patterns IA flagrants en relisant le premier et le dernier paragraphe

Présenter à Tom :
- l'URL du Google Doc créé
- les stats : nombre de mots, nombre de liens internes, conformité titre/MD
- les choix éventuels qui méritent un coup d'œil (ex : un terme médical traduit de manière non triviale)

Tom valide AVANT toute publication ailleurs (cf. CLAUDE.md global). Ne jamais publier directement sans son go.

## Inputs attendus

L'utilisateur fournit en pratique :
1. URL d'un Google Doc FR, contenu collé, ou URL/ID d'une carte Trello
2. Langue(s) cible : `en`, `it`, `fr` (ou plusieurs)
3. Optionnel : SEO existant à respecter, contraintes spéciales

Si plusieurs langues sont demandées, traiter en série (pas en parallèle dans la même passe). Faire FR d'abord (linking + SEO), puis EN, puis IT, en réutilisant le SEO source détecté/généré comme référence.

## Intégration Trello

Quand l'utilisateur demande "check les cartes à traduire" ou fournit l'URL d'un board Trello, utiliser le MCP Trello (`@delorenj/mcp-server-trello`) pour :

1. **Lire les colonnes "Images à Mettre" et "A publier"** : identifier les cartes contenant un lien Google Doc FR sans traduction EN/IT déjà liée.
2. **Extraire le lien Google Doc** depuis la description ou les commentaires de chaque carte.
3. **Lancer le pipeline de traduction** sur chaque doc.
4. **Mettre à jour la description de la carte** avec un tableau récapitulatif des liens FR/EN/IT (voir format dans `references/trello-workflow.md`).

Si le MCP Trello n'est pas installé/connecté, basculer en mode dégradé : demander à Tom de copier-coller manuellement les URLs des Google Docs. Lui rappeler les instructions d'installation dans `INSTALL.md`.

**Important.** Ne jamais déplacer une carte automatiquement vers une colonne "Traduit" ou "Validé" : Tom valide la qualité d'abord. Le skill ajoute juste les liens, c'est Tom qui décide du mouvement.

Voir `references/trello-workflow.md` pour les détails (tools MCP exposés, format des commentaires, gestion des erreurs).

## Erreurs courantes à éviter

- **Écrire un em dash dans le texte final.** Tom ne le tolère jamais. À chaque passe, vérifier que `grep -P '\xe2\x80\x94' fichier.md` et `grep -P '\xe2\x80\x93' fichier.md` ne renvoient rien (codes UTF-8 du em dash et en dash).
- **Sauter l'étape Google Translate** et essayer de traduire directement avec Opus. Le pipeline N8N a été calibré avec GT comme premier jet, c'est ce qui permet aux passes suivantes de se concentrer sur la naturalisation. Ne pas court-circuiter.
- **Localiser les noms propres ou les chiffres.** Dr Emrah Cinik reste Dr Emrah Cinik. Les pourcentages aussi.
- **Oublier le lien vers la home** dans Internal Linking. Toujours obligatoire.
- **Bourrer de liens internes.** Viser 5 à 10 liens uniques pour un article de 1500 mots, pas 30.
- **Ignorer les liens existants** dans le source FR. Les préserver dans la version traduite.

## Fichiers du skill

- `prompts/seo-detector.md` : détecte le SEO existant
- `prompts/seo-metadata-maker.md` : génère le SEO si absent (FR/EN/IT)
- `prompts/improver-en.md` : passe Improver UK English (long, complet)
- `prompts/humanizer-en.md` : passe Humanizer UK English
- `prompts/improver-it.md` : passe Improver italien
- `prompts/internal-linking-fr.md` : linking + anti-IA pour FR (long)
- `prompts/internal-linking-en.md` : linking EN (court)
- `prompts/internal-linking-it.md` : linking IT (court)
- `references/workflow-architecture.md` : doc de l'architecture N8N originelle
- `references/sources-databases.md` : IDs et structures des sheets de pages
- `references/cms-patterns.md` : patterns CMS Cinik à préserver pendant la traduction
- `references/trello-workflow.md` : intégration Trello (lecture cartes, mise à jour descriptions)
- `scripts/translate.py` : script Google Translate via deep-translator (avec protection des patterns CMS)
