UNPKG

nsgm-cli

Version:

A CLI tool to run Next/Style-components and Graphql/Mysql fullstack project

321 lines (320 loc) 13.3 kB
"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;