185 lines
5.9 KiB
JavaScript
185 lines
5.9 KiB
JavaScript
const DEFAULT_LOCALE = "zh-CN";
|
|
|
|
const REGION_LABELS = {
|
|
americas: "美洲",
|
|
europe: "欧洲",
|
|
"middle-east-africa": "中东与非洲",
|
|
"asia-pacific": "亚太",
|
|
global: "全球",
|
|
};
|
|
|
|
const FEED_LABELS = {
|
|
"Global Monitor / World": "区域监测",
|
|
"Global Monitor / Americas": "区域监测",
|
|
"Global Monitor / Europe": "区域监测",
|
|
"Global Monitor / MEA": "区域监测",
|
|
"Global Monitor / APAC": "区域监测",
|
|
};
|
|
|
|
const CATEGORY_LABELS = {
|
|
politics: "政治",
|
|
business: "商业",
|
|
ecommerce: "电商",
|
|
finance: "金融",
|
|
sports: "体育",
|
|
technology: "科技",
|
|
military: "军事",
|
|
disaster: "灾害",
|
|
energy: "能源",
|
|
society: "社会",
|
|
culture: "文化",
|
|
other: "其他",
|
|
};
|
|
|
|
const BREAKING_LEVEL_LABELS = {
|
|
watch: "关注",
|
|
breaking: "突发",
|
|
critical: "严重突发",
|
|
};
|
|
|
|
const BREAKING_SCOPE_LABELS = {
|
|
regional: "区域",
|
|
global: "全球",
|
|
};
|
|
|
|
const SOURCE_TYPE_LABELS = {
|
|
rss: "RSS",
|
|
atom: "Atom",
|
|
aggregated: "Aggregated",
|
|
reference: "Reference",
|
|
};
|
|
|
|
const LOCATION_SOURCE_LABELS = {
|
|
region_anchor: "区域锚点",
|
|
ai_inferred_target: "AI 推断位置",
|
|
headline_location_hint: "标题位置线索",
|
|
headline_country_hint: "标题国家线索",
|
|
};
|
|
|
|
const ENRICHMENT_STATUS_LABELS = {
|
|
pending: "待增强",
|
|
queued: "增强排队中",
|
|
attempted: "增强中",
|
|
success: "已汉化",
|
|
content_only: "已汉化",
|
|
location_only: "位置已增强",
|
|
unavailable: "AI 未配置",
|
|
provider_error: "增强失败",
|
|
parse_error: "增强解析失败",
|
|
no_result: "暂无增强结果",
|
|
};
|
|
|
|
const TITLE_PLACEHOLDERS = {
|
|
queued: "新闻汉化排队中",
|
|
attempted: "新闻汉化中",
|
|
provider_error: "新闻汉化失败,正在重试",
|
|
parse_error: "新闻解析失败,正在重试",
|
|
unavailable: "等待 AI 配置",
|
|
no_result: "新闻汉化待重试",
|
|
location_only: "新闻汉化待重试",
|
|
};
|
|
|
|
const SUMMARY_PLACEHOLDERS = {
|
|
queued: "中文概要正在生成,请稍后刷新。",
|
|
attempted: "中文概要正在生成,请稍后刷新。",
|
|
provider_error: "中文概要生成失败,系统会重新提交增强任务。",
|
|
parse_error: "中文概要解析失败,系统会重新提交增强任务。",
|
|
unavailable: "AI 服务配置完成后将生成中文概要。",
|
|
no_result: "中文概要暂未生成,系统会继续重试。",
|
|
location_only: "已完成位置增强,中文概要将继续重试。",
|
|
};
|
|
|
|
function normalizeText(value) {
|
|
return String(value ?? "").replace(/\s+/g, " ").trim();
|
|
}
|
|
|
|
function getLocalization(item, locale = DEFAULT_LOCALE) {
|
|
const localizations = item?.localizations;
|
|
const localized = localizations && typeof localizations === "object"
|
|
? localizations[locale]
|
|
: null;
|
|
return localized && typeof localized === "object" ? localized : {};
|
|
}
|
|
|
|
export function getNewsDisplayTitle(item, locale = DEFAULT_LOCALE) {
|
|
const localized = getLocalization(item, locale).title;
|
|
if (localized || item?.display_title) {
|
|
return normalizeText(item?.display_title || localized);
|
|
}
|
|
return normalizeText(
|
|
TITLE_PLACEHOLDERS[item?.enrichment_status]
|
|
|| "新闻汉化中",
|
|
);
|
|
}
|
|
|
|
export function getNewsDisplaySummary(item, locale = DEFAULT_LOCALE) {
|
|
const localized = getLocalization(item, locale).summary;
|
|
if (localized || item?.display_summary) {
|
|
return normalizeText(item?.display_summary || localized);
|
|
}
|
|
return normalizeText(
|
|
SUMMARY_PLACEHOLDERS[item?.enrichment_status]
|
|
|| "中文概要生成中,请稍后刷新。",
|
|
);
|
|
}
|
|
|
|
export function isNewsContentReady(item, locale = DEFAULT_LOCALE) {
|
|
const localized = getLocalization(item, locale);
|
|
const title = normalizeText(item?.display_title || localized.title);
|
|
const summary = normalizeText(item?.display_summary || localized.summary);
|
|
return Boolean(title && summary);
|
|
}
|
|
|
|
export function getNewsRegionLabel(region, fallback = "") {
|
|
return REGION_LABELS[region] || fallback || region || REGION_LABELS.global;
|
|
}
|
|
|
|
export function getNewsFeedLabel(feedName) {
|
|
return FEED_LABELS[feedName] || feedName || "聚合源";
|
|
}
|
|
|
|
export function getNewsCategoryLabel(category) {
|
|
return CATEGORY_LABELS[category] || category || CATEGORY_LABELS.other;
|
|
}
|
|
|
|
export function getNewsBreakingLabel(level, scope = "regional") {
|
|
const normalizedLevel = normalizeText(level).toLowerCase();
|
|
if (!normalizedLevel || normalizedLevel === "none") return "";
|
|
const levelLabel = BREAKING_LEVEL_LABELS[normalizedLevel] || level;
|
|
const scopeLabel = BREAKING_SCOPE_LABELS[normalizeText(scope).toLowerCase()] || BREAKING_SCOPE_LABELS.regional;
|
|
return `${scopeLabel}${levelLabel}`;
|
|
}
|
|
|
|
export function getNewsSourceTypeLabel(sourceType) {
|
|
const normalized = normalizeText(sourceType).toLowerCase();
|
|
return SOURCE_TYPE_LABELS[normalized] || sourceType || "RSS";
|
|
}
|
|
|
|
export function isRegionalMonitorFeed(feedName) {
|
|
return Object.prototype.hasOwnProperty.call(FEED_LABELS, feedName);
|
|
}
|
|
|
|
export function getNewsFetchChannelLabel(feedName, sourceType = "") {
|
|
const normalized = normalizeText(sourceType).toLowerCase();
|
|
if (isRegionalMonitorFeed(feedName) || normalized === "aggregated") return "区域监测";
|
|
if (normalized === "atom") return "单源 Atom";
|
|
if (normalized === "reference") return "配置保留";
|
|
return "单源 RSS";
|
|
}
|
|
|
|
export function getNewsLocationSourceLabel(source) {
|
|
return LOCATION_SOURCE_LABELS[source] || source || "位置来源";
|
|
}
|
|
|
|
export function getNewsEnrichmentStatusLabel(statusOrItem) {
|
|
const item = statusOrItem && typeof statusOrItem === "object" ? statusOrItem : null;
|
|
const status = item ? item.enrichment_status : statusOrItem;
|
|
const language = String(item?.content_language || "").toLowerCase();
|
|
if (language.startsWith("zh") && status !== "success" && status !== "content_only") {
|
|
if (status === "queued" || status === "attempted") return "英文补译中";
|
|
if (status === "provider_error" || status === "parse_error" || status === "no_result") return "中文原文";
|
|
return "中文原文";
|
|
}
|
|
return ENRICHMENT_STATUS_LABELS[status] || status || "增强状态";
|
|
}
|