- Add translateCarName import from i18n.ts for proper multilingual support - Change default API language from 'ko' to 'en' for hero banners - Add checkbox column for Local Cars banner registration - Update Dockerfile with Playwright dependencies - Add PostgreSQL migration script - Add banner translation fix script 🤖 Generated with [Claude Code](https://claude.ai/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
125 lines
4.9 KiB
Python
125 lines
4.9 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Fix hero banner translations by updating title_en, title_mn, title_ru from title_ko
|
|
"""
|
|
import sqlite3
|
|
import os
|
|
|
|
# Translation dictionary (subset of key terms)
|
|
TRANSLATIONS = {
|
|
# Makers
|
|
'현대': {'en': 'Hyundai', 'mn': 'Хёндай', 'ru': 'Хёндай'},
|
|
'기아': {'en': 'Kia', 'mn': 'Киа', 'ru': 'Киа'},
|
|
'제네시스': {'en': 'Genesis', 'mn': 'Женезис', 'ru': 'Дженезис'},
|
|
'쉐보레': {'en': 'Chevrolet', 'mn': 'Шевроле', 'ru': 'Шевроле'},
|
|
'KG모빌리티': {'en': 'KG Mobility', 'mn': 'КЖ Мобилити', 'ru': 'КГ Мобилити'},
|
|
'쌍용': {'en': 'SsangYong', 'mn': 'СсангЁнг', 'ru': 'СсангЙонг'},
|
|
|
|
# Models
|
|
'모하비': {'en': 'Mohave', 'mn': 'Мохаве', 'ru': 'Мохаве'},
|
|
'더 마스터': {'en': 'The Master', 'mn': 'Мастер', 'ru': 'Мастер'},
|
|
'신형': {'en': 'New', 'mn': 'Шинэ', 'ru': 'Новый'},
|
|
'더 뉴': {'en': 'The New', 'mn': 'Шинэ', 'ru': 'Новый'},
|
|
'그랜드스타렉스': {'en': 'Grand Starex', 'mn': 'Гранд Старекс', 'ru': 'Гранд Старекс'},
|
|
'스타렉스': {'en': 'Starex', 'mn': 'Старекс', 'ru': 'Старекс'},
|
|
'싼타페': {'en': 'Santa Fe', 'mn': 'Санта Фе', 'ru': 'Санта Фе'},
|
|
'스팅어': {'en': 'Stinger', 'mn': 'Стингер', 'ru': 'Стингер'},
|
|
'마이스터': {'en': 'Meister', 'mn': 'Мейстер', 'ru': 'Мейстер'},
|
|
'쏘렌토': {'en': 'Sorento', 'mn': 'Соренто', 'ru': 'Соренто'},
|
|
'스포티지': {'en': 'Sportage', 'mn': 'Спортаж', 'ru': 'Спортаж'},
|
|
'카니발': {'en': 'Carnival', 'mn': 'Карнивал', 'ru': 'Карнивал'},
|
|
'셀토스': {'en': 'Seltos', 'mn': 'Селтос', 'ru': 'Селтос'},
|
|
'투싼': {'en': 'Tucson', 'mn': 'Туксон', 'ru': 'Туксон'},
|
|
'팰리세이드': {'en': 'Palisade', 'mn': 'Палисейд', 'ru': 'Палисейд'},
|
|
'아반떼': {'en': 'Avante', 'mn': 'Аванте', 'ru': 'Аванте'},
|
|
'쏘나타': {'en': 'Sonata', 'mn': 'Соната', 'ru': 'Соната'},
|
|
'그랜저': {'en': 'Grandeur', 'mn': 'Грандёр', 'ru': 'Грандёр'},
|
|
'코나': {'en': 'Kona', 'mn': 'Кона', 'ru': 'Кона'},
|
|
'K5': {'en': 'K5', 'mn': 'K5', 'ru': 'K5'},
|
|
'K3': {'en': 'K3', 'mn': 'K3', 'ru': 'K3'},
|
|
'K7': {'en': 'K7', 'mn': 'K7', 'ru': 'K7'},
|
|
'K8': {'en': 'K8', 'mn': 'K8', 'ru': 'K8'},
|
|
'K9': {'en': 'K9', 'mn': 'K9', 'ru': 'K9'},
|
|
'GV70': {'en': 'GV70', 'mn': 'GV70', 'ru': 'GV70'},
|
|
'GV80': {'en': 'GV80', 'mn': 'GV80', 'ru': 'GV80'},
|
|
'G70': {'en': 'G70', 'mn': 'G70', 'ru': 'G70'},
|
|
'G80': {'en': 'G80', 'mn': 'G80', 'ru': 'G80'},
|
|
'G90': {'en': 'G90', 'mn': 'G90', 'ru': 'G90'},
|
|
}
|
|
|
|
# Sort keys by length (longest first) to avoid partial matches
|
|
SORTED_KEYS = sorted(TRANSLATIONS.keys(), key=len, reverse=True)
|
|
|
|
|
|
def translate(text: str, lang: str) -> str:
|
|
"""Translate Korean text to target language"""
|
|
if not text:
|
|
return text
|
|
|
|
result = text
|
|
for key in SORTED_KEYS:
|
|
if key in result:
|
|
translation = TRANSLATIONS[key].get(lang, key)
|
|
result = result.replace(key, translation)
|
|
return result
|
|
|
|
|
|
def main():
|
|
# Find database file
|
|
db_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "autonet.db")
|
|
|
|
if not os.path.exists(db_path):
|
|
print(f"Database not found at: {db_path}")
|
|
return
|
|
|
|
print(f"Using database: {db_path}")
|
|
|
|
conn = sqlite3.connect(db_path)
|
|
cursor = conn.cursor()
|
|
|
|
# Get all banners
|
|
cursor.execute("SELECT id, title_ko, title_en, title_mn, title_ru FROM hero_banners")
|
|
banners = cursor.fetchall()
|
|
|
|
print(f"\nFound {len(banners)} banners to update:\n")
|
|
|
|
for banner in banners:
|
|
banner_id, title_ko, title_en, title_mn, title_ru = banner
|
|
|
|
if not title_ko:
|
|
print(f"Banner {banner_id}: No Korean title, skipping")
|
|
continue
|
|
|
|
new_title_en = translate(title_ko, 'en')
|
|
new_title_mn = translate(title_ko, 'mn')
|
|
new_title_ru = translate(title_ko, 'ru')
|
|
|
|
print(f"Banner {banner_id}:")
|
|
print(f" KO: {title_ko}")
|
|
print(f" EN: {title_en} -> {new_title_en}")
|
|
print(f" MN: {title_mn} -> {new_title_mn}")
|
|
print(f" RU: {title_ru} -> {new_title_ru}")
|
|
print()
|
|
|
|
# Update the banner
|
|
cursor.execute("""
|
|
UPDATE hero_banners
|
|
SET title_en = ?, title_mn = ?, title_ru = ?
|
|
WHERE id = ?
|
|
""", (new_title_en, new_title_mn, new_title_ru, banner_id))
|
|
|
|
conn.commit()
|
|
print(f"Updated {len(banners)} banners successfully!")
|
|
|
|
# Verify
|
|
print("\n--- Verification ---")
|
|
cursor.execute("SELECT id, title_ko, title_en, title_mn FROM hero_banners")
|
|
for row in cursor.fetchall():
|
|
print(f"ID {row[0]}: {row[1]} -> EN: {row[2]}, MN: {row[3]}")
|
|
|
|
conn.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|