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.
- package/.github/workflows/pages.yml +3 -0
- package/.zen/meta.json +43 -8
- package/.zen/src/ar-SA/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/da-DK/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/de-DE/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/en-US/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/es-ES/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/es-MX/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/fi-FI/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/fr-FR/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/hi-IN/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/id-ID/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/it-IT/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/ja-JP/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/ko-KR/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/nl-NL/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/no-NO/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/pl-PL/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/pt-BR/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/pt-PT/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/ru-RU/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/sv-SE/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/th-TH/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/tr-TR/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/uk-UA/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/vi-VN/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/zh-Hans/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/zh-Hant/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/README.md +26 -36
- package/assets/templates/default/layout.html +58 -3
- package/dist/ai/translateMarkdown.d.ts +1 -1
- package/dist/ai/translateMarkdown.d.ts.map +1 -1
- package/dist/ai/translateMarkdown.js +33 -2
- package/dist/ai/translateMarkdown.js.map +1 -1
- package/dist/languages.d.ts.map +1 -1
- package/dist/languages.js +23 -0
- package/dist/languages.js.map +1 -1
- package/dist/process/template.d.ts.map +1 -1
- package/dist/process/template.js +9 -5
- package/dist/process/template.js.map +1 -1
- package/package.json +2 -2
- package/src/ai/translateMarkdown.ts +33 -2
- package/src/languages.ts +27 -0
- 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
|
-
|
|
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:
|
|
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
|
};
|
package/src/process/template.ts
CHANGED
|
@@ -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
|
|
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(
|
|
130
|
+
result = result.replace(/{{language_switcher}}/g, langSwitcher);
|
|
126
131
|
}
|
|
127
132
|
|
|
128
133
|
return result;
|