ciiic-translation-rules 1.0.0 → 1.1.0
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/TRANSLATION_PROMPT.md +22 -1
- package/dist/index.d.mts +8 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.js +202 -41
- package/dist/index.mjs +201 -41
- package/package.json +1 -1
package/TRANSLATION_PROMPT.md
CHANGED
|
@@ -2,6 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
Use these rules when translating content between Dutch and English for CIIIC.
|
|
4
4
|
|
|
5
|
+
## Voice & Style — apply this FIRST
|
|
6
|
+
|
|
7
|
+
Translate **meaning, not words**. The output must read like a native speaker of the target language wrote it, not like a transcription of the source. Re-read what you produced and ask: "Would a native speaker actually write this sentence in this context?" If the answer is no, rewrite it.
|
|
8
|
+
|
|
9
|
+
Headings, titles, subheads, and CTAs are the most common failure mode — they are idiomatic by nature, so render their **intent**, not their syntax.
|
|
10
|
+
|
|
11
|
+
Examples:
|
|
12
|
+
|
|
13
|
+
| Source (NL) | Literal (avoid) | Idiomatic (use) |
|
|
14
|
+
|-------------|-----------------|-----------------|
|
|
15
|
+
| Wat hieronder zit | What sits underneath this | The thinking behind it / Why this matters |
|
|
16
|
+
| Op een rij | On a row | At a glance / Summed up |
|
|
17
|
+
|
|
18
|
+
- Dutch metaphors and figures of speech usually do not carry word-for-word to English. Replace them with the closest natural English equivalent — and the same in reverse.
|
|
19
|
+
- Match the register and tone of the source. Friendly informal Dutch ("je/jij") should land as friendly conversational English — not formal corporate-speak, and not stiff word-by-word renderings either.
|
|
20
|
+
- Respect target-language rhythm. Dutch tolerates long stacked compound noun phrases; English usually breaks them up. English prefers active verbs; Dutch tolerates more nominalisation.
|
|
21
|
+
- When choosing between literal accuracy and natural-sounding prose, lean toward natural-sounding prose — as long as no factual content, name, number, date, or commitment is lost or distorted.
|
|
22
|
+
- The terminology and spelling rules below are exact and must be followed for those specific terms. Everything else gets the native-speaker treatment.
|
|
23
|
+
|
|
5
24
|
## Organisation Names
|
|
6
25
|
|
|
7
26
|
| Dutch | English | Notes |
|
|
@@ -48,6 +67,8 @@ Use these exact translations for funding call names:
|
|
|
48
67
|
| Adviseur | Advisor |
|
|
49
68
|
| Coördinator | Coordinator |
|
|
50
69
|
| Communityplatform | Community Platform |
|
|
70
|
+
| Begeleidingscommissie | Advisory Committee |
|
|
71
|
+
| Adviesraad | Advisory Board |
|
|
51
72
|
|
|
52
73
|
## Terminology
|
|
53
74
|
|
|
@@ -56,7 +77,7 @@ These terms can be used interchangeably or have specific translations:
|
|
|
56
77
|
| Dutch | English | Notes |
|
|
57
78
|
|-------|---------|-------|
|
|
58
79
|
| immersive experiences, immersieve ervaringen | immersive experiences | In Dutch, both "immersive experiences" (English) and "immersieve ervaringen" are acceptable. The abbreviation "IX" is common in both languages. |
|
|
59
|
-
|
|
|
80
|
+
| regeling | funding scheme | Decision 2026-06-11: "regeling" is the public-facing Dutch term, "funding scheme" the English one. Reserve "call" (NL and EN) for a specific open edition of a regeling (e.g. "the current ADRIE call"); never use it for the regeling itself. |
|
|
60
81
|
| subsidie, financiering | grant, funding | |
|
|
61
82
|
| aanvraag, aanvragen | application, apply | |
|
|
62
83
|
| bijdrage | contribution, grant | |
|
package/dist/index.d.mts
CHANGED
|
@@ -49,6 +49,13 @@ declare const TRANSLATION_RULES: TranslationRules;
|
|
|
49
49
|
* Generate the terminology rules section for LLM prompts
|
|
50
50
|
*/
|
|
51
51
|
declare function generateTerminologyPrompt(): string;
|
|
52
|
+
/**
|
|
53
|
+
* Voice & style guidelines that apply in BOTH directions (NL→EN and EN→NL).
|
|
54
|
+
* Read this BEFORE applying any terminology/spelling rule — without it, an LLM
|
|
55
|
+
* tends to fall back to word-for-word translation that is technically correct
|
|
56
|
+
* but reads like a robot wrote it.
|
|
57
|
+
*/
|
|
58
|
+
declare function getTranslationVoiceGuidelines(): string;
|
|
52
59
|
/**
|
|
53
60
|
* Get Dutch-specific translation guidelines for LLM prompts
|
|
54
61
|
*/
|
|
@@ -81,4 +88,4 @@ declare function shouldNeverTranslate(term: string): boolean;
|
|
|
81
88
|
*/
|
|
82
89
|
declare function generateMarkdownPrompt(): string;
|
|
83
90
|
|
|
84
|
-
export { type FundingCallMapping, type OfficialTerm, type OrganisationMapping, type SimpleTranslation, TRANSLATION_RULES, type TerminologyMapping, type TranslationRules, generateMarkdownPrompt, generateTerminologyPrompt, getDutchGuidelines, getEnglishGuidelines, getGuidelines, shouldNeverTranslate, translateFundingCall, translateOrganisation };
|
|
91
|
+
export { type FundingCallMapping, type OfficialTerm, type OrganisationMapping, type SimpleTranslation, TRANSLATION_RULES, type TerminologyMapping, type TranslationRules, generateMarkdownPrompt, generateTerminologyPrompt, getDutchGuidelines, getEnglishGuidelines, getGuidelines, getTranslationVoiceGuidelines, shouldNeverTranslate, translateFundingCall, translateOrganisation };
|
package/dist/index.d.ts
CHANGED
|
@@ -49,6 +49,13 @@ declare const TRANSLATION_RULES: TranslationRules;
|
|
|
49
49
|
* Generate the terminology rules section for LLM prompts
|
|
50
50
|
*/
|
|
51
51
|
declare function generateTerminologyPrompt(): string;
|
|
52
|
+
/**
|
|
53
|
+
* Voice & style guidelines that apply in BOTH directions (NL→EN and EN→NL).
|
|
54
|
+
* Read this BEFORE applying any terminology/spelling rule — without it, an LLM
|
|
55
|
+
* tends to fall back to word-for-word translation that is technically correct
|
|
56
|
+
* but reads like a robot wrote it.
|
|
57
|
+
*/
|
|
58
|
+
declare function getTranslationVoiceGuidelines(): string;
|
|
52
59
|
/**
|
|
53
60
|
* Get Dutch-specific translation guidelines for LLM prompts
|
|
54
61
|
*/
|
|
@@ -81,4 +88,4 @@ declare function shouldNeverTranslate(term: string): boolean;
|
|
|
81
88
|
*/
|
|
82
89
|
declare function generateMarkdownPrompt(): string;
|
|
83
90
|
|
|
84
|
-
export { type FundingCallMapping, type OfficialTerm, type OrganisationMapping, type SimpleTranslation, TRANSLATION_RULES, type TerminologyMapping, type TranslationRules, generateMarkdownPrompt, generateTerminologyPrompt, getDutchGuidelines, getEnglishGuidelines, getGuidelines, shouldNeverTranslate, translateFundingCall, translateOrganisation };
|
|
91
|
+
export { type FundingCallMapping, type OfficialTerm, type OrganisationMapping, type SimpleTranslation, TRANSLATION_RULES, type TerminologyMapping, type TranslationRules, generateMarkdownPrompt, generateTerminologyPrompt, getDutchGuidelines, getEnglishGuidelines, getGuidelines, getTranslationVoiceGuidelines, shouldNeverTranslate, translateFundingCall, translateOrganisation };
|
package/dist/index.js
CHANGED
|
@@ -26,6 +26,7 @@ __export(index_exports, {
|
|
|
26
26
|
getDutchGuidelines: () => getDutchGuidelines,
|
|
27
27
|
getEnglishGuidelines: () => getEnglishGuidelines,
|
|
28
28
|
getGuidelines: () => getGuidelines,
|
|
29
|
+
getTranslationVoiceGuidelines: () => getTranslationVoiceGuidelines,
|
|
29
30
|
shouldNeverTranslate: () => shouldNeverTranslate,
|
|
30
31
|
translateFundingCall: () => translateFundingCall,
|
|
31
32
|
translateOrganisation: () => translateOrganisation
|
|
@@ -87,14 +88,17 @@ var TRANSLATION_RULES = {
|
|
|
87
88
|
*/
|
|
88
89
|
terminology: [
|
|
89
90
|
{
|
|
90
|
-
dutch: [
|
|
91
|
+
dutch: [
|
|
92
|
+
"immersive experiences",
|
|
93
|
+
"immersieve ervaringen"
|
|
94
|
+
],
|
|
91
95
|
english: ["immersive experiences"],
|
|
92
96
|
notes: 'In Dutch, both "immersive experiences" (English) and "immersieve ervaringen" are acceptable. The abbreviation "IX" is common in both languages.'
|
|
93
97
|
},
|
|
94
98
|
{
|
|
95
|
-
dutch: ["
|
|
96
|
-
english: ["
|
|
97
|
-
notes: '
|
|
99
|
+
dutch: ["regeling"],
|
|
100
|
+
english: ["funding scheme"],
|
|
101
|
+
notes: 'Decision 2026-06-11: "regeling" is the public-facing Dutch term, "funding scheme" the English one. Reserve "call" (NL and EN) for a specific open edition of a regeling (e.g. "the current ADRIE call"); never use it for the regeling itself.'
|
|
98
102
|
},
|
|
99
103
|
// Grant/Funding Terminology
|
|
100
104
|
{
|
|
@@ -210,11 +214,17 @@ var TRANSLATION_RULES = {
|
|
|
210
214
|
ctaTranslations: [
|
|
211
215
|
{ dutch: "Lees meer", english: "Read more" },
|
|
212
216
|
{ dutch: "Lees verder", english: "Read more" },
|
|
213
|
-
{
|
|
217
|
+
{
|
|
218
|
+
dutch: "Meer informatie",
|
|
219
|
+
english: "More information"
|
|
220
|
+
},
|
|
214
221
|
{ dutch: "Schrijf je in", english: "Register" },
|
|
215
222
|
{ dutch: "Meld je aan", english: "Sign up" },
|
|
216
223
|
{ dutch: "Aanmelden", english: "Register" },
|
|
217
|
-
{
|
|
224
|
+
{
|
|
225
|
+
dutch: "Bekijk de agenda",
|
|
226
|
+
english: "View the agenda"
|
|
227
|
+
},
|
|
218
228
|
{ dutch: "Naar de website", english: "Go to website" },
|
|
219
229
|
{ dutch: "Download", english: "Download" },
|
|
220
230
|
{ dutch: "Deel dit bericht", english: "Share this" }
|
|
@@ -223,24 +233,47 @@ var TRANSLATION_RULES = {
|
|
|
223
233
|
* CIIIC-specific role and term translations
|
|
224
234
|
*/
|
|
225
235
|
ciiicSpecifics: [
|
|
226
|
-
{
|
|
236
|
+
{
|
|
237
|
+
dutch: "Programmadirecteur",
|
|
238
|
+
english: "Programme Director"
|
|
239
|
+
},
|
|
227
240
|
{ dutch: "Projectleider", english: "Project Lead" },
|
|
228
|
-
{
|
|
241
|
+
{
|
|
242
|
+
dutch: "Communicatie & Marketing",
|
|
243
|
+
english: "Communications & Marketing"
|
|
244
|
+
},
|
|
229
245
|
{ dutch: "Adviseur", english: "Advisor" },
|
|
230
246
|
{ dutch: "Co\xF6rdinator", english: "Coordinator" },
|
|
231
|
-
{
|
|
247
|
+
{
|
|
248
|
+
dutch: "Communityplatform",
|
|
249
|
+
english: "Community Platform"
|
|
250
|
+
},
|
|
251
|
+
{ dutch: "Begeleidingscommissie", english: "Advisory Committee" },
|
|
252
|
+
{ dutch: "Adviesraad", english: "Advisory Board" }
|
|
232
253
|
],
|
|
233
254
|
/**
|
|
234
255
|
* Newsletter-specific phrases
|
|
235
256
|
*/
|
|
236
257
|
newsletterPhrases: [
|
|
237
|
-
{
|
|
258
|
+
{
|
|
259
|
+
dutch: "Bekijk deze e-mail in je browser",
|
|
260
|
+
english: "View this email in your browser"
|
|
261
|
+
},
|
|
238
262
|
{ dutch: "Uitschrijven", english: "Unsubscribe" },
|
|
239
|
-
{
|
|
263
|
+
{
|
|
264
|
+
dutch: "Voorkeuren aanpassen",
|
|
265
|
+
english: "Update your preferences"
|
|
266
|
+
},
|
|
240
267
|
{ dutch: "Beste lezer", english: "Dear reader" },
|
|
241
|
-
{
|
|
268
|
+
{
|
|
269
|
+
dutch: "Met vriendelijke groet",
|
|
270
|
+
english: "Kind regards"
|
|
271
|
+
},
|
|
242
272
|
{ dutch: "Hartelijke groet", english: "Warm regards" },
|
|
243
|
-
{
|
|
273
|
+
{
|
|
274
|
+
dutch: "In deze nieuwsbrief",
|
|
275
|
+
english: "In this newsletter"
|
|
276
|
+
}
|
|
244
277
|
]
|
|
245
278
|
};
|
|
246
279
|
function generateTerminologyPrompt() {
|
|
@@ -249,16 +282,22 @@ function generateTerminologyPrompt() {
|
|
|
249
282
|
lines.push("");
|
|
250
283
|
lines.push("Organisation names:");
|
|
251
284
|
for (const org of TRANSLATION_RULES.organisations) {
|
|
252
|
-
lines.push(
|
|
285
|
+
lines.push(
|
|
286
|
+
` - "${org.dutch}" (Dutch) = "${org.english}" (English)`
|
|
287
|
+
);
|
|
253
288
|
if (org.notes) {
|
|
254
289
|
lines.push(` Note: ${org.notes}`);
|
|
255
290
|
}
|
|
256
291
|
}
|
|
257
292
|
lines.push("");
|
|
258
|
-
lines.push(
|
|
293
|
+
lines.push(
|
|
294
|
+
"Funding call translations (use these exact translations):"
|
|
295
|
+
);
|
|
259
296
|
for (const call of TRANSLATION_RULES.fundingCalls) {
|
|
260
297
|
if (call.dutch === call.english) {
|
|
261
|
-
lines.push(
|
|
298
|
+
lines.push(
|
|
299
|
+
` - "${call.dutch}" - same in both languages`
|
|
300
|
+
);
|
|
262
301
|
} else {
|
|
263
302
|
lines.push(` - Dutch: "${call.dutch}"`);
|
|
264
303
|
lines.push(` English: "${call.english}"`);
|
|
@@ -270,17 +309,27 @@ function generateTerminologyPrompt() {
|
|
|
270
309
|
lines.push("");
|
|
271
310
|
lines.push("Terminology guidelines:");
|
|
272
311
|
for (const term of TRANSLATION_RULES.terminology) {
|
|
273
|
-
lines.push(
|
|
274
|
-
|
|
312
|
+
lines.push(
|
|
313
|
+
` - Dutch options: ${term.dutch.map((t) => `"${t}"`).join(", ")}`
|
|
314
|
+
);
|
|
315
|
+
lines.push(
|
|
316
|
+
` English options: ${term.english.map((t) => `"${t}"`).join(", ")}`
|
|
317
|
+
);
|
|
275
318
|
if (term.notes) {
|
|
276
319
|
lines.push(` Note: ${term.notes}`);
|
|
277
320
|
}
|
|
278
321
|
}
|
|
279
322
|
lines.push("");
|
|
280
|
-
lines.push(
|
|
281
|
-
|
|
323
|
+
lines.push(
|
|
324
|
+
"Terms that should NEVER be translated (keep as-is):"
|
|
325
|
+
);
|
|
326
|
+
lines.push(
|
|
327
|
+
` ${TRANSLATION_RULES.neverTranslate.join(", ")}`
|
|
328
|
+
);
|
|
282
329
|
lines.push("");
|
|
283
|
-
lines.push(
|
|
330
|
+
lines.push(
|
|
331
|
+
"Official terms (keep in original language, use quotes if needed):"
|
|
332
|
+
);
|
|
284
333
|
for (const term of TRANSLATION_RULES.officialTerms) {
|
|
285
334
|
lines.push(` - "${term.term}" (${term.language})`);
|
|
286
335
|
if (term.notes) {
|
|
@@ -290,30 +339,71 @@ function generateTerminologyPrompt() {
|
|
|
290
339
|
lines.push("");
|
|
291
340
|
lines.push("Button/CTA text translations:");
|
|
292
341
|
for (const cta of TRANSLATION_RULES.ctaTranslations) {
|
|
293
|
-
lines.push(
|
|
342
|
+
lines.push(
|
|
343
|
+
` - "${cta.dutch}" (Dutch) = "${cta.english}" (English)`
|
|
344
|
+
);
|
|
294
345
|
}
|
|
295
346
|
lines.push("");
|
|
296
347
|
lines.push("CIIIC-specific terms:");
|
|
297
348
|
for (const term of TRANSLATION_RULES.ciiicSpecifics) {
|
|
298
|
-
lines.push(
|
|
349
|
+
lines.push(
|
|
350
|
+
` - "${term.dutch}" (Dutch) = "${term.english}" (English)`
|
|
351
|
+
);
|
|
299
352
|
}
|
|
300
353
|
lines.push("");
|
|
301
354
|
lines.push("Newsletter-specific phrases:");
|
|
302
355
|
for (const phrase of TRANSLATION_RULES.newsletterPhrases) {
|
|
303
|
-
lines.push(
|
|
356
|
+
lines.push(
|
|
357
|
+
` - "${phrase.dutch}" (Dutch) = "${phrase.english}" (English)`
|
|
358
|
+
);
|
|
304
359
|
}
|
|
305
360
|
lines.push("");
|
|
306
361
|
lines.push("Personal names:");
|
|
307
362
|
lines.push(" - People's names must NEVER be translated");
|
|
308
|
-
lines.push(
|
|
363
|
+
lines.push(
|
|
364
|
+
' - Example: "Jan de Vries" stays "Jan de Vries", NOT "John of Vries"'
|
|
365
|
+
);
|
|
309
366
|
lines.push("");
|
|
310
367
|
lines.push(
|
|
311
368
|
"GENERAL PRINCIPLE: It is acceptable and often preferable to leave some terms in their original language. Proper nouns, programme names, personal names, and official terminology should generally remain unchanged or use the official translation if one exists."
|
|
312
369
|
);
|
|
313
370
|
return lines.join("\n");
|
|
314
371
|
}
|
|
372
|
+
function getTranslationVoiceGuidelines() {
|
|
373
|
+
return `TRANSLATION VOICE & STYLE \u2014 apply this FIRST, before the rules below:
|
|
374
|
+
|
|
375
|
+
Translate **meaning, not words**. The output must read like it was written by a
|
|
376
|
+
native speaker of the target language, not transcribed from the source.
|
|
377
|
+
|
|
378
|
+
- Re-read what you produced and ask yourself: "Would a native speaker actually
|
|
379
|
+
write this sentence in this context?" If the answer is no, rewrite it.
|
|
380
|
+
- Headings, titles, subheads, and CTAs are the most common failure mode \u2014 they
|
|
381
|
+
are idiomatic by nature, so render their INTENT, not their syntax.
|
|
382
|
+
BAD (literal): "Wat hieronder zit" \u2192 "What sits underneath this"
|
|
383
|
+
GOOD (idiomatic): "Wat hieronder zit" \u2192 "The thinking behind it" /
|
|
384
|
+
"Why this matters" /
|
|
385
|
+
"What's underneath"
|
|
386
|
+
BAD (literal): "Op een rij" \u2192 "On a row"
|
|
387
|
+
GOOD (idiomatic): "Op een rij" \u2192 "At a glance" / "Summed up"
|
|
388
|
+
- Dutch metaphors and figures of speech usually do not carry over to English
|
|
389
|
+
word-for-word. Replace them with the closest natural English equivalent.
|
|
390
|
+
The same applies in reverse for English \u2192 Dutch.
|
|
391
|
+
- Match the register and tone of the source. Friendly informal Dutch ("je/jij")
|
|
392
|
+
should land as friendly conversational English \u2014 not formal corporate-speak,
|
|
393
|
+
and not stiff word-by-word renderings either.
|
|
394
|
+
- Respect target-language rhythm. Dutch tolerates long stacked compound noun
|
|
395
|
+
phrases; English usually breaks them up. English prefers active verbs;
|
|
396
|
+
Dutch tolerates more nominalisation. Adjust sentence structure accordingly.
|
|
397
|
+
- When you have to choose between literal accuracy and natural-sounding prose,
|
|
398
|
+
lean toward natural-sounding prose \u2014 as long as no factual content, name,
|
|
399
|
+
number, date, or commitment is lost or distorted.
|
|
400
|
+
- The terminology mappings below are exact and must be followed for those
|
|
401
|
+
specific terms. Everything else gets the native-speaker treatment.`;
|
|
402
|
+
}
|
|
315
403
|
function getDutchGuidelines() {
|
|
316
404
|
return `
|
|
405
|
+
${getTranslationVoiceGuidelines()}
|
|
406
|
+
|
|
317
407
|
DUTCH-SPECIFIC RULES:
|
|
318
408
|
- Headlines and titles: Use sentence case only (first letter capitalised, rest lowercase)
|
|
319
409
|
Example: "Deze titel is goed" NOT "Deze Titel Is Goed"
|
|
@@ -321,17 +411,20 @@ DUTCH-SPECIFIC RULES:
|
|
|
321
411
|
- Maintain a friendly but professional tone
|
|
322
412
|
- When translating "Creative Industries Fund NL" \u2192 use "Stimuleringsfonds Creatieve Industrie"
|
|
323
413
|
- "Immersive experiences" can stay in English or be translated to "immersieve ervaringen"
|
|
324
|
-
-
|
|
414
|
+
- "Funding scheme" \u2192 "regeling" (public-facing term). Use "call" only for a specific open edition of a regeling, never for the regeling itself
|
|
325
415
|
|
|
326
416
|
${generateTerminologyPrompt()}`;
|
|
327
417
|
}
|
|
328
418
|
function getEnglishGuidelines() {
|
|
329
419
|
return `
|
|
420
|
+
${getTranslationVoiceGuidelines()}
|
|
421
|
+
|
|
330
422
|
ENGLISH-SPECIFIC RULES:
|
|
331
423
|
- Use British English spellings (e.g., "colour" not "color", "organise" not "organize", "centre" not "center")
|
|
332
424
|
- British vocabulary: "programme" (not "program" for non-computer contexts), "behaviour", "favour", etc.
|
|
333
425
|
- Date format references should use British conventions where applicable
|
|
334
426
|
- When translating "Stimuleringsfonds Creatieve Industrie" \u2192 use "Creative Industries Fund NL"
|
|
427
|
+
- "Regeling" \u2192 "funding scheme" (public-facing term). Use "call" only for a specific open edition of a scheme (e.g. "the current ADRIE call"), never for the scheme itself
|
|
335
428
|
|
|
336
429
|
${generateTerminologyPrompt()}`;
|
|
337
430
|
}
|
|
@@ -363,25 +456,70 @@ function generateMarkdownPrompt() {
|
|
|
363
456
|
const lines = [];
|
|
364
457
|
lines.push("# CIIIC Translation Rules");
|
|
365
458
|
lines.push("");
|
|
366
|
-
lines.push(
|
|
459
|
+
lines.push(
|
|
460
|
+
"Use these rules when translating content between Dutch and English for CIIIC."
|
|
461
|
+
);
|
|
462
|
+
lines.push("");
|
|
463
|
+
lines.push("## Voice & Style \u2014 apply this FIRST");
|
|
464
|
+
lines.push("");
|
|
465
|
+
lines.push(
|
|
466
|
+
'Translate **meaning, not words**. The output must read like a native speaker of the target language wrote it, not like a transcription of the source. Re-read what you produced and ask: "Would a native speaker actually write this sentence in this context?" If the answer is no, rewrite it.'
|
|
467
|
+
);
|
|
468
|
+
lines.push("");
|
|
469
|
+
lines.push(
|
|
470
|
+
"Headings, titles, subheads, and CTAs are the most common failure mode \u2014 they are idiomatic by nature, so render their **intent**, not their syntax."
|
|
471
|
+
);
|
|
472
|
+
lines.push("");
|
|
473
|
+
lines.push("Examples:");
|
|
474
|
+
lines.push("");
|
|
475
|
+
lines.push("| Source (NL) | Literal (avoid) | Idiomatic (use) |");
|
|
476
|
+
lines.push("|-------------|-----------------|-----------------|");
|
|
477
|
+
lines.push(
|
|
478
|
+
"| Wat hieronder zit | What sits underneath this | The thinking behind it / Why this matters |"
|
|
479
|
+
);
|
|
480
|
+
lines.push(
|
|
481
|
+
"| Op een rij | On a row | At a glance / Summed up |"
|
|
482
|
+
);
|
|
483
|
+
lines.push("");
|
|
484
|
+
lines.push(
|
|
485
|
+
"- Dutch metaphors and figures of speech usually do not carry word-for-word to English. Replace them with the closest natural English equivalent \u2014 and the same in reverse."
|
|
486
|
+
);
|
|
487
|
+
lines.push(
|
|
488
|
+
'- Match the register and tone of the source. Friendly informal Dutch ("je/jij") should land as friendly conversational English \u2014 not formal corporate-speak, and not stiff word-by-word renderings either.'
|
|
489
|
+
);
|
|
490
|
+
lines.push(
|
|
491
|
+
"- Respect target-language rhythm. Dutch tolerates long stacked compound noun phrases; English usually breaks them up. English prefers active verbs; Dutch tolerates more nominalisation."
|
|
492
|
+
);
|
|
493
|
+
lines.push(
|
|
494
|
+
"- When choosing between literal accuracy and natural-sounding prose, lean toward natural-sounding prose \u2014 as long as no factual content, name, number, date, or commitment is lost or distorted."
|
|
495
|
+
);
|
|
496
|
+
lines.push(
|
|
497
|
+
"- The terminology and spelling rules below are exact and must be followed for those specific terms. Everything else gets the native-speaker treatment."
|
|
498
|
+
);
|
|
367
499
|
lines.push("");
|
|
368
500
|
lines.push("## Organisation Names");
|
|
369
501
|
lines.push("");
|
|
370
502
|
lines.push("| Dutch | English | Notes |");
|
|
371
503
|
lines.push("|-------|---------|-------|");
|
|
372
504
|
for (const org of TRANSLATION_RULES.organisations) {
|
|
373
|
-
lines.push(
|
|
505
|
+
lines.push(
|
|
506
|
+
`| ${org.dutch} | ${org.english} | ${org.notes || ""} |`
|
|
507
|
+
);
|
|
374
508
|
}
|
|
375
509
|
lines.push("");
|
|
376
510
|
lines.push("## Funding Call Translations");
|
|
377
511
|
lines.push("");
|
|
378
|
-
lines.push(
|
|
512
|
+
lines.push(
|
|
513
|
+
"Use these exact translations for funding call names:"
|
|
514
|
+
);
|
|
379
515
|
lines.push("");
|
|
380
516
|
lines.push("| Dutch | English | Notes |");
|
|
381
517
|
lines.push("|-------|---------|-------|");
|
|
382
518
|
for (const call of TRANSLATION_RULES.fundingCalls) {
|
|
383
519
|
const note = call.dutch === call.english ? "Same in both languages" : call.notes || "";
|
|
384
|
-
lines.push(
|
|
520
|
+
lines.push(
|
|
521
|
+
`| ${call.dutch} | ${call.english} | ${note} |`
|
|
522
|
+
);
|
|
385
523
|
}
|
|
386
524
|
lines.push("");
|
|
387
525
|
lines.push("## Button/CTA Text");
|
|
@@ -402,14 +540,18 @@ function generateMarkdownPrompt() {
|
|
|
402
540
|
lines.push("");
|
|
403
541
|
lines.push("## Terminology");
|
|
404
542
|
lines.push("");
|
|
405
|
-
lines.push(
|
|
543
|
+
lines.push(
|
|
544
|
+
"These terms can be used interchangeably or have specific translations:"
|
|
545
|
+
);
|
|
406
546
|
lines.push("");
|
|
407
547
|
lines.push("| Dutch | English | Notes |");
|
|
408
548
|
lines.push("|-------|---------|-------|");
|
|
409
549
|
for (const term of TRANSLATION_RULES.terminology) {
|
|
410
550
|
const dutchStr = term.dutch.join(", ");
|
|
411
551
|
const englishStr = term.english.join(", ");
|
|
412
|
-
lines.push(
|
|
552
|
+
lines.push(
|
|
553
|
+
`| ${dutchStr} | ${englishStr} | ${term.notes || ""} |`
|
|
554
|
+
);
|
|
413
555
|
}
|
|
414
556
|
lines.push("");
|
|
415
557
|
lines.push("## Newsletter-Specific Phrases");
|
|
@@ -422,15 +564,21 @@ function generateMarkdownPrompt() {
|
|
|
422
564
|
lines.push("");
|
|
423
565
|
lines.push("## Official Terms");
|
|
424
566
|
lines.push("");
|
|
425
|
-
lines.push(
|
|
567
|
+
lines.push(
|
|
568
|
+
"Keep these in their original language (use quotes if needed):"
|
|
569
|
+
);
|
|
426
570
|
lines.push("");
|
|
427
571
|
for (const term of TRANSLATION_RULES.officialTerms) {
|
|
428
|
-
lines.push(
|
|
572
|
+
lines.push(
|
|
573
|
+
`- **${term.term}** (${term.language})${term.notes ? ` - ${term.notes}` : ""}`
|
|
574
|
+
);
|
|
429
575
|
}
|
|
430
576
|
lines.push("");
|
|
431
577
|
lines.push("## Never Translate");
|
|
432
578
|
lines.push("");
|
|
433
|
-
lines.push(
|
|
579
|
+
lines.push(
|
|
580
|
+
"These terms should NEVER be translated - keep them exactly as-is:"
|
|
581
|
+
);
|
|
434
582
|
lines.push("");
|
|
435
583
|
lines.push("```");
|
|
436
584
|
lines.push(TRANSLATION_RULES.neverTranslate.join(", "));
|
|
@@ -440,19 +588,31 @@ function generateMarkdownPrompt() {
|
|
|
440
588
|
lines.push("");
|
|
441
589
|
lines.push("### Personal Names");
|
|
442
590
|
lines.push("- People's names must NEVER be translated");
|
|
443
|
-
lines.push(
|
|
591
|
+
lines.push(
|
|
592
|
+
'- Example: "Jan de Vries" stays "Jan de Vries", NOT "John of Vries"'
|
|
593
|
+
);
|
|
444
594
|
lines.push("");
|
|
445
595
|
lines.push("### Dutch-Specific");
|
|
446
|
-
lines.push(
|
|
447
|
-
|
|
596
|
+
lines.push(
|
|
597
|
+
"- Headlines and titles: Use sentence case only (first letter capitalised, rest lowercase)"
|
|
598
|
+
);
|
|
599
|
+
lines.push(
|
|
600
|
+
'- Use informal Dutch: Always use "je/jij/jouw" instead of "u/uw"'
|
|
601
|
+
);
|
|
448
602
|
lines.push("- Maintain a friendly but professional tone");
|
|
449
603
|
lines.push("");
|
|
450
604
|
lines.push("### English-Specific");
|
|
451
|
-
lines.push(
|
|
452
|
-
|
|
605
|
+
lines.push(
|
|
606
|
+
"- Use British English spellings (colour, organise, centre)"
|
|
607
|
+
);
|
|
608
|
+
lines.push(
|
|
609
|
+
'- British vocabulary: "programme" (not "program"), "behaviour", "favour"'
|
|
610
|
+
);
|
|
453
611
|
lines.push("");
|
|
454
612
|
lines.push("### General Principle");
|
|
455
|
-
lines.push(
|
|
613
|
+
lines.push(
|
|
614
|
+
"It is acceptable and often preferable to leave some terms in their original language. Proper nouns, programme names, personal names, and official terminology should generally remain unchanged or use the official translation if one exists."
|
|
615
|
+
);
|
|
456
616
|
lines.push("");
|
|
457
617
|
return lines.join("\n");
|
|
458
618
|
}
|
|
@@ -464,6 +624,7 @@ function generateMarkdownPrompt() {
|
|
|
464
624
|
getDutchGuidelines,
|
|
465
625
|
getEnglishGuidelines,
|
|
466
626
|
getGuidelines,
|
|
627
|
+
getTranslationVoiceGuidelines,
|
|
467
628
|
shouldNeverTranslate,
|
|
468
629
|
translateFundingCall,
|
|
469
630
|
translateOrganisation
|
package/dist/index.mjs
CHANGED
|
@@ -55,14 +55,17 @@ var TRANSLATION_RULES = {
|
|
|
55
55
|
*/
|
|
56
56
|
terminology: [
|
|
57
57
|
{
|
|
58
|
-
dutch: [
|
|
58
|
+
dutch: [
|
|
59
|
+
"immersive experiences",
|
|
60
|
+
"immersieve ervaringen"
|
|
61
|
+
],
|
|
59
62
|
english: ["immersive experiences"],
|
|
60
63
|
notes: 'In Dutch, both "immersive experiences" (English) and "immersieve ervaringen" are acceptable. The abbreviation "IX" is common in both languages.'
|
|
61
64
|
},
|
|
62
65
|
{
|
|
63
|
-
dutch: ["
|
|
64
|
-
english: ["
|
|
65
|
-
notes: '
|
|
66
|
+
dutch: ["regeling"],
|
|
67
|
+
english: ["funding scheme"],
|
|
68
|
+
notes: 'Decision 2026-06-11: "regeling" is the public-facing Dutch term, "funding scheme" the English one. Reserve "call" (NL and EN) for a specific open edition of a regeling (e.g. "the current ADRIE call"); never use it for the regeling itself.'
|
|
66
69
|
},
|
|
67
70
|
// Grant/Funding Terminology
|
|
68
71
|
{
|
|
@@ -178,11 +181,17 @@ var TRANSLATION_RULES = {
|
|
|
178
181
|
ctaTranslations: [
|
|
179
182
|
{ dutch: "Lees meer", english: "Read more" },
|
|
180
183
|
{ dutch: "Lees verder", english: "Read more" },
|
|
181
|
-
{
|
|
184
|
+
{
|
|
185
|
+
dutch: "Meer informatie",
|
|
186
|
+
english: "More information"
|
|
187
|
+
},
|
|
182
188
|
{ dutch: "Schrijf je in", english: "Register" },
|
|
183
189
|
{ dutch: "Meld je aan", english: "Sign up" },
|
|
184
190
|
{ dutch: "Aanmelden", english: "Register" },
|
|
185
|
-
{
|
|
191
|
+
{
|
|
192
|
+
dutch: "Bekijk de agenda",
|
|
193
|
+
english: "View the agenda"
|
|
194
|
+
},
|
|
186
195
|
{ dutch: "Naar de website", english: "Go to website" },
|
|
187
196
|
{ dutch: "Download", english: "Download" },
|
|
188
197
|
{ dutch: "Deel dit bericht", english: "Share this" }
|
|
@@ -191,24 +200,47 @@ var TRANSLATION_RULES = {
|
|
|
191
200
|
* CIIIC-specific role and term translations
|
|
192
201
|
*/
|
|
193
202
|
ciiicSpecifics: [
|
|
194
|
-
{
|
|
203
|
+
{
|
|
204
|
+
dutch: "Programmadirecteur",
|
|
205
|
+
english: "Programme Director"
|
|
206
|
+
},
|
|
195
207
|
{ dutch: "Projectleider", english: "Project Lead" },
|
|
196
|
-
{
|
|
208
|
+
{
|
|
209
|
+
dutch: "Communicatie & Marketing",
|
|
210
|
+
english: "Communications & Marketing"
|
|
211
|
+
},
|
|
197
212
|
{ dutch: "Adviseur", english: "Advisor" },
|
|
198
213
|
{ dutch: "Co\xF6rdinator", english: "Coordinator" },
|
|
199
|
-
{
|
|
214
|
+
{
|
|
215
|
+
dutch: "Communityplatform",
|
|
216
|
+
english: "Community Platform"
|
|
217
|
+
},
|
|
218
|
+
{ dutch: "Begeleidingscommissie", english: "Advisory Committee" },
|
|
219
|
+
{ dutch: "Adviesraad", english: "Advisory Board" }
|
|
200
220
|
],
|
|
201
221
|
/**
|
|
202
222
|
* Newsletter-specific phrases
|
|
203
223
|
*/
|
|
204
224
|
newsletterPhrases: [
|
|
205
|
-
{
|
|
225
|
+
{
|
|
226
|
+
dutch: "Bekijk deze e-mail in je browser",
|
|
227
|
+
english: "View this email in your browser"
|
|
228
|
+
},
|
|
206
229
|
{ dutch: "Uitschrijven", english: "Unsubscribe" },
|
|
207
|
-
{
|
|
230
|
+
{
|
|
231
|
+
dutch: "Voorkeuren aanpassen",
|
|
232
|
+
english: "Update your preferences"
|
|
233
|
+
},
|
|
208
234
|
{ dutch: "Beste lezer", english: "Dear reader" },
|
|
209
|
-
{
|
|
235
|
+
{
|
|
236
|
+
dutch: "Met vriendelijke groet",
|
|
237
|
+
english: "Kind regards"
|
|
238
|
+
},
|
|
210
239
|
{ dutch: "Hartelijke groet", english: "Warm regards" },
|
|
211
|
-
{
|
|
240
|
+
{
|
|
241
|
+
dutch: "In deze nieuwsbrief",
|
|
242
|
+
english: "In this newsletter"
|
|
243
|
+
}
|
|
212
244
|
]
|
|
213
245
|
};
|
|
214
246
|
function generateTerminologyPrompt() {
|
|
@@ -217,16 +249,22 @@ function generateTerminologyPrompt() {
|
|
|
217
249
|
lines.push("");
|
|
218
250
|
lines.push("Organisation names:");
|
|
219
251
|
for (const org of TRANSLATION_RULES.organisations) {
|
|
220
|
-
lines.push(
|
|
252
|
+
lines.push(
|
|
253
|
+
` - "${org.dutch}" (Dutch) = "${org.english}" (English)`
|
|
254
|
+
);
|
|
221
255
|
if (org.notes) {
|
|
222
256
|
lines.push(` Note: ${org.notes}`);
|
|
223
257
|
}
|
|
224
258
|
}
|
|
225
259
|
lines.push("");
|
|
226
|
-
lines.push(
|
|
260
|
+
lines.push(
|
|
261
|
+
"Funding call translations (use these exact translations):"
|
|
262
|
+
);
|
|
227
263
|
for (const call of TRANSLATION_RULES.fundingCalls) {
|
|
228
264
|
if (call.dutch === call.english) {
|
|
229
|
-
lines.push(
|
|
265
|
+
lines.push(
|
|
266
|
+
` - "${call.dutch}" - same in both languages`
|
|
267
|
+
);
|
|
230
268
|
} else {
|
|
231
269
|
lines.push(` - Dutch: "${call.dutch}"`);
|
|
232
270
|
lines.push(` English: "${call.english}"`);
|
|
@@ -238,17 +276,27 @@ function generateTerminologyPrompt() {
|
|
|
238
276
|
lines.push("");
|
|
239
277
|
lines.push("Terminology guidelines:");
|
|
240
278
|
for (const term of TRANSLATION_RULES.terminology) {
|
|
241
|
-
lines.push(
|
|
242
|
-
|
|
279
|
+
lines.push(
|
|
280
|
+
` - Dutch options: ${term.dutch.map((t) => `"${t}"`).join(", ")}`
|
|
281
|
+
);
|
|
282
|
+
lines.push(
|
|
283
|
+
` English options: ${term.english.map((t) => `"${t}"`).join(", ")}`
|
|
284
|
+
);
|
|
243
285
|
if (term.notes) {
|
|
244
286
|
lines.push(` Note: ${term.notes}`);
|
|
245
287
|
}
|
|
246
288
|
}
|
|
247
289
|
lines.push("");
|
|
248
|
-
lines.push(
|
|
249
|
-
|
|
290
|
+
lines.push(
|
|
291
|
+
"Terms that should NEVER be translated (keep as-is):"
|
|
292
|
+
);
|
|
293
|
+
lines.push(
|
|
294
|
+
` ${TRANSLATION_RULES.neverTranslate.join(", ")}`
|
|
295
|
+
);
|
|
250
296
|
lines.push("");
|
|
251
|
-
lines.push(
|
|
297
|
+
lines.push(
|
|
298
|
+
"Official terms (keep in original language, use quotes if needed):"
|
|
299
|
+
);
|
|
252
300
|
for (const term of TRANSLATION_RULES.officialTerms) {
|
|
253
301
|
lines.push(` - "${term.term}" (${term.language})`);
|
|
254
302
|
if (term.notes) {
|
|
@@ -258,30 +306,71 @@ function generateTerminologyPrompt() {
|
|
|
258
306
|
lines.push("");
|
|
259
307
|
lines.push("Button/CTA text translations:");
|
|
260
308
|
for (const cta of TRANSLATION_RULES.ctaTranslations) {
|
|
261
|
-
lines.push(
|
|
309
|
+
lines.push(
|
|
310
|
+
` - "${cta.dutch}" (Dutch) = "${cta.english}" (English)`
|
|
311
|
+
);
|
|
262
312
|
}
|
|
263
313
|
lines.push("");
|
|
264
314
|
lines.push("CIIIC-specific terms:");
|
|
265
315
|
for (const term of TRANSLATION_RULES.ciiicSpecifics) {
|
|
266
|
-
lines.push(
|
|
316
|
+
lines.push(
|
|
317
|
+
` - "${term.dutch}" (Dutch) = "${term.english}" (English)`
|
|
318
|
+
);
|
|
267
319
|
}
|
|
268
320
|
lines.push("");
|
|
269
321
|
lines.push("Newsletter-specific phrases:");
|
|
270
322
|
for (const phrase of TRANSLATION_RULES.newsletterPhrases) {
|
|
271
|
-
lines.push(
|
|
323
|
+
lines.push(
|
|
324
|
+
` - "${phrase.dutch}" (Dutch) = "${phrase.english}" (English)`
|
|
325
|
+
);
|
|
272
326
|
}
|
|
273
327
|
lines.push("");
|
|
274
328
|
lines.push("Personal names:");
|
|
275
329
|
lines.push(" - People's names must NEVER be translated");
|
|
276
|
-
lines.push(
|
|
330
|
+
lines.push(
|
|
331
|
+
' - Example: "Jan de Vries" stays "Jan de Vries", NOT "John of Vries"'
|
|
332
|
+
);
|
|
277
333
|
lines.push("");
|
|
278
334
|
lines.push(
|
|
279
335
|
"GENERAL PRINCIPLE: It is acceptable and often preferable to leave some terms in their original language. Proper nouns, programme names, personal names, and official terminology should generally remain unchanged or use the official translation if one exists."
|
|
280
336
|
);
|
|
281
337
|
return lines.join("\n");
|
|
282
338
|
}
|
|
339
|
+
function getTranslationVoiceGuidelines() {
|
|
340
|
+
return `TRANSLATION VOICE & STYLE \u2014 apply this FIRST, before the rules below:
|
|
341
|
+
|
|
342
|
+
Translate **meaning, not words**. The output must read like it was written by a
|
|
343
|
+
native speaker of the target language, not transcribed from the source.
|
|
344
|
+
|
|
345
|
+
- Re-read what you produced and ask yourself: "Would a native speaker actually
|
|
346
|
+
write this sentence in this context?" If the answer is no, rewrite it.
|
|
347
|
+
- Headings, titles, subheads, and CTAs are the most common failure mode \u2014 they
|
|
348
|
+
are idiomatic by nature, so render their INTENT, not their syntax.
|
|
349
|
+
BAD (literal): "Wat hieronder zit" \u2192 "What sits underneath this"
|
|
350
|
+
GOOD (idiomatic): "Wat hieronder zit" \u2192 "The thinking behind it" /
|
|
351
|
+
"Why this matters" /
|
|
352
|
+
"What's underneath"
|
|
353
|
+
BAD (literal): "Op een rij" \u2192 "On a row"
|
|
354
|
+
GOOD (idiomatic): "Op een rij" \u2192 "At a glance" / "Summed up"
|
|
355
|
+
- Dutch metaphors and figures of speech usually do not carry over to English
|
|
356
|
+
word-for-word. Replace them with the closest natural English equivalent.
|
|
357
|
+
The same applies in reverse for English \u2192 Dutch.
|
|
358
|
+
- Match the register and tone of the source. Friendly informal Dutch ("je/jij")
|
|
359
|
+
should land as friendly conversational English \u2014 not formal corporate-speak,
|
|
360
|
+
and not stiff word-by-word renderings either.
|
|
361
|
+
- Respect target-language rhythm. Dutch tolerates long stacked compound noun
|
|
362
|
+
phrases; English usually breaks them up. English prefers active verbs;
|
|
363
|
+
Dutch tolerates more nominalisation. Adjust sentence structure accordingly.
|
|
364
|
+
- When you have to choose between literal accuracy and natural-sounding prose,
|
|
365
|
+
lean toward natural-sounding prose \u2014 as long as no factual content, name,
|
|
366
|
+
number, date, or commitment is lost or distorted.
|
|
367
|
+
- The terminology mappings below are exact and must be followed for those
|
|
368
|
+
specific terms. Everything else gets the native-speaker treatment.`;
|
|
369
|
+
}
|
|
283
370
|
function getDutchGuidelines() {
|
|
284
371
|
return `
|
|
372
|
+
${getTranslationVoiceGuidelines()}
|
|
373
|
+
|
|
285
374
|
DUTCH-SPECIFIC RULES:
|
|
286
375
|
- Headlines and titles: Use sentence case only (first letter capitalised, rest lowercase)
|
|
287
376
|
Example: "Deze titel is goed" NOT "Deze Titel Is Goed"
|
|
@@ -289,17 +378,20 @@ DUTCH-SPECIFIC RULES:
|
|
|
289
378
|
- Maintain a friendly but professional tone
|
|
290
379
|
- When translating "Creative Industries Fund NL" \u2192 use "Stimuleringsfonds Creatieve Industrie"
|
|
291
380
|
- "Immersive experiences" can stay in English or be translated to "immersieve ervaringen"
|
|
292
|
-
-
|
|
381
|
+
- "Funding scheme" \u2192 "regeling" (public-facing term). Use "call" only for a specific open edition of a regeling, never for the regeling itself
|
|
293
382
|
|
|
294
383
|
${generateTerminologyPrompt()}`;
|
|
295
384
|
}
|
|
296
385
|
function getEnglishGuidelines() {
|
|
297
386
|
return `
|
|
387
|
+
${getTranslationVoiceGuidelines()}
|
|
388
|
+
|
|
298
389
|
ENGLISH-SPECIFIC RULES:
|
|
299
390
|
- Use British English spellings (e.g., "colour" not "color", "organise" not "organize", "centre" not "center")
|
|
300
391
|
- British vocabulary: "programme" (not "program" for non-computer contexts), "behaviour", "favour", etc.
|
|
301
392
|
- Date format references should use British conventions where applicable
|
|
302
393
|
- When translating "Stimuleringsfonds Creatieve Industrie" \u2192 use "Creative Industries Fund NL"
|
|
394
|
+
- "Regeling" \u2192 "funding scheme" (public-facing term). Use "call" only for a specific open edition of a scheme (e.g. "the current ADRIE call"), never for the scheme itself
|
|
303
395
|
|
|
304
396
|
${generateTerminologyPrompt()}`;
|
|
305
397
|
}
|
|
@@ -331,25 +423,70 @@ function generateMarkdownPrompt() {
|
|
|
331
423
|
const lines = [];
|
|
332
424
|
lines.push("# CIIIC Translation Rules");
|
|
333
425
|
lines.push("");
|
|
334
|
-
lines.push(
|
|
426
|
+
lines.push(
|
|
427
|
+
"Use these rules when translating content between Dutch and English for CIIIC."
|
|
428
|
+
);
|
|
429
|
+
lines.push("");
|
|
430
|
+
lines.push("## Voice & Style \u2014 apply this FIRST");
|
|
431
|
+
lines.push("");
|
|
432
|
+
lines.push(
|
|
433
|
+
'Translate **meaning, not words**. The output must read like a native speaker of the target language wrote it, not like a transcription of the source. Re-read what you produced and ask: "Would a native speaker actually write this sentence in this context?" If the answer is no, rewrite it.'
|
|
434
|
+
);
|
|
435
|
+
lines.push("");
|
|
436
|
+
lines.push(
|
|
437
|
+
"Headings, titles, subheads, and CTAs are the most common failure mode \u2014 they are idiomatic by nature, so render their **intent**, not their syntax."
|
|
438
|
+
);
|
|
439
|
+
lines.push("");
|
|
440
|
+
lines.push("Examples:");
|
|
441
|
+
lines.push("");
|
|
442
|
+
lines.push("| Source (NL) | Literal (avoid) | Idiomatic (use) |");
|
|
443
|
+
lines.push("|-------------|-----------------|-----------------|");
|
|
444
|
+
lines.push(
|
|
445
|
+
"| Wat hieronder zit | What sits underneath this | The thinking behind it / Why this matters |"
|
|
446
|
+
);
|
|
447
|
+
lines.push(
|
|
448
|
+
"| Op een rij | On a row | At a glance / Summed up |"
|
|
449
|
+
);
|
|
450
|
+
lines.push("");
|
|
451
|
+
lines.push(
|
|
452
|
+
"- Dutch metaphors and figures of speech usually do not carry word-for-word to English. Replace them with the closest natural English equivalent \u2014 and the same in reverse."
|
|
453
|
+
);
|
|
454
|
+
lines.push(
|
|
455
|
+
'- Match the register and tone of the source. Friendly informal Dutch ("je/jij") should land as friendly conversational English \u2014 not formal corporate-speak, and not stiff word-by-word renderings either.'
|
|
456
|
+
);
|
|
457
|
+
lines.push(
|
|
458
|
+
"- Respect target-language rhythm. Dutch tolerates long stacked compound noun phrases; English usually breaks them up. English prefers active verbs; Dutch tolerates more nominalisation."
|
|
459
|
+
);
|
|
460
|
+
lines.push(
|
|
461
|
+
"- When choosing between literal accuracy and natural-sounding prose, lean toward natural-sounding prose \u2014 as long as no factual content, name, number, date, or commitment is lost or distorted."
|
|
462
|
+
);
|
|
463
|
+
lines.push(
|
|
464
|
+
"- The terminology and spelling rules below are exact and must be followed for those specific terms. Everything else gets the native-speaker treatment."
|
|
465
|
+
);
|
|
335
466
|
lines.push("");
|
|
336
467
|
lines.push("## Organisation Names");
|
|
337
468
|
lines.push("");
|
|
338
469
|
lines.push("| Dutch | English | Notes |");
|
|
339
470
|
lines.push("|-------|---------|-------|");
|
|
340
471
|
for (const org of TRANSLATION_RULES.organisations) {
|
|
341
|
-
lines.push(
|
|
472
|
+
lines.push(
|
|
473
|
+
`| ${org.dutch} | ${org.english} | ${org.notes || ""} |`
|
|
474
|
+
);
|
|
342
475
|
}
|
|
343
476
|
lines.push("");
|
|
344
477
|
lines.push("## Funding Call Translations");
|
|
345
478
|
lines.push("");
|
|
346
|
-
lines.push(
|
|
479
|
+
lines.push(
|
|
480
|
+
"Use these exact translations for funding call names:"
|
|
481
|
+
);
|
|
347
482
|
lines.push("");
|
|
348
483
|
lines.push("| Dutch | English | Notes |");
|
|
349
484
|
lines.push("|-------|---------|-------|");
|
|
350
485
|
for (const call of TRANSLATION_RULES.fundingCalls) {
|
|
351
486
|
const note = call.dutch === call.english ? "Same in both languages" : call.notes || "";
|
|
352
|
-
lines.push(
|
|
487
|
+
lines.push(
|
|
488
|
+
`| ${call.dutch} | ${call.english} | ${note} |`
|
|
489
|
+
);
|
|
353
490
|
}
|
|
354
491
|
lines.push("");
|
|
355
492
|
lines.push("## Button/CTA Text");
|
|
@@ -370,14 +507,18 @@ function generateMarkdownPrompt() {
|
|
|
370
507
|
lines.push("");
|
|
371
508
|
lines.push("## Terminology");
|
|
372
509
|
lines.push("");
|
|
373
|
-
lines.push(
|
|
510
|
+
lines.push(
|
|
511
|
+
"These terms can be used interchangeably or have specific translations:"
|
|
512
|
+
);
|
|
374
513
|
lines.push("");
|
|
375
514
|
lines.push("| Dutch | English | Notes |");
|
|
376
515
|
lines.push("|-------|---------|-------|");
|
|
377
516
|
for (const term of TRANSLATION_RULES.terminology) {
|
|
378
517
|
const dutchStr = term.dutch.join(", ");
|
|
379
518
|
const englishStr = term.english.join(", ");
|
|
380
|
-
lines.push(
|
|
519
|
+
lines.push(
|
|
520
|
+
`| ${dutchStr} | ${englishStr} | ${term.notes || ""} |`
|
|
521
|
+
);
|
|
381
522
|
}
|
|
382
523
|
lines.push("");
|
|
383
524
|
lines.push("## Newsletter-Specific Phrases");
|
|
@@ -390,15 +531,21 @@ function generateMarkdownPrompt() {
|
|
|
390
531
|
lines.push("");
|
|
391
532
|
lines.push("## Official Terms");
|
|
392
533
|
lines.push("");
|
|
393
|
-
lines.push(
|
|
534
|
+
lines.push(
|
|
535
|
+
"Keep these in their original language (use quotes if needed):"
|
|
536
|
+
);
|
|
394
537
|
lines.push("");
|
|
395
538
|
for (const term of TRANSLATION_RULES.officialTerms) {
|
|
396
|
-
lines.push(
|
|
539
|
+
lines.push(
|
|
540
|
+
`- **${term.term}** (${term.language})${term.notes ? ` - ${term.notes}` : ""}`
|
|
541
|
+
);
|
|
397
542
|
}
|
|
398
543
|
lines.push("");
|
|
399
544
|
lines.push("## Never Translate");
|
|
400
545
|
lines.push("");
|
|
401
|
-
lines.push(
|
|
546
|
+
lines.push(
|
|
547
|
+
"These terms should NEVER be translated - keep them exactly as-is:"
|
|
548
|
+
);
|
|
402
549
|
lines.push("");
|
|
403
550
|
lines.push("```");
|
|
404
551
|
lines.push(TRANSLATION_RULES.neverTranslate.join(", "));
|
|
@@ -408,19 +555,31 @@ function generateMarkdownPrompt() {
|
|
|
408
555
|
lines.push("");
|
|
409
556
|
lines.push("### Personal Names");
|
|
410
557
|
lines.push("- People's names must NEVER be translated");
|
|
411
|
-
lines.push(
|
|
558
|
+
lines.push(
|
|
559
|
+
'- Example: "Jan de Vries" stays "Jan de Vries", NOT "John of Vries"'
|
|
560
|
+
);
|
|
412
561
|
lines.push("");
|
|
413
562
|
lines.push("### Dutch-Specific");
|
|
414
|
-
lines.push(
|
|
415
|
-
|
|
563
|
+
lines.push(
|
|
564
|
+
"- Headlines and titles: Use sentence case only (first letter capitalised, rest lowercase)"
|
|
565
|
+
);
|
|
566
|
+
lines.push(
|
|
567
|
+
'- Use informal Dutch: Always use "je/jij/jouw" instead of "u/uw"'
|
|
568
|
+
);
|
|
416
569
|
lines.push("- Maintain a friendly but professional tone");
|
|
417
570
|
lines.push("");
|
|
418
571
|
lines.push("### English-Specific");
|
|
419
|
-
lines.push(
|
|
420
|
-
|
|
572
|
+
lines.push(
|
|
573
|
+
"- Use British English spellings (colour, organise, centre)"
|
|
574
|
+
);
|
|
575
|
+
lines.push(
|
|
576
|
+
'- British vocabulary: "programme" (not "program"), "behaviour", "favour"'
|
|
577
|
+
);
|
|
421
578
|
lines.push("");
|
|
422
579
|
lines.push("### General Principle");
|
|
423
|
-
lines.push(
|
|
580
|
+
lines.push(
|
|
581
|
+
"It is acceptable and often preferable to leave some terms in their original language. Proper nouns, programme names, personal names, and official terminology should generally remain unchanged or use the official translation if one exists."
|
|
582
|
+
);
|
|
424
583
|
lines.push("");
|
|
425
584
|
return lines.join("\n");
|
|
426
585
|
}
|
|
@@ -431,6 +590,7 @@ export {
|
|
|
431
590
|
getDutchGuidelines,
|
|
432
591
|
getEnglishGuidelines,
|
|
433
592
|
getGuidelines,
|
|
593
|
+
getTranslationVoiceGuidelines,
|
|
434
594
|
shouldNeverTranslate,
|
|
435
595
|
translateFundingCall,
|
|
436
596
|
translateOrganisation
|