i18n-automatically-cli
Version:
143 lines (120 loc) • 4.12 kB
JavaScript
const fs = require("fs");
const path = require("path");
const chalk = require("chalk");
const { readConfig, getRootPath, resolveI18nPath } = require("../utils/config");
// 动态导入 inquirer
async function getInquirer() {
const inquirer = await import("inquirer");
return inquirer.default;
}
async function switchCommand(targetLanguage) {
try {
const config = readConfig();
const localeDir = resolveI18nPath("locale");
// 检查 locale 目录是否存在
if (!fs.existsSync(localeDir)) {
console.error(chalk.red(`locale 目录不存在: ${localeDir}`));
console.log(chalk.yellow('请先运行 "i18n-auto init" 初始化项目'));
process.exit(1);
}
// 获取可用的语言列表
const availableLanguages = getAvailableLanguages(localeDir);
if (availableLanguages.length === 0) {
console.error(chalk.red("未找到任何语言包文件"));
console.log(chalk.yellow('请先运行 "i18n-auto generate" 生成语言包'));
process.exit(1);
}
console.log(chalk.blue("📋 可用语言:"));
availableLanguages.forEach((lang) => {
console.log(chalk.gray(` - ${lang}`));
});
let selectedLanguage = targetLanguage;
// 如果没有指定语言,让用户选择
if (!selectedLanguage) {
const inquirer = await getInquirer();
const { language } = await inquirer.prompt([
{
type: "list",
name: "language",
message: "选择要切换到的语言:",
choices: availableLanguages,
},
]);
selectedLanguage = language;
}
// 验证选择的语言是否存在
if (!availableLanguages.includes(selectedLanguage)) {
console.error(chalk.red(`语言 "${selectedLanguage}" 不存在`));
console.log(chalk.yellow(`可用语言: ${availableLanguages.join(", ")}`));
process.exit(1);
}
// 显示语言包内容
await displayLanguagePackage(selectedLanguage, localeDir);
console.log(chalk.green(`✅ 已切换到语言: ${selectedLanguage}`));
console.log(
chalk.gray(
`语言包路径: ${path.join(localeDir, `${selectedLanguage}.json`)}`
)
);
} catch (error) {
console.error(chalk.red("切换语言失败:"), error);
process.exit(1);
}
}
function getAvailableLanguages(localeDir) {
try {
const files = fs.readdirSync(localeDir);
return files
.filter((file) => file.endsWith(".json"))
.map((file) => file.replace(".json", ""))
.sort();
} catch (error) {
return [];
}
}
async function displayLanguagePackage(language, localeDir) {
try {
const filePath = resolveI18nPath("locale", `${language}.json`);
const content = fs.readFileSync(filePath, "utf8");
const data = JSON.parse(content);
const entries = Object.entries(data);
if (entries.length === 0) {
console.log(chalk.yellow(`${language}.json 语言包为空`));
return;
}
console.log(
chalk.blue(`\n📖 ${language}.json 语言包内容 (${entries.length} 条):`)
);
// 显示前10条记录作为预览
const preview = entries.slice(0, 10);
preview.forEach(([key, value]) => {
const displayValue = value ? String(value) : chalk.gray("(未翻译)");
console.log(chalk.gray(` ${key}: ${displayValue}`));
});
if (entries.length > 10) {
console.log(chalk.gray(` ... 还有 ${entries.length - 10} 条记录`));
}
// 统计翻译进度
const translatedCount = entries.filter(
([_, value]) => value && String(value).trim()
).length;
const progress = Math.round((translatedCount / entries.length) * 100);
console.log(
chalk.blue(
`\n📊 翻译进度: ${translatedCount}/${entries.length} (${progress}%)`
)
);
if (progress < 100) {
console.log(
chalk.yellow(
`💡 提示: 运行 "i18n-auto generate -l ${language}" 来完善翻译`
)
);
}
} catch (error) {
console.error(chalk.red(`读取语言包失败: ${error}`));
}
}
module.exports = {
switchCommand,
};