NouveauProduct Score, 4T Segmentation, Price War et Broken Size sont disponibles.Découvrir les nouveautés
Feedance
Article

Passer en minuscules des titres produits turcs sans abîmer İ et ı : playbook de règles de flux

Le passage en minuscules transforme İZMİR en i̇zmi̇r et ISPARTA en isparta. Testez et corrigez la casse turque de vos règles de titres de flux.

Inci DindarInci Dindar
10 min de lecture
Product tags with one misplaced dot being inspected by a magnifier, illustrating Turkish casing errors in feed titles

Google autorise un titre produit de 1 à 150 caractères et demande aux marchands de ne pas utiliser de majuscules pour mettre en valeur un mot (Aide Merchant Center). Les catalogues turcs exportés depuis des ERP sont souvent écrits en majuscules ; la solution évidente est donc une règle qui met chaque titre en minuscules ou en casse de titre. C'est précisément là que les données turques se dégradent sans bruit. Dans notre test, un passage en minuscules par défaut de İZMİR ÇİZGİLİ KIŞLIK MONT a renvoyé 30 points de code au lieu de 25, et ISPARTA est devenu isparta au lieu de ısparta. Ce guide s'adresse aux responsables de flux et aux développeurs qui traitent du texte produit en turc. À la fin, vous saurez tester votre stack, corriger la règle de casse et ajouter un contrôle qui détecte le problème à chaque synchronisation.

Pourquoi la casse turque met en échec les règles ordinaires

Le turc compte deux paires de lettres distinctes : le ı sans point avec la majuscule I, et le i pointé avec la majuscule İ. Le fichier Unicode de correspondance des casses le dit sans détour : « I and i-dotless; I-dot and i are case pairs in Turkish and Azeri » (« I et i sans point ; I avec point et i forment des paires majuscule/minuscule en turc et en azéri ») (Unicode SpecialCasing.txt).

La casse par défaut (indépendante de la langue) l'ignore. Elle convertit I en i, et İ en i suivi d'un point suscrit combinant (U+0307). Les règles turques du même fichier convertissent I en ı et İ en un simple i. L'azéri suit la même règle.

Trois problèmes apparaissent dans un flux :

  • Mauvaises lettres. KADIN devient kadin, YAĞI devient yaği. Le mot reste lisible, mais il est mal orthographié.
  • Caractères en trop. İZMİR devient i̇zmi̇r, une chaîne contenant deux points de code supplémentaires quasi invisibles. Elle paraît presque correcte à l'écran, mais ne correspond pas à izmir dans un filtre, une jointure ou une recherche.
  • Mauvaises majuscules dans l'autre sens. istanbul devient ISTANBUL au lieu de İSTANBUL, et la casse de titre produit Iç au lieu de İç.

Étape 1 : découvrir ce que fait votre stack aujourd'hui

Avant de modifier la moindre règle, vérifiez le comportement du code qui transforme vos titres. Nous avons passé les deux mêmes entrées dans les runtimes que la plupart des pipelines de flux utilisent. L'entrée était ISPARTA İSTANBUL pour les minuscules et istanbul ışık pour les majuscules.

Runtime et appelRésultat en minusculesRésultat en majusculesCorrect pour le turc ?
JavaScript toLowerCase() / toUpperCase()isparta i̇stanbulISTANBUL IŞIKNon
JavaScript toLocaleLowerCase("tr") / toLocaleUpperCase("tr")ısparta istanbulİSTANBUL IŞIKOui
Python 3.13 str.lower() / str.upper()isparta i̇stanbulISTANBUL IŞIKNon
PHP 8.3 mb_strtolower()i̇stanbul (pour İSTANBUL)s.o.Non
PHP 8.3 strtolower()isparta (pour ISPARTA)s.o.Non
Perl lc() / uc()isparta i̇stanbulISTANBUL IŞIKNon

Deux détails comptent. Premièrement, toLocaleLowerCase() de JavaScript, appelé sans argument, utilise la locale par défaut : le même code peut donc se comporter différemment sur un serveur et sur un ordinateur portable. La documentation montre que "İstanbul".toLocaleLowerCase("en-US") renvoie i̇stanbul et que toLocaleLowerCase("tr") renvoie istanbul (MDN). Passez toujours "tr" explicitement.

Deuxièmement, PHP 8.2 a modifié strtolower() : la fonction ne dépend plus de setlocale() et ne convertit que les caractères ASCII (manuel PHP). Définir une locale turque n'y changera donc rien sur une version récente.

Étape 2 : constituer un jeu de test de titres réels

Prenez 10 à 15 titres de votre propre catalogue couvrant chaque lettre propre au turc : İ, I, ı, i, Ş, Ğ, Ç, Ö, Ü. Incluez un titre commençant par I, un autre par İ, et un avec une unité comme ML ou GB. Voici un jeu de départ, avec le résultat d'un passage en minuscules par défaut à côté du résultat correct.

Titre sourceMinuscules par défautMinuscules turques
ISPARTA GÜL YAĞI 50 MLisparta gül yaği 50 mlısparta gül yağı 50 ml
İZMİR ÇİZGİLİ KIŞLIK MONTi̇zmi̇r çi̇zgi̇li̇ kişlik montizmir çizgili kışlık mont
KADIN İÇ ÇAMAŞIRI SETİkadin i̇ç çamaşiri seti̇kadın iç çamaşırı seti
IŞIK GEÇİRMEZ PERDEişik geçi̇rmez perdeışık geçirmez perde
ÇOCUK OKUL ÇANTASIçocuk okul çantasiçocuk okul çantası

Regardez la dernière ligne. Une seule lettre diffère, et un contrôle visuel sur quelques titres la manquerait facilement. C'est pourquoi le jeu de test doit couvrir chaque lettre, et pourquoi il faut comparer des chaînes, pas des impressions.

Étape 3 : corriger la fonction de casse

Lorsque votre outil vous permet de choisir la locale, définissez-la sur tr. Lorsqu'il ne le permet pas, encapsulez vous-même la transformation. En JavaScript ou Node, la correction tient en un argument :

title.toLocaleLowerCase("tr")
title.toLocaleUpperCase("tr")

Les méthodes de chaîne standard de Python n'ont pas d'argument de locale. Un contournement fiable consiste à remplacer les quatre lettres particulières avant d'appeler la méthode par défaut. Nous avons testé cette version sur les quatre premières lignes ci-dessus :

def tr_lower(s):
    return s.replace("İ", "i").replace("I", "ı").lower()

def tr_upper(s):
    return s.replace("i", "İ").replace("ı", "I").upper()

L'ordre est important. Remplacez d'abord İ et I, puis passez en minuscules. Si vous passez d'abord en minuscules, l'information sur la majuscule d'origine est déjà perdue.

Étape 4 : traiter séparément la casse de titre et les unités

La casse de titre ajoute deux problèmes. Mettre en majuscule la première lettre de chaque mot doit utiliser la majuscule turque, sinon iç çamaşırı devient Iç Çamaşırı avec title() de Python. Et une règle appliquée à l'aveugle met les unités en casse de titre : 50 ML devient 50 Ml.

Le schéma que nous utilisons est le suivant : passer tout le titre en minuscules avec la fonction turque, mettre en majuscule la première lettre de chaque mot avec la fonction turque, et ignorer tout jeton qui commence par un chiffre ou figure dans une courte liste d'unités (ml, gb, cm, kg). Sur ISPARTA GÜL YAĞI 50 ML, cela donne Isparta Gül Yağı 50 ml. Sans la liste d'unités, le même pipeline renvoie 50 Ml. Notez que Isparta est correct : le nom de la ville commence par un I majuscule sans point.

Les noms de marque sont un cas à part. Une marque volontairement écrite en majuscules (IKEA, HP) nécessite une liste d'exclusions, car Google demande seulement d'éviter les majuscules pour la mise en valeur et de les utiliser là où c'est approprié, par exemple pour les abréviations (Aide Merchant Center). Gardez cette liste courte et au même endroit que la règle.

Si vous maintenez ces règles dans un outil de gestion de flux, vérifiez comment il applique la casse. Les Feed Rules de Feedance proposent les options majuscules, casse de phrase et majuscule initiale, et la page n'indique pas quelle locale elles utilisent ; nous exécutons donc ce jeu de test sur n'importe quel outil, le nôtre compris, avant de lui confier du texte turc. Pour savoir quand une règle suffit et quand un modèle d'IA vaut la peine, consultez notre comparatif des titres produits par règles et par IA.

Étape 5 : détecter les dégâts résiduels dans les données existantes

Si une mauvaise règle a déjà été exécutée, le point combinant se trouve désormais dans vos données stockées. La normalisation Unicode ne le supprime pas : dans notre test, i suivi de U+0307 est resté deux points de code après normalisation NFC, car il n'existe aucune forme précomposée vers laquelle les combiner. Il faut le repérer et le supprimer.

Ce contrôle signale chaque titre contenant le point suscrit combinant :

import re
bad = [t for t in titles if re.search("̇", t)]

Après avoir ré-exécuté la règle corrigée sur İZMİR, le même contrôle renvoie false. Exécutez-le sur title, description, brand, product_type et tout champ custom_label, car les règles de casse sont souvent appliquées à plus que les titres.

Par ailleurs, si un canal signale une erreur d'encodage, il s'agit d'un autre défaut. La page « Invalid UTF-8 encoding » de Merchant Center indique que la cause est un problème d'encodage du texte et recommande de déclarer ou de convertir l'encodage du fichier (Aide Merchant Center). Le bug de casse produit de l'UTF-8 valide : il ne déclenchera donc pas cette erreur. Il passe en silence, et c'est la raison de le tester.

Étape 6 : en faire un point de contrôle à chaque synchronisation

Une correction que personne ne revérifie régressera dès que quelqu'un ajoutera une règle ou changera d'outil. Utilisez cette checklist comme point de contrôle avant toute mise en production d'une modification des règles de titre, de description ou de nom de catégorie.

ContrôleCondition de réussite
La locale est expliciteChaque fonction de casse est appelée avec tr ou encapsulée comme ci-dessus
Le jeu de test passeToutes les lignes correspondent au résultat correct en turc, caractère par caractère
Aucun point combinantAucun champ ne contient U+0307
Unités préservéesLes jetons comme ml, gb, cm ne sont pas mis en casse de titre
Exclusions de marques appliquéesLes marques listées conservent leurs majuscules voulues
Longueur inchangéeLa sortie n'est pas plus longue que l'entrée en points de code, et reste dans la limite de 150

Le contrôle de longueur détecte les points de code supplémentaires qu'ajoute le passage en minuscules par défaut. C'est un détecteur pratique, même si vous ne savez pas encore quelle règle a provoqué le changement.

Les limites de cette méthode

Il s'agit d'une méthode pour le turc et l'azéri, les deux langues que le fichier Unicode cite pour cette règle. Elle ne couvre pas les champs en écriture arabe ; pour ceux-ci, voyez comment structurer les données produits en arabe et en anglais.

Nous n'avons aucune preuve que Google ou une place de marché refuse un produit à cause d'un i pointé ou sans point erroné. Les coûts documentés sont indirects : des titres mal orthographiés sous les yeux des acheteurs, et des chaînes qui ne correspondent plus à vos filtres, jointures et à votre recherche interne. Considérez-le comme un défaut de qualité des données, non comme un problème de politique.

L'astuce de substitution de l'étape 3 gère les quatre lettres particulières, mais elle n'est pas une implémentation complète des règles de casse Unicode. Les bibliothèques fondées sur ICU et les outils qui exposent un paramètre de locale couvrent plus de cas limites qu'une surcouche écrite à la main. Si un outil que vous utilisez propose déjà une option de locale turque correcte, utilisez-la et ne conservez que le jeu de test. Nous n'avons pas testé la façon dont Channable, DataFeedWatch ou Productsup gèrent la locale turque ; nous ne formulons donc aucune affirmation, dans un sens comme dans l'autre : exécutez le jeu de test sur ces outils comme sur n'importe quel autre. Les places de marché ajoutent leurs propres règles de titre, que nous traitons dans nos guides sur les flux Akakçe, Cimri, N11 et ÇiçekSepeti.

FAQ

Pourquoi İZMİR devient-il i̇zmi̇r quand je le passe en minuscules ?

La mise en minuscules Unicode par défaut convertit le İ majuscule pointé en un i ordinaire suivi d'un point suscrit combinant (U+0307). La règle turque convertit İ en un simple i. Le résultat paraît presque correct à l'écran mais contient des points de code supplémentaires.

Google Merchant Center rejette-t-il les titres contenant le point combinant ?

Nous n'avons trouvé aucun rejet documenté. La chaîne est de l'UTF-8 valide : elle ne déclenche donc pas l'erreur « Invalid UTF-8 encoding ». Le préjudice, ce sont des titres mal orthographiés et des correspondances qui échouent dans vos propres outils.

Dois-je envoyer les titres en majuscules, en minuscules ou en casse de titre ?

Google demande de ne pas utiliser de majuscules pour la mise en valeur et de placer les détails les plus importants en premier, car les utilisateurs ne voient généralement que les 70 premiers caractères, voire moins. La casse de phrase ou la casse de titre avec les bonnes lettres turques satisfont toutes deux cette exigence. Savoir laquelle convertit le mieux relève d'un test sur votre propre compte.

toLowerCase("tr") suffit-il en JavaScript ?

Non. toLowerCase() n'accepte pas de locale. Utilisez toLocaleLowerCase("tr") et passez la locale explicitement, car la valeur par défaut dépend de l'environnement.

Pourquoi setlocale ne corrige-t-il pas strtolower en PHP ?

Depuis PHP 8.2, strtolower() ignore la locale et ne convertit que les lettres ASCII. mb_strtolower() gère le texte non ASCII mais, dans notre test, a tout de même renvoyé i̇stanbul pour İSTANBUL. Appliquez la substitution de caractères de l'étape 3 avant de l'appeler.

La normalisation Unicode peut-elle supprimer le point parasite ?

Non. Dans notre test, la NFC a laissé i plus U+0307 sous forme de deux points de code. Supprimez explicitement le caractère, puis ré-exécutez la règle de casse corrigée sur le texte source d'origine.

Cela concerne-t-il l'arabe ou d'autres langues ?

La règle s'applique au turc et à l'azéri. Les autres langues ont leurs propres problèmes de casse et de normalisation, que ce guide ne couvre pas.

Combien de lignes de test faut-il ?

Assez pour couvrir chaque lettre propre au turc et chacune de ses positions possibles : début de mot, milieu, fin et à côté d'un chiffre. Pour la plupart des catalogues, cela représente 10 à 15 titres. Ajoutez une ligne chaque fois qu'un nouveau défaut apparaît en production.

Vérifiez votre propre flux

Si vous voulez voir comment votre flux actuel se classe en matière de qualité des titres et des attributs, passez-le dans notre outil gratuit d'audit de flux produits.

Vous souhaitez un regard extérieur sur votre flux ? Nous l'examinerons avec vous et vous montrerons ses lacunes avant votre prochaine soumission.
Lancer un audit gratuit
Inci Dindar
Écrit par
Inci Dindar

Cofondatrice de Feedance, elle s’appuie sur plus de 20 ans d’expérience en conception produit et en design d’expérience utilisateur pour façonner la manière dont les catalogues deviennent des créations. Particulièrement attachée à rapprocher design systems et automatisation, elle aide les marques à faire progresser la qualité visuelle à grande échelle sans multiplier l’effort de design.

LinkedIn

Découvrez quels
produits rapportent.

Connectez votre flux et GA4. Nous affichons Product Score, 4T, Price War et Broken Size sur votre propre catalogue.