@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
JavaScript
;
/**
* 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;
}