@alauda-fe/i18n-tools
Version:
基于 Azure OpenAI 的 JSON i18n 文件翻译和英文语法检查工具集
703 lines (644 loc) • 21.8 kB
JavaScript
// ====================== AI 提示词模板库 ======================
/**
* 云原生和容器技术术语(严格按照官方拼写)
*/
export const CLOUD_NATIVE_TERMS = [
// 容器相关
"Docker",
"docker",
"Dockerfile",
"docker-compose",
"containerd",
"runc",
"OCI",
"CRI",
"CNI",
"CSI",
// Kubernetes 生态
"Kubernetes",
"kubectl",
"kubelet",
"kube-proxy",
"kube-apiserver",
"etcd",
"CoreDNS",
"Helm",
"Tiller",
"Istio",
"Envoy",
"Pod",
"ReplicaSet",
"Deployment",
"StatefulSet",
"DaemonSet",
"Service",
"Ingress",
"ConfigMap",
"Secret",
"PersistentVolume",
"Persistent Volume",
"Persistent Volume Claims",
"Load Balancer",
"Load Balancers",
"Service Account",
"Service Accounts",
"Cluster Role",
"Role Binding",
"Network Policy",
"Storage Class",
"Volume Snapshot",
"Custom Resource Definition",
"Resource Quota",
"Limit Range",
"Priority Class",
"Pod Security Policy",
"Security Context",
"Horizontal Pod Autoscaler",
"Vertical Pod Autoscaler",
"Namespace",
"Node",
"Cluster",
"ServiceAccount",
"RBAC",
// 监控和日志
"Prometheus",
"Grafana",
"Jaeger",
"Zipkin",
"Fluentd",
"Elasticsearch",
"Kibana",
"Logstash",
"AlertManager",
"Thanos",
// 服务网格
"Linkerd",
"Consul",
"Vault",
"Nomad",
// CI/CD
"Jenkins",
"GitLab",
"GitHub",
"ArgoCD",
"Flux",
"Tekton",
// 云平台
"AWS",
"Azure",
"GCP",
"Alibaba Cloud",
"Tencent Cloud",
];
/**
* 通用技术术语
*/
export const GENERAL_TECH_TERMS = [
// 网络协议
"HTTP",
"HTTPS",
"TCP",
"UDP",
"DNS",
"TLS",
"SSL",
"gRPC",
"REST",
"GraphQL",
// 认证授权
"OAuth",
"OAuth 2.0",
"JWT",
"SAML",
"LDAP",
"Active Directory",
"Single Sign-On",
"Single Sign On",
"SSO",
"Multi-Factor Authentication",
"Two-Factor Authentication",
"MFA",
"2FA",
// 数据库
"MySQL",
"PostgreSQL",
"MongoDB",
"Redis",
"Cassandra",
"CockroachDB",
"InfluxDB",
"TimescaleDB",
"Neo4j",
"DynamoDB",
"RDS",
// 编程语言和框架
"JavaScript",
"TypeScript",
"Python",
"Go",
"Rust",
"Java",
"C++",
"React",
"Vue.js",
"Angular",
"Node.js",
"Express",
"FastAPI",
"Django",
// 开发工具
"Git",
"GitHub",
"GitHub Actions",
"GitHub Pages",
"GitLab",
"GitLab CI",
"GitLab CI/CD",
"Azure DevOps",
"Azure Pipelines",
"Bitbucket",
"SVN",
"Mercurial",
"VS Code",
"Visual Studio Code",
"Visual Studio",
"IntelliJ IDEA",
"Android Studio",
"Eclipse",
"Vim",
"Emacs",
// 操作系统和虚拟化
"Linux",
"Ubuntu",
"Ubuntu Server",
"CentOS",
"Red Hat Enterprise Linux",
"RHEL",
"Alpine Linux",
"Windows",
"Windows Server",
"macOS",
"Mac OS",
"VMware",
"VMware vSphere",
"VirtualBox",
"Virtual Machine",
"Virtual Machines",
"QEMU",
"KVM",
"Xen",
"Hyper-V",
// AI/ML 相关
"Machine Learning",
"Artificial Intelligence",
"Deep Learning",
"Neural Network",
"Natural Language Processing",
"Computer Vision",
"Data Science",
"Big Data",
// 云服务相关
"Amazon Web Services",
"Google Cloud Platform",
"Microsoft Azure",
"Application Load Balancer",
"Network Load Balancer",
"Auto Scaling",
"Health Check",
"Health Checks",
];
/**
* 共用的基础规则
*/
export const COMMON_BASE_RULES = [
"保持 JSON 键名不变,仅处理字符串值",
"输出必须是合法的 JSON 对象,严格保持原有的键值对结构",
"空字符串和 null 值必须保持原样",
"严格保持所有模板变量格式完全不变:",
" - {{variable}} 格式变量(如 {{name}}, {{count}})",
" - ${variable} 格式变量(如 ${name}, ${count})",
" - ICU Message Format 语法(如 {count, plural, =0{no items} =1{one item} other{# items}})",
" - ICU 选择格式(如 {gender, select, male{he} female{she} other{they}})",
" - ICU 数字格式(如 {value, number, integer}, {price, number, currency})",
" - ICU 日期格式(如 {date, date, short}, {time, time, medium})",
"保持 HTML 标签、URL 链接、邮箱地址不变",
"保持数字、日期格式、版本号(如 v1.0.0)原样",
"对于代码片段、命令行指令、文件路径等技术内容保持原样",
];
/**
* 变量和模板保护规则
*/
export const TEMPLATE_PROTECTION_RULES = [
"**严格保护所有模板变量和格式化语法**:",
" - {{variable}} 格式:{{name}}, {{count}}, {{title}} 等",
" - ${variable} 格式:${name}, ${count}, ${title} 等",
" - ICU 复数格式:{count, plural, =0{no items} =1{one item} other{# items}}",
" - ICU 选择格式:{gender, select, male{he} female{she} other{they}}",
" - ICU 数字格式:{value, number, integer}, {price, number, currency}",
" - ICU 日期时间:{date, date, short}, {time, time, medium}",
" - ICU 相对时间:{timestamp, date, relative}",
" - 参数占位符:{0}, {1}, {2} 等索引占位符",
"**ICU Message Format 语法保护**:",
" - 保持所有 ICU 语法结构完整:{variable, type, format}",
" - 保持复数规则标识符:=0, =1, few, many, other",
" - 保持选择规则标识符:male, female, other 等",
" - 保持格式化类型:plural, select, number, date, time",
" - 保持嵌套 ICU 语法结构不被破坏",
" - 保持 # 符号在复数语法中的特殊含义",
"**变量命名和语法完整性**:",
" - 变量名称必须完全保持不变",
" - 大括号、花括号数量和位置必须精确匹配",
" - 逗号、等号、井号等特殊符号位置不变",
" - 嵌套结构的层级关系必须保持",
];
/**
* 技术术语保护规则
*/
export const TECH_TERMS_PROTECTION_RULES = [
"**严格保护技术术语的原始格式**:",
" - 保持原有的空格数量,既不增加也不减少空格",
" - 保持技术术语的确切原始拼写、空格和缩写格式",
" - 所有技术术语必须完全按照原文格式保持不变",
" - 如果原文是 LoadBalancer,保持为 LoadBalancer(不要加空格)",
" - 如果原文是 Load Balancer,保持为 Load Balancer(不要删除空格)",
" - 不要将 PVC 展开为 Persistent Volume Claims",
" - 不要将 PVCs 展开为 Persistent Volume Claims",
" - 不要将 Persistent Volume Claim 缩写为 PVC",
" - 不要将 Persistent Volume Claims 缩写为 PVCs",
" - 不要将 LB 展开为 Load Balancer",
" - 不要将 Load Balancer 缩写为 LB",
" - 不要将 SA 展开为 Service Account",
" - 不要将 Service Account 缩写为 SA",
" - 不要将 k8s 展开为 Kubernetes",
" - 不要将 Kubernetes 缩写为 k8s",
" - 不要将缩写改为全称,也不要将全称改为缩写",
];
/**
* 标点符号保护规则
*/
export const PUNCTUATION_PROTECTION_RULES = [
"**严格保持原文的标点符号格式**:",
" - 如果原文没有句尾标点符号,译文也不要添加",
" - 如果原文有句尾标点符号,译文保持相同类型的标点",
" - 绝对不要在按钮文本、标签、标题等UI元素末尾添加句号",
" - 保持原文标点符号的数量和位置",
"**严格禁止添加或删除标点符号**:",
" - 绝对不要在原本没有句号的文本末尾添加句号",
" - 绝对不要在原本没有感叹号的文本末尾添加感叹号",
" - 绝对不要在原本没有问号的文本末尾添加问号",
" - 只修正明显的标点符号错误(如多余的逗号、错误的引号等)",
" - 保持原文的标点符号风格和数量完全不变",
];
/**
* 表达简洁性规则
*/
export const CONCISENESS_RULES = [
"优先使用简短、直接的表达,避免冗长的句式:",
" - 能用一个词表达的不用短语",
" - 能用短语表达的不用长句",
" - 删除不必要的修饰词和填充词",
" - 优选主动语态而非被动语态(在合适的情况下)",
" - 使用具体动词而非抽象名词结构",
"优化表达简洁性,在保持意思准确的前提下:",
" - 删除冗余的词汇和短语",
" - 将复杂的句式简化为直接表达",
" - 用具体动词替换抽象名词+动词的组合",
" - 避免不必要的被动语态(技术文档除外)",
" - 消除重复的概念和表达",
];
/**
* 翻译专用规则
*/
export const TRANSLATION_SPECIFIC_RULES = [
"遇到无法翻译的内容(如专有名词、品牌名称)直接返回原始值",
"对日期、星期、月份等缩写翻译为目标语言对应形式:",
" - 星期缩写:Sun, Mon...Sat → 按目标语言习惯翻译",
" - 月份缩写:Jan, Feb...Dec → 按目标语言习惯翻译",
" - 时间单位:second(s), minute(s), hour(s), day(s) → 翻译为对应单位",
"保持原文的语调和正式程度(正式/非正式/技术性/用户友好等)",
"对于 UI 界面文本,使用简洁明了的表达方式",
"错误消息和提示信息要翻译得准确易懂",
"按钮、菜单等操作类文本使用动词形式",
];
/**
* 语法检查专用规则
*/
export const GRAMMAR_CHECK_SPECIFIC_RULES = [
"修正常见的语法错误:",
" - 主谓一致错误(如 'data is' vs 'data are')",
" - 时态错误(如过去时、现在完成时的误用)",
" - 冠词使用错误(a, an, the 的误用或遗漏)",
" - 介词使用错误(in, on, at, for, with 等)",
" - 单复数形式错误(如 information/informations)",
"修正拼写错误,但优先保持技术术语的标准拼写",
"保持原有的语调和风格,只修正明显的错误",
"对于专业术语、产品名称、品牌名称保持原样不变",
"如果句子本身没有明显错误,保持原样返回",
"对于缩写形式(如 don't, can't, won't)保持一致性",
];
/**
* 构建通用技术术语说明
*/
function buildTechTermsSection() {
return `**技术术语标准化要求:**
严格按照官方标准拼写处理技术术语,包括但不限于:
- 容器技术:Docker, containerd, etcd, kubectl, kubelet
- 云原生:Kubernetes, Prometheus, Grafana, Istio, Helm
- 网络协议:HTTP, HTTPS, gRPC, REST, GraphQL
- 认证授权:OAuth, JWT, SAML, LDAP, SSO
- 数据库:MySQL, PostgreSQL, MongoDB, Redis
- 编程技术:JavaScript, TypeScript, Node.js, Vue.js, React
特别注意以下要求:
- "etcd" 必须全小写(不是 ETCD 或 Etcd)
- "kubectl" 必须全小写
- "Docker" 首字母大写
- "Node.js" 和 "Vue.js" 包含点号
- "PostgreSQL" 大小写混合
- **保持原有空格格式**:LoadBalancer 保持无空格,Load Balancer 保持有空格
- **不展开缩写**:PVC 不改为 Persistent Volume Claims,PVCs 不改为 Persistent Volume Claims
- **不创建缩写**:Persistent Volume Claim 不改为 PVC,Persistent Volume Claims 不改为 PVCs`;
}
/**
* 构建通用基础提示词(翻译和语法检查共用)
*/
function buildCommonBasePrompt(type) {
const title =
type === "translation"
? "你是一个专业的国际化(i18n)翻译专家,专门处理软件界面、技术文档和用户体验文本的翻译工作。"
: "你是一个专业的英文文案校对专家,专门负责检查和修正软件界面、技术文档中的英文语法和拼写错误。";
const allRules = [
...COMMON_BASE_RULES,
...TEMPLATE_PROTECTION_RULES,
...TECH_TERMS_PROTECTION_RULES,
...PUNCTUATION_PROTECTION_RULES,
...CONCISENESS_RULES,
];
return `${title}
请严格遵循以下规则:
**基础处理规则:**
${allRules.map((rule, i) => `${i + 1}. ${rule}`).join("\n")}
${buildTechTermsSection()}`;
}
/**
* 构建翻译系统提示词
*/
export function buildTranslationSystemPrompt() {
const basePrompt = buildCommonBasePrompt("translation");
return `${basePrompt}
**翻译专用规则:**
${TRANSLATION_SPECIFIC_RULES.map((rule, i) => `${i + 1}. ${rule}`).join("\n")}
**翻译质量要求:**
- 确保译文自然流畅,符合目标语言的表达习惯
- 保持技术准确性,不要改变原意
- 考虑上下文语境,选择最合适的表达方式
- 对于UI文本,优先考虑用户体验和易理解性
- 技术术语保持英文原文,不要翻译
- **优先使用简洁直接的表达,避免冗长复杂的句式**
- **选择最精练的词汇,删除不必要的修饰和填充词**
- **🚫 严禁在原本没有标点的文本末尾添加标点符号**
- **📍 按钮、菜单、标签等UI元素通常不以标点符号结尾**
- **🔤 严格保护技术术语的原始格式,不增减空格,不展开缩写**
如果遇到任何不确定的内容,宁可保持原样也不要错误翻译。`.trim();
}
/**
* 构建语法检查系统提示词
*/
export function buildGrammarCheckSystemPrompt() {
const basePrompt = buildCommonBasePrompt("grammar");
return `${basePrompt}
**语法检查专用规则:**
${GRAMMAR_CHECK_SPECIFIC_RULES.map((rule, i) => `${i + 1}. ${rule}`).join("\n")}
**检查重点:**
- 优先修正影响理解的明显错误
- 保持原文的专业性和技术准确性
- 确保修正后的文本更加专业和易读
- 对于模糊或主观的语法问题,保持原样
- 重点检查技术术语的标准化拼写
- **优化表达的简洁性,使文本更直接、更易懂**
- **在保持准确性的前提下,选择最精练的表达方式**
**特别注意:**
- 技术文档中常见的被动语态是正确的,不要随意改为主动语态
- API 文档、错误消息等技术文本有其特定的表达方式
- 保持与软件行业标准用词的一致性
- 技术术语的拼写必须符合官方标准
- **🚫 严禁在原本没有标点符号的文本末尾添加任何标点符号**
- **🚫 特别是按钮文本、菜单项、标签等UI元素,绝对不要添加句号**
- **📍 软件界面文本通常不以句号结尾,必须保持这种格式**
- **🔤 严格保护技术术语的原始格式,不增减空格,不展开缩写**`.trim();
}
/**
* 构建翻译用户提示词
*/
export function buildTranslationUserPrompt(srcLang, tgtLang) {
return `请将以下 ${srcLang} 的 JSON 对象精准翻译为 ${tgtLang},严格遵守上述规则。
**翻译要求:**
- 保持专业性和准确性
- 确保译文自然流畅
- 适合软件界面显示
- 用户友好易理解
- **使用简洁直接的表达,避免冗长**
- **🚫 不要在原本没有标点的文本末尾添加标点符号**
- **🔤 严格保护技术术语的原始格式,不增减空格,不展开缩写**
**模板变量和格式化语法保护:**
- **{{variable}} 模板**:保持 {{name}}, {{count}}, {{title}} 等格式不变
- **\${variable} 模板**:保持 \${name}, \${count}, \${title} 等格式不变
- **ICU Message Format**:
- 复数格式:{count, plural, =0{no items} =1{one item} other{# items}}
- 选择格式:{gender, select, male{he} female{she} other{they}}
- 数字格式:{value, number, integer}, {price, number, currency}
- 日期格式:{date, date, short}, {time, time, medium}
- 保持所有大括号、逗号、等号、井号的精确位置
- 只翻译 ICU 语法中的显示文本部分,变量名和关键字保持英文
**特别注意术语保护:**
- 保持 PVC ↔ PVC(不展开)
- 保持 Persistent Volume Claim ↔ Persistent Volume Claim(不缩写)
- 保持 Load Balancer ↔ Load Balancer(保持空格)
- 保持 Service Account ↔ Service Account(保持空格)
**ICU 格式翻译示例:**
- 原文:{count, plural, =0{No files} =1{One file} other{# files}}
- 中文:{count, plural, =0{无文件} =1{一个文件} other{# 个文件}}
- 原文:{status, select, success{操作成功} failed{操作失败} other{未知状态}}
- 保持:{status, select, success{操作成功} failed{操作失败} other{未知状态}}(已是中文无需翻译)
请开始翻译:`;
}
/**
* 构建语法检查用户提示词
*/
export function buildGrammarCheckUserPrompt() {
return `请检查并修正以下英文 JSON 对象中的语法和拼写错误,严格遵守上述规则。
**检查要求:**
- 只修正明显的错误
- 保持原文风格和语调
- 确保技术术语正确
- 提高文本的专业性
- **优化表达简洁性,使文本更直接易懂**
- **🚫 绝对不要在原本没有标点的文本末尾添加标点符号**
- **🔤 严格保护技术术语的原始格式,不增减空格,不展开缩写**
**模板变量和格式化语法保护:**
- **{{variable}} 模板**:完全保持 {{name}}, {{count}}, {{title}} 等格式不变
- **${variable} 模板**:完全保持 \${name}, \${count}, \${title} 等格式不变
- **ICU Message Format**:
- 复数格式:{count, plural, =0{no items} =1{one item} other{# items}}
- 选择格式:{gender, select, male{he} female{she} other{they}}
- 数字格式:{value, number, integer}, {price, number, currency}
- 日期格式:{date, date, short}, {time, time, medium}
- 保持所有大括号、逗号、等号、井号的精确位置和数量
- 可以修正 ICU 语法内的英文文本语法错误,但不能改变结构
**关键术语保护示例:**
- ✅ 保持:"Configure your PVC settings"
- ❌ 禁止改为:"Configure your Persistent Volume Claim settings"
- ✅ 保持:"Create a Persistent Volume Claim"
- ❌ 禁止改为:"Create a PVC"
- ✅ 保持:"Load Balancer configuration"
- ❌ 禁止改为:"LoadBalancer configuration"
**ICU 格式检查示例:**
- 可修正:{count, plural, =0{No file} =1{One files} other{# file}}
- 修正为:{count, plural, =0{No files} =1{One file} other{# files}}
- 保持变量名 count、关键字 plural、标识符 =0, =1, other 和结构不变
请开始检查:`;
}
/**
* 预定义的语言映射(用于更友好的显示)
*/
export const LANGUAGE_NAMES = {
en: "English",
"zh-cn": "中文(简体)",
"zh-tw": "中文(繁體)",
ja: "日本語",
ko: "한국어",
fr: "Français",
de: "Deutsch",
es: "Español",
pt: "Português",
ru: "Русский",
ar: "العربية",
hi: "हिन्दी",
th: "ไทย",
vi: "Tiếng Việt",
it: "Italiano",
nl: "Nederlands",
pl: "Polski",
tr: "Türkçe",
};
/**
* 获取友好的语言名称
*/
export function getFriendlyLanguageName(langCode) {
return LANGUAGE_NAMES[langCode] || langCode;
}
/**
* 获取完整的技术术语列表
*/
export function getAllTechTerms() {
return [...CLOUD_NATIVE_TERMS, ...GENERAL_TECH_TERMS];
}
/**
* 检查文本中的技术术语并给出标准化建议
*/
export function validateTechTerms(text) {
const allTerms = getAllTechTerms();
const issues = [];
// 检查常见的大小写错误
const commonMistakes = {
docker: "Docker",
kubernetes: "Kubernetes",
ETCD: "etcd",
KUBECTL: "kubectl",
prometheus: "Prometheus",
grafana: "Grafana",
nodejs: "Node.js",
vuejs: "Vue.js",
};
// 检查 PVC 相关的错误转换(这些应该被保护,不应发生转换)
const pvcProtectionChecks = [
{
pattern: /\bPVC\b/g,
warning: "PVC 缩写应保持不变,不应展开为 Persistent Volume Claim",
},
{
pattern: /\bPVCs\b/g,
warning: "PVCs 复数缩写应保持不变,不应展开为 Persistent Volume Claims",
},
{
pattern: /\bPersistent Volume Claim\b/g,
warning: "Persistent Volume Claim 全称应保持不变,不应缩写为 PVC",
},
{
pattern: /\bPersistent Volume Claims\b/g,
warning: "Persistent Volume Claims 复数全称应保持不变,不应缩写为 PVCs",
},
];
// 执行 PVC 保护检查
pvcProtectionChecks.forEach(({ pattern, warning }) => {
if (pattern.test(text)) {
issues.push({
type: "protection_reminder",
message: warning,
context: "PVC 术语保护规则",
});
}
});
Object.entries(commonMistakes).forEach(([wrong, correct]) => {
if (text.includes(wrong)) {
issues.push({
wrong,
correct,
message: `"${wrong}" 应该写作 "${correct}"`,
});
}
});
return issues;
}
/**
* 从文件加载自定义提示词
*/
export async function loadCustomPrompt(filePath) {
try {
const fs = await import("node:fs/promises");
const content = await fs.readFile(filePath, "utf8");
return content.trim();
} catch (err) {
throw new Error(`无法加载自定义提示词文件: ${err.message}`);
}
}
/**
* 构建带自定义内容的翻译系统提示词
*/
export async function buildCustomTranslationSystemPrompt(
customPromptPath,
extraRules
) {
let basePrompt;
if (customPromptPath) {
// 使用完全自定义的提示词
basePrompt = await loadCustomPrompt(customPromptPath);
} else {
// 使用默认提示词
basePrompt = buildTranslationSystemPrompt();
}
if (extraRules) {
basePrompt += `\n\n**用户自定义规则:**\n${extraRules}`;
}
return basePrompt;
}
/**
* 构建带自定义内容的语法检查系统提示词
*/
export async function buildCustomGrammarCheckSystemPrompt(
customPromptPath,
extraRules
) {
let basePrompt;
if (customPromptPath) {
// 使用完全自定义的提示词
basePrompt = await loadCustomPrompt(customPromptPath);
} else {
// 使用默认提示词
basePrompt = buildGrammarCheckSystemPrompt();
}
if (extraRules) {
basePrompt += `\n\n**用户自定义规则:**\n${extraRules}`;
}
return basePrompt;
}
// ====================== 默认提示词构建器 ======================