UNPKG

@lzwme/m3u8-dl

Version:

A free, open-source, and powerful m3u8 video batch downloader with multi-threaded downloading, play-while-downloading, WebUI management, video parsing, and more.

109 lines (108 loc) 3.19 kB
"use strict"; /** * Shared i18n utility for backend (CLI, SDK, Server) */ Object.defineProperty(exports, "__esModule", { value: true }); exports.LANG_CODES = void 0; exports.detectLanguage = detectLanguage; exports.setLanguage = setLanguage; exports.getLanguage = getLanguage; exports.getLang = getLang; exports.t = t; exports.LANG_CODES = new Set(['zh-CN', 'en']); let globalLang = null; /** * Detect language from OS or environment */ function detectLanguage() { // Check environment variable first const envLang = process.env.M3U8DL_LANG || process.env.LANG; if (envLang) { const langCode = envLang.toLowerCase(); // 支持 zh-CN, zh-TW, zh 等变体映射到 zh-CN if (langCode.startsWith('zh')) { return 'zh-CN'; } const baseLangCode = langCode.split('-')[0].split('_')[0]; if (exports.LANG_CODES.has(baseLangCode)) { return baseLangCode; } } // Try to detect from OS locale try { const osLocale = Intl.DateTimeFormat().resolvedOptions().locale; const langCode = osLocale.toLowerCase(); // 支持 zh-CN, zh-TW 等变体映射到 zh-CN if (langCode.startsWith('zh')) { return 'zh-CN'; } const baseLangCode = langCode.split('-')[0]; if (exports.LANG_CODES.has(baseLangCode)) { return baseLangCode; } } catch { // Ignore errors } // Fallback to English return 'en'; } /** * Set global language context */ function setLanguage(lang) { globalLang = lang; } /** * Get global language context */ function getLanguage() { return globalLang; } /** * Get language from various sources */ function getLang(lang) { if (lang) { const normalizedLang = lang.toLowerCase(); // 支持向后兼容:将 zh 映射到 zh-CN if (normalizedLang === 'zh' || normalizedLang.startsWith('zh')) { return 'zh-CN'; } if (exports.LANG_CODES.has(normalizedLang)) { return normalizedLang; } } if (globalLang) { return globalLang; } return detectLanguage(); } /** * Translation function */ function t(key, lang, params) { const targetLang = getLang(lang); // 将 zh-CN 映射到文件名 zh-CN.ts const langFile = targetLang === 'zh-CN' ? 'zh-CN' : targetLang; const translations = require(`../i18n/locales/${langFile}.js`); // Navigate through nested keys (e.g., 'cli.command.download.description') const keys = key.split('.'); let value = translations.default || translations; for (const k of keys) { if (value && typeof value === 'object' && k in value) { value = value[k]; } else { // Key not found, return the key itself return key; } } // If value is a string, replace params if provided if (typeof value === 'string' && params) { return value.replace(/\{(\w+)\}/g, (match, paramKey) => { return params[paramKey] !== undefined ? String(params[paramKey]) : match; }); } return typeof value === 'string' ? value : key; }