import type { LanguageConfig } from "../types"; import { LANGUAGE_CONFIGS, getLanguageConfig } from "../config/languages"; /** * 语言管理器 * 负责管理支持的编程语言,从配置文件读取 */ export class LanguageManager { private languages: Map = new Map(); private currentLanguage: LanguageConfig; constructor(defaultLanguage: string = "javascript") { // 从配置加载所有语言 LANGUAGE_CONFIGS.forEach((config) => { this.languages.set(config.id, config); }); // 设置默认语言 const lang = this.languages.get(defaultLanguage); if (!lang) { throw new Error(`Language "${defaultLanguage}" not found in config`); } this.currentLanguage = lang; } /** * 获取指定语言配置 */ getLanguage(id: string): LanguageConfig | undefined { return this.languages.get(id); } /** * 获取所有语言 */ getAllLanguages(): LanguageConfig[] { return Array.from(this.languages.values()); } /** * 切换语言 */ switchLanguage(languageId: string): LanguageConfig { const lang = this.languages.get(languageId); if (!lang) { throw new Error(`Language "${languageId}" not supported`); } this.currentLanguage = lang; return this.currentLanguage; } /** * 获取当前语言 */ getCurrentLanguage(): LanguageConfig { return this.currentLanguage; } /** * 检查语言是否支持 */ isSupported(languageId: string): boolean { return this.languages.has(languageId); } /** * 获取可运行的语言列表 */ getRunnableLanguages(): LanguageConfig[] { return Array.from(this.languages.values()).filter((lang) => lang.canRun); } /** * 获取语言的代码模板(支持外部配置) * 优先级: languageTemplates > questionConfig > fallbackTemplate > 空字符串 */ getTemplate( languageId: string, questionConfig?: import("../types/question").QuestionConfig, languageTemplates?: import("../types/question").LanguageTemplates, ): string { // 优先级 1: 直接传入的 languageTemplates if ( languageTemplates && languageTemplates[languageId] !== undefined && languageTemplates[languageId] !== null ) { return languageTemplates[languageId]; } // 优先级 2: questionConfig 中的模板 if ( questionConfig?.languageTemplates?.[languageId] !== undefined && questionConfig?.languageTemplates?.[languageId] !== null ) { return questionConfig.languageTemplates[languageId]; } // 优先级 3: 语言的 fallbackTemplate const langConfig = this.languages.get(languageId); if (langConfig && (langConfig as any).fallbackTemplate) { return (langConfig as any).fallbackTemplate; } // 优先级 4: 空字符串(允许用户从空白开始) return ""; } }