Files

135 lines
5.4 KiB
Python
Raw Permalink Normal View History

#!/usr/bin/env python3
"""家纺情报的中文标题翻译与术语校准。"""
from __future__ import annotations
import re
from pathlib import Path
from typing import Any
import requests
if __package__:
from .update_textile_trends import load_zh_cache, save_zh_cache, translate_to_zh_cn
else:
from update_textile_trends import load_zh_cache, save_zh_cache, translate_to_zh_cn
BROWSER_UA = (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0 Safari/537.36"
)
CALENDAR_TITLE_OVERRIDES = {
"New Year's Day": "元旦",
"New Year’s Day": "元旦",
"New Year's Eve": "跨年夜",
"St. Stephen's Day": "圣斯蒂芬节",
"Christmas Eve": "平安夜",
"Pentecost": "圣灵降临节",
"Immaculate Conception": "圣母无染原罪节",
"Maundy Thursday": "濯足节",
"Chuseok": "韩国秋夕",
"All Saints Day": "诸圣节",
"All Saints' Day Eve": "诸圣节前夜",
"All Souls' Day": "追思亡者节",
"Armistice Day": "停战纪念日",
"Summer bank holiday": "夏季银行假日",
"Early May bank holiday": "五月初银行假日",
"Spring bank holiday": "春季银行假日",
"May Day": "五一劳动节",
"Good Friday": "耶稣受难日",
"Holy Saturday": "圣周六",
"Easter Monday": "复活节星期一",
"Christmas Day": "圣诞节",
"Boxing Day": "节礼日",
"Saint Patrick's Day": "圣帕特里克节",
"St Patrick’s Day": "圣帕特里克节",
"National Heroes Day": "国家英雄日",
"National Day for Truth and Reconciliation": "真相与和解国家纪念日",
"National Day of Spain": "西班牙国庆日",
"German Unity Day": "德国统一日",
"National Foundation Day": "建国纪念日",
"Hangul Day": "韩文日",
"Labour Thanksgiving Day": "勤劳感谢之日",
"Thanksgiving": "感恩节",
"Remembrance Day": "阵亡将士纪念日",
"Veterans Day": "退伍军人节",
"Day of Reconciliation": "和解日",
"Day of Goodwill": "友善日",
"Deepavali": "屠妖节",
"Hari Raya Puasa": "开斋节",
"Hari Raya Haji": "哈芝节",
"Vesak Day": "卫塞节",
"Eid al-Fitr First Day (Tentative Date)": "开斋节首日(暂定)",
"Eid al-Fitr Second Day (Tentative Date)": "开斋节次日(暂定)",
"Eid al-Fitr Third Day (Tentative Date)": "开斋节第三日(暂定)",
"Eid al-Adha First Day (Tentative Date)": "宰牲节首日(暂定)",
"Eid al-Adha Second Day (Tentative Date)": "宰牲节次日(暂定)",
"Eid al-Adha Third Day (Tentative Date)": "宰牲节第三日(暂定)",
"Eid al-Adha Fourth Day (Tentative Date)": "宰牲节第四日(暂定)",
"Anzac Day": "澳新军团日",
"Waitangi Day": "怀唐伊日",
"Matariki": "毛利新年 Matariki",
"Juneteenth National Independence Day": "六月节国家独立日",
}
def normalize_text(value: str) -> str:
return " ".join((value or "").replace("\u00a0", " ").split())
def refine_calendar_translation(value: str) -> str:
replacements = {
"假定日期": "暂定日期",
"第一天(暂定日期)": "首日(暂定)",
"第二天(暂定日期)": "次日(暂定)",
"第三天(暂定日期)": "第三日(暂定)",
"第四天(暂定日期)": "第四日(暂定)",
"银行关闭日": "银行休业日",
"家庭日": "家庭日",
}
output = normalize_text(value)
for source, target in replacements.items():
output = output.replace(source, target)
return output
def translate_calendar_titles(items: list[dict[str, Any]], output_dir: Path, max_new: int = 260) -> None:
cache = load_zh_cache(output_dir)
session = requests.Session()
session.headers.update({"User-Agent": BROWSER_UA, "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8"})
translated_count = 0
cache_changed = False
for item in items:
current = normalize_text(str(item.get("title") or ""))
if not current:
continue
english = normalize_text(str(item.get("title_english") or current))
translated = CALENDAR_TITLE_OVERRIDES.get(english)
if translated:
if item.get("source_id") != "calendar_nager" or not item.get("title_original"):
item["title_original"] = current
item["title"] = translated
item["translation_status"] = "已按权威节日名称校准并保留当地名称"
continue
if re.search(r"[\u4e00-\u9fff]", current):
continue
translated = cache.get(english)
if not translated and translated_count < max_new:
translated = translate_to_zh_cn(session, english)
if translated:
cache[english] = translated
translated_count += 1
cache_changed = True
if not translated or not re.search(r"[\u4e00-\u9fff]", translated):
translated = f"{english}({item.get('region') or '当地'}公共假日)"
item["translation_status"] = "保留官方名称并补充中文语境"
else:
translated = refine_calendar_translation(translated)
item["translation_status"] = "已翻译并保留官方名称"
if item.get("source_id") != "calendar_nager" or not item.get("title_original"):
item["title_original"] = current
item["title"] = translated
if cache_changed:
save_zh_cache(output_dir, cache)