NowośćProduct Score, 4T Segmentation, Price War i Broken Size są już dostępne.Zobacz, co nowego
Feedance
Artykuł

Zamiana tureckich tytułów produktów na małe litery bez psucia İ i ı: playbook reguł feedu

Zwykła zamiana na małe litery zmienia İZMİR w i̇zmi̇r, a ISPARTA w isparta. Przetestuj i popraw reguły tytułów w feedzie na 5 przykładach.

Inci DindarInci Dindar
9 minut czytania
Product tags with one misplaced dot being inspected by a magnifier, illustrating Turkish casing errors in feed titles

Google dopuszcza tytuł produktu o długości od 1 do 150 znaków i zaleca, by nie używać wielkich liter do wyróżniania (Merchant Center Help). Tureckie katalogi eksportowane z systemów ERP są często zapisane wielkimi literami, więc oczywistym rozwiązaniem wydaje się reguła, która zamienia każdy tytuł na małe litery lub nadaje mu format title case. Właśnie tu tureckie dane po cichu się psują. W naszym teście domyślna zamiana İZMİR ÇİZGİLİ KIŞLIK MONT na małe litery zwróciła 30 punktów kodowych zamiast 25, a ISPARTA zamieniło się w isparta zamiast w ısparta. Ten poradnik jest dla osób zarządzających feedem i programistów, którzy pracują z tureckimi tekstami produktowymi. Na jego końcu będziesz umieć przetestować swój stack, poprawić regułę zmiany wielkości liter i dodać kontrolę, która wychwyci ten problem przy każdej synchronizacji.

Dlaczego turecka wielkość liter psuje zwykłe reguły

Turecki ma dwie oddzielne pary liter: bezkropkowe ı z wielkim I oraz kropkowe i z wielkim İ. Plik Unicode z mapowaniem wielkości liter mówi o tym wprost: „I and i-dotless; I-dot and i are case pairs in Turkish and Azeri” (Unicode SpecialCasing.txt).

Domyślna zamiana (neutralna językowo) tego nie wie. Mapuje I na i, a İ na i plus łączącą kropkę nad literą (U+0307). Reguły tureckie z tego samego pliku mapują I na ı, a İ na zwykłe i. Azerbejdżański stosuje tę samą zasadę.

W feedzie psują się trzy rzeczy:

  • Złe litery. KADIN zmienia się w kadin, a YAĞI w yaği. Słowo nadal da się odczytać, ale jest zapisane z błędem.
  • Dodatkowe znaki. İZMİR zmienia się w i̇zmi̇r, czyli ciąg z dwoma dodatkowymi, niemal niewidocznymi punktami kodowymi. Na ekranie wygląda prawie poprawnie, ale nie pasuje do izmir w filtrze, złączeniu ani wyszukiwarce.
  • Złe wielkie litery w drugą stronę. istanbul zmienia się w ISTANBUL zamiast w İSTANBUL, a title case daje Iç zamiast İç.

Krok 1: Sprawdź, co robi dziś Twój stack

Zanim zmienisz jakąkolwiek regułę, sprawdź, jak zachowuje się kod przekształcający Twoje tytuły. Te same dwa dane wejściowe przepuściliśmy przez środowiska uruchomieniowe, z których korzysta większość pipeline'ów feedów. Dla małych liter danymi wejściowymi było ISPARTA İSTANBUL, a dla wielkich istanbul ışık.

Środowisko i wywołanieWynik zamiany na małe literyWynik zamiany na wielkie literyPoprawne po turecku?
JavaScript toLowerCase() / toUpperCase()isparta i̇stanbulISTANBUL IŞIKNie
JavaScript toLocaleLowerCase("tr") / toLocaleUpperCase("tr")ısparta istanbulİSTANBUL IŞIKTak
Python 3.13 str.lower() / str.upper()isparta i̇stanbulISTANBUL IŞIKNie
PHP 8.3 mb_strtolower()i̇stanbul (dla İSTANBUL)n/dNie
PHP 8.3 strtolower()isparta (dla ISPARTA)n/dNie
Perl lc() / uc()isparta i̇stanbulISTANBUL IŞIKNie

Znaczenie mają dwa szczegóły. Po pierwsze, zwykłe toLocaleLowerCase() w JavaScripcie bez argumentu używa domyślnych ustawień regionalnych, więc ten sam kod może działać inaczej na serwerze i na laptopie. Dokumentacja pokazuje, że "İstanbul".toLocaleLowerCase("en-US") zwraca i̇stanbul, a toLocaleLowerCase("tr") zwraca istanbul (MDN). Zawsze przekazuj "tr" jawnie.

Po drugie, PHP 8.2 zmieniło strtolower() tak, że funkcja nie zależy już od setlocale() i konwertuje wyłącznie znaki ASCII (podręcznik PHP). Ustawienie tureckich ustawień regionalnych niczego tu nie zmieni w aktualnej wersji.

Krok 2: Zbuduj zestaw testowy z prawdziwych tytułów

Weź z własnego katalogu 10–15 tytułów, które obejmują każdą turecką literę specjalną: İ, I, ı, i, Ş, Ğ, Ç, Ö, Ü. Uwzględnij tytuł zaczynający się od I, taki, który zaczyna się od İ, oraz taki z jednostką, np. ML lub GB. Oto zestaw startowy, w którym obok poprawnego wyniku widać efekt domyślnej zamiany na małe litery.

Tytuł źródłowyDomyślne małe literyTureckie małe litery
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ı

Spójrz na ostatni wiersz. Różni się tylko jedna litera, a wzrokowa kontrola kilku tytułów łatwo by ją przeoczyła. Dlatego zestaw testowy musi obejmować każdą literę i dlatego porównuje się ciągi znaków, a nie wrażenia.

Krok 3: Popraw funkcję zmiany wielkości liter

Jeśli narzędzie pozwala wybrać ustawienia regionalne, ustaw tr. Jeśli nie, opakuj przekształcenie samodzielnie. W JavaScripcie lub Node poprawka to jeden argument:

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

Standardowe metody łańcuchów w Pythonie nie mają argumentu z ustawieniami regionalnymi. Niezawodne obejście polega na podmianie czterech liter specjalnych przed wywołaniem metody domyślnej. Przetestowaliśmy tę wersję na pierwszych czterech wierszach powyżej:

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

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

Kolejność ma znaczenie. Najpierw zamień İ i I, potem przejdź na małe litery. Jeśli zrobisz to odwrotnie, informacja o tym, która to była wielka litera, zostanie już utracona.

Krok 4: Obsłuż title case i jednostki osobno

Title case dokłada dwa problemy. Zamiana pierwszej litery każdego wyrazu na wielką musi używać tureckiej wielkiej litery, inaczej iç çamaşırı zmieni się w Iç Çamaşırı w Pythonowym title(). Ponadto zbiorcza reguła zmienia wielkość liter w jednostkach: 50 ML staje się 50 Ml.

Stosujemy taki wzorzec: zamień cały tytuł na małe litery tureckią funkcją, zamień pierwszą literę każdego wyrazu na wielką tureckią funkcją i pomiń każdy token zaczynający się od cyfry lub znajdujący się na krótkiej liście jednostek (ml, gb, cm, kg). Dla ISPARTA GÜL YAĞI 50 ML daje to Isparta Gül Yağı 50 ml. Bez listy jednostek ten sam pipeline zwraca 50 Ml. Zauważ, że Isparta jest poprawne: nazwa miasta zaczyna się od bezkropkowego wielkiego I.

Nazwy marek to osobny przypadek. Marka celowo zapisana wielkimi literami (IKEA, HP) wymaga listy wyjątków, ponieważ Google prosi jedynie o unikanie wielkich liter do wyróżniania i dopuszcza je tam, gdzie są uzasadnione, np. w skrótach (Merchant Center Help). Trzymaj tę listę krótką i w tym samym miejscu co regułę.

Jeśli utrzymujesz te reguły w narzędziu do zarządzania feedem, sprawdź, jak stosuje ono wielkość liter. Feed Rules w Feedance oferują jako opcje wielkie litery, wielkość liter jak w zdaniu i wielkie pierwsze litery, a strona nie podaje, jakich ustawień regionalnych używają. Dlatego przed powierzeniem narzędziu tureckiego tekstu uruchamiamy ten zestaw testowy na każdym z nich, także na naszym. Szerszy obraz tego, kiedy wystarczy reguła, a kiedy warto sięgnąć po model AI, znajdziesz w naszym porównaniu tytułów produktów opartych na regułach i na AI.

Krok 5: Wykryj pozostałe uszkodzenia w istniejących danych

Jeśli zła reguła już działała, łącząca kropka jest teraz w Twoich zapisanych danych. Normalizacja Unicode jej nie usuwa: w naszym teście i z następującym po nim U+0307 pozostało dwoma punktami kodowymi po normalizacji NFC, ponieważ nie istnieje forma złożona, w którą można by je połączyć. Musisz ją znaleźć i usunąć.

Ta kontrola raportuje każdy tytuł zawierający łączącą kropkę nad literą:

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

Po ponownym uruchomieniu poprawionej reguły na İZMİR ta sama kontrola zwraca fałsz. Uruchom ją na polach title, description, brand, product_type i każdym polu custom_label, ponieważ reguły zmiany wielkości liter często stosuje się nie tylko do tytułów.

Osobna sprawa: jeśli kanał zgłasza błąd kodowania, to jest to inna usterka. Strona Merchant Center „Invalid UTF-8 encoding” podaje, że przyczyną jest problem z kodowaniem tekstu, i każe zadeklarować lub przekonwertować kodowanie pliku (Merchant Center Help). Błąd wielkości liter daje poprawny UTF-8, więc nie wywoła tego komunikatu. Przechodzi bez echa, i właśnie dlatego trzeba go testować.

Krok 6: Zrób z tego bramkę przy każdej synchronizacji

Poprawka, której nikt nie sprawdza ponownie, zregresuje się przy pierwszym dodaniu reguły lub zmianie narzędzia. Użyj tej listy kontrolnej jako bramki wydania dla każdej zmiany reguł tytułów, opisów lub nazw kategorii.

KontrolaWarunek zaliczenia
Ustawienia regionalne są jawneKażda funkcja zmiany wielkości liter jest wywoływana z tr lub opakowana jak powyżej
Zestaw testowy przechodziWszystkie wiersze zgadzają się z poprawnym tureckim wynikiem znak po znaku
Brak łączącej kropkiZero pól zawiera U+0307
Jednostki zachowaneTokeny takie jak ml, gb, cm nie są zapisane w title case
Wyjątki dla marek zastosowaneMarki z listy zachowują zamierzone wielkie litery
Długość bez zmianWynik nie jest dłuższy od wejścia w punktach kodowych i mieści się w 150

Kontrola długości wychwytuje dodatkowe punkty kodowe, które dodaje domyślna zamiana na małe litery. To wygodny wykrywacz, nawet jeśli jeszcze nie wiesz, która reguła spowodowała zmianę.

Gdzie ta metoda przestaje działać

To metoda dla tureckiego i azerbejdżańskiego, dwóch języków, które plik Unicode wymienia przy tej regule. Nie obejmuje pól w alfabecie arabskim; zobacz, jak zbudować arabskie i angielskie dane produktowe.

Nie mamy dowodów, że Google lub jakikolwiek marketplace odrzuca produkt z powodu błędnego kropkowego lub bezkropkowego i. Udokumentowane koszty są pośrednie: tytuły z błędami przed oczami kupujących oraz ciągi, które przestają pasować do Twoich filtrów, złączeń i wewnętrznej wyszukiwarki. Traktuj to jako błąd jakości danych, nie naruszenie zasad.

Sztuczka z podmianą z Kroku 3 obsługuje cztery litery specjalne, ale nie jest pełną implementacją reguł Unicode dotyczących wielkości liter. Biblioteki oparte na ICU i narzędzia udostępniające ustawienie regionalne pokrywają więcej przypadków brzegowych niż ręcznie napisana nakładka. Jeśli używane przez Ciebie narzędzie ma już poprawną opcję tureckich ustawień regionalnych, skorzystaj z niej i zachowaj tylko zestaw testowy. Nie testowaliśmy, jak Channable, DataFeedWatch ani Productsup obsługują tureckie ustawienia regionalne, więc nie formułujemy w tej sprawie żadnych twierdzeń; uruchom na nich zestaw testowy tak jak na każdym narzędziu. Marketplace'y mają ponadto własne reguły dotyczące tytułów, które omawiamy w naszych poradnikach o feedach Akakçe, Cimri, N11 i ÇiçekSepeti.

FAQ

Dlaczego İZMİR zmienia się w i̇zmi̇r po zamianie na małe litery?

Domyślna zamiana Unicode na małe litery mapuje kropkowe wielkie İ na zwykłe i plus łączącą kropkę nad literą (U+0307). Reguła turecka mapuje İ na zwykłe i. Wynik wygląda na ekranie niemal poprawnie, ale zawiera dodatkowe punkty kodowe.

Czy Google Merchant Center odrzuca tytuły z łączącą kropką?

Nie znaleźliśmy udokumentowanego odrzucenia z tego powodu. Ciąg jest poprawnym UTF-8, więc nie wywołuje błędu „Invalid UTF-8 encoding”. Szkodą są tytuły z błędami i nieudane dopasowania w Twoich własnych narzędziach.

Czy wysyłać tytuły wielkimi literami, małymi czy w title case?

Google zaleca, by nie używać wielkich liter do wyróżniania i umieszczać najważniejsze informacje na początku, ponieważ użytkownicy zwykle widzą tylko pierwsze 70 znaków lub mniej. Wielkość liter jak w zdaniu oraz title case z poprawnymi tureckimi literami spełniają ten wymóg. To, który wariant konwertuje lepiej, trzeba sprawdzić testem na własnym koncie.

Czy w JavaScripcie wystarczy toLowerCase("tr")?

Nie. toLowerCase() nie przyjmuje ustawień regionalnych. Użyj toLocaleLowerCase("tr") i przekaż ustawienia jawnie, ponieważ wartość domyślna zależy od środowiska.

Dlaczego setlocale nie naprawia strtolower w PHP?

Od PHP 8.2 strtolower() ignoruje ustawienia regionalne i konwertuje tylko litery ASCII. mb_strtolower() obsługuje tekst spoza ASCII, ale w naszym teście nadal zwracało i̇stanbul dla İSTANBUL. Zastosuj podmianę znaków z Kroku 3 przed jego wywołaniem.

Czy normalizacja Unicode może usunąć zabłąkaną kropkę?

Nie. W naszym teście NFC zostawiła i plus U+0307 jako dwa punkty kodowe. Usuń ten znak jawnie, a potem ponownie uruchom poprawioną regułę wielkości liter na oryginalnym tekście źródłowym.

Czy dotyczy to arabskiego lub innych języków?

Reguła dotyczy tureckiego i azerbejdżańskiego. Inne języki mają własne problemy z wielkością liter i normalizacją, których ten poradnik nie obejmuje.

Ile wierszy testowych wystarczy?

Tyle, by pokryć każdą turecką literę specjalną i każdą pozycję, jaką może zajmować: początek wyrazu, środek, koniec i sąsiedztwo cyfry. W przypadku większości katalogów to 10–15 tytułów. Dodawaj wiersz za każdym razem, gdy na produkcji pojawi się nowy defekt.

Sprawdź własny feed

Jeśli chcesz zobaczyć, jak Twój obecny feed wypada pod względem jakości tytułów i atrybutów, przepuść go przez nasze bezpłatne narzędzie do audytu feedu produktowego.

Chcesz, by ktoś jeszcze spojrzał na twój feed? Przejrzymy go razem z tobą i pokażemy luki przed kolejnym przesłaniem.
Zrób bezpłatny audyt
Inci Dindar
Autor
Inci Dindar

Współzałożycielka Feedance, która wykorzystuje ponad 20 lat doświadczenia w projektowaniu produktów i doświadczeń użytkownika, aby kształtować sposób, w jaki katalogi stają się kreacjami. Skupiając się na łączeniu systemów projektowych z automatyzacją, pomaga markom skalować jakość wizualną bez zwiększania nakładu pracy projektowej.

LinkedIn

Zobacz, które
produkty zarabiają.

Połącz swój feed i GA4. Pokażemy Product Score, 4T, Price War i Broken Size na twoim własnym katalogu.