This commit is contained in:
MarkLo 2025-12-24 04:49:04 +08:00
parent 9c7b1f7903
commit 6e48ac3f7a
2 changed files with 76 additions and 8 deletions

View File

@ -506,6 +506,46 @@ export default function HistoryPage() {
return;
}
// Detect report language based on trader's final decision keywords
// This ensures PDF language matches the report content, not UI language
const detectReportLanguage = (reports: any): 'zh-TW' | 'en' => {
const traderPlan = reports?.trader_investment_plan;
if (!traderPlan || typeof traderPlan !== 'string') {
return 'zh-TW'; // Default to Chinese
}
// Chinese decision keywords: 買入, 賣出, 持有
const chineseKeywords = ['買入', '賣出', '持有'];
// English decision keywords: buy, sell, hold (case insensitive)
const englishKeywords = ['buy', 'sell', 'hold'];
const lowerPlan = traderPlan.toLowerCase();
// Check for Chinese keywords first
for (const keyword of chineseKeywords) {
if (traderPlan.includes(keyword)) {
return 'zh-TW';
}
}
// Check for English keywords
for (const keyword of englishKeywords) {
if (lowerPlan.includes(keyword)) {
return 'en';
}
}
// Fallback: check for any Chinese characters
const chineseRegex = /[\u4e00-\u9fa5]/;
if (chineseRegex.test(traderPlan)) {
return 'zh-TW';
}
return 'en';
};
const reportLanguage = detectReportLanguage(report.result.reports);
// Build request body
const requestBody = {
ticker: report.ticker,
@ -514,7 +554,7 @@ export default function HistoryPage() {
reports: report.result.reports,
price_data: report.result.price_data,
price_stats: report.result.price_stats,
language: locale, // Pass current language for PDF generation
language: reportLanguage, // Use detected language based on trader decision
};
const response = await fetch('/api/download/reports', {

View File

@ -49,15 +49,43 @@ export function DownloadReports({
return path.split('.').reduce((current, key) => current?.[key], obj);
};
// Helper to detect if content contains Chinese characters
const detectContentLanguage = (data: any): 'zh-TW' | 'en' | null => {
// Helper to detect report language based on trader's final decision keywords
// This ensures PDF language matches the report content language, not UI language
const detectReportLanguage = (data: any): 'zh-TW' | 'en' | null => {
try {
const contentStr = JSON.stringify(data);
// Check for Chinese characters (Unicode range \u4e00-\u9fa5)
// Get trader's investment plan (final decision)
const traderPlan = data?.trader_investment_plan;
if (!traderPlan || typeof traderPlan !== 'string') {
return null;
}
// Chinese decision keywords: 買入, 賣出, 持有
const chineseKeywords = ['買入', '賣出', '持有'];
// English decision keywords: buy, sell, hold (case insensitive)
const englishKeywords = ['buy', 'sell', 'hold'];
const lowerPlan = traderPlan.toLowerCase();
// Check for Chinese keywords first
for (const keyword of chineseKeywords) {
if (traderPlan.includes(keyword)) {
return 'zh-TW';
}
}
// Check for English keywords
for (const keyword of englishKeywords) {
if (lowerPlan.includes(keyword)) {
return 'en';
}
}
// Fallback: check for any Chinese characters as secondary detection
const chineseRegex = /[\u4e00-\u9fa5]/;
if (chineseRegex.test(contentStr)) {
if (chineseRegex.test(traderPlan)) {
return 'zh-TW';
}
return 'en';
} catch (e) {
return null;
@ -80,8 +108,8 @@ export function DownloadReports({
try {
// Build request body with all available analysts
// Always use direct mode when reports data is available (task may be cleaned up from Redis)
// Detect content language
const contentLang = detectContentLanguage(reports);
// Detect report language based on trader's final decision keywords
const contentLang = detectReportLanguage(reports);
// Use detected language if available, otherwise fallback to prop or current locale
// This ensures that if reports are in Chinese, the PDF headers will also be in Chinese
// even if the UI is in English