fix: banner translations and deployment improvements
- 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>
This commit is contained in:
124
backend/fix_banner_translations.py
Normal file
124
backend/fix_banner_translations.py
Normal file
@@ -0,0 +1,124 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user