nsgm-cli
Version:
A CLI tool to run Next/Style-components and Graphql/Mysql fullstack project
321 lines (320 loc) • 13.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.I18nGenerator = void 0;
const base_generator_1 = require("./base-generator");
/**
* 国际化文件生成器
* 生成控制器对应的多语言文件
*/
class I18nGenerator extends base_generator_1.BaseGenerator {
/**
* 生成中文翻译文件
*/
generateChineseTranslation() {
const capitalizedController = this.getCapitalizedController();
const formFields = this.getFormFields();
const displayFields = this.getDisplayFields();
// 生成字段翻译
const fieldTranslations = this.generateFieldTranslations(displayFields, formFields, "zh-CN");
// 生成占位符翻译
const placeholderTranslations = this.generatePlaceholderTranslations(formFields, "zh-CN");
return JSON.stringify({
[this.controller]: {
title: `${capitalizedController} 管理`,
fields: fieldTranslations,
buttons: {
add: "新增",
edit: "修改",
delete: "删除",
search: "搜索",
export: "导出",
import: "导入",
batchDelete: "批量删除",
confirm: "确认",
cancel: "取消",
},
placeholders: placeholderTranslations,
messages: {
confirmDelete: "确认删除吗",
confirmBatchDelete: "确认批量删除吗",
uploadSuccess: "文件上传成功",
uploadFailed: "文件上传失败",
onlyExcel: "只能上传 Excel 文件!",
fileSizeLimit: "文件大小不能超过 2MB!",
noData: "没有数据无需导出",
noDataBatchDelete: "没有数据不能批量删除",
},
modal: {
addTitle: `新增 ${capitalizedController}`,
editTitle: `修改 ${capitalizedController}`,
},
pagination: {
total: "共 {{total}} 条记录",
},
},
}, null, 2);
}
/**
* 生成英文翻译文件
*/
generateEnglishTranslation() {
const capitalizedController = this.getCapitalizedController();
const formFields = this.getFormFields();
const displayFields = this.getDisplayFields();
// 生成字段翻译
const fieldTranslations = this.generateFieldTranslations(displayFields, formFields, "en-US");
// 生成占位符翻译
const placeholderTranslations = this.generatePlaceholderTranslations(formFields, "en-US");
return JSON.stringify({
[this.controller]: {
title: `${capitalizedController} Management`,
fields: fieldTranslations,
buttons: {
add: "Add",
edit: "Edit",
delete: "Delete",
search: "Search",
export: "Export",
import: "Import",
batchDelete: "Batch Delete",
confirm: "Confirm",
cancel: "Cancel",
},
placeholders: placeholderTranslations,
messages: {
confirmDelete: "Are you sure to delete?",
confirmBatchDelete: "Are you sure to batch delete?",
uploadSuccess: "File uploaded successfully",
uploadFailed: "File upload failed",
onlyExcel: "Only Excel files are allowed!",
fileSizeLimit: "File size cannot exceed 2MB!",
noData: "No data to export",
noDataBatchDelete: "No data to batch delete",
},
modal: {
addTitle: `Add ${capitalizedController}`,
editTitle: `Edit ${capitalizedController}`,
},
pagination: {
total: "Total {{total}} records",
},
},
}, null, 2);
}
/**
* 生成日文翻译文件
*/
generateJapaneseTranslation() {
const capitalizedController = this.getCapitalizedController();
const formFields = this.getFormFields();
const displayFields = this.getDisplayFields();
// 生成字段翻译
const fieldTranslations = this.generateFieldTranslations(displayFields, formFields, "ja-JP");
// 生成占位符翻译
const placeholderTranslations = this.generatePlaceholderTranslations(formFields, "ja-JP");
return JSON.stringify({
[this.controller]: {
title: `${capitalizedController}管理`,
fields: fieldTranslations,
buttons: {
add: "追加",
edit: "編集",
delete: "削除",
search: "検索",
export: "エクスポート",
import: "インポート",
batchDelete: "一括削除",
confirm: "確認",
cancel: "キャンセル",
},
placeholders: placeholderTranslations,
messages: {
confirmDelete: "削除してもよろしいですか?",
confirmBatchDelete: "一括削除してもよろしいですか?",
uploadSuccess: "ファイルのアップロードが成功しました",
uploadFailed: "ファイルのアップロードが失敗しました",
onlyExcel: "Excelファイルのみアップロード可能です!",
fileSizeLimit: "ファイルサイズは2MBを超えることはできません!",
noData: "エクスポートするデータがありません",
noDataBatchDelete: "一括削除するデータがありません",
},
modal: {
addTitle: `${capitalizedController}を追加`,
editTitle: `${capitalizedController}を編集`,
},
pagination: {
total: "合計 {{total}} 件",
},
},
}, null, 2);
}
/**
* 生成字段翻译
*/
generateFieldTranslations(displayFields, formFields, locale) {
const translations = {};
// 合并显示字段和表单字段,去重
const allFields = [...displayFields, ...formFields];
const uniqueFields = allFields.filter((field, index, self) => index === self.findIndex((f) => f.name === field.name));
// 添加操作列
translations.actions = this.getActionsTranslation(locale);
// 为每个字段生成翻译
uniqueFields.forEach((field) => {
translations[field.name] = this.getFieldTranslation(field, locale);
});
return translations;
}
/**
* 生成占位符翻译
*/
generatePlaceholderTranslations(formFields, locale) {
const translations = {};
formFields.forEach((field) => {
const fieldName = field.name;
const capitalizedName = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);
const fieldTranslation = this.getFieldTranslation(field, locale);
switch (locale) {
case "zh-CN":
translations[`enter${capitalizedName}`] = `请输入${fieldTranslation}搜索`;
translations[`input${capitalizedName}`] = `请输入${fieldTranslation}`;
break;
case "en-US":
translations[`enter${capitalizedName}`] = `Enter ${fieldTranslation.toLowerCase()} to search`;
translations[`input${capitalizedName}`] = `Enter ${fieldTranslation.toLowerCase()}`;
break;
case "ja-JP":
translations[`enter${capitalizedName}`] = `${fieldTranslation}を入力して検索`;
translations[`input${capitalizedName}`] = `${fieldTranslation}を入力`;
break;
}
});
return translations;
}
/**
* 获取字段翻译
*/
getFieldTranslation(field, locale) {
// 如果字段有注释且是中文环境,直接使用注释
if (field.comment && locale === "zh-CN") {
return field.comment;
}
// 根据字段名生成对应语言的翻译
switch (field.name.toLowerCase()) {
case "id":
return "ID";
case "name":
return locale === "zh-CN" ? "名称" : locale === "en-US" ? "Name" : "名前";
case "email":
return locale === "zh-CN" ? "邮箱" : locale === "en-US" ? "Email" : "メール";
case "phone":
return locale === "zh-CN" ? "电话" : locale === "en-US" ? "Phone" : "電話";
case "address":
return locale === "zh-CN" ? "地址" : locale === "en-US" ? "Address" : "住所";
case "description":
return locale === "zh-CN" ? "描述" : locale === "en-US" ? "Description" : "説明";
case "status":
return locale === "zh-CN" ? "状态" : locale === "en-US" ? "Status" : "ステータス";
case "created_at":
case "create_date":
return locale === "zh-CN" ? "创建时间" : locale === "en-US" ? "Created At" : "作成日時";
case "updated_at":
case "update_date":
return locale === "zh-CN" ? "更新时间" : locale === "en-US" ? "Updated At" : "更新日時";
default:
// 如果有中文注释,根据语言环境处理
if (field.comment) {
switch (locale) {
case "zh-CN":
return field.comment;
case "en-US":
// 尝试将中文字段名转换为英文(简单映射)
return this.translateChineseToEnglish(field.comment) || this.formatFieldName(field.name);
case "ja-JP":
// 尝试将中文字段名转换为日文(简单映射)
return this.translateChineseToJapanese(field.comment) || this.formatFieldName(field.name);
default:
return field.comment;
}
}
// 如果没有注释,格式化字段名
return this.formatFieldName(field.name);
}
}
/**
* 获取操作列翻译
*/
getActionsTranslation(locale) {
switch (locale) {
case "zh-CN":
return "操作";
case "en-US":
return "Actions";
case "ja-JP":
return "操作";
default:
return "Actions";
}
}
/**
* 格式化字段名
*/
formatFieldName(fieldName) {
// 将下划线转换为空格并首字母大写
return fieldName.replace(/_/g, " ").replace(/\b\w/g, (l) => l.toUpperCase());
}
/**
* 简单的中文到英文翻译映射
*/
translateChineseToEnglish(chinese) {
const translations = {
用户名: "Username",
用户: "User",
邮箱: "Email",
电话: "Phone",
手机: "Mobile",
地址: "Address",
描述: "Description",
状态: "Status",
名称: "Name",
标题: "Title",
内容: "Content",
价格: "Price",
数量: "Quantity",
创建时间: "Created At",
更新时间: "Updated At",
修改时间: "Modified At",
};
return translations[chinese] || null;
}
/**
* 简单的中文到日文翻译映射
*/
translateChineseToJapanese(chinese) {
const translations = {
用户名: "ユーザー名",
用户: "ユーザー",
邮箱: "メール",
电话: "電話",
手机: "携帯電話",
地址: "住所",
描述: "説明",
状态: "ステータス",
名称: "名前",
标题: "タイトル",
内容: "内容",
价格: "価格",
数量: "数量",
创建时间: "作成日時",
更新时间: "更新日時",
修改时间: "変更日時",
};
return translations[chinese] || null;
}
/**
* 主生成方法(为了继承BaseGenerator需要实现)
*/
generate() {
return this.generateChineseTranslation();
}
}
exports.I18nGenerator = I18nGenerator;