zengen 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/.github/workflows/pages.yml +3 -0
  2. package/.zen/meta.json +43 -8
  3. package/.zen/src/ar-SA/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  4. package/.zen/src/da-DK/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  5. package/.zen/src/de-DE/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  6. package/.zen/src/en-US/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  7. package/.zen/src/es-ES/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  8. package/.zen/src/es-MX/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  9. package/.zen/src/fi-FI/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  10. package/.zen/src/fr-FR/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  11. package/.zen/src/hi-IN/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  12. package/.zen/src/id-ID/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  13. package/.zen/src/it-IT/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  14. package/.zen/src/ja-JP/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  15. package/.zen/src/ko-KR/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  16. package/.zen/src/nl-NL/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  17. package/.zen/src/no-NO/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  18. package/.zen/src/pl-PL/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  19. package/.zen/src/pt-BR/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  20. package/.zen/src/pt-PT/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  21. package/.zen/src/ru-RU/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  22. package/.zen/src/sv-SE/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  23. package/.zen/src/th-TH/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  24. package/.zen/src/tr-TR/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  25. package/.zen/src/uk-UA/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  26. package/.zen/src/vi-VN/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  27. package/.zen/src/zh-Hans/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  28. package/.zen/src/zh-Hant/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
  29. package/README.md +26 -36
  30. package/assets/templates/default/layout.html +58 -3
  31. package/dist/ai/translateMarkdown.d.ts +1 -1
  32. package/dist/ai/translateMarkdown.d.ts.map +1 -1
  33. package/dist/ai/translateMarkdown.js +33 -2
  34. package/dist/ai/translateMarkdown.js.map +1 -1
  35. package/dist/languages.d.ts.map +1 -1
  36. package/dist/languages.js +23 -0
  37. package/dist/languages.js.map +1 -1
  38. package/dist/process/template.d.ts.map +1 -1
  39. package/dist/process/template.js +9 -5
  40. package/dist/process/template.js.map +1 -1
  41. package/package.json +2 -2
  42. package/src/ai/translateMarkdown.ts +33 -2
  43. package/src/languages.ts +27 -0
  44. package/src/process/template.ts +10 -5
@@ -1,16 +1,47 @@
1
+ import { LANGUAGE_NAMES } from '../languages';
1
2
  import { completeMessages, OpenAIMessage } from '../services/openai';
2
3
 
3
4
  /**
4
- * 将 markdown 翻译为指定的语言
5
+
5
6
  * @param content Markdown 内容
6
7
  * @param targetLang 目标语言代码(例如:zh-Hans, en-US)
7
8
  * @returns Promise<string> 翻译后的 Markdown 内容
8
9
  */
9
10
  export async function translateMarkdown(content: string, targetLang: string): Promise<string> {
11
+ const langName = LANGUAGE_NAMES[targetLang];
12
+ const lang = `${langName} (${targetLang})`;
10
13
  const messages: OpenAIMessage[] = [
11
14
  {
12
15
  role: 'system',
13
- content: `你是一个专业的翻译助手,擅长将文档翻译成不同语言,同时保持原有的格式和结构。请将用户输入翻译成 ${targetLang},注意保持 Markdown 格式不变,链接不变,不要翻译代码,但是可以翻译代码中的注释。`,
16
+ content: [
17
+ `You are a professional document translator.`,
18
+ `Translate the following markdown content into ${lang}`,
19
+ targetLang === 'ja-JP'
20
+ ? [
21
+ //
22
+ '使用日语母语者自然的表达方式。',
23
+ '采用适合技术/专业文档的礼貌、正式语体(丁寧体/です・ます体)',
24
+ '确保语法和字符集完全符合日语规范。',
25
+ '绝对禁止使用繁体中文汉字。',
26
+ '所有日语汉字必须使用标准的 **日本常用汉字(Jōyō kanji)** 字形。',
27
+ '特别检查以下字形示例,确保使用日文标准字形:',
28
+ '1. “国” - 使用“国”而非“國”',
29
+ '2. “学” - 使用“学”而非“學”',
30
+ '3. “広” - 使用“広”而非“廣”',
31
+ '4. “円” - 使用“円”而非“圓”',
32
+ '5. “医” - 使用“医”而非“醫”',
33
+ '6. “図” - 使用“図”而非“圖”',
34
+ '7. “対” - 使用“対”而非“對”',
35
+ '8. “声” - 使用“声”而非“聲”',
36
+ '9. “芸” - 使用“芸”而非“藝”',
37
+ '10. “験” - 使用“験”而非“驗”',
38
+ ].join('\n')
39
+ : ``,
40
+ `Preserve the original markdown formatting, including headings, lists, code blocks, links, and images.`,
41
+ `Do not change any non-text elements or their formatting.`,
42
+ `Ensure that technical terms and code snippets remain unchanged.`,
43
+ `Provide a natural and fluent translation suitable for readers familiar with the subject matter.`,
44
+ ].join('\n'),
14
45
  },
15
46
  {
16
47
  role: 'user',
package/src/languages.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export const LANGUAGE_NAMES: Record<string, string> = {
2
+ // 现有语言
2
3
  'zh-Hans': '简体中文',
3
4
  'en-US': 'English',
4
5
  'ja-JP': '日本語',
@@ -7,4 +8,30 @@ export const LANGUAGE_NAMES: Record<string, string> = {
7
8
  'fr-FR': 'Français',
8
9
  'de-DE': 'Deutsch',
9
10
  'ru-RU': 'Русский',
11
+
12
+ // 补充缺失的项目支持语言
13
+ 'pt-PT': 'Português',
14
+
15
+ // 欧洲主要语言
16
+ 'it-IT': 'Italiano',
17
+ 'nl-NL': 'Nederlands',
18
+ 'pl-PL': 'Polski',
19
+ 'sv-SE': 'Svenska',
20
+ 'fi-FI': 'Suomi',
21
+ 'da-DK': 'Dansk',
22
+ 'no-NO': 'Norsk',
23
+
24
+ // 亚洲主要语言
25
+ 'zh-Hant': '繁體中文',
26
+ 'hi-IN': 'हिन्दी',
27
+ 'ar-SA': 'العربية',
28
+ 'th-TH': 'ไทย',
29
+ 'vi-VN': 'Tiếng Việt',
30
+ 'id-ID': 'Bahasa Indonesia',
31
+
32
+ // 其他重要语言
33
+ 'pt-BR': 'Português (Brasil)',
34
+ 'es-MX': 'Español (México)',
35
+ 'tr-TR': 'Türkçe',
36
+ 'uk-UA': 'Українська',
10
37
  };
@@ -31,11 +31,16 @@ function generateLanguageSwitcher(templateData: TemplateData): string {
31
31
  .join('');
32
32
 
33
33
  return `<div class="language-switcher">
34
- <span class="lang-label">Language:</span>
35
34
  <ul class="lang-list">${items}</ul>
36
35
  </div>`;
37
36
  }
38
37
 
38
+ const generateTagsHtml = (tags: string[]): string => {
39
+ return `<ul class="tags-list">${tags
40
+ .map(tag => `<li class="tag-item">${tag}</li>`)
41
+ .join('')}</ul>`;
42
+ };
43
+
39
44
  /**
40
45
  * 生成导航 HTML
41
46
  * @param navigation 导航树
@@ -113,16 +118,16 @@ async function renderTemplate(template: string, data: TemplateData): Promise<str
113
118
  // 替换元数据变量
114
119
  if (frontmatter) {
115
120
  result = result.replace(/{{summary}}/g, frontmatter.summary || '');
116
- result = result.replace(/{{tags}}/g, frontmatter.tags?.join(', ') || '');
117
- result = result.replace(/{{inferred_date}}/g, frontmatter.inferred_date || '');
118
- result = result.replace(/{{inferred_lang}}/g, frontmatter.inferred_lang || '');
121
+ result = result.replace(/{{tags}}/g, generateTagsHtml(frontmatter.tags || []));
122
+ result = result.replace(/{{inferred_date}}/g, frontmatter.inferred_date || '--');
123
+ result = result.replace(/{{inferred_lang}}/g, frontmatter.inferred_lang || '--');
119
124
  }
120
125
 
121
126
  // 替换语言相关变量
122
127
  result = result.replace(/{{lang}}/g, data.lang || '');
123
128
  if (langs && langs.length > 1 && data.lang) {
124
129
  const langSwitcher = generateLanguageSwitcher(data);
125
- result = result.replace('{{language_switcher}}', langSwitcher);
130
+ result = result.replace(/{{language_switcher}}/g, langSwitcher);
126
131
  }
127
132
 
128
133
  return result;