@terai/translator 0.0.12 → 0.0.14

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/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ async function e({dictionary:e,projectLocale:t,locale:n,translator:r}){return r({dictionary:e,projectLocale:t,locale:n})}exports.translate=e;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/translate.ts"],"sourcesContent":["// Types\nimport type { Config, Locale, Dictionary } from '@terai/types'\n\nexport type TranslateOptions = Pick<Config, 'translator' | 'projectLocale'> & {\n\tdictionary: Dictionary\n\tlocale: Locale\n}\n\nexport async function translate({\n\tdictionary,\n\tprojectLocale,\n\tlocale,\n\ttranslator\n}: TranslateOptions): Promise<Dictionary> {\n\treturn translator({\n\t\tdictionary,\n\t\tprojectLocale,\n\t\tlocale\n\t})\n}\n"],"mappings":"AAQA,eAAsB,EAAU,CAC/B,aACA,gBACA,SACA,cACyC,CACzC,OAAO,EAAW,CACjB,aACA,gBACA,SACA,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { Config, Dictionary, Locale } from "@terai/types";
2
+
3
+ //#region src/translate.d.ts
4
+ type TranslateOptions = Pick<Config, 'translator' | 'projectLocale'> & {
5
+ dictionary: Dictionary;
6
+ locale: Locale;
7
+ };
8
+ declare function translate({
9
+ dictionary,
10
+ projectLocale,
11
+ locale,
12
+ translator
13
+ }: TranslateOptions): Promise<Dictionary>;
14
+ //#endregion
15
+ export { TranslateOptions, translate };
16
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/translate.ts"],"sourcesContent":[],"mappings":";;;KAGY,gBAAA,GAAmB,KAAK;cACvB;EADD,MAAA,EAEH,MAFG;CAAwB;AAAL,iBAKT,SAAA,CALS;EAAA,UAAA;EAAA,aAAA;EAAA,MAAA;EAAA;AAAA,CAAA,EAU5B,gBAV4B,CAAA,EAUT,OAVS,CAUD,UAVC,CAAA"}
package/dist/index.d.mts CHANGED
@@ -1,9 +1,16 @@
1
- import { Config, Dictionary, Locale } from '@terai/types';
1
+ import { Config, Dictionary, Locale } from "@terai/types";
2
2
 
3
+ //#region src/translate.d.ts
3
4
  type TranslateOptions = Pick<Config, 'translator' | 'projectLocale'> & {
4
- dictionary: Dictionary;
5
- locale: Locale;
5
+ dictionary: Dictionary;
6
+ locale: Locale;
6
7
  };
7
- declare function translate({ dictionary, projectLocale, locale, translator }: TranslateOptions): Promise<Dictionary>;
8
-
9
- export { type TranslateOptions, translate };
8
+ declare function translate({
9
+ dictionary,
10
+ projectLocale,
11
+ locale,
12
+ translator
13
+ }: TranslateOptions): Promise<Dictionary>;
14
+ //#endregion
15
+ export { TranslateOptions, translate };
16
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/translate.ts"],"sourcesContent":[],"mappings":";;;KAGY,gBAAA,GAAmB,KAAK;cACvB;EADD,MAAA,EAEH,MAFG;CAAwB;AAAL,iBAKT,SAAA,CALS;EAAA,UAAA;EAAA,aAAA;EAAA,MAAA;EAAA;AAAA,CAAA,EAU5B,gBAV4B,CAAA,EAUT,OAVS,CAUD,UAVC,CAAA"}
package/dist/index.mjs CHANGED
@@ -1,17 +1,2 @@
1
- // src/translate.ts
2
- async function translate({
3
- dictionary,
4
- projectLocale,
5
- locale,
6
- translator
7
- }) {
8
- return translator({
9
- dictionary,
10
- projectLocale,
11
- locale
12
- });
13
- }
14
- export {
15
- translate
16
- };
1
+ async function e({dictionary:e,projectLocale:t,locale:n,translator:r}){return r({dictionary:e,projectLocale:t,locale:n})}export{e as translate};
17
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/translate.ts"],"sourcesContent":["// Types\nimport type { Config, Locale, Dictionary } from '@terai/types'\n\nexport type TranslateOptions = Pick<Config, 'translator' | 'projectLocale'> & {\n\tdictionary: Dictionary\n\tlocale: Locale\n}\n\nexport async function translate({\n\tdictionary,\n\tprojectLocale,\n\tlocale,\n\ttranslator\n}: TranslateOptions): Promise<Dictionary> {\n\treturn translator({\n\t\tdictionary,\n\t\tprojectLocale,\n\t\tlocale\n\t})\n}\n"],"mappings":";AAQA,eAAsB,UAAU;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAA0C;AACzC,SAAO,WAAW;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AACF;","names":[]}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/translate.ts"],"sourcesContent":["// Types\nimport type { Config, Locale, Dictionary } from '@terai/types'\n\nexport type TranslateOptions = Pick<Config, 'translator' | 'projectLocale'> & {\n\tdictionary: Dictionary\n\tlocale: Locale\n}\n\nexport async function translate({\n\tdictionary,\n\tprojectLocale,\n\tlocale,\n\ttranslator\n}: TranslateOptions): Promise<Dictionary> {\n\treturn translator({\n\t\tdictionary,\n\t\tprojectLocale,\n\t\tlocale\n\t})\n}\n"],"mappings":"AAQA,eAAsB,EAAU,CAC/B,aACA,gBACA,SACA,cACyC,CACzC,OAAO,EAAW,CACjB,aACA,gBACA,SACA,CAAC"}
@@ -0,0 +1,69 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let l=require(`ai`),u=require(`zod`),d=require(`@aws-sdk/client-translate`),f=require(`deepl-node`);f=c(f);let p=require(`@google-cloud/translate`);var m=o(((e,t)=>{Object.defineProperty(e,`__esModule`,{value:!0}),e.outdent=void 0;function n(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t]}function r(){return typeof WeakMap<`u`?new WeakMap:i()}function i(){return{add:n,delete:n,get:n,set:n,has:function(e){return!1}}}var a=Object.prototype.hasOwnProperty,o=function(e,t){return a.call(e,t)};function s(e,t){for(var n in t)o(t,n)&&(e[n]=t[n]);return e}var c=/^[ \t]*(?:\r\n|\r|\n)/,l=/(?:\r\n|\r|\n)[ \t]*$/,u=/^(?:[\r\n]|$)/,d=/(?:\r\n|\r|\n)([ \t]*)(?:[^ \t\r\n]|$)/,f=/^[ \t]*[\r\n][ \t\r\n]*$/;function p(e,t,n){var r=0,i=e[0].match(d);i&&(r=i[1].length);var a=`(\\r\\n|\\r|\\n).{0,`+r+`}`,o=new RegExp(a,`g`);t&&(e=e.slice(1));var s=n.newline,u=n.trimLeadingNewline,f=n.trimTrailingNewline,p=typeof s==`string`,m=e.length;return e.map(function(e,t){return e=e.replace(o,`$1`),t===0&&u&&(e=e.replace(c,``)),t===m-1&&f&&(e=e.replace(l,``)),p&&(e=e.replace(/\r\n|\n|\r/g,function(e){return s})),e})}function m(e,t){for(var n=``,r=0,i=e.length;r<i;r++)n+=e[r],r<i-1&&(n+=t[r]);return n}function h(e){return o(e,`raw`)&&o(e,`length`)}function g(e){var t=r(),n=r();function i(r){for(var a=[],o=1;o<arguments.length;o++)a[o-1]=arguments[o];if(h(r)){var c=r,l=(a[0]===i||a[0]===_)&&f.test(c[0])&&u.test(c[1]),d=l?n:t,v=d.get(c);return v||(v=p(c,l,e),d.set(c,v)),a.length===0?v[0]:m(v,l?a.slice(1):a)}else return g(s(s({},e),r||{}))}return s(i,{string:function(t){return p([t],!1,e)[0]}})}var _=g({trimLeadingNewline:!0,trimTrailingNewline:!0});if(e.outdent=_,e.default=_,t!==void 0)try{t.exports=_,Object.defineProperty(_,`__esModule`,{value:!0}),_.default=_,_.outdent=_}catch{}})),h=m();const g=h.outdent`
2
+ # Expert AI Translator
3
+
4
+ ## Your Role
5
+ You are an expert translator and localization specialist with deep expertise in software
6
+ applications, user interfaces, and technical documentation. Your translations are accurate,
7
+ contextually appropriate, and maintain the natural feel of native language.
8
+
9
+ ## Critical Requirements
10
+
11
+ ### 1. Preserve Code Patterns
12
+ - **NEVER** translate template variables (e.g., \${var}, {var}, %s, %d)
13
+ - **ALWAYS** keep placeholder syntax exactly as provided
14
+ - **MAINTAIN** all escape sequences and special characters
15
+ - **PRESERVE** HTML tags, markdown syntax, and formatting codes
16
+
17
+ ### 2. Translation Quality
18
+ - Use **natural, idiomatic** expressions in the target language
19
+ - Maintain **consistent terminology** throughout all strings
20
+ - Adapt **cultural references** appropriately for the target locale
21
+ - Ensure **grammatical correctness** and proper sentence structure
22
+
23
+ ### 3. Context Awareness
24
+ - **UI Elements**: Keep translations concise for buttons, labels, and menus
25
+ - **Messages**: Maintain appropriate tone (error messages: clear, help text: friendly)
26
+ - **Technical Terms**: Use standard industry terminology when available
27
+ - **Brand Names**: Do not translate proper nouns, product names, or brand names
28
+
29
+ ### 4. Formatting Guidelines
30
+ - **Punctuation**: Follow target language conventions
31
+ - **Capitalization**: Match target language standards (e.g., German nouns)
32
+ - **Numbers & Dates**: Keep placeholders unchanged; format will be handled at runtime
33
+ - **Whitespace**: Preserve spacing around variables and special characters
34
+
35
+ ### 5. Tone & Style
36
+ - **Consistency**: Maintain uniform voice across all translations
37
+ - **Formality**: Match the formality level of the source text
38
+ - **Clarity**: Prioritize understanding over literal translation
39
+ - **Brevity**: Keep translations concise, especially for UI elements
40
+
41
+ ## Output Format
42
+ - Return ONLY a valid JSON object
43
+ - Use the EXACT SAME KEYS as the input
44
+ - Do NOT add newlines within string values
45
+ - Do NOT modify, remove, or add keys
46
+ - Do NOT include markdown code blocks or extra formatting
47
+
48
+ ## Examples of What to Preserve
49
+
50
+ ✅ CORRECT:
51
+ - "Welcome \${var}" → "Bienvenido \${var}"
52
+ - "You have {count} items" → "Tienes {count} elementos"
53
+ - "Click <strong>here</strong>" → "Haz clic <strong>aquí</strong>"
54
+
55
+ ❌ INCORRECT:
56
+ - "Welcome \${var}" → "Bienvenido Juan" (translated variable)
57
+ - "You have {var} items" → "Tienes 3 elementos" (removed braces)
58
+ - "Click <strong>here</strong>" → "Haz clic **aquí**" (changed HTML to markdown)`,_=({model:e,systemPrompt:t=g})=>async({dictionary:n,projectLocale:r,locale:i})=>{let{object:a}=await(0,l.generateObject)({model:e,output:`object`,schema:u.z.record(u.z.string(),u.z.string()),system:t?h.outdent`
59
+ ${g}
60
+
61
+ ## Additonal User System Instructions (highest priority)
62
+ ${t}
63
+ `:g,prompt:h.outdent`
64
+ Translate the following JSON from "${r}" to "${i}".
65
+ <target-json>
66
+ ${JSON.stringify(n,null,2)}
67
+ </target-json>
68
+ `});return a},v=({sourceLanguageCode:e=`auto`,...t})=>{let n=new d.TranslateClient(t);return async({dictionary:t,locale:r,projectLocale:i})=>{let a={},o=e===`auto`?i:e;return await Promise.all(Object.keys(t).map(async e=>{let i=t[e],s=new d.TranslateTextCommand({Text:i,SourceLanguageCode:o,TargetLanguageCode:r});a[e]=(await n.send(s)).TranslatedText||i})),a}},y=({subscriptionKey:e,region:t,endpoint:n=`https://api.cognitive.microsofttranslator.com`})=>async({dictionary:r,locale:i,projectLocale:a})=>{let o={},s=Object.keys(r),c=s.map(e=>({text:r[e]})),l=[];for(let e=0;e<c.length;e+=100)l.push(c.slice(e,e+100));let u=0;for(let c of l){let l=new URL(`/translate`,n);l.searchParams.set(`api-version`,`3.0`),l.searchParams.set(`from`,a),l.searchParams.set(`to`,i);let d=await fetch(l.toString(),{method:`POST`,headers:{"Ocp-Apim-Subscription-Key":e,"Ocp-Apim-Subscription-Region":t,"Content-Type":`application/json`},body:JSON.stringify(c)});if(!d.ok){let e=await d.text();throw Error(`Azure Translator API error: ${d.status} - ${e}`)}let f=await d.json();for(let e of f){let t=s[u];o[t]=e.translations[0]?.text||r[t],u++}}return o},b=({authKey:e,options:t,formality:n=`default`,preserveFormatting:r=!0,tagHandling:i=`xml`})=>{let a=new f.Translator(e,t);return async({dictionary:e,locale:t,projectLocale:o})=>{let s={},c=Object.keys(e),l=c.map(t=>e[t]),u=t.toUpperCase(),d=o.toUpperCase(),f=await a.translateText(l,d,u,{formality:n,preserveFormatting:r,tagHandling:i}),p=Array.isArray(f)?f:[f];for(let t=0;t<c.length;t++){let n=c[t];s[n]=p[t]?.text||e[n]}return s}},x=e=>{let t=new p.v2.Translate(e);return async({dictionary:e,locale:n})=>{let r={};return await Promise.all(Object.keys(e).map(async i=>{let a=e[i],[o]=await t.translate(a,n);r[i]=o})),r}};exports.createAiTranslator=_,exports.createAwsTranslator=v,exports.createAzureTranslator=y,exports.createDeepLTranslator=b,exports.createGoogleCloudTranslator=x;
69
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["outdent","translator: Translator","z","TranslateClient","translator: Translator","translatedOutput: Dictionary","TranslateTextCommand","translator: Translator","translatedOutput: Dictionary","batches: Array<Array<{ text: string }>>","results: AzureTranslationResponse","deepl","translator: Translator","translatedOutput: Dictionary","v2","translator: Translator","translatedOutput: Dictionary"],"sources":["../../../../node_modules/.pnpm/outdent@0.8.0/node_modules/outdent/lib/index.js","../../src/translators/ai.ts","../../src/translators/aws.ts","../../src/translators/azure.ts","../../src/translators/deepl.ts","../../src/translators/google-cloud.ts"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.outdent = void 0;\n// In the absence of a WeakSet or WeakMap implementation, don't break, but don't cache either.\nfunction noop() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n}\nfunction createWeakMap() {\n if (typeof WeakMap !== \"undefined\") {\n return new WeakMap();\n }\n else {\n return fakeSetOrMap();\n }\n}\n/**\n * Creates and returns a no-op implementation of a WeakMap / WeakSet that never stores anything.\n */\nfunction fakeSetOrMap() {\n return {\n add: noop,\n delete: noop,\n get: noop,\n set: noop,\n has: function (k) {\n return false;\n },\n };\n}\n// Safe hasOwnProperty\nvar hop = Object.prototype.hasOwnProperty;\nvar has = function (obj, prop) {\n return hop.call(obj, prop);\n};\n// Copy all own enumerable properties from source to target\nfunction extend(target, source) {\n for (var prop in source) {\n if (has(source, prop)) {\n target[prop] = source[prop];\n }\n }\n return target;\n}\nvar reLeadingNewline = /^[ \\t]*(?:\\r\\n|\\r|\\n)/;\nvar reTrailingNewline = /(?:\\r\\n|\\r|\\n)[ \\t]*$/;\nvar reStartsWithNewlineOrIsEmpty = /^(?:[\\r\\n]|$)/;\nvar reDetectIndentation = /(?:\\r\\n|\\r|\\n)([ \\t]*)(?:[^ \\t\\r\\n]|$)/;\nvar reOnlyWhitespaceWithAtLeastOneNewline = /^[ \\t]*[\\r\\n][ \\t\\r\\n]*$/;\nfunction _outdentArray(strings, firstInterpolatedValueSetsIndentationLevel, options) {\n // If first interpolated value is a reference to outdent,\n // determine indentation level from the indentation of the interpolated value.\n var indentationLevel = 0;\n var match = strings[0].match(reDetectIndentation);\n if (match) {\n indentationLevel = match[1].length;\n }\n var reSource = \"(\\\\r\\\\n|\\\\r|\\\\n).{0,\" + indentationLevel + \"}\";\n var reMatchIndent = new RegExp(reSource, \"g\");\n if (firstInterpolatedValueSetsIndentationLevel) {\n strings = strings.slice(1);\n }\n var newline = options.newline, trimLeadingNewline = options.trimLeadingNewline, trimTrailingNewline = options.trimTrailingNewline;\n var normalizeNewlines = typeof newline === \"string\";\n var l = strings.length;\n var outdentedStrings = strings.map(function (v, i) {\n // Remove leading indentation from all lines\n v = v.replace(reMatchIndent, \"$1\");\n // Trim a leading newline from the first string\n if (i === 0 && trimLeadingNewline) {\n v = v.replace(reLeadingNewline, \"\");\n }\n // Trim a trailing newline from the last string\n if (i === l - 1 && trimTrailingNewline) {\n v = v.replace(reTrailingNewline, \"\");\n }\n // Normalize newlines\n if (normalizeNewlines) {\n v = v.replace(/\\r\\n|\\n|\\r/g, function (_) { return newline; });\n }\n return v;\n });\n return outdentedStrings;\n}\nfunction concatStringsAndValues(strings, values) {\n var ret = \"\";\n for (var i = 0, l = strings.length; i < l; i++) {\n ret += strings[i];\n if (i < l - 1) {\n ret += values[i];\n }\n }\n return ret;\n}\nfunction isTemplateStringsArray(v) {\n return has(v, \"raw\") && has(v, \"length\");\n}\n/**\n * It is assumed that opts will not change. If this is a problem, clone your options object and pass the clone to\n * makeInstance\n * @param options\n * @return {outdent}\n */\nfunction createInstance(options) {\n /** Cache of pre-processed template literal arrays */\n var arrayAutoIndentCache = createWeakMap();\n /**\n * Cache of pre-processed template literal arrays, where first interpolated value is a reference to outdent,\n * before interpolated values are injected.\n */\n var arrayFirstInterpSetsIndentCache = createWeakMap();\n function outdent(stringsOrOptions) {\n var values = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n values[_i - 1] = arguments[_i];\n }\n /* tslint:enable:no-shadowed-variable */\n if (isTemplateStringsArray(stringsOrOptions)) {\n var strings = stringsOrOptions;\n // Is first interpolated value a reference to outdent, alone on its own line, without any preceding non-whitespace?\n var firstInterpolatedValueSetsIndentationLevel = (values[0] === outdent || values[0] === defaultOutdent) &&\n reOnlyWhitespaceWithAtLeastOneNewline.test(strings[0]) &&\n reStartsWithNewlineOrIsEmpty.test(strings[1]);\n // Perform outdentation\n var cache = firstInterpolatedValueSetsIndentationLevel\n ? arrayFirstInterpSetsIndentCache\n : arrayAutoIndentCache;\n var renderedArray = cache.get(strings);\n if (!renderedArray) {\n renderedArray = _outdentArray(strings, firstInterpolatedValueSetsIndentationLevel, options);\n cache.set(strings, renderedArray);\n }\n /** If no interpolated values, skip concatenation step */\n if (values.length === 0) {\n return renderedArray[0];\n }\n /** Concatenate string literals with interpolated values */\n var rendered = concatStringsAndValues(renderedArray, firstInterpolatedValueSetsIndentationLevel ? values.slice(1) : values);\n return rendered;\n }\n else {\n // Create and return a new instance of outdent with the given options\n return createInstance(extend(extend({}, options), stringsOrOptions || {}));\n }\n }\n var fullOutdent = extend(outdent, {\n string: function (str) {\n return _outdentArray([str], false, options)[0];\n },\n });\n return fullOutdent;\n}\nvar defaultOutdent = createInstance({\n trimLeadingNewline: true,\n trimTrailingNewline: true,\n});\nexports.outdent = defaultOutdent;\n// Named exports. Simple and preferred.\n// import outdent from 'outdent';\nexports.default = defaultOutdent;\nif (typeof module !== \"undefined\") {\n // In webpack harmony-modules environments, module.exports is read-only,\n // so we fail gracefully.\n try {\n module.exports = defaultOutdent;\n Object.defineProperty(defaultOutdent, \"__esModule\", { value: true });\n defaultOutdent.default = defaultOutdent;\n defaultOutdent.outdent = defaultOutdent;\n }\n catch (e) { }\n}\n//# sourceMappingURL=index.js.map","// Dependencies\nimport { generateObject } from 'ai'\nimport { outdent } from 'outdent'\nimport { z } from 'zod'\n\n// Types\nimport type { LanguageModel } from 'ai'\nimport type { Translator } from '@terai/types'\n\nexport type CreateAiTranslatorOptions = {\n\t/**\n\t * The AI model to use for translation.\n\t * Can be any model from AI SDK providers (@ai-sdk/openai, @ai-sdk/anthropic, @ai-sdk/groq, etc.)\n\t *\n\t * @example\n\t * import { createOpenAI } from '@ai-sdk/openai'\n\t * const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY })\n\t * const model = openai('gpt-4o')\n\t *\n\t * @example\n\t * import { createGroq } from '@ai-sdk/groq'\n\t * const groq = createGroq({ apiKey: process.env.GROQ_API_KEY })\n\t * const model = groq('llama-3.3-70b-versatile')\n\t */\n\tmodel: LanguageModel\n\n\t/**\n\t * Custom system prompt for translation.\n\t * If not provided, a generic prompt will be used that covers most app translation cases.\n\t */\n\tsystemPrompt?: string\n}\n\nconst DEFAULT_SYSTEM_PROMPT = outdent`\n# Expert AI Translator\n\n## Your Role\nYou are an expert translator and localization specialist with deep expertise in software\napplications, user interfaces, and technical documentation. Your translations are accurate,\ncontextually appropriate, and maintain the natural feel of native language.\n\n## Critical Requirements\n\n### 1. Preserve Code Patterns\n- **NEVER** translate template variables (e.g., \\${var}, {var}, %s, %d)\n- **ALWAYS** keep placeholder syntax exactly as provided\n- **MAINTAIN** all escape sequences and special characters\n- **PRESERVE** HTML tags, markdown syntax, and formatting codes\n\n### 2. Translation Quality\n- Use **natural, idiomatic** expressions in the target language\n- Maintain **consistent terminology** throughout all strings\n- Adapt **cultural references** appropriately for the target locale\n- Ensure **grammatical correctness** and proper sentence structure\n\n### 3. Context Awareness\n- **UI Elements**: Keep translations concise for buttons, labels, and menus\n- **Messages**: Maintain appropriate tone (error messages: clear, help text: friendly)\n- **Technical Terms**: Use standard industry terminology when available\n- **Brand Names**: Do not translate proper nouns, product names, or brand names\n\n### 4. Formatting Guidelines\n- **Punctuation**: Follow target language conventions\n- **Capitalization**: Match target language standards (e.g., German nouns)\n- **Numbers & Dates**: Keep placeholders unchanged; format will be handled at runtime\n- **Whitespace**: Preserve spacing around variables and special characters\n\n### 5. Tone & Style\n- **Consistency**: Maintain uniform voice across all translations\n- **Formality**: Match the formality level of the source text\n- **Clarity**: Prioritize understanding over literal translation\n- **Brevity**: Keep translations concise, especially for UI elements\n\n## Output Format\n- Return ONLY a valid JSON object\n- Use the EXACT SAME KEYS as the input\n- Do NOT add newlines within string values\n- Do NOT modify, remove, or add keys\n- Do NOT include markdown code blocks or extra formatting\n\n## Examples of What to Preserve\n\n✅ CORRECT:\n- \"Welcome \\${var}\" → \"Bienvenido \\${var}\"\n- \"You have {count} items\" → \"Tienes {count} elementos\"\n- \"Click <strong>here</strong>\" → \"Haz clic <strong>aquí</strong>\"\n\n❌ INCORRECT:\n- \"Welcome \\${var}\" → \"Bienvenido Juan\" (translated variable)\n- \"You have {var} items\" → \"Tienes 3 elementos\" (removed braces)\n- \"Click <strong>here</strong>\" → \"Haz clic **aquí**\" (changed HTML to markdown)`\n\n/**\n * Creates an AI-powered translator using the Vercel AI SDK.\n *\n * This translator uses structured output generation to translate dictionaries\n * while preserving template variables, formatting, and code patterns.\n *\n * @example\n * ```ts\n * import { createAiTranslator } from '@terai/translator/translators'\n * import { createOpenAI } from '@ai-sdk/openai'\n *\n * const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY })\n * const translator = createAiTranslator({\n * model: openai('gpt-4o')\n * })\n * ```\n *\n * @example With Groq\n * ```ts\n * import { createAiTranslator } from '@terai/translator/translators'\n * import { createGroq } from '@ai-sdk/groq'\n *\n * const groq = createGroq({ apiKey: process.env.GROQ_API_KEY })\n * const translator = createAiTranslator({\n * model: groq('llama-3.3-70b-versatile')\n * })\n * ```\n *\n * @example With custom system prompt\n * ```ts\n * import { createAiTranslator } from '@terai/translator/translators'\n * import { createAnthropic } from '@ai-sdk/anthropic'\n *\n * const anthropic = createAnthropic({ apiKey: process.env.ANTHROPIC_API_KEY })\n * const translator = createAiTranslator({\n * model: anthropic('claude-3-5-sonnet-20241022'),\n * systemPrompt: 'Custom prompt for my specific use case...'\n * })\n * ```\n */\nexport const createAiTranslator = ({\n\tmodel,\n\tsystemPrompt = DEFAULT_SYSTEM_PROMPT\n}: CreateAiTranslatorOptions): Translator => {\n\tconst translator: Translator = async ({\n\t\tdictionary,\n\t\tprojectLocale,\n\t\tlocale\n\t}) => {\n\t\tconst { object: translation } = await generateObject({\n\t\t\tmodel,\n\t\t\toutput: 'object',\n\t\t\tschema: z.record(z.string(), z.string()),\n\t\t\tsystem: !systemPrompt\n\t\t\t\t? DEFAULT_SYSTEM_PROMPT\n\t\t\t\t: outdent`\n\t\t\t\t${DEFAULT_SYSTEM_PROMPT}\n\t\t\t\t\n\t\t\t\t## Additonal User System Instructions (highest priority)\n\t\t\t\t${systemPrompt}\n\t\t\t`,\n\t\t\tprompt: outdent`\n\t\t\tTranslate the following JSON from \"${projectLocale}\" to \"${locale}\".\n\t\t\t<target-json>\n\t\t\t\t${JSON.stringify(dictionary, null, 2)}\n\t\t\t</target-json>\n\t\t\t`\n\t\t})\n\n\t\treturn translation\n\t}\n\n\treturn translator\n}\n","// Dependencies\nimport {\n\tTranslateClient,\n\tTranslateTextCommand,\n\ttype TranslateClientConfig\n} from '@aws-sdk/client-translate'\n\n// Types\nimport type { Dictionary, Translator } from '@terai/types'\n\nexport type CreateAwsTranslatorOptions = TranslateClientConfig & {\n\t/**\n\t * The source language code (e.g., 'en', 'es', 'fr').\n\t * If not provided, AWS Translate will auto-detect the source language.\n\t * @default 'auto'\n\t */\n\tsourceLanguageCode?: string\n}\n\n/**\n * Creates a translator using AWS Translate.\n *\n * AWS Translate is a neural machine translation service that delivers\n * fast, high-quality, and affordable language translation.\n *\n * @example\n * ```ts\n * import { createAwsTranslator } from '@terai/translator/translators'\n *\n * const translator = createAwsTranslator({\n * region: 'us-east-1',\n * credentials: {\n * accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n * secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY\n * }\n * })\n * ```\n *\n * @example With AWS profile\n * ```ts\n * import { createAwsTranslator } from '@terai/translator/translators'\n * import { fromIni } from '@aws-sdk/credential-providers'\n *\n * const translator = createAwsTranslator({\n * region: 'us-east-1',\n * credentials: fromIni({ profile: 'my-profile' })\n * })\n * ```\n */\nexport const createAwsTranslator = ({\n\tsourceLanguageCode = 'auto',\n\t...clientConfig\n}: CreateAwsTranslatorOptions): Translator => {\n\tconst client = new TranslateClient(clientConfig)\n\n\tconst translator: Translator = async ({\n\t\tdictionary,\n\t\tlocale,\n\t\tprojectLocale\n\t}) => {\n\t\tconst translatedOutput: Dictionary = {}\n\n\t\t// Use projectLocale as source if not set to auto\n\t\tconst source =\n\t\t\tsourceLanguageCode === 'auto' ? projectLocale : sourceLanguageCode\n\n\t\tawait Promise.all(\n\t\t\tObject.keys(dictionary).map(async (key) => {\n\t\t\t\tconst value = dictionary[key]\n\n\t\t\t\tconst command = new TranslateTextCommand({\n\t\t\t\t\tText: value,\n\t\t\t\t\tSourceLanguageCode: source,\n\t\t\t\t\tTargetLanguageCode: locale\n\t\t\t\t})\n\n\t\t\t\tconst response = await client.send(command)\n\n\t\t\t\ttranslatedOutput[key] = response.TranslatedText || value\n\t\t\t})\n\t\t)\n\n\t\treturn translatedOutput\n\t}\n\n\treturn translator\n}\n","// Types\nimport type { Dictionary, Translator } from '@terai/types'\n\nexport type CreateAzureTranslatorOptions = {\n\t/**\n\t * Azure Translator subscription key.\n\t */\n\tsubscriptionKey: string\n\n\t/**\n\t * Azure region where the Translator resource is located.\n\t * @example 'eastus', 'westeurope', 'southeastasia'\n\t */\n\tregion: string\n\n\t/**\n\t * Custom endpoint URL. If not provided, uses the global endpoint.\n\t * @default 'https://api.cognitive.microsofttranslator.com'\n\t */\n\tendpoint?: string\n}\n\ntype AzureTranslationResponse = Array<{\n\ttranslations: Array<{\n\t\ttext: string\n\t\tto: string\n\t}>\n}>\n\n/**\n * Creates a translator using Microsoft Azure Translator.\n *\n * Azure Translator is a cloud-based machine translation service\n * that supports 100+ languages.\n *\n * @example\n * ```ts\n * import { createAzureTranslator } from '@terai/translator/translators'\n *\n * const translator = createAzureTranslator({\n * subscriptionKey: process.env.AZURE_TRANSLATOR_KEY,\n * region: 'eastus'\n * })\n * ```\n *\n * @example With custom endpoint\n * ```ts\n * import { createAzureTranslator } from '@terai/translator/translators'\n *\n * const translator = createAzureTranslator({\n * subscriptionKey: process.env.AZURE_TRANSLATOR_KEY,\n * region: 'eastus',\n * endpoint: 'https://my-custom-endpoint.cognitiveservices.azure.com'\n * })\n * ```\n */\nexport const createAzureTranslator = ({\n\tsubscriptionKey,\n\tregion,\n\tendpoint = 'https://api.cognitive.microsofttranslator.com'\n}: CreateAzureTranslatorOptions): Translator => {\n\tconst translator: Translator = async ({\n\t\tdictionary,\n\t\tlocale,\n\t\tprojectLocale\n\t}) => {\n\t\tconst translatedOutput: Dictionary = {}\n\t\tconst keys = Object.keys(dictionary)\n\t\tconst texts = keys.map((key) => ({ text: dictionary[key] }))\n\n\t\t// Azure Translator API accepts up to 100 texts per request\n\t\tconst batchSize = 100\n\t\tconst batches: Array<Array<{ text: string }>> = []\n\n\t\tfor (let i = 0; i < texts.length; i += batchSize) {\n\t\t\tbatches.push(texts.slice(i, i + batchSize))\n\t\t}\n\n\t\tlet keyIndex = 0\n\n\t\tfor (const batch of batches) {\n\t\t\tconst url = new URL('/translate', endpoint)\n\t\t\turl.searchParams.set('api-version', '3.0')\n\t\t\turl.searchParams.set('from', projectLocale)\n\t\t\turl.searchParams.set('to', locale)\n\n\t\t\tconst response = await fetch(url.toString(), {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Ocp-Apim-Subscription-Key': subscriptionKey,\n\t\t\t\t\t'Ocp-Apim-Subscription-Region': region,\n\t\t\t\t\t'Content-Type': 'application/json'\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(batch)\n\t\t\t})\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst errorText = await response.text()\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Azure Translator API error: ${response.status} - ${errorText}`\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst results: AzureTranslationResponse = await response.json()\n\n\t\t\tfor (const result of results) {\n\t\t\t\tconst key = keys[keyIndex]\n\t\t\t\ttranslatedOutput[key] = result.translations[0]?.text || dictionary[key]\n\t\t\t\tkeyIndex++\n\t\t\t}\n\t\t}\n\n\t\treturn translatedOutput\n\t}\n\n\treturn translator\n}\n","// Dependencies\nimport * as deepl from 'deepl-node'\n\n// Types\nimport type { Dictionary, Translator } from '@terai/types'\n\nexport type CreateDeepLTranslatorOptions = {\n\t/**\n\t * DeepL API authentication key.\n\t * Get your key from https://www.deepl.com/pro-api\n\t */\n\tauthKey: string\n\n\t/**\n\t * Additional options for the DeepL Translator.\n\t */\n\toptions?: deepl.TranslatorOptions\n\n\t/**\n\t * Formality preference for translations.\n\t * - 'default': Default formality\n\t * - 'more': More formal language\n\t * - 'less': Less formal language\n\t * - 'prefer_more': Prefer more formal if available\n\t * - 'prefer_less': Prefer less formal if available\n\t * @default 'default'\n\t */\n\tformality?: deepl.Formality\n\n\t/**\n\t * Whether to preserve formatting in translations.\n\t * @default true\n\t */\n\tpreserveFormatting?: boolean\n\n\t/**\n\t * Specify how to handle XML tags in text.\n\t * @default 'xml'\n\t */\n\ttagHandling?: 'xml' | 'html'\n}\n\n/**\n * Creates a translator using DeepL API.\n *\n * DeepL is known for producing high-quality, natural-sounding translations\n * and is often considered one of the best machine translation services available.\n *\n * @example\n * ```ts\n * import { createDeepLTranslator } from '@terai/translator/translators'\n *\n * const translator = createDeepLTranslator({\n * authKey: process.env.DEEPL_API_KEY\n * })\n * ```\n *\n * @example With formality preference\n * ```ts\n * import { createDeepLTranslator } from '@terai/translator/translators'\n *\n * const translator = createDeepLTranslator({\n * authKey: process.env.DEEPL_API_KEY,\n * formality: 'less' // Use informal language\n * })\n * ```\n *\n * @example With HTML tag handling\n * ```ts\n * import { createDeepLTranslator } from '@terai/translator/translators'\n *\n * const translator = createDeepLTranslator({\n * authKey: process.env.DEEPL_API_KEY,\n * tagHandling: 'html',\n * preserveFormatting: true\n * })\n * ```\n */\nexport const createDeepLTranslator = ({\n\tauthKey,\n\toptions,\n\tformality = 'default',\n\tpreserveFormatting = true,\n\ttagHandling = 'xml'\n}: CreateDeepLTranslatorOptions): Translator => {\n\tconst deeplTranslator = new deepl.Translator(authKey, options)\n\n\tconst translator: Translator = async ({\n\t\tdictionary,\n\t\tlocale,\n\t\tprojectLocale\n\t}) => {\n\t\tconst translatedOutput: Dictionary = {}\n\t\tconst keys = Object.keys(dictionary)\n\t\tconst texts = keys.map((key) => dictionary[key])\n\n\t\t// DeepL uses specific language codes (e.g., 'EN-US' instead of 'en-US')\n\t\tconst targetLang = locale.toUpperCase() as deepl.TargetLanguageCode\n\t\tconst sourceLang = projectLocale.toUpperCase() as deepl.SourceLanguageCode\n\n\t\tconst results = await deeplTranslator.translateText(\n\t\t\ttexts,\n\t\t\tsourceLang,\n\t\t\ttargetLang,\n\t\t\t{\n\t\t\t\tformality,\n\t\t\t\tpreserveFormatting,\n\t\t\t\ttagHandling\n\t\t\t}\n\t\t)\n\n\t\t// Handle both single result and array of results\n\t\tconst translationResults = Array.isArray(results) ? results : [results]\n\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tconst key = keys[i]\n\t\t\ttranslatedOutput[key] = translationResults[i]?.text || dictionary[key]\n\t\t}\n\n\t\treturn translatedOutput\n\t}\n\n\treturn translator\n}\n","// Dependencies\nimport { v2 } from '@google-cloud/translate'\n\n// Types\nimport type { Dictionary, Translator } from '@terai/types'\n\nexport type CreateGoogleCloudTranslatorOptions = v2.TranslateConfig\n\n/**\n * Creates a translator using Google Cloud Translation API.\n *\n * This translator uses Google Cloud's Neural Machine Translation (NMT)\n * for high-quality translations.\n *\n * @example\n * ```ts\n * import { createGoogleCloudTranslator } from '@terai/translator/translators'\n *\n * const translator = createGoogleCloudTranslator({\n * projectId: process.env.GOOGLE_CLOUD_PROJECT_ID,\n * keyFilename: './google-credentials.json'\n * })\n * ```\n *\n * @example With API key\n * ```ts\n * import { createGoogleCloudTranslator } from '@terai/translator/translators'\n *\n * const translator = createGoogleCloudTranslator({\n * key: process.env.GOOGLE_CLOUD_API_KEY\n * })\n * ```\n */\nexport const createGoogleCloudTranslator = (\n\toptions: CreateGoogleCloudTranslatorOptions\n): Translator => {\n\tconst translate = new v2.Translate(options)\n\n\tconst translator: Translator = async ({ dictionary, locale }) => {\n\t\tconst translatedOutput: Dictionary = {}\n\n\t\tawait Promise.all(\n\t\t\tObject.keys(dictionary).map(async (key) => {\n\t\t\t\tconst value = dictionary[key]\n\n\t\t\t\tconst [translation] = await translate.translate(value, locale)\n\n\t\t\t\ttranslatedOutput[key] = translation\n\t\t\t})\n\t\t)\n\n\t\treturn translatedOutput\n\t}\n\n\treturn translator\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -0,0 +1,275 @@
1
+ import { Translator } from "@terai/types";
2
+ import { LanguageModel } from "ai";
3
+ import { TranslateClientConfig } from "@aws-sdk/client-translate";
4
+ import * as deepl from "deepl-node";
5
+ import { v2 } from "@google-cloud/translate";
6
+
7
+ //#region src/translators/ai.d.ts
8
+ type CreateAiTranslatorOptions = {
9
+ /**
10
+ * The AI model to use for translation.
11
+ * Can be any model from AI SDK providers (@ai-sdk/openai, @ai-sdk/anthropic, @ai-sdk/groq, etc.)
12
+ *
13
+ * @example
14
+ * import { createOpenAI } from '@ai-sdk/openai'
15
+ * const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY })
16
+ * const model = openai('gpt-4o')
17
+ *
18
+ * @example
19
+ * import { createGroq } from '@ai-sdk/groq'
20
+ * const groq = createGroq({ apiKey: process.env.GROQ_API_KEY })
21
+ * const model = groq('llama-3.3-70b-versatile')
22
+ */
23
+ model: LanguageModel;
24
+ /**
25
+ * Custom system prompt for translation.
26
+ * If not provided, a generic prompt will be used that covers most app translation cases.
27
+ */
28
+ systemPrompt?: string;
29
+ };
30
+ /**
31
+ * Creates an AI-powered translator using the Vercel AI SDK.
32
+ *
33
+ * This translator uses structured output generation to translate dictionaries
34
+ * while preserving template variables, formatting, and code patterns.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * import { createAiTranslator } from '@terai/translator/translators'
39
+ * import { createOpenAI } from '@ai-sdk/openai'
40
+ *
41
+ * const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY })
42
+ * const translator = createAiTranslator({
43
+ * model: openai('gpt-4o')
44
+ * })
45
+ * ```
46
+ *
47
+ * @example With Groq
48
+ * ```ts
49
+ * import { createAiTranslator } from '@terai/translator/translators'
50
+ * import { createGroq } from '@ai-sdk/groq'
51
+ *
52
+ * const groq = createGroq({ apiKey: process.env.GROQ_API_KEY })
53
+ * const translator = createAiTranslator({
54
+ * model: groq('llama-3.3-70b-versatile')
55
+ * })
56
+ * ```
57
+ *
58
+ * @example With custom system prompt
59
+ * ```ts
60
+ * import { createAiTranslator } from '@terai/translator/translators'
61
+ * import { createAnthropic } from '@ai-sdk/anthropic'
62
+ *
63
+ * const anthropic = createAnthropic({ apiKey: process.env.ANTHROPIC_API_KEY })
64
+ * const translator = createAiTranslator({
65
+ * model: anthropic('claude-3-5-sonnet-20241022'),
66
+ * systemPrompt: 'Custom prompt for my specific use case...'
67
+ * })
68
+ * ```
69
+ */
70
+ declare const createAiTranslator: ({
71
+ model,
72
+ systemPrompt
73
+ }: CreateAiTranslatorOptions) => Translator;
74
+ //#endregion
75
+ //#region src/translators/aws.d.ts
76
+ type CreateAwsTranslatorOptions = TranslateClientConfig & {
77
+ /**
78
+ * The source language code (e.g., 'en', 'es', 'fr').
79
+ * If not provided, AWS Translate will auto-detect the source language.
80
+ * @default 'auto'
81
+ */
82
+ sourceLanguageCode?: string;
83
+ };
84
+ /**
85
+ * Creates a translator using AWS Translate.
86
+ *
87
+ * AWS Translate is a neural machine translation service that delivers
88
+ * fast, high-quality, and affordable language translation.
89
+ *
90
+ * @example
91
+ * ```ts
92
+ * import { createAwsTranslator } from '@terai/translator/translators'
93
+ *
94
+ * const translator = createAwsTranslator({
95
+ * region: 'us-east-1',
96
+ * credentials: {
97
+ * accessKeyId: process.env.AWS_ACCESS_KEY_ID,
98
+ * secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
99
+ * }
100
+ * })
101
+ * ```
102
+ *
103
+ * @example With AWS profile
104
+ * ```ts
105
+ * import { createAwsTranslator } from '@terai/translator/translators'
106
+ * import { fromIni } from '@aws-sdk/credential-providers'
107
+ *
108
+ * const translator = createAwsTranslator({
109
+ * region: 'us-east-1',
110
+ * credentials: fromIni({ profile: 'my-profile' })
111
+ * })
112
+ * ```
113
+ */
114
+ declare const createAwsTranslator: ({
115
+ sourceLanguageCode,
116
+ ...clientConfig
117
+ }: CreateAwsTranslatorOptions) => Translator;
118
+ //#endregion
119
+ //#region src/translators/azure.d.ts
120
+ type CreateAzureTranslatorOptions = {
121
+ /**
122
+ * Azure Translator subscription key.
123
+ */
124
+ subscriptionKey: string;
125
+ /**
126
+ * Azure region where the Translator resource is located.
127
+ * @example 'eastus', 'westeurope', 'southeastasia'
128
+ */
129
+ region: string;
130
+ /**
131
+ * Custom endpoint URL. If not provided, uses the global endpoint.
132
+ * @default 'https://api.cognitive.microsofttranslator.com'
133
+ */
134
+ endpoint?: string;
135
+ };
136
+ /**
137
+ * Creates a translator using Microsoft Azure Translator.
138
+ *
139
+ * Azure Translator is a cloud-based machine translation service
140
+ * that supports 100+ languages.
141
+ *
142
+ * @example
143
+ * ```ts
144
+ * import { createAzureTranslator } from '@terai/translator/translators'
145
+ *
146
+ * const translator = createAzureTranslator({
147
+ * subscriptionKey: process.env.AZURE_TRANSLATOR_KEY,
148
+ * region: 'eastus'
149
+ * })
150
+ * ```
151
+ *
152
+ * @example With custom endpoint
153
+ * ```ts
154
+ * import { createAzureTranslator } from '@terai/translator/translators'
155
+ *
156
+ * const translator = createAzureTranslator({
157
+ * subscriptionKey: process.env.AZURE_TRANSLATOR_KEY,
158
+ * region: 'eastus',
159
+ * endpoint: 'https://my-custom-endpoint.cognitiveservices.azure.com'
160
+ * })
161
+ * ```
162
+ */
163
+ declare const createAzureTranslator: ({
164
+ subscriptionKey,
165
+ region,
166
+ endpoint
167
+ }: CreateAzureTranslatorOptions) => Translator;
168
+ //#endregion
169
+ //#region src/translators/deepl.d.ts
170
+ type CreateDeepLTranslatorOptions = {
171
+ /**
172
+ * DeepL API authentication key.
173
+ * Get your key from https://www.deepl.com/pro-api
174
+ */
175
+ authKey: string;
176
+ /**
177
+ * Additional options for the DeepL Translator.
178
+ */
179
+ options?: deepl.TranslatorOptions;
180
+ /**
181
+ * Formality preference for translations.
182
+ * - 'default': Default formality
183
+ * - 'more': More formal language
184
+ * - 'less': Less formal language
185
+ * - 'prefer_more': Prefer more formal if available
186
+ * - 'prefer_less': Prefer less formal if available
187
+ * @default 'default'
188
+ */
189
+ formality?: deepl.Formality;
190
+ /**
191
+ * Whether to preserve formatting in translations.
192
+ * @default true
193
+ */
194
+ preserveFormatting?: boolean;
195
+ /**
196
+ * Specify how to handle XML tags in text.
197
+ * @default 'xml'
198
+ */
199
+ tagHandling?: 'xml' | 'html';
200
+ };
201
+ /**
202
+ * Creates a translator using DeepL API.
203
+ *
204
+ * DeepL is known for producing high-quality, natural-sounding translations
205
+ * and is often considered one of the best machine translation services available.
206
+ *
207
+ * @example
208
+ * ```ts
209
+ * import { createDeepLTranslator } from '@terai/translator/translators'
210
+ *
211
+ * const translator = createDeepLTranslator({
212
+ * authKey: process.env.DEEPL_API_KEY
213
+ * })
214
+ * ```
215
+ *
216
+ * @example With formality preference
217
+ * ```ts
218
+ * import { createDeepLTranslator } from '@terai/translator/translators'
219
+ *
220
+ * const translator = createDeepLTranslator({
221
+ * authKey: process.env.DEEPL_API_KEY,
222
+ * formality: 'less' // Use informal language
223
+ * })
224
+ * ```
225
+ *
226
+ * @example With HTML tag handling
227
+ * ```ts
228
+ * import { createDeepLTranslator } from '@terai/translator/translators'
229
+ *
230
+ * const translator = createDeepLTranslator({
231
+ * authKey: process.env.DEEPL_API_KEY,
232
+ * tagHandling: 'html',
233
+ * preserveFormatting: true
234
+ * })
235
+ * ```
236
+ */
237
+ declare const createDeepLTranslator: ({
238
+ authKey,
239
+ options,
240
+ formality,
241
+ preserveFormatting,
242
+ tagHandling
243
+ }: CreateDeepLTranslatorOptions) => Translator;
244
+ //#endregion
245
+ //#region src/translators/google-cloud.d.ts
246
+ type CreateGoogleCloudTranslatorOptions = v2.TranslateConfig;
247
+ /**
248
+ * Creates a translator using Google Cloud Translation API.
249
+ *
250
+ * This translator uses Google Cloud's Neural Machine Translation (NMT)
251
+ * for high-quality translations.
252
+ *
253
+ * @example
254
+ * ```ts
255
+ * import { createGoogleCloudTranslator } from '@terai/translator/translators'
256
+ *
257
+ * const translator = createGoogleCloudTranslator({
258
+ * projectId: process.env.GOOGLE_CLOUD_PROJECT_ID,
259
+ * keyFilename: './google-credentials.json'
260
+ * })
261
+ * ```
262
+ *
263
+ * @example With API key
264
+ * ```ts
265
+ * import { createGoogleCloudTranslator } from '@terai/translator/translators'
266
+ *
267
+ * const translator = createGoogleCloudTranslator({
268
+ * key: process.env.GOOGLE_CLOUD_API_KEY
269
+ * })
270
+ * ```
271
+ */
272
+ declare const createGoogleCloudTranslator: (options: CreateGoogleCloudTranslatorOptions) => Translator;
273
+ //#endregion
274
+ export { CreateAiTranslatorOptions, CreateAwsTranslatorOptions, CreateAzureTranslatorOptions, CreateDeepLTranslatorOptions, CreateGoogleCloudTranslatorOptions, createAiTranslator, createAwsTranslator, createAzureTranslator, createDeepLTranslator, createGoogleCloudTranslator };
275
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/translators/ai.ts","../../src/translators/aws.ts","../../src/translators/azure.ts","../../src/translators/deepl.ts","../../src/translators/google-cloud.ts"],"sourcesContent":[],"mappings":";;;;;;;KASY,yBAAA;;;;;AAAZ;AA2HA;;;;;;;;;EC1HY,KAAA,EDcJ,aCdI;EAuCC;;;;EAqCZ,YAAA,CAAA,EAAA,MAAA;;;;ACnFD;AAqDA;;;;;;;;;;AClDA;AAwEA;;;;;;;;;;;;ACxEA;AA2BA;;;;;;;;;;;;;cJmGa;;;GAGV,8BAA4B;;;KC7HnB,0BAAA,GAA6B;;;;;ADDzC;EA2Ha,kBAAA,CAAA,EAiCZ,MAAA;CAjCkC;;;;;;;;AC1HnC;AAuCA;;;;;;;;AC9CA;AAqDA;;;;;;;;;;AClDA;AAwEA;;AAAsC,cF7BzB,mBE6ByB,EAAA,CAAA;EAAA,kBAAA;EAAA,GAAA;AAAA,CAAA,EF1BnC,0BE0BmC,EAAA,GF1BN,UE0BM;;;KD3E1B,4BAAA;;;;;;AFMZ;AA2HA;;EAAmC,MAAA,EAAA,MAAA;EAGhC;;;;;;AC7HH;AAuCA;;;;;;;;AC9CA;AAqDA;;;;;;;;;;AClDA;AAwEA;;;;;;AAMG,cD5BU,qBC4BV,EAAA,CAAA;EAAA,eAAA;EAAA,MAAA;EAAA;AAAA,CAAA,EDxBA,4BCwBA,EAAA,GDxB+B,UCwB/B;;;KA9ES,4BAAA;;;;;EHGA,OAAA,EAAA,MAAA;EA2HC;;;EAGV,OAAA,CAAA,EGvHQ,KAAA,CAAM,iBHuHd;EAA4B;;;;;AC7H/B;AAuCA;;;EAGgC,SAAA,CAAA,EEzBnB,KAAA,CAAM,SFyBa;EAkC/B;;;;ECnFW,kBAAA,CAAA,EAAA,OAAA;EAqDC;;;;EAIV,WAAA,CAAA,EAAA,KAAA,GAAA,MAAA;CAA+B;;;;;ACtDlC;AAwEA;;;;;;;;;;;;ACxEA;AA2BA;;;;;;;;;;;;;;;;;;cD6Ca;;;;;;GAMV,iCAA+B;;;KC9EtB,kCAAA,GAAqC,EAAA,CAAG;;;;;AJGpD;AA2HA;;;;;;;;;AC1HA;AAuCA;;;;;;;;AC9CA;AAqDA;AAAsC,cEvBzB,2BFuByB,EAAA,CAAA,OAAA,EEtB5B,kCFsB4B,EAAA,GErBnC,UFqBmC"}
@@ -1,9 +1,275 @@
1
- import { ClientOptions } from 'openai';
2
- import { Translator } from '@terai/types';
3
- import { v2 } from '@google-cloud/translate';
1
+ import { LanguageModel } from "ai";
2
+ import { TranslateClientConfig } from "@aws-sdk/client-translate";
3
+ import * as deepl from "deepl-node";
4
+ import { v2 } from "@google-cloud/translate";
5
+ import { Translator } from "@terai/types";
4
6
 
5
- declare const createChatGptTranslator: (openaiOptions: ClientOptions) => Translator;
6
-
7
- declare const createGoogleCloudTranslator: (options: v2.TranslateConfig) => Translator;
8
-
9
- export { createChatGptTranslator, createGoogleCloudTranslator };
7
+ //#region src/translators/ai.d.ts
8
+ type CreateAiTranslatorOptions = {
9
+ /**
10
+ * The AI model to use for translation.
11
+ * Can be any model from AI SDK providers (@ai-sdk/openai, @ai-sdk/anthropic, @ai-sdk/groq, etc.)
12
+ *
13
+ * @example
14
+ * import { createOpenAI } from '@ai-sdk/openai'
15
+ * const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY })
16
+ * const model = openai('gpt-4o')
17
+ *
18
+ * @example
19
+ * import { createGroq } from '@ai-sdk/groq'
20
+ * const groq = createGroq({ apiKey: process.env.GROQ_API_KEY })
21
+ * const model = groq('llama-3.3-70b-versatile')
22
+ */
23
+ model: LanguageModel;
24
+ /**
25
+ * Custom system prompt for translation.
26
+ * If not provided, a generic prompt will be used that covers most app translation cases.
27
+ */
28
+ systemPrompt?: string;
29
+ };
30
+ /**
31
+ * Creates an AI-powered translator using the Vercel AI SDK.
32
+ *
33
+ * This translator uses structured output generation to translate dictionaries
34
+ * while preserving template variables, formatting, and code patterns.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * import { createAiTranslator } from '@terai/translator/translators'
39
+ * import { createOpenAI } from '@ai-sdk/openai'
40
+ *
41
+ * const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY })
42
+ * const translator = createAiTranslator({
43
+ * model: openai('gpt-4o')
44
+ * })
45
+ * ```
46
+ *
47
+ * @example With Groq
48
+ * ```ts
49
+ * import { createAiTranslator } from '@terai/translator/translators'
50
+ * import { createGroq } from '@ai-sdk/groq'
51
+ *
52
+ * const groq = createGroq({ apiKey: process.env.GROQ_API_KEY })
53
+ * const translator = createAiTranslator({
54
+ * model: groq('llama-3.3-70b-versatile')
55
+ * })
56
+ * ```
57
+ *
58
+ * @example With custom system prompt
59
+ * ```ts
60
+ * import { createAiTranslator } from '@terai/translator/translators'
61
+ * import { createAnthropic } from '@ai-sdk/anthropic'
62
+ *
63
+ * const anthropic = createAnthropic({ apiKey: process.env.ANTHROPIC_API_KEY })
64
+ * const translator = createAiTranslator({
65
+ * model: anthropic('claude-3-5-sonnet-20241022'),
66
+ * systemPrompt: 'Custom prompt for my specific use case...'
67
+ * })
68
+ * ```
69
+ */
70
+ declare const createAiTranslator: ({
71
+ model,
72
+ systemPrompt
73
+ }: CreateAiTranslatorOptions) => Translator;
74
+ //#endregion
75
+ //#region src/translators/aws.d.ts
76
+ type CreateAwsTranslatorOptions = TranslateClientConfig & {
77
+ /**
78
+ * The source language code (e.g., 'en', 'es', 'fr').
79
+ * If not provided, AWS Translate will auto-detect the source language.
80
+ * @default 'auto'
81
+ */
82
+ sourceLanguageCode?: string;
83
+ };
84
+ /**
85
+ * Creates a translator using AWS Translate.
86
+ *
87
+ * AWS Translate is a neural machine translation service that delivers
88
+ * fast, high-quality, and affordable language translation.
89
+ *
90
+ * @example
91
+ * ```ts
92
+ * import { createAwsTranslator } from '@terai/translator/translators'
93
+ *
94
+ * const translator = createAwsTranslator({
95
+ * region: 'us-east-1',
96
+ * credentials: {
97
+ * accessKeyId: process.env.AWS_ACCESS_KEY_ID,
98
+ * secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
99
+ * }
100
+ * })
101
+ * ```
102
+ *
103
+ * @example With AWS profile
104
+ * ```ts
105
+ * import { createAwsTranslator } from '@terai/translator/translators'
106
+ * import { fromIni } from '@aws-sdk/credential-providers'
107
+ *
108
+ * const translator = createAwsTranslator({
109
+ * region: 'us-east-1',
110
+ * credentials: fromIni({ profile: 'my-profile' })
111
+ * })
112
+ * ```
113
+ */
114
+ declare const createAwsTranslator: ({
115
+ sourceLanguageCode,
116
+ ...clientConfig
117
+ }: CreateAwsTranslatorOptions) => Translator;
118
+ //#endregion
119
+ //#region src/translators/azure.d.ts
120
+ type CreateAzureTranslatorOptions = {
121
+ /**
122
+ * Azure Translator subscription key.
123
+ */
124
+ subscriptionKey: string;
125
+ /**
126
+ * Azure region where the Translator resource is located.
127
+ * @example 'eastus', 'westeurope', 'southeastasia'
128
+ */
129
+ region: string;
130
+ /**
131
+ * Custom endpoint URL. If not provided, uses the global endpoint.
132
+ * @default 'https://api.cognitive.microsofttranslator.com'
133
+ */
134
+ endpoint?: string;
135
+ };
136
+ /**
137
+ * Creates a translator using Microsoft Azure Translator.
138
+ *
139
+ * Azure Translator is a cloud-based machine translation service
140
+ * that supports 100+ languages.
141
+ *
142
+ * @example
143
+ * ```ts
144
+ * import { createAzureTranslator } from '@terai/translator/translators'
145
+ *
146
+ * const translator = createAzureTranslator({
147
+ * subscriptionKey: process.env.AZURE_TRANSLATOR_KEY,
148
+ * region: 'eastus'
149
+ * })
150
+ * ```
151
+ *
152
+ * @example With custom endpoint
153
+ * ```ts
154
+ * import { createAzureTranslator } from '@terai/translator/translators'
155
+ *
156
+ * const translator = createAzureTranslator({
157
+ * subscriptionKey: process.env.AZURE_TRANSLATOR_KEY,
158
+ * region: 'eastus',
159
+ * endpoint: 'https://my-custom-endpoint.cognitiveservices.azure.com'
160
+ * })
161
+ * ```
162
+ */
163
+ declare const createAzureTranslator: ({
164
+ subscriptionKey,
165
+ region,
166
+ endpoint
167
+ }: CreateAzureTranslatorOptions) => Translator;
168
+ //#endregion
169
+ //#region src/translators/deepl.d.ts
170
+ type CreateDeepLTranslatorOptions = {
171
+ /**
172
+ * DeepL API authentication key.
173
+ * Get your key from https://www.deepl.com/pro-api
174
+ */
175
+ authKey: string;
176
+ /**
177
+ * Additional options for the DeepL Translator.
178
+ */
179
+ options?: deepl.TranslatorOptions;
180
+ /**
181
+ * Formality preference for translations.
182
+ * - 'default': Default formality
183
+ * - 'more': More formal language
184
+ * - 'less': Less formal language
185
+ * - 'prefer_more': Prefer more formal if available
186
+ * - 'prefer_less': Prefer less formal if available
187
+ * @default 'default'
188
+ */
189
+ formality?: deepl.Formality;
190
+ /**
191
+ * Whether to preserve formatting in translations.
192
+ * @default true
193
+ */
194
+ preserveFormatting?: boolean;
195
+ /**
196
+ * Specify how to handle XML tags in text.
197
+ * @default 'xml'
198
+ */
199
+ tagHandling?: 'xml' | 'html';
200
+ };
201
+ /**
202
+ * Creates a translator using DeepL API.
203
+ *
204
+ * DeepL is known for producing high-quality, natural-sounding translations
205
+ * and is often considered one of the best machine translation services available.
206
+ *
207
+ * @example
208
+ * ```ts
209
+ * import { createDeepLTranslator } from '@terai/translator/translators'
210
+ *
211
+ * const translator = createDeepLTranslator({
212
+ * authKey: process.env.DEEPL_API_KEY
213
+ * })
214
+ * ```
215
+ *
216
+ * @example With formality preference
217
+ * ```ts
218
+ * import { createDeepLTranslator } from '@terai/translator/translators'
219
+ *
220
+ * const translator = createDeepLTranslator({
221
+ * authKey: process.env.DEEPL_API_KEY,
222
+ * formality: 'less' // Use informal language
223
+ * })
224
+ * ```
225
+ *
226
+ * @example With HTML tag handling
227
+ * ```ts
228
+ * import { createDeepLTranslator } from '@terai/translator/translators'
229
+ *
230
+ * const translator = createDeepLTranslator({
231
+ * authKey: process.env.DEEPL_API_KEY,
232
+ * tagHandling: 'html',
233
+ * preserveFormatting: true
234
+ * })
235
+ * ```
236
+ */
237
+ declare const createDeepLTranslator: ({
238
+ authKey,
239
+ options,
240
+ formality,
241
+ preserveFormatting,
242
+ tagHandling
243
+ }: CreateDeepLTranslatorOptions) => Translator;
244
+ //#endregion
245
+ //#region src/translators/google-cloud.d.ts
246
+ type CreateGoogleCloudTranslatorOptions = v2.TranslateConfig;
247
+ /**
248
+ * Creates a translator using Google Cloud Translation API.
249
+ *
250
+ * This translator uses Google Cloud's Neural Machine Translation (NMT)
251
+ * for high-quality translations.
252
+ *
253
+ * @example
254
+ * ```ts
255
+ * import { createGoogleCloudTranslator } from '@terai/translator/translators'
256
+ *
257
+ * const translator = createGoogleCloudTranslator({
258
+ * projectId: process.env.GOOGLE_CLOUD_PROJECT_ID,
259
+ * keyFilename: './google-credentials.json'
260
+ * })
261
+ * ```
262
+ *
263
+ * @example With API key
264
+ * ```ts
265
+ * import { createGoogleCloudTranslator } from '@terai/translator/translators'
266
+ *
267
+ * const translator = createGoogleCloudTranslator({
268
+ * key: process.env.GOOGLE_CLOUD_API_KEY
269
+ * })
270
+ * ```
271
+ */
272
+ declare const createGoogleCloudTranslator: (options: CreateGoogleCloudTranslatorOptions) => Translator;
273
+ //#endregion
274
+ export { CreateAiTranslatorOptions, CreateAwsTranslatorOptions, CreateAzureTranslatorOptions, CreateDeepLTranslatorOptions, CreateGoogleCloudTranslatorOptions, createAiTranslator, createAwsTranslator, createAzureTranslator, createDeepLTranslator, createGoogleCloudTranslator };
275
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/translators/ai.ts","../../src/translators/aws.ts","../../src/translators/azure.ts","../../src/translators/deepl.ts","../../src/translators/google-cloud.ts"],"sourcesContent":[],"mappings":";;;;;;;KASY,yBAAA;;;;;AAAZ;AA2HA;;;;;;;;;EC1HY,KAAA,EDcJ,aCdI;EAuCC;;;;EAqCZ,YAAA,CAAA,EAAA,MAAA;;;;ACnFD;AAqDA;;;;;;;;;;AClDA;AAwEA;;;;;;;;;;;;ACxEA;AA2BA;;;;;;;;;;;;;cJmGa;;;GAGV,8BAA4B;;;KC7HnB,0BAAA,GAA6B;;;;;ADDzC;EA2Ha,kBAAA,CAAA,EAiCZ,MAAA;CAjCkC;;;;;;;;AC1HnC;AAuCA;;;;;;;;AC9CA;AAqDA;;;;;;;;;;AClDA;AAwEA;;AAAsC,cF7BzB,mBE6ByB,EAAA,CAAA;EAAA,kBAAA;EAAA,GAAA;AAAA,CAAA,EF1BnC,0BE0BmC,EAAA,GF1BN,UE0BM;;;KD3E1B,4BAAA;;;;;;AFMZ;AA2HA;;EAAmC,MAAA,EAAA,MAAA;EAGhC;;;;;;AC7HH;AAuCA;;;;;;;;AC9CA;AAqDA;;;;;;;;;;AClDA;AAwEA;;;;;;AAMG,cD5BU,qBC4BV,EAAA,CAAA;EAAA,eAAA;EAAA,MAAA;EAAA;AAAA,CAAA,EDxBA,4BCwBA,EAAA,GDxB+B,UCwB/B;;;KA9ES,4BAAA;;;;;EHGA,OAAA,EAAA,MAAA;EA2HC;;;EAGV,OAAA,CAAA,EGvHQ,KAAA,CAAM,iBHuHd;EAA4B;;;;;AC7H/B;AAuCA;;;EAGgC,SAAA,CAAA,EEzBnB,KAAA,CAAM,SFyBa;EAkC/B;;;;ECnFW,kBAAA,CAAA,EAAA,OAAA;EAqDC;;;;EAIV,WAAA,CAAA,EAAA,KAAA,GAAA,MAAA;CAA+B;;;;;ACtDlC;AAwEA;;;;;;;;;;;;ACxEA;AA2BA;;;;;;;;;;;;;;;;;;cD6Ca;;;;;;GAMV,iCAA+B;;;KC9EtB,kCAAA,GAAqC,EAAA,CAAG;;;;;AJGpD;AA2HA;;;;;;;;;AC1HA;AAuCA;;;;;;;;AC9CA;AAqDA;AAAsC,cEvBzB,2BFuByB,EAAA,CAAA,OAAA,EEtB5B,kCFsB4B,EAAA,GErBnC,UFqBmC"}
@@ -1,60 +1,69 @@
1
- // src/translators/chat-gpt.ts
2
- import OpenAI from "openai";
3
- var createChatGptTranslator = (openaiOptions) => {
4
- const openai = new OpenAI(openaiOptions);
5
- const translator = async ({
6
- dictionary,
7
- projectLocale,
8
- locale
9
- }) => {
10
- const messagesJson = JSON.stringify(dictionary);
11
- const response = await openai.chat.completions.create({
12
- model: "gpt-3.5-turbo-0125",
13
- messages: [
14
- {
15
- role: "system",
16
- content: [
17
- // 'Act like a professional translator',
18
- `You will be provided with a JSON in locale: ${projectLocale}, and your task is to translate it to locale: ${locale}.`,
19
- // 'Keep the same structure and keys, just translate the values.',
20
- 'Do not translate any escaped characters or "${var}" ocurrences, just keep them as they are'
21
- ].join(".\n")
22
- },
23
- {
24
- role: "user",
25
- content: messagesJson
26
- }
27
- ],
28
- temperature: 0.4,
29
- frequency_penalty: -2,
30
- presence_penalty: -2
31
- });
32
- return JSON.parse(
33
- response?.choices?.[0]?.message?.content || "{}"
34
- );
35
- };
36
- return translator;
37
- };
38
-
39
- // src/translators/google-cloud.ts
40
- import { v2 } from "@google-cloud/translate";
41
- var createGoogleCloudTranslator = (options) => {
42
- const translate = new v2.Translate(options);
43
- const translator = async ({ dictionary, locale }) => {
44
- const translatedOutput = {};
45
- await Promise.all(
46
- Object.keys(dictionary).map(async (key) => {
47
- const value = dictionary[key];
48
- const [translation] = await translate.translate(value, locale);
49
- translatedOutput[key] = translation;
50
- })
51
- );
52
- return translatedOutput;
53
- };
54
- return translator;
55
- };
56
- export {
57
- createChatGptTranslator,
58
- createGoogleCloudTranslator
59
- };
1
+ import{generateObject as e}from"ai";import{z as t}from"zod";import{TranslateClient as n,TranslateTextCommand as r}from"@aws-sdk/client-translate";import*as i from"deepl-node";import{v2 as a}from"@google-cloud/translate";var o=((e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports))(((e,t)=>{Object.defineProperty(e,`__esModule`,{value:!0}),e.outdent=void 0;function n(){}function r(){return typeof WeakMap<`u`?new WeakMap:i()}function i(){return{add:n,delete:n,get:n,set:n,has:function(e){return!1}}}var a=Object.prototype.hasOwnProperty,o=function(e,t){return a.call(e,t)};function s(e,t){for(var n in t)o(t,n)&&(e[n]=t[n]);return e}var c=/^[ \t]*(?:\r\n|\r|\n)/,l=/(?:\r\n|\r|\n)[ \t]*$/,u=/^(?:[\r\n]|$)/,d=/(?:\r\n|\r|\n)([ \t]*)(?:[^ \t\r\n]|$)/,f=/^[ \t]*[\r\n][ \t\r\n]*$/;function p(e,t,n){var r=0,i=e[0].match(d);i&&(r=i[1].length);var a=`(\\r\\n|\\r|\\n).{0,`+r+`}`,o=new RegExp(a,`g`);t&&(e=e.slice(1));var s=n.newline,u=n.trimLeadingNewline,f=n.trimTrailingNewline,p=typeof s==`string`,m=e.length;return e.map(function(e,t){return e=e.replace(o,`$1`),t===0&&u&&(e=e.replace(c,``)),t===m-1&&f&&(e=e.replace(l,``)),p&&(e=e.replace(/\r\n|\n|\r/g,function(e){return s})),e})}function m(e,t){for(var n=``,r=0,i=e.length;r<i;r++)n+=e[r],r<i-1&&(n+=t[r]);return n}function h(e){return o(e,`raw`)&&o(e,`length`)}function g(e){var t=r(),n=r();function i(r){var a=[...arguments].slice(1);if(h(r)){var o=r,c=(a[0]===i||a[0]===_)&&f.test(o[0])&&u.test(o[1]),l=c?n:t,d=l.get(o);return d||(d=p(o,c,e),l.set(o,d)),a.length===0?d[0]:m(d,c?a.slice(1):a)}else return g(s(s({},e),r||{}))}return s(i,{string:function(t){return p([t],!1,e)[0]}})}var _=g({trimLeadingNewline:!0,trimTrailingNewline:!0});if(e.outdent=_,e.default=_,t!==void 0)try{t.exports=_,Object.defineProperty(_,`__esModule`,{value:!0}),_.default=_,_.outdent=_}catch{}}))();const s=o.outdent`
2
+ # Expert AI Translator
3
+
4
+ ## Your Role
5
+ You are an expert translator and localization specialist with deep expertise in software
6
+ applications, user interfaces, and technical documentation. Your translations are accurate,
7
+ contextually appropriate, and maintain the natural feel of native language.
8
+
9
+ ## Critical Requirements
10
+
11
+ ### 1. Preserve Code Patterns
12
+ - **NEVER** translate template variables (e.g., \${var}, {var}, %s, %d)
13
+ - **ALWAYS** keep placeholder syntax exactly as provided
14
+ - **MAINTAIN** all escape sequences and special characters
15
+ - **PRESERVE** HTML tags, markdown syntax, and formatting codes
16
+
17
+ ### 2. Translation Quality
18
+ - Use **natural, idiomatic** expressions in the target language
19
+ - Maintain **consistent terminology** throughout all strings
20
+ - Adapt **cultural references** appropriately for the target locale
21
+ - Ensure **grammatical correctness** and proper sentence structure
22
+
23
+ ### 3. Context Awareness
24
+ - **UI Elements**: Keep translations concise for buttons, labels, and menus
25
+ - **Messages**: Maintain appropriate tone (error messages: clear, help text: friendly)
26
+ - **Technical Terms**: Use standard industry terminology when available
27
+ - **Brand Names**: Do not translate proper nouns, product names, or brand names
28
+
29
+ ### 4. Formatting Guidelines
30
+ - **Punctuation**: Follow target language conventions
31
+ - **Capitalization**: Match target language standards (e.g., German nouns)
32
+ - **Numbers & Dates**: Keep placeholders unchanged; format will be handled at runtime
33
+ - **Whitespace**: Preserve spacing around variables and special characters
34
+
35
+ ### 5. Tone & Style
36
+ - **Consistency**: Maintain uniform voice across all translations
37
+ - **Formality**: Match the formality level of the source text
38
+ - **Clarity**: Prioritize understanding over literal translation
39
+ - **Brevity**: Keep translations concise, especially for UI elements
40
+
41
+ ## Output Format
42
+ - Return ONLY a valid JSON object
43
+ - Use the EXACT SAME KEYS as the input
44
+ - Do NOT add newlines within string values
45
+ - Do NOT modify, remove, or add keys
46
+ - Do NOT include markdown code blocks or extra formatting
47
+
48
+ ## Examples of What to Preserve
49
+
50
+ ✅ CORRECT:
51
+ - "Welcome \${var}" → "Bienvenido \${var}"
52
+ - "You have {count} items" → "Tienes {count} elementos"
53
+ - "Click <strong>here</strong>" → "Haz clic <strong>aquí</strong>"
54
+
55
+ ❌ INCORRECT:
56
+ - "Welcome \${var}" → "Bienvenido Juan" (translated variable)
57
+ - "You have {var} items" → "Tienes 3 elementos" (removed braces)
58
+ - "Click <strong>here</strong>" → "Haz clic **aquí**" (changed HTML to markdown)`,c=({model:n,systemPrompt:r=s})=>async({dictionary:i,projectLocale:a,locale:c})=>{let{object:l}=await e({model:n,output:`object`,schema:t.record(t.string(),t.string()),system:r?o.outdent`
59
+ ${s}
60
+
61
+ ## Additonal User System Instructions (highest priority)
62
+ ${r}
63
+ `:s,prompt:o.outdent`
64
+ Translate the following JSON from "${a}" to "${c}".
65
+ <target-json>
66
+ ${JSON.stringify(i,null,2)}
67
+ </target-json>
68
+ `});return l},l=({sourceLanguageCode:e=`auto`,...t})=>{let i=new n(t);return async({dictionary:t,locale:n,projectLocale:a})=>{let o={},s=e===`auto`?a:e;return await Promise.all(Object.keys(t).map(async e=>{let a=t[e],c=new r({Text:a,SourceLanguageCode:s,TargetLanguageCode:n});o[e]=(await i.send(c)).TranslatedText||a})),o}},u=({subscriptionKey:e,region:t,endpoint:n=`https://api.cognitive.microsofttranslator.com`})=>async({dictionary:r,locale:i,projectLocale:a})=>{let o={},s=Object.keys(r),c=s.map(e=>({text:r[e]})),l=[];for(let e=0;e<c.length;e+=100)l.push(c.slice(e,e+100));let u=0;for(let c of l){let l=new URL(`/translate`,n);l.searchParams.set(`api-version`,`3.0`),l.searchParams.set(`from`,a),l.searchParams.set(`to`,i);let d=await fetch(l.toString(),{method:`POST`,headers:{"Ocp-Apim-Subscription-Key":e,"Ocp-Apim-Subscription-Region":t,"Content-Type":`application/json`},body:JSON.stringify(c)});if(!d.ok){let e=await d.text();throw Error(`Azure Translator API error: ${d.status} - ${e}`)}let f=await d.json();for(let e of f){let t=s[u];o[t]=e.translations[0]?.text||r[t],u++}}return o},d=({authKey:e,options:t,formality:n=`default`,preserveFormatting:r=!0,tagHandling:a=`xml`})=>{let o=new i.Translator(e,t);return async({dictionary:e,locale:t,projectLocale:i})=>{let s={},c=Object.keys(e),l=c.map(t=>e[t]),u=t.toUpperCase(),d=i.toUpperCase(),f=await o.translateText(l,d,u,{formality:n,preserveFormatting:r,tagHandling:a}),p=Array.isArray(f)?f:[f];for(let t=0;t<c.length;t++){let n=c[t];s[n]=p[t]?.text||e[n]}return s}},f=e=>{let t=new a.Translate(e);return async({dictionary:e,locale:n})=>{let r={};return await Promise.all(Object.keys(e).map(async i=>{let a=e[i],[o]=await t.translate(a,n);r[i]=o})),r}};export{c as createAiTranslator,l as createAwsTranslator,u as createAzureTranslator,d as createDeepLTranslator,f as createGoogleCloudTranslator};
60
69
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/translators/chat-gpt.ts","../../src/translators/google-cloud.ts"],"sourcesContent":["// Dependencies\nimport OpenAI, { type ClientOptions } from 'openai'\n\n// Types\nimport type { Dictionary, Translator } from '@terai/types'\n\nexport const createChatGptTranslator = (openaiOptions: ClientOptions) => {\n\tconst openai = new OpenAI(openaiOptions)\n\n\tconst translator: Translator = async ({\n\t\tdictionary,\n\t\tprojectLocale,\n\t\tlocale\n\t}) => {\n\t\tconst messagesJson = JSON.stringify(dictionary)\n\n\t\tconst response = await openai.chat.completions.create({\n\t\t\tmodel: 'gpt-3.5-turbo-0125',\n\t\t\tmessages: [\n\t\t\t\t{\n\t\t\t\t\trole: 'system',\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t// 'Act like a professional translator',\n\t\t\t\t\t\t`You will be provided with a JSON in locale: ${projectLocale}, and your task is to translate it to locale: ${locale}.`,\n\t\t\t\t\t\t// 'Keep the same structure and keys, just translate the values.',\n\t\t\t\t\t\t'Do not translate any escaped characters or \"${var}\" ocurrences, just keep them as they are'\n\t\t\t\t\t].join('.\\n')\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\trole: 'user',\n\t\t\t\t\tcontent: messagesJson\n\t\t\t\t}\n\t\t\t],\n\t\t\ttemperature: 0.4,\n\t\t\tfrequency_penalty: -2.0,\n\t\t\tpresence_penalty: -2.0\n\t\t})\n\n\t\treturn JSON.parse(\n\t\t\tresponse?.choices?.[0]?.message?.content || '{}'\n\t\t) as Dictionary\n\t}\n\n\treturn translator\n}\n","// Dependencies\nimport { v2 } from '@google-cloud/translate'\n\n// Types\nimport type { Dictionary, Translator } from '@terai/types'\n\nexport const createGoogleCloudTranslator = (options: v2.TranslateConfig) => {\n\tconst translate = new v2.Translate(options)\n\n\tconst translator: Translator = async ({ dictionary, locale }) => {\n\t\tconst translatedOutput: Dictionary = {}\n\n\t\tawait Promise.all(\n\t\t\tObject.keys(dictionary).map(async (key) => {\n\t\t\t\tconst value = dictionary[key]\n\n\t\t\t\tconst [translation] = await translate.translate(value, locale)\n\n\t\t\t\ttranslatedOutput[key] = translation\n\t\t\t})\n\t\t)\n\n\t\treturn translatedOutput\n\t}\n\n\treturn translator\n}\n"],"mappings":";AACA,OAAO,YAAoC;AAKpC,IAAM,0BAA0B,CAAC,kBAAiC;AACxE,QAAM,SAAS,IAAI,OAAO,aAAa;AAEvC,QAAM,aAAyB,OAAO;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,EACD,MAAM;AACL,UAAM,eAAe,KAAK,UAAU,UAAU;AAE9C,UAAM,WAAW,MAAM,OAAO,KAAK,YAAY,OAAO;AAAA,MACrD,OAAO;AAAA,MACP,UAAU;AAAA,QACT;AAAA,UACC,MAAM;AAAA,UACN,SAAS;AAAA;AAAA,YAER,+CAA+C,aAAa,iDAAiD,MAAM;AAAA;AAAA,YAEnH;AAAA,UACD,EAAE,KAAK,KAAK;AAAA,QACb;AAAA,QACA;AAAA,UACC,MAAM;AAAA,UACN,SAAS;AAAA,QACV;AAAA,MACD;AAAA,MACA,aAAa;AAAA,MACb,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,IACnB,CAAC;AAED,WAAO,KAAK;AAAA,MACX,UAAU,UAAU,CAAC,GAAG,SAAS,WAAW;AAAA,IAC7C;AAAA,EACD;AAEA,SAAO;AACR;;;AC3CA,SAAS,UAAU;AAKZ,IAAM,8BAA8B,CAAC,YAAgC;AAC3E,QAAM,YAAY,IAAI,GAAG,UAAU,OAAO;AAE1C,QAAM,aAAyB,OAAO,EAAE,YAAY,OAAO,MAAM;AAChE,UAAM,mBAA+B,CAAC;AAEtC,UAAM,QAAQ;AAAA,MACb,OAAO,KAAK,UAAU,EAAE,IAAI,OAAO,QAAQ;AAC1C,cAAM,QAAQ,WAAW,GAAG;AAE5B,cAAM,CAAC,WAAW,IAAI,MAAM,UAAU,UAAU,OAAO,MAAM;AAE7D,yBAAiB,GAAG,IAAI;AAAA,MACzB,CAAC;AAAA,IACF;AAEA,WAAO;AAAA,EACR;AAEA,SAAO;AACR;","names":[]}
1
+ {"version":3,"file":"index.mjs","names":["outdent","translator: Translator","translator: Translator","translatedOutput: Dictionary","translator: Translator","translatedOutput: Dictionary","batches: Array<Array<{ text: string }>>","results: AzureTranslationResponse","translator: Translator","translatedOutput: Dictionary","translator: Translator","translatedOutput: Dictionary"],"sources":["../../../../node_modules/.pnpm/outdent@0.8.0/node_modules/outdent/lib/index.js","../../src/translators/ai.ts","../../src/translators/aws.ts","../../src/translators/azure.ts","../../src/translators/deepl.ts","../../src/translators/google-cloud.ts"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.outdent = void 0;\n// In the absence of a WeakSet or WeakMap implementation, don't break, but don't cache either.\nfunction noop() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n}\nfunction createWeakMap() {\n if (typeof WeakMap !== \"undefined\") {\n return new WeakMap();\n }\n else {\n return fakeSetOrMap();\n }\n}\n/**\n * Creates and returns a no-op implementation of a WeakMap / WeakSet that never stores anything.\n */\nfunction fakeSetOrMap() {\n return {\n add: noop,\n delete: noop,\n get: noop,\n set: noop,\n has: function (k) {\n return false;\n },\n };\n}\n// Safe hasOwnProperty\nvar hop = Object.prototype.hasOwnProperty;\nvar has = function (obj, prop) {\n return hop.call(obj, prop);\n};\n// Copy all own enumerable properties from source to target\nfunction extend(target, source) {\n for (var prop in source) {\n if (has(source, prop)) {\n target[prop] = source[prop];\n }\n }\n return target;\n}\nvar reLeadingNewline = /^[ \\t]*(?:\\r\\n|\\r|\\n)/;\nvar reTrailingNewline = /(?:\\r\\n|\\r|\\n)[ \\t]*$/;\nvar reStartsWithNewlineOrIsEmpty = /^(?:[\\r\\n]|$)/;\nvar reDetectIndentation = /(?:\\r\\n|\\r|\\n)([ \\t]*)(?:[^ \\t\\r\\n]|$)/;\nvar reOnlyWhitespaceWithAtLeastOneNewline = /^[ \\t]*[\\r\\n][ \\t\\r\\n]*$/;\nfunction _outdentArray(strings, firstInterpolatedValueSetsIndentationLevel, options) {\n // If first interpolated value is a reference to outdent,\n // determine indentation level from the indentation of the interpolated value.\n var indentationLevel = 0;\n var match = strings[0].match(reDetectIndentation);\n if (match) {\n indentationLevel = match[1].length;\n }\n var reSource = \"(\\\\r\\\\n|\\\\r|\\\\n).{0,\" + indentationLevel + \"}\";\n var reMatchIndent = new RegExp(reSource, \"g\");\n if (firstInterpolatedValueSetsIndentationLevel) {\n strings = strings.slice(1);\n }\n var newline = options.newline, trimLeadingNewline = options.trimLeadingNewline, trimTrailingNewline = options.trimTrailingNewline;\n var normalizeNewlines = typeof newline === \"string\";\n var l = strings.length;\n var outdentedStrings = strings.map(function (v, i) {\n // Remove leading indentation from all lines\n v = v.replace(reMatchIndent, \"$1\");\n // Trim a leading newline from the first string\n if (i === 0 && trimLeadingNewline) {\n v = v.replace(reLeadingNewline, \"\");\n }\n // Trim a trailing newline from the last string\n if (i === l - 1 && trimTrailingNewline) {\n v = v.replace(reTrailingNewline, \"\");\n }\n // Normalize newlines\n if (normalizeNewlines) {\n v = v.replace(/\\r\\n|\\n|\\r/g, function (_) { return newline; });\n }\n return v;\n });\n return outdentedStrings;\n}\nfunction concatStringsAndValues(strings, values) {\n var ret = \"\";\n for (var i = 0, l = strings.length; i < l; i++) {\n ret += strings[i];\n if (i < l - 1) {\n ret += values[i];\n }\n }\n return ret;\n}\nfunction isTemplateStringsArray(v) {\n return has(v, \"raw\") && has(v, \"length\");\n}\n/**\n * It is assumed that opts will not change. If this is a problem, clone your options object and pass the clone to\n * makeInstance\n * @param options\n * @return {outdent}\n */\nfunction createInstance(options) {\n /** Cache of pre-processed template literal arrays */\n var arrayAutoIndentCache = createWeakMap();\n /**\n * Cache of pre-processed template literal arrays, where first interpolated value is a reference to outdent,\n * before interpolated values are injected.\n */\n var arrayFirstInterpSetsIndentCache = createWeakMap();\n function outdent(stringsOrOptions) {\n var values = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n values[_i - 1] = arguments[_i];\n }\n /* tslint:enable:no-shadowed-variable */\n if (isTemplateStringsArray(stringsOrOptions)) {\n var strings = stringsOrOptions;\n // Is first interpolated value a reference to outdent, alone on its own line, without any preceding non-whitespace?\n var firstInterpolatedValueSetsIndentationLevel = (values[0] === outdent || values[0] === defaultOutdent) &&\n reOnlyWhitespaceWithAtLeastOneNewline.test(strings[0]) &&\n reStartsWithNewlineOrIsEmpty.test(strings[1]);\n // Perform outdentation\n var cache = firstInterpolatedValueSetsIndentationLevel\n ? arrayFirstInterpSetsIndentCache\n : arrayAutoIndentCache;\n var renderedArray = cache.get(strings);\n if (!renderedArray) {\n renderedArray = _outdentArray(strings, firstInterpolatedValueSetsIndentationLevel, options);\n cache.set(strings, renderedArray);\n }\n /** If no interpolated values, skip concatenation step */\n if (values.length === 0) {\n return renderedArray[0];\n }\n /** Concatenate string literals with interpolated values */\n var rendered = concatStringsAndValues(renderedArray, firstInterpolatedValueSetsIndentationLevel ? values.slice(1) : values);\n return rendered;\n }\n else {\n // Create and return a new instance of outdent with the given options\n return createInstance(extend(extend({}, options), stringsOrOptions || {}));\n }\n }\n var fullOutdent = extend(outdent, {\n string: function (str) {\n return _outdentArray([str], false, options)[0];\n },\n });\n return fullOutdent;\n}\nvar defaultOutdent = createInstance({\n trimLeadingNewline: true,\n trimTrailingNewline: true,\n});\nexports.outdent = defaultOutdent;\n// Named exports. Simple and preferred.\n// import outdent from 'outdent';\nexports.default = defaultOutdent;\nif (typeof module !== \"undefined\") {\n // In webpack harmony-modules environments, module.exports is read-only,\n // so we fail gracefully.\n try {\n module.exports = defaultOutdent;\n Object.defineProperty(defaultOutdent, \"__esModule\", { value: true });\n defaultOutdent.default = defaultOutdent;\n defaultOutdent.outdent = defaultOutdent;\n }\n catch (e) { }\n}\n//# sourceMappingURL=index.js.map","// Dependencies\nimport { generateObject } from 'ai'\nimport { outdent } from 'outdent'\nimport { z } from 'zod'\n\n// Types\nimport type { LanguageModel } from 'ai'\nimport type { Translator } from '@terai/types'\n\nexport type CreateAiTranslatorOptions = {\n\t/**\n\t * The AI model to use for translation.\n\t * Can be any model from AI SDK providers (@ai-sdk/openai, @ai-sdk/anthropic, @ai-sdk/groq, etc.)\n\t *\n\t * @example\n\t * import { createOpenAI } from '@ai-sdk/openai'\n\t * const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY })\n\t * const model = openai('gpt-4o')\n\t *\n\t * @example\n\t * import { createGroq } from '@ai-sdk/groq'\n\t * const groq = createGroq({ apiKey: process.env.GROQ_API_KEY })\n\t * const model = groq('llama-3.3-70b-versatile')\n\t */\n\tmodel: LanguageModel\n\n\t/**\n\t * Custom system prompt for translation.\n\t * If not provided, a generic prompt will be used that covers most app translation cases.\n\t */\n\tsystemPrompt?: string\n}\n\nconst DEFAULT_SYSTEM_PROMPT = outdent`\n# Expert AI Translator\n\n## Your Role\nYou are an expert translator and localization specialist with deep expertise in software\napplications, user interfaces, and technical documentation. Your translations are accurate,\ncontextually appropriate, and maintain the natural feel of native language.\n\n## Critical Requirements\n\n### 1. Preserve Code Patterns\n- **NEVER** translate template variables (e.g., \\${var}, {var}, %s, %d)\n- **ALWAYS** keep placeholder syntax exactly as provided\n- **MAINTAIN** all escape sequences and special characters\n- **PRESERVE** HTML tags, markdown syntax, and formatting codes\n\n### 2. Translation Quality\n- Use **natural, idiomatic** expressions in the target language\n- Maintain **consistent terminology** throughout all strings\n- Adapt **cultural references** appropriately for the target locale\n- Ensure **grammatical correctness** and proper sentence structure\n\n### 3. Context Awareness\n- **UI Elements**: Keep translations concise for buttons, labels, and menus\n- **Messages**: Maintain appropriate tone (error messages: clear, help text: friendly)\n- **Technical Terms**: Use standard industry terminology when available\n- **Brand Names**: Do not translate proper nouns, product names, or brand names\n\n### 4. Formatting Guidelines\n- **Punctuation**: Follow target language conventions\n- **Capitalization**: Match target language standards (e.g., German nouns)\n- **Numbers & Dates**: Keep placeholders unchanged; format will be handled at runtime\n- **Whitespace**: Preserve spacing around variables and special characters\n\n### 5. Tone & Style\n- **Consistency**: Maintain uniform voice across all translations\n- **Formality**: Match the formality level of the source text\n- **Clarity**: Prioritize understanding over literal translation\n- **Brevity**: Keep translations concise, especially for UI elements\n\n## Output Format\n- Return ONLY a valid JSON object\n- Use the EXACT SAME KEYS as the input\n- Do NOT add newlines within string values\n- Do NOT modify, remove, or add keys\n- Do NOT include markdown code blocks or extra formatting\n\n## Examples of What to Preserve\n\n✅ CORRECT:\n- \"Welcome \\${var}\" → \"Bienvenido \\${var}\"\n- \"You have {count} items\" → \"Tienes {count} elementos\"\n- \"Click <strong>here</strong>\" → \"Haz clic <strong>aquí</strong>\"\n\n❌ INCORRECT:\n- \"Welcome \\${var}\" → \"Bienvenido Juan\" (translated variable)\n- \"You have {var} items\" → \"Tienes 3 elementos\" (removed braces)\n- \"Click <strong>here</strong>\" → \"Haz clic **aquí**\" (changed HTML to markdown)`\n\n/**\n * Creates an AI-powered translator using the Vercel AI SDK.\n *\n * This translator uses structured output generation to translate dictionaries\n * while preserving template variables, formatting, and code patterns.\n *\n * @example\n * ```ts\n * import { createAiTranslator } from '@terai/translator/translators'\n * import { createOpenAI } from '@ai-sdk/openai'\n *\n * const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY })\n * const translator = createAiTranslator({\n * model: openai('gpt-4o')\n * })\n * ```\n *\n * @example With Groq\n * ```ts\n * import { createAiTranslator } from '@terai/translator/translators'\n * import { createGroq } from '@ai-sdk/groq'\n *\n * const groq = createGroq({ apiKey: process.env.GROQ_API_KEY })\n * const translator = createAiTranslator({\n * model: groq('llama-3.3-70b-versatile')\n * })\n * ```\n *\n * @example With custom system prompt\n * ```ts\n * import { createAiTranslator } from '@terai/translator/translators'\n * import { createAnthropic } from '@ai-sdk/anthropic'\n *\n * const anthropic = createAnthropic({ apiKey: process.env.ANTHROPIC_API_KEY })\n * const translator = createAiTranslator({\n * model: anthropic('claude-3-5-sonnet-20241022'),\n * systemPrompt: 'Custom prompt for my specific use case...'\n * })\n * ```\n */\nexport const createAiTranslator = ({\n\tmodel,\n\tsystemPrompt = DEFAULT_SYSTEM_PROMPT\n}: CreateAiTranslatorOptions): Translator => {\n\tconst translator: Translator = async ({\n\t\tdictionary,\n\t\tprojectLocale,\n\t\tlocale\n\t}) => {\n\t\tconst { object: translation } = await generateObject({\n\t\t\tmodel,\n\t\t\toutput: 'object',\n\t\t\tschema: z.record(z.string(), z.string()),\n\t\t\tsystem: !systemPrompt\n\t\t\t\t? DEFAULT_SYSTEM_PROMPT\n\t\t\t\t: outdent`\n\t\t\t\t${DEFAULT_SYSTEM_PROMPT}\n\t\t\t\t\n\t\t\t\t## Additonal User System Instructions (highest priority)\n\t\t\t\t${systemPrompt}\n\t\t\t`,\n\t\t\tprompt: outdent`\n\t\t\tTranslate the following JSON from \"${projectLocale}\" to \"${locale}\".\n\t\t\t<target-json>\n\t\t\t\t${JSON.stringify(dictionary, null, 2)}\n\t\t\t</target-json>\n\t\t\t`\n\t\t})\n\n\t\treturn translation\n\t}\n\n\treturn translator\n}\n","// Dependencies\nimport {\n\tTranslateClient,\n\tTranslateTextCommand,\n\ttype TranslateClientConfig\n} from '@aws-sdk/client-translate'\n\n// Types\nimport type { Dictionary, Translator } from '@terai/types'\n\nexport type CreateAwsTranslatorOptions = TranslateClientConfig & {\n\t/**\n\t * The source language code (e.g., 'en', 'es', 'fr').\n\t * If not provided, AWS Translate will auto-detect the source language.\n\t * @default 'auto'\n\t */\n\tsourceLanguageCode?: string\n}\n\n/**\n * Creates a translator using AWS Translate.\n *\n * AWS Translate is a neural machine translation service that delivers\n * fast, high-quality, and affordable language translation.\n *\n * @example\n * ```ts\n * import { createAwsTranslator } from '@terai/translator/translators'\n *\n * const translator = createAwsTranslator({\n * region: 'us-east-1',\n * credentials: {\n * accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n * secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY\n * }\n * })\n * ```\n *\n * @example With AWS profile\n * ```ts\n * import { createAwsTranslator } from '@terai/translator/translators'\n * import { fromIni } from '@aws-sdk/credential-providers'\n *\n * const translator = createAwsTranslator({\n * region: 'us-east-1',\n * credentials: fromIni({ profile: 'my-profile' })\n * })\n * ```\n */\nexport const createAwsTranslator = ({\n\tsourceLanguageCode = 'auto',\n\t...clientConfig\n}: CreateAwsTranslatorOptions): Translator => {\n\tconst client = new TranslateClient(clientConfig)\n\n\tconst translator: Translator = async ({\n\t\tdictionary,\n\t\tlocale,\n\t\tprojectLocale\n\t}) => {\n\t\tconst translatedOutput: Dictionary = {}\n\n\t\t// Use projectLocale as source if not set to auto\n\t\tconst source =\n\t\t\tsourceLanguageCode === 'auto' ? projectLocale : sourceLanguageCode\n\n\t\tawait Promise.all(\n\t\t\tObject.keys(dictionary).map(async (key) => {\n\t\t\t\tconst value = dictionary[key]\n\n\t\t\t\tconst command = new TranslateTextCommand({\n\t\t\t\t\tText: value,\n\t\t\t\t\tSourceLanguageCode: source,\n\t\t\t\t\tTargetLanguageCode: locale\n\t\t\t\t})\n\n\t\t\t\tconst response = await client.send(command)\n\n\t\t\t\ttranslatedOutput[key] = response.TranslatedText || value\n\t\t\t})\n\t\t)\n\n\t\treturn translatedOutput\n\t}\n\n\treturn translator\n}\n","// Types\nimport type { Dictionary, Translator } from '@terai/types'\n\nexport type CreateAzureTranslatorOptions = {\n\t/**\n\t * Azure Translator subscription key.\n\t */\n\tsubscriptionKey: string\n\n\t/**\n\t * Azure region where the Translator resource is located.\n\t * @example 'eastus', 'westeurope', 'southeastasia'\n\t */\n\tregion: string\n\n\t/**\n\t * Custom endpoint URL. If not provided, uses the global endpoint.\n\t * @default 'https://api.cognitive.microsofttranslator.com'\n\t */\n\tendpoint?: string\n}\n\ntype AzureTranslationResponse = Array<{\n\ttranslations: Array<{\n\t\ttext: string\n\t\tto: string\n\t}>\n}>\n\n/**\n * Creates a translator using Microsoft Azure Translator.\n *\n * Azure Translator is a cloud-based machine translation service\n * that supports 100+ languages.\n *\n * @example\n * ```ts\n * import { createAzureTranslator } from '@terai/translator/translators'\n *\n * const translator = createAzureTranslator({\n * subscriptionKey: process.env.AZURE_TRANSLATOR_KEY,\n * region: 'eastus'\n * })\n * ```\n *\n * @example With custom endpoint\n * ```ts\n * import { createAzureTranslator } from '@terai/translator/translators'\n *\n * const translator = createAzureTranslator({\n * subscriptionKey: process.env.AZURE_TRANSLATOR_KEY,\n * region: 'eastus',\n * endpoint: 'https://my-custom-endpoint.cognitiveservices.azure.com'\n * })\n * ```\n */\nexport const createAzureTranslator = ({\n\tsubscriptionKey,\n\tregion,\n\tendpoint = 'https://api.cognitive.microsofttranslator.com'\n}: CreateAzureTranslatorOptions): Translator => {\n\tconst translator: Translator = async ({\n\t\tdictionary,\n\t\tlocale,\n\t\tprojectLocale\n\t}) => {\n\t\tconst translatedOutput: Dictionary = {}\n\t\tconst keys = Object.keys(dictionary)\n\t\tconst texts = keys.map((key) => ({ text: dictionary[key] }))\n\n\t\t// Azure Translator API accepts up to 100 texts per request\n\t\tconst batchSize = 100\n\t\tconst batches: Array<Array<{ text: string }>> = []\n\n\t\tfor (let i = 0; i < texts.length; i += batchSize) {\n\t\t\tbatches.push(texts.slice(i, i + batchSize))\n\t\t}\n\n\t\tlet keyIndex = 0\n\n\t\tfor (const batch of batches) {\n\t\t\tconst url = new URL('/translate', endpoint)\n\t\t\turl.searchParams.set('api-version', '3.0')\n\t\t\turl.searchParams.set('from', projectLocale)\n\t\t\turl.searchParams.set('to', locale)\n\n\t\t\tconst response = await fetch(url.toString(), {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Ocp-Apim-Subscription-Key': subscriptionKey,\n\t\t\t\t\t'Ocp-Apim-Subscription-Region': region,\n\t\t\t\t\t'Content-Type': 'application/json'\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(batch)\n\t\t\t})\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst errorText = await response.text()\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Azure Translator API error: ${response.status} - ${errorText}`\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst results: AzureTranslationResponse = await response.json()\n\n\t\t\tfor (const result of results) {\n\t\t\t\tconst key = keys[keyIndex]\n\t\t\t\ttranslatedOutput[key] = result.translations[0]?.text || dictionary[key]\n\t\t\t\tkeyIndex++\n\t\t\t}\n\t\t}\n\n\t\treturn translatedOutput\n\t}\n\n\treturn translator\n}\n","// Dependencies\nimport * as deepl from 'deepl-node'\n\n// Types\nimport type { Dictionary, Translator } from '@terai/types'\n\nexport type CreateDeepLTranslatorOptions = {\n\t/**\n\t * DeepL API authentication key.\n\t * Get your key from https://www.deepl.com/pro-api\n\t */\n\tauthKey: string\n\n\t/**\n\t * Additional options for the DeepL Translator.\n\t */\n\toptions?: deepl.TranslatorOptions\n\n\t/**\n\t * Formality preference for translations.\n\t * - 'default': Default formality\n\t * - 'more': More formal language\n\t * - 'less': Less formal language\n\t * - 'prefer_more': Prefer more formal if available\n\t * - 'prefer_less': Prefer less formal if available\n\t * @default 'default'\n\t */\n\tformality?: deepl.Formality\n\n\t/**\n\t * Whether to preserve formatting in translations.\n\t * @default true\n\t */\n\tpreserveFormatting?: boolean\n\n\t/**\n\t * Specify how to handle XML tags in text.\n\t * @default 'xml'\n\t */\n\ttagHandling?: 'xml' | 'html'\n}\n\n/**\n * Creates a translator using DeepL API.\n *\n * DeepL is known for producing high-quality, natural-sounding translations\n * and is often considered one of the best machine translation services available.\n *\n * @example\n * ```ts\n * import { createDeepLTranslator } from '@terai/translator/translators'\n *\n * const translator = createDeepLTranslator({\n * authKey: process.env.DEEPL_API_KEY\n * })\n * ```\n *\n * @example With formality preference\n * ```ts\n * import { createDeepLTranslator } from '@terai/translator/translators'\n *\n * const translator = createDeepLTranslator({\n * authKey: process.env.DEEPL_API_KEY,\n * formality: 'less' // Use informal language\n * })\n * ```\n *\n * @example With HTML tag handling\n * ```ts\n * import { createDeepLTranslator } from '@terai/translator/translators'\n *\n * const translator = createDeepLTranslator({\n * authKey: process.env.DEEPL_API_KEY,\n * tagHandling: 'html',\n * preserveFormatting: true\n * })\n * ```\n */\nexport const createDeepLTranslator = ({\n\tauthKey,\n\toptions,\n\tformality = 'default',\n\tpreserveFormatting = true,\n\ttagHandling = 'xml'\n}: CreateDeepLTranslatorOptions): Translator => {\n\tconst deeplTranslator = new deepl.Translator(authKey, options)\n\n\tconst translator: Translator = async ({\n\t\tdictionary,\n\t\tlocale,\n\t\tprojectLocale\n\t}) => {\n\t\tconst translatedOutput: Dictionary = {}\n\t\tconst keys = Object.keys(dictionary)\n\t\tconst texts = keys.map((key) => dictionary[key])\n\n\t\t// DeepL uses specific language codes (e.g., 'EN-US' instead of 'en-US')\n\t\tconst targetLang = locale.toUpperCase() as deepl.TargetLanguageCode\n\t\tconst sourceLang = projectLocale.toUpperCase() as deepl.SourceLanguageCode\n\n\t\tconst results = await deeplTranslator.translateText(\n\t\t\ttexts,\n\t\t\tsourceLang,\n\t\t\ttargetLang,\n\t\t\t{\n\t\t\t\tformality,\n\t\t\t\tpreserveFormatting,\n\t\t\t\ttagHandling\n\t\t\t}\n\t\t)\n\n\t\t// Handle both single result and array of results\n\t\tconst translationResults = Array.isArray(results) ? results : [results]\n\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tconst key = keys[i]\n\t\t\ttranslatedOutput[key] = translationResults[i]?.text || dictionary[key]\n\t\t}\n\n\t\treturn translatedOutput\n\t}\n\n\treturn translator\n}\n","// Dependencies\nimport { v2 } from '@google-cloud/translate'\n\n// Types\nimport type { Dictionary, Translator } from '@terai/types'\n\nexport type CreateGoogleCloudTranslatorOptions = v2.TranslateConfig\n\n/**\n * Creates a translator using Google Cloud Translation API.\n *\n * This translator uses Google Cloud's Neural Machine Translation (NMT)\n * for high-quality translations.\n *\n * @example\n * ```ts\n * import { createGoogleCloudTranslator } from '@terai/translator/translators'\n *\n * const translator = createGoogleCloudTranslator({\n * projectId: process.env.GOOGLE_CLOUD_PROJECT_ID,\n * keyFilename: './google-credentials.json'\n * })\n * ```\n *\n * @example With API key\n * ```ts\n * import { createGoogleCloudTranslator } from '@terai/translator/translators'\n *\n * const translator = createGoogleCloudTranslator({\n * key: process.env.GOOGLE_CLOUD_API_KEY\n * })\n * ```\n */\nexport const createGoogleCloudTranslator = (\n\toptions: CreateGoogleCloudTranslatorOptions\n): Translator => {\n\tconst translate = new v2.Translate(options)\n\n\tconst translator: Translator = async ({ dictionary, locale }) => {\n\t\tconst translatedOutput: Dictionary = {}\n\n\t\tawait Promise.all(\n\t\t\tObject.keys(dictionary).map(async (key) => {\n\t\t\t\tconst value = dictionary[key]\n\n\t\t\t\tconst [translation] = await translate.translate(value, locale)\n\n\t\t\t\ttranslatedOutput[key] = translation\n\t\t\t})\n\t\t)\n\n\t\treturn translatedOutput\n\t}\n\n\treturn translator\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@terai/translator",
3
3
  "description": "terai core translator",
4
- "version": "0.0.12",
5
- "main": "dist/index.js",
6
- "module": "dist/index.mjs",
7
- "types": "dist/index.d.ts",
4
+ "version": "0.0.14",
5
+ "main": "./dist/index.cjs",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
8
  "author": "Hugo Corta <corta.hugo@gmail.com>",
9
9
  "files": [
10
10
  "dist"
@@ -15,27 +15,60 @@
15
15
  },
16
16
  "exports": {
17
17
  ".": {
18
- "types": "./dist/index.d.ts",
19
- "require": "./dist/index.js",
20
- "import": "./dist/index.mjs"
18
+ "import": {
19
+ "types": "./dist/index.d.mts",
20
+ "default": "./dist/index.mjs"
21
+ },
22
+ "require": {
23
+ "types": "./dist/index.d.cts",
24
+ "default": "./dist/index.cjs"
25
+ }
21
26
  },
22
27
  "./translators": {
23
- "types": "./dist/translators/index.d.ts",
24
- "require": "./dist/translators/index.js",
25
- "import": "./dist/translators/index.mjs"
28
+ "import": {
29
+ "types": "./dist/translators/index.d.mts",
30
+ "default": "./dist/translators/index.mjs"
31
+ },
32
+ "require": {
33
+ "types": "./dist/translators/index.d.cts",
34
+ "default": "./dist/translators/index.cjs"
35
+ }
26
36
  }
27
37
  },
28
- "dependencies": {
38
+ "peerDependencies": {
39
+ "@aws-sdk/client-translate": "^3",
29
40
  "@google-cloud/translate": "^8",
30
- "openai": "^4"
41
+ "ai": "^5",
42
+ "deepl-node": "^1",
43
+ "zod": "^4"
44
+ },
45
+ "peerDependenciesMeta": {
46
+ "@aws-sdk/client-translate": {
47
+ "optional": true
48
+ },
49
+ "@google-cloud/translate": {
50
+ "optional": true
51
+ },
52
+ "ai": {
53
+ "optional": true
54
+ },
55
+ "deepl-node": {
56
+ "optional": true
57
+ },
58
+ "zod": {
59
+ "optional": true
60
+ }
31
61
  },
32
62
  "devDependencies": {
33
- "@terai/runtime": "0.0.12",
34
- "@terai/types": "0.0.12",
35
- "@terai/utils": "0.0.12"
63
+ "@aws-sdk/client-translate": "^3.936.0",
64
+ "@google-cloud/translate": "^9.3.0",
65
+ "deepl-node": "^1.22.0",
66
+ "@terai/runtime": "0.0.14",
67
+ "@terai/types": "0.0.14",
68
+ "@terai/utils": "0.0.14"
36
69
  },
37
70
  "scripts": {
38
- "dev": "tsup --format=esm,cjs --no-dts --watch",
39
- "build": "tsup"
71
+ "dev": "tsdown --format=esm --no-dts --watch",
72
+ "build": "tsdown"
40
73
  }
41
74
  }
package/dist/index.d.ts DELETED
@@ -1,9 +0,0 @@
1
- import { Config, Dictionary, Locale } from '@terai/types';
2
-
3
- type TranslateOptions = Pick<Config, 'translator' | 'projectLocale'> & {
4
- dictionary: Dictionary;
5
- locale: Locale;
6
- };
7
- declare function translate({ dictionary, projectLocale, locale, translator }: TranslateOptions): Promise<Dictionary>;
8
-
9
- export { type TranslateOptions, translate };
package/dist/index.js DELETED
@@ -1,17 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/translate.ts
2
- async function translate({
3
- dictionary,
4
- projectLocale,
5
- locale,
6
- translator
7
- }) {
8
- return translator({
9
- dictionary,
10
- projectLocale,
11
- locale
12
- });
13
- }
14
-
15
-
16
- exports.translate = translate;
17
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/terai/terai/packages/translator/dist/index.js","../src/translate.ts"],"names":[],"mappings":"AAAA;ACQA,MAAA,SAAsB,SAAA,CAAU;AAAA,EAC/B,UAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA;AACD,CAAA,EAA0C;AACzC,EAAA,OAAO,UAAA,CAAW;AAAA,IACjB,UAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,EACD,CAAC,CAAA;AACF;ADNA;AACE;AACF,8BAAC","file":"/home/runner/work/terai/terai/packages/translator/dist/index.js","sourcesContent":[null,"// Types\nimport type { Config, Locale, Dictionary } from '@terai/types'\n\nexport type TranslateOptions = Pick<Config, 'translator' | 'projectLocale'> & {\n\tdictionary: Dictionary\n\tlocale: Locale\n}\n\nexport async function translate({\n\tdictionary,\n\tprojectLocale,\n\tlocale,\n\ttranslator\n}: TranslateOptions): Promise<Dictionary> {\n\treturn translator({\n\t\tdictionary,\n\t\tprojectLocale,\n\t\tlocale\n\t})\n}\n"]}
@@ -1,9 +0,0 @@
1
- import { ClientOptions } from 'openai';
2
- import { Translator } from '@terai/types';
3
- import { v2 } from '@google-cloud/translate';
4
-
5
- declare const createChatGptTranslator: (openaiOptions: ClientOptions) => Translator;
6
-
7
- declare const createGoogleCloudTranslator: (options: v2.TranslateConfig) => Translator;
8
-
9
- export { createChatGptTranslator, createGoogleCloudTranslator };
@@ -1,60 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// src/translators/chat-gpt.ts
2
- var _openai = require('openai'); var _openai2 = _interopRequireDefault(_openai);
3
- var createChatGptTranslator = (openaiOptions) => {
4
- const openai = new (0, _openai2.default)(openaiOptions);
5
- const translator = async ({
6
- dictionary,
7
- projectLocale,
8
- locale
9
- }) => {
10
- const messagesJson = JSON.stringify(dictionary);
11
- const response = await openai.chat.completions.create({
12
- model: "gpt-3.5-turbo-0125",
13
- messages: [
14
- {
15
- role: "system",
16
- content: [
17
- // 'Act like a professional translator',
18
- `You will be provided with a JSON in locale: ${projectLocale}, and your task is to translate it to locale: ${locale}.`,
19
- // 'Keep the same structure and keys, just translate the values.',
20
- 'Do not translate any escaped characters or "${var}" ocurrences, just keep them as they are'
21
- ].join(".\n")
22
- },
23
- {
24
- role: "user",
25
- content: messagesJson
26
- }
27
- ],
28
- temperature: 0.4,
29
- frequency_penalty: -2,
30
- presence_penalty: -2
31
- });
32
- return JSON.parse(
33
- _optionalChain([response, 'optionalAccess', _ => _.choices, 'optionalAccess', _2 => _2[0], 'optionalAccess', _3 => _3.message, 'optionalAccess', _4 => _4.content]) || "{}"
34
- );
35
- };
36
- return translator;
37
- };
38
-
39
- // src/translators/google-cloud.ts
40
- var _translate = require('@google-cloud/translate');
41
- var createGoogleCloudTranslator = (options) => {
42
- const translate = new _translate.v2.Translate(options);
43
- const translator = async ({ dictionary, locale }) => {
44
- const translatedOutput = {};
45
- await Promise.all(
46
- Object.keys(dictionary).map(async (key) => {
47
- const value = dictionary[key];
48
- const [translation] = await translate.translate(value, locale);
49
- translatedOutput[key] = translation;
50
- })
51
- );
52
- return translatedOutput;
53
- };
54
- return translator;
55
- };
56
-
57
-
58
-
59
- exports.createChatGptTranslator = createChatGptTranslator; exports.createGoogleCloudTranslator = createGoogleCloudTranslator;
60
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/terai/terai/packages/translator/dist/translators/index.js","../../src/translators/chat-gpt.ts","../../src/translators/google-cloud.ts"],"names":[],"mappings":"AAAA;ACCA,gFAA2C;AAKpC,IAAM,wBAAA,EAA0B,CAAC,aAAA,EAAA,GAAiC;AACxE,EAAA,MAAM,OAAA,EAAS,IAAI,qBAAA,CAAO,aAAa,CAAA;AAEvC,EAAA,MAAM,WAAA,EAAyB,MAAA,CAAO;AAAA,IACrC,UAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,EACD,CAAA,EAAA,GAAM;AACL,IAAA,MAAM,aAAA,EAAe,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA;AAE9C,IAAA,MAAM,SAAA,EAAW,MAAM,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO;AAAA,MACrD,KAAA,EAAO,oBAAA;AAAA,MACP,QAAA,EAAU;AAAA,QACT;AAAA,UACC,IAAA,EAAM,QAAA;AAAA,UACN,OAAA,EAAS;AAAA;AAAA,YAER,CAAA,4CAAA,EAA+C,aAAa,CAAA,8CAAA,EAAiD,MAAM,CAAA,CAAA,CAAA;AAAA;AAAA,YAEnH;AAAA,UACD,CAAA,CAAE,IAAA,CAAK,KAAK;AAAA,QACb,CAAA;AAAA,QACA;AAAA,UACC,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS;AAAA,QACV;AAAA,MACD,CAAA;AAAA,MACA,WAAA,EAAa,GAAA;AAAA,MACb,iBAAA,EAAmB,CAAA,CAAA;AAAA,MACnB,gBAAA,EAAkB,CAAA;AAAA,IACnB,CAAC,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,sBACX,QAAA,2BAAU,OAAA,4BAAA,CAAU,CAAC,CAAA,6BAAG,OAAA,6BAAS,UAAA,GAAW;AAAA,IAC7C,CAAA;AAAA,EACD,CAAA;AAEA,EAAA,OAAO,UAAA;AACR,CAAA;ADPA;AACA;AErCA,oDAAmB;AAKZ,IAAM,4BAAA,EAA8B,CAAC,OAAA,EAAA,GAAgC;AAC3E,EAAA,MAAM,UAAA,EAAY,IAAI,aAAA,CAAG,SAAA,CAAU,OAAO,CAAA;AAE1C,EAAA,MAAM,WAAA,EAAyB,MAAA,CAAO,EAAE,UAAA,EAAY,OAAO,CAAA,EAAA,GAAM;AAChE,IAAA,MAAM,iBAAA,EAA+B,CAAC,CAAA;AAEtC,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACb,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,GAAA,EAAA,GAAQ;AAC1C,QAAA,MAAM,MAAA,EAAQ,UAAA,CAAW,GAAG,CAAA;AAE5B,QAAA,MAAM,CAAC,WAAW,EAAA,EAAI,MAAM,SAAA,CAAU,SAAA,CAAU,KAAA,EAAO,MAAM,CAAA;AAE7D,QAAA,gBAAA,CAAiB,GAAG,EAAA,EAAI,WAAA;AAAA,MACzB,CAAC;AAAA,IACF,CAAA;AAEA,IAAA,OAAO,gBAAA;AAAA,EACR,CAAA;AAEA,EAAA,OAAO,UAAA;AACR,CAAA;AF6BA;AACE;AACA;AACF,6HAAC","file":"/home/runner/work/terai/terai/packages/translator/dist/translators/index.js","sourcesContent":[null,"// Dependencies\nimport OpenAI, { type ClientOptions } from 'openai'\n\n// Types\nimport type { Dictionary, Translator } from '@terai/types'\n\nexport const createChatGptTranslator = (openaiOptions: ClientOptions) => {\n\tconst openai = new OpenAI(openaiOptions)\n\n\tconst translator: Translator = async ({\n\t\tdictionary,\n\t\tprojectLocale,\n\t\tlocale\n\t}) => {\n\t\tconst messagesJson = JSON.stringify(dictionary)\n\n\t\tconst response = await openai.chat.completions.create({\n\t\t\tmodel: 'gpt-3.5-turbo-0125',\n\t\t\tmessages: [\n\t\t\t\t{\n\t\t\t\t\trole: 'system',\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t// 'Act like a professional translator',\n\t\t\t\t\t\t`You will be provided with a JSON in locale: ${projectLocale}, and your task is to translate it to locale: ${locale}.`,\n\t\t\t\t\t\t// 'Keep the same structure and keys, just translate the values.',\n\t\t\t\t\t\t'Do not translate any escaped characters or \"${var}\" ocurrences, just keep them as they are'\n\t\t\t\t\t].join('.\\n')\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\trole: 'user',\n\t\t\t\t\tcontent: messagesJson\n\t\t\t\t}\n\t\t\t],\n\t\t\ttemperature: 0.4,\n\t\t\tfrequency_penalty: -2.0,\n\t\t\tpresence_penalty: -2.0\n\t\t})\n\n\t\treturn JSON.parse(\n\t\t\tresponse?.choices?.[0]?.message?.content || '{}'\n\t\t) as Dictionary\n\t}\n\n\treturn translator\n}\n","// Dependencies\nimport { v2 } from '@google-cloud/translate'\n\n// Types\nimport type { Dictionary, Translator } from '@terai/types'\n\nexport const createGoogleCloudTranslator = (options: v2.TranslateConfig) => {\n\tconst translate = new v2.Translate(options)\n\n\tconst translator: Translator = async ({ dictionary, locale }) => {\n\t\tconst translatedOutput: Dictionary = {}\n\n\t\tawait Promise.all(\n\t\t\tObject.keys(dictionary).map(async (key) => {\n\t\t\t\tconst value = dictionary[key]\n\n\t\t\t\tconst [translation] = await translate.translate(value, locale)\n\n\t\t\t\ttranslatedOutput[key] = translation\n\t\t\t})\n\t\t)\n\n\t\treturn translatedOutput\n\t}\n\n\treturn translator\n}\n"]}