@terai/translator 0.0.16 → 0.0.18

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.
@@ -0,0 +1,72 @@
1
+ //#region ../types/dist/index.d.mts
2
+ //#region src/locale.d.ts
3
+ /**
4
+ * BCP 47 Locale Identifiers
5
+ *
6
+ * Every locale in Unicode CLDR v48.2.0, plus the language-region form
7
+ * of locales CLDR spells with a script (e.g. 'zh-CN' for 'zh-Hans-CN').
8
+ * Format follows BCP 47 standard using hyphens (e.g., 'en-US', 'zh-Hans-CN').
9
+ *
10
+ * Generated by scripts/generate-locales.mjs. Do not edit by hand.
11
+ *
12
+ * Structure:
13
+ * - language: ISO 639-1/639-3 language code (e.g., 'en', 'zh')
14
+ * - script: ISO 15924 script code (e.g., 'Hans', 'Latn')
15
+ * - region: ISO 3166-1 alpha-2 country code or UN M.49 region code (e.g., 'US', '419')
16
+ * - variant: Registered variant subtags (e.g., 'valencia', 'tarask')
17
+ *
18
+ * @see https://cldr.unicode.org/
19
+ * @see https://www.ietf.org/rfc/bcp/bcp47.txt
20
+ * @see https://www.iana.org/assignments/language-subtag-registry
21
+ */
22
+ type Locale = 'aa' | 'aa-DJ' | 'aa-ER' | 'aa-ET' | 'ab' | 'ab-GE' | 'af' | 'af-NA' | 'af-ZA' | 'agq' | 'agq-CM' | 'ak' | 'ak-GH' | 'am' | 'am-ET' | 'an' | 'an-ES' | 'ann' | 'ann-NG' | 'apc' | 'apc-SY' | 'ar' | 'ar-001' | 'ar-AE' | 'ar-BH' | 'ar-DJ' | 'ar-DZ' | 'ar-EG' | 'ar-EH' | 'ar-ER' | 'ar-IL' | 'ar-IQ' | 'ar-JO' | 'ar-KM' | 'ar-KW' | 'ar-LB' | 'ar-LY' | 'ar-MA' | 'ar-MR' | 'ar-OM' | 'ar-PS' | 'ar-QA' | 'ar-SA' | 'ar-SD' | 'ar-SO' | 'ar-SS' | 'ar-SY' | 'ar-TD' | 'ar-TN' | 'ar-YE' | 'arn' | 'arn-CL' | 'as' | 'as-IN' | 'asa' | 'asa-TZ' | 'ast' | 'ast-ES' | 'az' | 'az-AZ' | 'az-Arab' | 'az-Arab-IQ' | 'az-Arab-IR' | 'az-Arab-TR' | 'az-Cyrl' | 'az-Cyrl-AZ' | 'az-IQ' | 'az-IR' | 'az-Latn' | 'az-Latn-AZ' | 'ba' | 'ba-RU' | 'bal' | 'bal-Arab' | 'bal-Arab-PK' | 'bal-Latn' | 'bal-Latn-PK' | 'bal-PK' | 'bas' | 'bas-CM' | 'be' | 'be-BY' | 'be-tarask' | 'bem' | 'bem-ZM' | 'bew' | 'bew-ID' | 'bez' | 'bez-TZ' | 'bg' | 'bg-BG' | 'bgc' | 'bgc-IN' | 'bgn' | 'bgn-AE' | 'bgn-AF' | 'bgn-IR' | 'bgn-OM' | 'bgn-PK' | 'bho' | 'bho-IN' | 'blo' | 'blo-BJ' | 'blt' | 'blt-VN' | 'bm' | 'bm-ML' | 'bm-Nkoo' | 'bm-Nkoo-ML' | 'bn' | 'bn-BD' | 'bn-IN' | 'bo' | 'bo-CN' | 'bo-IN' | 'bqi' | 'bqi-IR' | 'br' | 'br-FR' | 'brx' | 'brx-IN' | 'bs' | 'bs-BA' | 'bs-Cyrl' | 'bs-Cyrl-BA' | 'bs-Latn' | 'bs-Latn-BA' | 'bss' | 'bss-CM' | 'bua' | 'bua-RU' | 'byn' | 'byn-ER' | 'ca' | 'ca-AD' | 'ca-ES' | 'ca-ES-valencia' | 'ca-FR' | 'ca-IT' | 'cad' | 'cad-US' | 'cch' | 'cch-NG' | 'ccp' | 'ccp-BD' | 'ccp-IN' | 'ce' | 'ce-RU' | 'ceb' | 'ceb-PH' | 'cgg' | 'cgg-UG' | 'cho' | 'cho-US' | 'chr' | 'chr-US' | 'cic' | 'cic-US' | 'ckb' | 'ckb-IQ' | 'ckb-IR' | 'co' | 'co-FR' | 'cop' | 'cop-EG' | 'cs' | 'cs-CZ' | 'csw' | 'csw-CA' | 'cu' | 'cu-RU' | 'cv' | 'cv-RU' | 'cy' | 'cy-GB' | 'da' | 'da-DK' | 'da-GL' | 'dav' | 'dav-KE' | 'de' | 'de-AT' | 'de-BE' | 'de-CH' | 'de-DE' | 'de-IT' | 'de-LI' | 'de-LU' | 'dje' | 'dje-NE' | 'doi' | 'doi-IN' | 'dsb' | 'dsb-DE' | 'dua' | 'dua-CM' | 'dv' | 'dv-MV' | 'dyo' | 'dyo-SN' | 'dz' | 'dz-BT' | 'ebu' | 'ebu-KE' | 'ee' | 'ee-GH' | 'ee-TG' | 'el' | 'el-CY' | 'el-GR' | 'el-polyton' | 'en' | 'en-001' | 'en-150' | 'en-AE' | 'en-AG' | 'en-AI' | 'en-AS' | 'en-AT' | 'en-AU' | 'en-BB' | 'en-BE' | 'en-BI' | 'en-BM' | 'en-BS' | 'en-BW' | 'en-BZ' | 'en-CA' | 'en-CC' | 'en-CH' | 'en-CK' | 'en-CM' | 'en-CX' | 'en-CY' | 'en-CZ' | 'en-DE' | 'en-DG' | 'en-DK' | 'en-DM' | 'en-Dsrt' | 'en-Dsrt-US' | 'en-EE' | 'en-ER' | 'en-ES' | 'en-FI' | 'en-FJ' | 'en-FK' | 'en-FM' | 'en-FR' | 'en-GB' | 'en-GD' | 'en-GE' | 'en-GG' | 'en-GH' | 'en-GI' | 'en-GM' | 'en-GS' | 'en-GU' | 'en-GY' | 'en-HK' | 'en-HU' | 'en-ID' | 'en-IE' | 'en-IL' | 'en-IM' | 'en-IN' | 'en-IO' | 'en-IT' | 'en-JE' | 'en-JM' | 'en-JP' | 'en-KE' | 'en-KI' | 'en-KN' | 'en-KY' | 'en-LC' | 'en-LR' | 'en-LS' | 'en-LT' | 'en-LV' | 'en-MG' | 'en-MH' | 'en-MO' | 'en-MP' | 'en-MS' | 'en-MT' | 'en-MU' | 'en-MV' | 'en-MW' | 'en-MY' | 'en-NA' | 'en-NF' | 'en-NG' | 'en-NL' | 'en-NO' | 'en-NR' | 'en-NU' | 'en-NZ' | 'en-PG' | 'en-PH' | 'en-PK' | 'en-PL' | 'en-PN' | 'en-PR' | 'en-PT' | 'en-PW' | 'en-RO' | 'en-RW' | 'en-SB' | 'en-SC' | 'en-SD' | 'en-SE' | 'en-SG' | 'en-SH' | 'en-SI' | 'en-SK' | 'en-SL' | 'en-SS' | 'en-SX' | 'en-SZ' | 'en-Shaw' | 'en-Shaw-GB' | 'en-TC' | 'en-TK' | 'en-TO' | 'en-TT' | 'en-TV' | 'en-TZ' | 'en-UA' | 'en-UG' | 'en-UM' | 'en-US' | 'en-VC' | 'en-VG' | 'en-VI' | 'en-VU' | 'en-WS' | 'en-ZA' | 'en-ZM' | 'en-ZW' | 'eo' | 'eo-001' | 'es' | 'es-419' | 'es-AR' | 'es-BO' | 'es-BR' | 'es-BZ' | 'es-CL' | 'es-CO' | 'es-CR' | 'es-CU' | 'es-DO' | 'es-EA' | 'es-EC' | 'es-ES' | 'es-GQ' | 'es-GT' | 'es-HN' | 'es-IC' | 'es-MX' | 'es-NI' | 'es-PA' | 'es-PE' | 'es-PH' | 'es-PR' | 'es-PY' | 'es-SV' | 'es-US' | 'es-UY' | 'es-VE' | 'et' | 'et-EE' | 'eu' | 'eu-ES' | 'ewo' | 'ewo-CM' | 'fa' | 'fa-AF' | 'fa-IR' | 'ff' | 'ff-Adlm' | 'ff-Adlm-BF' | 'ff-Adlm-CM' | 'ff-Adlm-GH' | 'ff-Adlm-GM' | 'ff-Adlm-GN' | 'ff-Adlm-GW' | 'ff-Adlm-LR' | 'ff-Adlm-MR' | 'ff-Adlm-NE' | 'ff-Adlm-NG' | 'ff-Adlm-SL' | 'ff-Adlm-SN' | 'ff-BF' | 'ff-CM' | 'ff-GH' | 'ff-GM' | 'ff-GN' | 'ff-GW' | 'ff-LR' | 'ff-Latn' | 'ff-Latn-BF' | 'ff-Latn-CM' | 'ff-Latn-GH' | 'ff-Latn-GM' | 'ff-Latn-GN' | 'ff-Latn-GW' | 'ff-Latn-LR' | 'ff-Latn-MR' | 'ff-Latn-NE' | 'ff-Latn-NG' | 'ff-Latn-SL' | 'ff-Latn-SN' | 'ff-MR' | 'ff-NE' | 'ff-NG' | 'ff-SL' | 'ff-SN' | 'fi' | 'fi-FI' | 'fil' | 'fil-PH' | 'fo' | 'fo-DK' | 'fo-FO' | 'fr' | 'fr-BE' | 'fr-BF' | 'fr-BI' | 'fr-BJ' | 'fr-BL' | 'fr-CA' | 'fr-CD' | 'fr-CF' | 'fr-CG' | 'fr-CH' | 'fr-CI' | 'fr-CM' | 'fr-DJ' | 'fr-DZ' | 'fr-FR' | 'fr-GA' | 'fr-GF' | 'fr-GN' | 'fr-GP' | 'fr-GQ' | 'fr-HT' | 'fr-KM' | 'fr-LU' | 'fr-MA' | 'fr-MC' | 'fr-MF' | 'fr-MG' | 'fr-ML' | 'fr-MQ' | 'fr-MR' | 'fr-MU' | 'fr-NC' | 'fr-NE' | 'fr-PF' | 'fr-PM' | 'fr-RE' | 'fr-RW' | 'fr-SC' | 'fr-SN' | 'fr-SY' | 'fr-TD' | 'fr-TG' | 'fr-TN' | 'fr-VU' | 'fr-WF' | 'fr-YT' | 'frr' | 'frr-DE' | 'fur' | 'fur-IT' | 'fy' | 'fy-NL' | 'ga' | 'ga-GB' | 'ga-IE' | 'gaa' | 'gaa-GH' | 'gd' | 'gd-GB' | 'gez' | 'gez-ER' | 'gez-ET' | 'gl' | 'gl-ES' | 'gn' | 'gn-PY' | 'gsw' | 'gsw-CH' | 'gsw-FR' | 'gsw-LI' | 'gu' | 'gu-IN' | 'guz' | 'guz-KE' | 'gv' | 'gv-IM' | 'ha' | 'ha-Arab' | 'ha-Arab-NG' | 'ha-Arab-SD' | 'ha-GH' | 'ha-NE' | 'ha-NG' | 'ha-SD' | 'haw' | 'haw-US' | 'he' | 'he-IL' | 'hi' | 'hi-IN' | 'hi-Latn' | 'hi-Latn-IN' | 'hnj' | 'hnj-Hmnp' | 'hnj-Hmnp-US' | 'hnj-US' | 'hr' | 'hr-BA' | 'hr-HR' | 'hsb' | 'hsb-DE' | 'ht' | 'ht-HT' | 'hu' | 'hu-HU' | 'hy' | 'hy-AM' | 'ia' | 'ia-001' | 'id' | 'id-ID' | 'ie' | 'ie-EE' | 'ig' | 'ig-NG' | 'ii' | 'ii-CN' | 'io' | 'io-001' | 'is' | 'is-IS' | 'it' | 'it-CH' | 'it-IT' | 'it-SM' | 'it-VA' | 'iu' | 'iu-CA' | 'iu-Latn' | 'iu-Latn-CA' | 'ja' | 'ja-JP' | 'jbo' | 'jbo-001' | 'jgo' | 'jgo-CM' | 'jmc' | 'jmc-TZ' | 'jv' | 'jv-ID' | 'ka' | 'ka-GE' | 'kaa' | 'kaa-Cyrl' | 'kaa-Cyrl-UZ' | 'kaa-Latn' | 'kaa-Latn-UZ' | 'kaa-UZ' | 'kab' | 'kab-DZ' | 'kaj' | 'kaj-NG' | 'kam' | 'kam-KE' | 'kcg' | 'kcg-NG' | 'kde' | 'kde-TZ' | 'kea' | 'kea-CV' | 'kek' | 'kek-GT' | 'ken' | 'ken-CM' | 'kgp' | 'kgp-BR' | 'khq' | 'khq-ML' | 'ki' | 'ki-KE' | 'kk' | 'kk-Arab' | 'kk-Arab-CN' | 'kk-CN' | 'kk-Cyrl' | 'kk-Cyrl-KZ' | 'kk-KZ' | 'kkj' | 'kkj-CM' | 'kl' | 'kl-GL' | 'kln' | 'kln-KE' | 'km' | 'km-KH' | 'kn' | 'kn-IN' | 'ko' | 'ko-CN' | 'ko-KP' | 'ko-KR' | 'kok' | 'kok-Deva' | 'kok-Deva-IN' | 'kok-IN' | 'kok-Latn' | 'kok-Latn-IN' | 'kpe' | 'kpe-GN' | 'kpe-LR' | 'ks' | 'ks-Arab' | 'ks-Arab-IN' | 'ks-Deva' | 'ks-Deva-IN' | 'ks-IN' | 'ksb' | 'ksb-TZ' | 'ksf' | 'ksf-CM' | 'ksh' | 'ksh-DE' | 'ku' | 'ku-Arab' | 'ku-Arab-IQ' | 'ku-Arab-IR' | 'ku-IQ' | 'ku-IR' | 'ku-Latn' | 'ku-Latn-IQ' | 'ku-Latn-SY' | 'ku-Latn-TR' | 'ku-SY' | 'ku-TR' | 'kw' | 'kw-GB' | 'kxv' | 'kxv-Deva' | 'kxv-Deva-IN' | 'kxv-IN' | 'kxv-Latn' | 'kxv-Latn-IN' | 'kxv-Orya' | 'kxv-Orya-IN' | 'kxv-Telu' | 'kxv-Telu-IN' | 'ky' | 'ky-KG' | 'la' | 'la-VA' | 'lag' | 'lag-TZ' | 'lb' | 'lb-LU' | 'lg' | 'lg-UG' | 'lij' | 'lij-IT' | 'lkt' | 'lkt-US' | 'lld' | 'lld-IT' | 'lmo' | 'lmo-IT' | 'ln' | 'ln-AO' | 'ln-CD' | 'ln-CF' | 'ln-CG' | 'lo' | 'lo-LA' | 'lrc' | 'lrc-IQ' | 'lrc-IR' | 'lt' | 'lt-LT' | 'ltg' | 'ltg-LV' | 'lu' | 'lu-CD' | 'luo' | 'luo-KE' | 'luy' | 'luy-KE' | 'lv' | 'lv-LV' | 'lzz' | 'lzz-TR' | 'mai' | 'mai-IN' | 'mas' | 'mas-KE' | 'mas-TZ' | 'mdf' | 'mdf-RU' | 'mer' | 'mer-KE' | 'mfe' | 'mfe-MU' | 'mg' | 'mg-MG' | 'mgh' | 'mgh-MZ' | 'mgo' | 'mgo-CM' | 'mhn' | 'mhn-IT' | 'mi' | 'mi-NZ' | 'mic' | 'mic-CA' | 'mk' | 'mk-MK' | 'ml' | 'ml-IN' | 'mn' | 'mn-CN' | 'mn-MN' | 'mn-Mong' | 'mn-Mong-CN' | 'mn-Mong-MN' | 'mni' | 'mni-Beng' | 'mni-Beng-IN' | 'mni-IN' | 'mni-Mtei' | 'mni-Mtei-IN' | 'moh' | 'moh-CA' | 'mr' | 'mr-IN' | 'ms' | 'ms-Arab' | 'ms-Arab-BN' | 'ms-Arab-MY' | 'ms-BN' | 'ms-ID' | 'ms-MY' | 'ms-SG' | 'mt' | 'mt-MT' | 'mua' | 'mua-CM' | 'mus' | 'mus-US' | 'mww' | 'mww-Hmnp' | 'mww-Hmnp-US' | 'mww-US' | 'my' | 'my-MM' | 'myv' | 'myv-RU' | 'mzn' | 'mzn-IR' | 'naq' | 'naq-NA' | 'nb' | 'nb-NO' | 'nb-SJ' | 'nd' | 'nd-ZW' | 'nds' | 'nds-DE' | 'nds-NL' | 'ne' | 'ne-IN' | 'ne-NP' | 'nl' | 'nl-AW' | 'nl-BE' | 'nl-BQ' | 'nl-CW' | 'nl-NL' | 'nl-SR' | 'nl-SX' | 'nmg' | 'nmg-CM' | 'nn' | 'nn-NO' | 'nnh' | 'nnh-CM' | 'no' | 'no-NO' | 'nqo' | 'nqo-GN' | 'nr' | 'nr-ZA' | 'nso' | 'nso-ZA' | 'nus' | 'nus-SS' | 'nv' | 'nv-US' | 'ny' | 'ny-MW' | 'nyn' | 'nyn-UG' | 'oc' | 'oc-ES' | 'oc-FR' | 'oka' | 'oka-CA' | 'oka-US' | 'om' | 'om-ET' | 'om-KE' | 'or' | 'or-IN' | 'os' | 'os-GE' | 'os-RU' | 'osa' | 'osa-US' | 'pa' | 'pa-Arab' | 'pa-Arab-PK' | 'pa-Guru' | 'pa-Guru-IN' | 'pa-IN' | 'pa-PK' | 'pap' | 'pap-AW' | 'pap-CW' | 'pcm' | 'pcm-NG' | 'pi' | 'pi-GB' | 'pi-Latn' | 'pi-Latn-GB' | 'pis' | 'pis-SB' | 'pl' | 'pl-PL' | 'pms' | 'pms-IT' | 'prg' | 'prg-PL' | 'ps' | 'ps-AF' | 'ps-PK' | 'pt' | 'pt-AO' | 'pt-BR' | 'pt-CH' | 'pt-CV' | 'pt-GQ' | 'pt-GW' | 'pt-LU' | 'pt-MO' | 'pt-MZ' | 'pt-PT' | 'pt-ST' | 'pt-TL' | 'qu' | 'qu-BO' | 'qu-EC' | 'qu-PE' | 'quc' | 'quc-GT' | 'raj' | 'raj-IN' | 'rhg' | 'rhg-BD' | 'rhg-MM' | 'rhg-Rohg' | 'rhg-Rohg-BD' | 'rhg-Rohg-MM' | 'rif' | 'rif-MA' | 'rm' | 'rm-CH' | 'rn' | 'rn-BI' | 'ro' | 'ro-MD' | 'ro-RO' | 'rof' | 'rof-TZ' | 'ru' | 'ru-BY' | 'ru-KG' | 'ru-KZ' | 'ru-MD' | 'ru-RU' | 'ru-UA' | 'rw' | 'rw-RW' | 'rwk' | 'rwk-TZ' | 'sa' | 'sa-IN' | 'sah' | 'sah-RU' | 'saq' | 'saq-KE' | 'sat' | 'sat-Deva' | 'sat-Deva-IN' | 'sat-IN' | 'sat-Olck' | 'sat-Olck-IN' | 'sbp' | 'sbp-TZ' | 'sc' | 'sc-IT' | 'scn' | 'scn-IT' | 'sd' | 'sd-Arab' | 'sd-Arab-PK' | 'sd-Deva' | 'sd-Deva-IN' | 'sd-IN' | 'sd-PK' | 'sdh' | 'sdh-IQ' | 'sdh-IR' | 'se' | 'se-FI' | 'se-NO' | 'se-SE' | 'seh' | 'seh-MZ' | 'ses' | 'ses-ML' | 'sg' | 'sg-CF' | 'sgs' | 'sgs-LT' | 'shi' | 'shi-Latn' | 'shi-Latn-MA' | 'shi-MA' | 'shi-Tfng' | 'shi-Tfng-MA' | 'shn' | 'shn-MM' | 'shn-TH' | 'si' | 'si-LK' | 'sid' | 'sid-ET' | 'sk' | 'sk-SK' | 'skr' | 'skr-PK' | 'sl' | 'sl-SI' | 'sma' | 'sma-NO' | 'sma-SE' | 'smj' | 'smj-NO' | 'smj-SE' | 'smn' | 'smn-FI' | 'sms' | 'sms-FI' | 'sn' | 'sn-ZW' | 'so' | 'so-DJ' | 'so-ET' | 'so-KE' | 'so-SO' | 'sq' | 'sq-AL' | 'sq-MK' | 'sq-XK' | 'sr' | 'sr-BA' | 'sr-Cyrl' | 'sr-Cyrl-BA' | 'sr-Cyrl-ME' | 'sr-Cyrl-RS' | 'sr-Cyrl-XK' | 'sr-Latn' | 'sr-Latn-BA' | 'sr-Latn-ME' | 'sr-Latn-RS' | 'sr-Latn-XK' | 'sr-ME' | 'sr-RS' | 'sr-XK' | 'ss' | 'ss-SZ' | 'ss-ZA' | 'ssy' | 'ssy-ER' | 'st' | 'st-LS' | 'st-ZA' | 'su' | 'su-ID' | 'su-Latn' | 'su-Latn-ID' | 'suz' | 'suz-Deva' | 'suz-Deva-NP' | 'suz-NP' | 'suz-Sunu' | 'suz-Sunu-NP' | 'sv' | 'sv-AX' | 'sv-FI' | 'sv-SE' | 'sw' | 'sw-CD' | 'sw-KE' | 'sw-TZ' | 'sw-UG' | 'syr' | 'syr-IQ' | 'syr-SY' | 'szl' | 'szl-PL' | 'ta' | 'ta-IN' | 'ta-LK' | 'ta-MY' | 'ta-SG' | 'te' | 'te-IN' | 'teo' | 'teo-KE' | 'teo-UG' | 'tg' | 'tg-TJ' | 'th' | 'th-TH' | 'ti' | 'ti-ER' | 'ti-ET' | 'tig' | 'tig-ER' | 'tk' | 'tk-TM' | 'tn' | 'tn-BW' | 'tn-ZA' | 'to' | 'to-TO' | 'tok' | 'tok-001' | 'tpi' | 'tpi-PG' | 'tr' | 'tr-CY' | 'tr-TR' | 'trv' | 'trv-TW' | 'trw' | 'trw-PK' | 'ts' | 'ts-ZA' | 'tt' | 'tt-RU' | 'twq' | 'twq-NE' | 'tyv' | 'tyv-RU' | 'tzm' | 'tzm-MA' | 'ug' | 'ug-CN' | 'uk' | 'uk-UA' | 'und' | 'ur' | 'ur-IN' | 'ur-PK' | 'uz' | 'uz-AF' | 'uz-Arab' | 'uz-Arab-AF' | 'uz-Cyrl' | 'uz-Cyrl-UZ' | 'uz-Latn' | 'uz-Latn-UZ' | 'uz-UZ' | 'vai' | 'vai-LR' | 'vai-Latn' | 'vai-Latn-LR' | 'vai-Vaii' | 'vai-Vaii-LR' | 've' | 've-ZA' | 'vec' | 'vec-IT' | 'vi' | 'vi-VN' | 'vmw' | 'vmw-MZ' | 'vo' | 'vo-001' | 'vun' | 'vun-TZ' | 'wa' | 'wa-BE' | 'wae' | 'wae-CH' | 'wal' | 'wal-ET' | 'wbp' | 'wbp-AU' | 'wo' | 'wo-SN' | 'xh' | 'xh-ZA' | 'xnr' | 'xnr-IN' | 'xog' | 'xog-UG' | 'yav' | 'yav-CM' | 'yi' | 'yi-UA' | 'yo' | 'yo-BJ' | 'yo-NG' | 'yrl' | 'yrl-BR' | 'yrl-CO' | 'yrl-VE' | 'yue' | 'yue-CN' | 'yue-HK' | 'yue-Hans' | 'yue-Hans-CN' | 'yue-Hant' | 'yue-Hant-CN' | 'yue-Hant-HK' | 'yue-Hant-MO' | 'yue-MO' | 'za' | 'za-CN' | 'zgh' | 'zgh-MA' | 'zh' | 'zh-CN' | 'zh-HK' | 'zh-Hans' | 'zh-Hans-CN' | 'zh-Hans-HK' | 'zh-Hans-MO' | 'zh-Hans-MY' | 'zh-Hans-SG' | 'zh-Hant' | 'zh-Hant-HK' | 'zh-Hant-MO' | 'zh-Hant-MY' | 'zh-Hant-TW' | 'zh-Latn' | 'zh-Latn-CN' | 'zh-MO' | 'zh-MY' | 'zh-SG' | 'zh-TW' | 'zu' | 'zu-ZA';
23
+ //#endregion
24
+ //#region src/dictionary.d.ts
25
+ type Dictionary = Record<string, string>;
26
+ //#endregion
27
+ //#region src/translator.d.ts
28
+ type Translator = ({ dictionary, locale, projectLocale }: {
29
+ dictionary: Dictionary;
30
+ locale: Locale;
31
+ projectLocale: Locale;
32
+ }) => Promise<Dictionary>;
33
+ //#endregion
34
+ //#region src/config.d.ts
35
+ /**
36
+ * Configuration for Terai
37
+ */
38
+ type Config = {
39
+ /**
40
+ * List of files glob to to look for your locale declarations
41
+ */
42
+ include: string[];
43
+ /**
44
+ * List of files glob to ignore
45
+ */
46
+ exclude?: string[];
47
+ /**
48
+ * The output directory for your locale system
49
+ */
50
+ outDir: string;
51
+ /**
52
+ * The base locale used in your project messages
53
+ */
54
+ projectLocale: Locale;
55
+ /**
56
+ * The aditional locales you want to support
57
+ */
58
+ outLocales: Locale[];
59
+ /**
60
+ * The translator for your messages
61
+ */
62
+ translator: Translator;
63
+ /**
64
+ * Maximum number of messages sent to the translator in a single call.
65
+ * Batches run concurrently and are saved independently, so a failing batch
66
+ * does not discard the others. Defaults to sending every message at once.
67
+ */
68
+ batchSize?: number;
69
+ };
70
+ //#endregion
71
+ export { Translator as i, Dictionary as n, Locale as r, Config as t };
72
+ //# sourceMappingURL=index-7t-AdJLS.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-7t-AdJLS.d.cts","names":[],"sources":["../../types/dist/index.d.mts"],"mappings":";;;;;;;;;;;;;;;;;;;;;KAoBY;;;KAGA,aAAa;;;KAKb,gBAAgB,YAAY,QAAQ;EAC9C,YAAY;EACZ,QAAQ;EACR,eAAe;MACX,QAAQ;;;;;;KAMF;;;;EAIV;;;;EAIA;;;;EAIA;;;;EAIA,eAAe;;;;EAIf,YAAY;;;;EAIZ,YAAY;;;;;;EAMZ"}
@@ -0,0 +1,72 @@
1
+ //#region ../types/dist/index.d.mts
2
+ //#region src/locale.d.ts
3
+ /**
4
+ * BCP 47 Locale Identifiers
5
+ *
6
+ * Every locale in Unicode CLDR v48.2.0, plus the language-region form
7
+ * of locales CLDR spells with a script (e.g. 'zh-CN' for 'zh-Hans-CN').
8
+ * Format follows BCP 47 standard using hyphens (e.g., 'en-US', 'zh-Hans-CN').
9
+ *
10
+ * Generated by scripts/generate-locales.mjs. Do not edit by hand.
11
+ *
12
+ * Structure:
13
+ * - language: ISO 639-1/639-3 language code (e.g., 'en', 'zh')
14
+ * - script: ISO 15924 script code (e.g., 'Hans', 'Latn')
15
+ * - region: ISO 3166-1 alpha-2 country code or UN M.49 region code (e.g., 'US', '419')
16
+ * - variant: Registered variant subtags (e.g., 'valencia', 'tarask')
17
+ *
18
+ * @see https://cldr.unicode.org/
19
+ * @see https://www.ietf.org/rfc/bcp/bcp47.txt
20
+ * @see https://www.iana.org/assignments/language-subtag-registry
21
+ */
22
+ type Locale = 'aa' | 'aa-DJ' | 'aa-ER' | 'aa-ET' | 'ab' | 'ab-GE' | 'af' | 'af-NA' | 'af-ZA' | 'agq' | 'agq-CM' | 'ak' | 'ak-GH' | 'am' | 'am-ET' | 'an' | 'an-ES' | 'ann' | 'ann-NG' | 'apc' | 'apc-SY' | 'ar' | 'ar-001' | 'ar-AE' | 'ar-BH' | 'ar-DJ' | 'ar-DZ' | 'ar-EG' | 'ar-EH' | 'ar-ER' | 'ar-IL' | 'ar-IQ' | 'ar-JO' | 'ar-KM' | 'ar-KW' | 'ar-LB' | 'ar-LY' | 'ar-MA' | 'ar-MR' | 'ar-OM' | 'ar-PS' | 'ar-QA' | 'ar-SA' | 'ar-SD' | 'ar-SO' | 'ar-SS' | 'ar-SY' | 'ar-TD' | 'ar-TN' | 'ar-YE' | 'arn' | 'arn-CL' | 'as' | 'as-IN' | 'asa' | 'asa-TZ' | 'ast' | 'ast-ES' | 'az' | 'az-AZ' | 'az-Arab' | 'az-Arab-IQ' | 'az-Arab-IR' | 'az-Arab-TR' | 'az-Cyrl' | 'az-Cyrl-AZ' | 'az-IQ' | 'az-IR' | 'az-Latn' | 'az-Latn-AZ' | 'ba' | 'ba-RU' | 'bal' | 'bal-Arab' | 'bal-Arab-PK' | 'bal-Latn' | 'bal-Latn-PK' | 'bal-PK' | 'bas' | 'bas-CM' | 'be' | 'be-BY' | 'be-tarask' | 'bem' | 'bem-ZM' | 'bew' | 'bew-ID' | 'bez' | 'bez-TZ' | 'bg' | 'bg-BG' | 'bgc' | 'bgc-IN' | 'bgn' | 'bgn-AE' | 'bgn-AF' | 'bgn-IR' | 'bgn-OM' | 'bgn-PK' | 'bho' | 'bho-IN' | 'blo' | 'blo-BJ' | 'blt' | 'blt-VN' | 'bm' | 'bm-ML' | 'bm-Nkoo' | 'bm-Nkoo-ML' | 'bn' | 'bn-BD' | 'bn-IN' | 'bo' | 'bo-CN' | 'bo-IN' | 'bqi' | 'bqi-IR' | 'br' | 'br-FR' | 'brx' | 'brx-IN' | 'bs' | 'bs-BA' | 'bs-Cyrl' | 'bs-Cyrl-BA' | 'bs-Latn' | 'bs-Latn-BA' | 'bss' | 'bss-CM' | 'bua' | 'bua-RU' | 'byn' | 'byn-ER' | 'ca' | 'ca-AD' | 'ca-ES' | 'ca-ES-valencia' | 'ca-FR' | 'ca-IT' | 'cad' | 'cad-US' | 'cch' | 'cch-NG' | 'ccp' | 'ccp-BD' | 'ccp-IN' | 'ce' | 'ce-RU' | 'ceb' | 'ceb-PH' | 'cgg' | 'cgg-UG' | 'cho' | 'cho-US' | 'chr' | 'chr-US' | 'cic' | 'cic-US' | 'ckb' | 'ckb-IQ' | 'ckb-IR' | 'co' | 'co-FR' | 'cop' | 'cop-EG' | 'cs' | 'cs-CZ' | 'csw' | 'csw-CA' | 'cu' | 'cu-RU' | 'cv' | 'cv-RU' | 'cy' | 'cy-GB' | 'da' | 'da-DK' | 'da-GL' | 'dav' | 'dav-KE' | 'de' | 'de-AT' | 'de-BE' | 'de-CH' | 'de-DE' | 'de-IT' | 'de-LI' | 'de-LU' | 'dje' | 'dje-NE' | 'doi' | 'doi-IN' | 'dsb' | 'dsb-DE' | 'dua' | 'dua-CM' | 'dv' | 'dv-MV' | 'dyo' | 'dyo-SN' | 'dz' | 'dz-BT' | 'ebu' | 'ebu-KE' | 'ee' | 'ee-GH' | 'ee-TG' | 'el' | 'el-CY' | 'el-GR' | 'el-polyton' | 'en' | 'en-001' | 'en-150' | 'en-AE' | 'en-AG' | 'en-AI' | 'en-AS' | 'en-AT' | 'en-AU' | 'en-BB' | 'en-BE' | 'en-BI' | 'en-BM' | 'en-BS' | 'en-BW' | 'en-BZ' | 'en-CA' | 'en-CC' | 'en-CH' | 'en-CK' | 'en-CM' | 'en-CX' | 'en-CY' | 'en-CZ' | 'en-DE' | 'en-DG' | 'en-DK' | 'en-DM' | 'en-Dsrt' | 'en-Dsrt-US' | 'en-EE' | 'en-ER' | 'en-ES' | 'en-FI' | 'en-FJ' | 'en-FK' | 'en-FM' | 'en-FR' | 'en-GB' | 'en-GD' | 'en-GE' | 'en-GG' | 'en-GH' | 'en-GI' | 'en-GM' | 'en-GS' | 'en-GU' | 'en-GY' | 'en-HK' | 'en-HU' | 'en-ID' | 'en-IE' | 'en-IL' | 'en-IM' | 'en-IN' | 'en-IO' | 'en-IT' | 'en-JE' | 'en-JM' | 'en-JP' | 'en-KE' | 'en-KI' | 'en-KN' | 'en-KY' | 'en-LC' | 'en-LR' | 'en-LS' | 'en-LT' | 'en-LV' | 'en-MG' | 'en-MH' | 'en-MO' | 'en-MP' | 'en-MS' | 'en-MT' | 'en-MU' | 'en-MV' | 'en-MW' | 'en-MY' | 'en-NA' | 'en-NF' | 'en-NG' | 'en-NL' | 'en-NO' | 'en-NR' | 'en-NU' | 'en-NZ' | 'en-PG' | 'en-PH' | 'en-PK' | 'en-PL' | 'en-PN' | 'en-PR' | 'en-PT' | 'en-PW' | 'en-RO' | 'en-RW' | 'en-SB' | 'en-SC' | 'en-SD' | 'en-SE' | 'en-SG' | 'en-SH' | 'en-SI' | 'en-SK' | 'en-SL' | 'en-SS' | 'en-SX' | 'en-SZ' | 'en-Shaw' | 'en-Shaw-GB' | 'en-TC' | 'en-TK' | 'en-TO' | 'en-TT' | 'en-TV' | 'en-TZ' | 'en-UA' | 'en-UG' | 'en-UM' | 'en-US' | 'en-VC' | 'en-VG' | 'en-VI' | 'en-VU' | 'en-WS' | 'en-ZA' | 'en-ZM' | 'en-ZW' | 'eo' | 'eo-001' | 'es' | 'es-419' | 'es-AR' | 'es-BO' | 'es-BR' | 'es-BZ' | 'es-CL' | 'es-CO' | 'es-CR' | 'es-CU' | 'es-DO' | 'es-EA' | 'es-EC' | 'es-ES' | 'es-GQ' | 'es-GT' | 'es-HN' | 'es-IC' | 'es-MX' | 'es-NI' | 'es-PA' | 'es-PE' | 'es-PH' | 'es-PR' | 'es-PY' | 'es-SV' | 'es-US' | 'es-UY' | 'es-VE' | 'et' | 'et-EE' | 'eu' | 'eu-ES' | 'ewo' | 'ewo-CM' | 'fa' | 'fa-AF' | 'fa-IR' | 'ff' | 'ff-Adlm' | 'ff-Adlm-BF' | 'ff-Adlm-CM' | 'ff-Adlm-GH' | 'ff-Adlm-GM' | 'ff-Adlm-GN' | 'ff-Adlm-GW' | 'ff-Adlm-LR' | 'ff-Adlm-MR' | 'ff-Adlm-NE' | 'ff-Adlm-NG' | 'ff-Adlm-SL' | 'ff-Adlm-SN' | 'ff-BF' | 'ff-CM' | 'ff-GH' | 'ff-GM' | 'ff-GN' | 'ff-GW' | 'ff-LR' | 'ff-Latn' | 'ff-Latn-BF' | 'ff-Latn-CM' | 'ff-Latn-GH' | 'ff-Latn-GM' | 'ff-Latn-GN' | 'ff-Latn-GW' | 'ff-Latn-LR' | 'ff-Latn-MR' | 'ff-Latn-NE' | 'ff-Latn-NG' | 'ff-Latn-SL' | 'ff-Latn-SN' | 'ff-MR' | 'ff-NE' | 'ff-NG' | 'ff-SL' | 'ff-SN' | 'fi' | 'fi-FI' | 'fil' | 'fil-PH' | 'fo' | 'fo-DK' | 'fo-FO' | 'fr' | 'fr-BE' | 'fr-BF' | 'fr-BI' | 'fr-BJ' | 'fr-BL' | 'fr-CA' | 'fr-CD' | 'fr-CF' | 'fr-CG' | 'fr-CH' | 'fr-CI' | 'fr-CM' | 'fr-DJ' | 'fr-DZ' | 'fr-FR' | 'fr-GA' | 'fr-GF' | 'fr-GN' | 'fr-GP' | 'fr-GQ' | 'fr-HT' | 'fr-KM' | 'fr-LU' | 'fr-MA' | 'fr-MC' | 'fr-MF' | 'fr-MG' | 'fr-ML' | 'fr-MQ' | 'fr-MR' | 'fr-MU' | 'fr-NC' | 'fr-NE' | 'fr-PF' | 'fr-PM' | 'fr-RE' | 'fr-RW' | 'fr-SC' | 'fr-SN' | 'fr-SY' | 'fr-TD' | 'fr-TG' | 'fr-TN' | 'fr-VU' | 'fr-WF' | 'fr-YT' | 'frr' | 'frr-DE' | 'fur' | 'fur-IT' | 'fy' | 'fy-NL' | 'ga' | 'ga-GB' | 'ga-IE' | 'gaa' | 'gaa-GH' | 'gd' | 'gd-GB' | 'gez' | 'gez-ER' | 'gez-ET' | 'gl' | 'gl-ES' | 'gn' | 'gn-PY' | 'gsw' | 'gsw-CH' | 'gsw-FR' | 'gsw-LI' | 'gu' | 'gu-IN' | 'guz' | 'guz-KE' | 'gv' | 'gv-IM' | 'ha' | 'ha-Arab' | 'ha-Arab-NG' | 'ha-Arab-SD' | 'ha-GH' | 'ha-NE' | 'ha-NG' | 'ha-SD' | 'haw' | 'haw-US' | 'he' | 'he-IL' | 'hi' | 'hi-IN' | 'hi-Latn' | 'hi-Latn-IN' | 'hnj' | 'hnj-Hmnp' | 'hnj-Hmnp-US' | 'hnj-US' | 'hr' | 'hr-BA' | 'hr-HR' | 'hsb' | 'hsb-DE' | 'ht' | 'ht-HT' | 'hu' | 'hu-HU' | 'hy' | 'hy-AM' | 'ia' | 'ia-001' | 'id' | 'id-ID' | 'ie' | 'ie-EE' | 'ig' | 'ig-NG' | 'ii' | 'ii-CN' | 'io' | 'io-001' | 'is' | 'is-IS' | 'it' | 'it-CH' | 'it-IT' | 'it-SM' | 'it-VA' | 'iu' | 'iu-CA' | 'iu-Latn' | 'iu-Latn-CA' | 'ja' | 'ja-JP' | 'jbo' | 'jbo-001' | 'jgo' | 'jgo-CM' | 'jmc' | 'jmc-TZ' | 'jv' | 'jv-ID' | 'ka' | 'ka-GE' | 'kaa' | 'kaa-Cyrl' | 'kaa-Cyrl-UZ' | 'kaa-Latn' | 'kaa-Latn-UZ' | 'kaa-UZ' | 'kab' | 'kab-DZ' | 'kaj' | 'kaj-NG' | 'kam' | 'kam-KE' | 'kcg' | 'kcg-NG' | 'kde' | 'kde-TZ' | 'kea' | 'kea-CV' | 'kek' | 'kek-GT' | 'ken' | 'ken-CM' | 'kgp' | 'kgp-BR' | 'khq' | 'khq-ML' | 'ki' | 'ki-KE' | 'kk' | 'kk-Arab' | 'kk-Arab-CN' | 'kk-CN' | 'kk-Cyrl' | 'kk-Cyrl-KZ' | 'kk-KZ' | 'kkj' | 'kkj-CM' | 'kl' | 'kl-GL' | 'kln' | 'kln-KE' | 'km' | 'km-KH' | 'kn' | 'kn-IN' | 'ko' | 'ko-CN' | 'ko-KP' | 'ko-KR' | 'kok' | 'kok-Deva' | 'kok-Deva-IN' | 'kok-IN' | 'kok-Latn' | 'kok-Latn-IN' | 'kpe' | 'kpe-GN' | 'kpe-LR' | 'ks' | 'ks-Arab' | 'ks-Arab-IN' | 'ks-Deva' | 'ks-Deva-IN' | 'ks-IN' | 'ksb' | 'ksb-TZ' | 'ksf' | 'ksf-CM' | 'ksh' | 'ksh-DE' | 'ku' | 'ku-Arab' | 'ku-Arab-IQ' | 'ku-Arab-IR' | 'ku-IQ' | 'ku-IR' | 'ku-Latn' | 'ku-Latn-IQ' | 'ku-Latn-SY' | 'ku-Latn-TR' | 'ku-SY' | 'ku-TR' | 'kw' | 'kw-GB' | 'kxv' | 'kxv-Deva' | 'kxv-Deva-IN' | 'kxv-IN' | 'kxv-Latn' | 'kxv-Latn-IN' | 'kxv-Orya' | 'kxv-Orya-IN' | 'kxv-Telu' | 'kxv-Telu-IN' | 'ky' | 'ky-KG' | 'la' | 'la-VA' | 'lag' | 'lag-TZ' | 'lb' | 'lb-LU' | 'lg' | 'lg-UG' | 'lij' | 'lij-IT' | 'lkt' | 'lkt-US' | 'lld' | 'lld-IT' | 'lmo' | 'lmo-IT' | 'ln' | 'ln-AO' | 'ln-CD' | 'ln-CF' | 'ln-CG' | 'lo' | 'lo-LA' | 'lrc' | 'lrc-IQ' | 'lrc-IR' | 'lt' | 'lt-LT' | 'ltg' | 'ltg-LV' | 'lu' | 'lu-CD' | 'luo' | 'luo-KE' | 'luy' | 'luy-KE' | 'lv' | 'lv-LV' | 'lzz' | 'lzz-TR' | 'mai' | 'mai-IN' | 'mas' | 'mas-KE' | 'mas-TZ' | 'mdf' | 'mdf-RU' | 'mer' | 'mer-KE' | 'mfe' | 'mfe-MU' | 'mg' | 'mg-MG' | 'mgh' | 'mgh-MZ' | 'mgo' | 'mgo-CM' | 'mhn' | 'mhn-IT' | 'mi' | 'mi-NZ' | 'mic' | 'mic-CA' | 'mk' | 'mk-MK' | 'ml' | 'ml-IN' | 'mn' | 'mn-CN' | 'mn-MN' | 'mn-Mong' | 'mn-Mong-CN' | 'mn-Mong-MN' | 'mni' | 'mni-Beng' | 'mni-Beng-IN' | 'mni-IN' | 'mni-Mtei' | 'mni-Mtei-IN' | 'moh' | 'moh-CA' | 'mr' | 'mr-IN' | 'ms' | 'ms-Arab' | 'ms-Arab-BN' | 'ms-Arab-MY' | 'ms-BN' | 'ms-ID' | 'ms-MY' | 'ms-SG' | 'mt' | 'mt-MT' | 'mua' | 'mua-CM' | 'mus' | 'mus-US' | 'mww' | 'mww-Hmnp' | 'mww-Hmnp-US' | 'mww-US' | 'my' | 'my-MM' | 'myv' | 'myv-RU' | 'mzn' | 'mzn-IR' | 'naq' | 'naq-NA' | 'nb' | 'nb-NO' | 'nb-SJ' | 'nd' | 'nd-ZW' | 'nds' | 'nds-DE' | 'nds-NL' | 'ne' | 'ne-IN' | 'ne-NP' | 'nl' | 'nl-AW' | 'nl-BE' | 'nl-BQ' | 'nl-CW' | 'nl-NL' | 'nl-SR' | 'nl-SX' | 'nmg' | 'nmg-CM' | 'nn' | 'nn-NO' | 'nnh' | 'nnh-CM' | 'no' | 'no-NO' | 'nqo' | 'nqo-GN' | 'nr' | 'nr-ZA' | 'nso' | 'nso-ZA' | 'nus' | 'nus-SS' | 'nv' | 'nv-US' | 'ny' | 'ny-MW' | 'nyn' | 'nyn-UG' | 'oc' | 'oc-ES' | 'oc-FR' | 'oka' | 'oka-CA' | 'oka-US' | 'om' | 'om-ET' | 'om-KE' | 'or' | 'or-IN' | 'os' | 'os-GE' | 'os-RU' | 'osa' | 'osa-US' | 'pa' | 'pa-Arab' | 'pa-Arab-PK' | 'pa-Guru' | 'pa-Guru-IN' | 'pa-IN' | 'pa-PK' | 'pap' | 'pap-AW' | 'pap-CW' | 'pcm' | 'pcm-NG' | 'pi' | 'pi-GB' | 'pi-Latn' | 'pi-Latn-GB' | 'pis' | 'pis-SB' | 'pl' | 'pl-PL' | 'pms' | 'pms-IT' | 'prg' | 'prg-PL' | 'ps' | 'ps-AF' | 'ps-PK' | 'pt' | 'pt-AO' | 'pt-BR' | 'pt-CH' | 'pt-CV' | 'pt-GQ' | 'pt-GW' | 'pt-LU' | 'pt-MO' | 'pt-MZ' | 'pt-PT' | 'pt-ST' | 'pt-TL' | 'qu' | 'qu-BO' | 'qu-EC' | 'qu-PE' | 'quc' | 'quc-GT' | 'raj' | 'raj-IN' | 'rhg' | 'rhg-BD' | 'rhg-MM' | 'rhg-Rohg' | 'rhg-Rohg-BD' | 'rhg-Rohg-MM' | 'rif' | 'rif-MA' | 'rm' | 'rm-CH' | 'rn' | 'rn-BI' | 'ro' | 'ro-MD' | 'ro-RO' | 'rof' | 'rof-TZ' | 'ru' | 'ru-BY' | 'ru-KG' | 'ru-KZ' | 'ru-MD' | 'ru-RU' | 'ru-UA' | 'rw' | 'rw-RW' | 'rwk' | 'rwk-TZ' | 'sa' | 'sa-IN' | 'sah' | 'sah-RU' | 'saq' | 'saq-KE' | 'sat' | 'sat-Deva' | 'sat-Deva-IN' | 'sat-IN' | 'sat-Olck' | 'sat-Olck-IN' | 'sbp' | 'sbp-TZ' | 'sc' | 'sc-IT' | 'scn' | 'scn-IT' | 'sd' | 'sd-Arab' | 'sd-Arab-PK' | 'sd-Deva' | 'sd-Deva-IN' | 'sd-IN' | 'sd-PK' | 'sdh' | 'sdh-IQ' | 'sdh-IR' | 'se' | 'se-FI' | 'se-NO' | 'se-SE' | 'seh' | 'seh-MZ' | 'ses' | 'ses-ML' | 'sg' | 'sg-CF' | 'sgs' | 'sgs-LT' | 'shi' | 'shi-Latn' | 'shi-Latn-MA' | 'shi-MA' | 'shi-Tfng' | 'shi-Tfng-MA' | 'shn' | 'shn-MM' | 'shn-TH' | 'si' | 'si-LK' | 'sid' | 'sid-ET' | 'sk' | 'sk-SK' | 'skr' | 'skr-PK' | 'sl' | 'sl-SI' | 'sma' | 'sma-NO' | 'sma-SE' | 'smj' | 'smj-NO' | 'smj-SE' | 'smn' | 'smn-FI' | 'sms' | 'sms-FI' | 'sn' | 'sn-ZW' | 'so' | 'so-DJ' | 'so-ET' | 'so-KE' | 'so-SO' | 'sq' | 'sq-AL' | 'sq-MK' | 'sq-XK' | 'sr' | 'sr-BA' | 'sr-Cyrl' | 'sr-Cyrl-BA' | 'sr-Cyrl-ME' | 'sr-Cyrl-RS' | 'sr-Cyrl-XK' | 'sr-Latn' | 'sr-Latn-BA' | 'sr-Latn-ME' | 'sr-Latn-RS' | 'sr-Latn-XK' | 'sr-ME' | 'sr-RS' | 'sr-XK' | 'ss' | 'ss-SZ' | 'ss-ZA' | 'ssy' | 'ssy-ER' | 'st' | 'st-LS' | 'st-ZA' | 'su' | 'su-ID' | 'su-Latn' | 'su-Latn-ID' | 'suz' | 'suz-Deva' | 'suz-Deva-NP' | 'suz-NP' | 'suz-Sunu' | 'suz-Sunu-NP' | 'sv' | 'sv-AX' | 'sv-FI' | 'sv-SE' | 'sw' | 'sw-CD' | 'sw-KE' | 'sw-TZ' | 'sw-UG' | 'syr' | 'syr-IQ' | 'syr-SY' | 'szl' | 'szl-PL' | 'ta' | 'ta-IN' | 'ta-LK' | 'ta-MY' | 'ta-SG' | 'te' | 'te-IN' | 'teo' | 'teo-KE' | 'teo-UG' | 'tg' | 'tg-TJ' | 'th' | 'th-TH' | 'ti' | 'ti-ER' | 'ti-ET' | 'tig' | 'tig-ER' | 'tk' | 'tk-TM' | 'tn' | 'tn-BW' | 'tn-ZA' | 'to' | 'to-TO' | 'tok' | 'tok-001' | 'tpi' | 'tpi-PG' | 'tr' | 'tr-CY' | 'tr-TR' | 'trv' | 'trv-TW' | 'trw' | 'trw-PK' | 'ts' | 'ts-ZA' | 'tt' | 'tt-RU' | 'twq' | 'twq-NE' | 'tyv' | 'tyv-RU' | 'tzm' | 'tzm-MA' | 'ug' | 'ug-CN' | 'uk' | 'uk-UA' | 'und' | 'ur' | 'ur-IN' | 'ur-PK' | 'uz' | 'uz-AF' | 'uz-Arab' | 'uz-Arab-AF' | 'uz-Cyrl' | 'uz-Cyrl-UZ' | 'uz-Latn' | 'uz-Latn-UZ' | 'uz-UZ' | 'vai' | 'vai-LR' | 'vai-Latn' | 'vai-Latn-LR' | 'vai-Vaii' | 'vai-Vaii-LR' | 've' | 've-ZA' | 'vec' | 'vec-IT' | 'vi' | 'vi-VN' | 'vmw' | 'vmw-MZ' | 'vo' | 'vo-001' | 'vun' | 'vun-TZ' | 'wa' | 'wa-BE' | 'wae' | 'wae-CH' | 'wal' | 'wal-ET' | 'wbp' | 'wbp-AU' | 'wo' | 'wo-SN' | 'xh' | 'xh-ZA' | 'xnr' | 'xnr-IN' | 'xog' | 'xog-UG' | 'yav' | 'yav-CM' | 'yi' | 'yi-UA' | 'yo' | 'yo-BJ' | 'yo-NG' | 'yrl' | 'yrl-BR' | 'yrl-CO' | 'yrl-VE' | 'yue' | 'yue-CN' | 'yue-HK' | 'yue-Hans' | 'yue-Hans-CN' | 'yue-Hant' | 'yue-Hant-CN' | 'yue-Hant-HK' | 'yue-Hant-MO' | 'yue-MO' | 'za' | 'za-CN' | 'zgh' | 'zgh-MA' | 'zh' | 'zh-CN' | 'zh-HK' | 'zh-Hans' | 'zh-Hans-CN' | 'zh-Hans-HK' | 'zh-Hans-MO' | 'zh-Hans-MY' | 'zh-Hans-SG' | 'zh-Hant' | 'zh-Hant-HK' | 'zh-Hant-MO' | 'zh-Hant-MY' | 'zh-Hant-TW' | 'zh-Latn' | 'zh-Latn-CN' | 'zh-MO' | 'zh-MY' | 'zh-SG' | 'zh-TW' | 'zu' | 'zu-ZA';
23
+ //#endregion
24
+ //#region src/dictionary.d.ts
25
+ type Dictionary = Record<string, string>;
26
+ //#endregion
27
+ //#region src/translator.d.ts
28
+ type Translator = ({ dictionary, locale, projectLocale }: {
29
+ dictionary: Dictionary;
30
+ locale: Locale;
31
+ projectLocale: Locale;
32
+ }) => Promise<Dictionary>;
33
+ //#endregion
34
+ //#region src/config.d.ts
35
+ /**
36
+ * Configuration for Terai
37
+ */
38
+ type Config = {
39
+ /**
40
+ * List of files glob to to look for your locale declarations
41
+ */
42
+ include: string[];
43
+ /**
44
+ * List of files glob to ignore
45
+ */
46
+ exclude?: string[];
47
+ /**
48
+ * The output directory for your locale system
49
+ */
50
+ outDir: string;
51
+ /**
52
+ * The base locale used in your project messages
53
+ */
54
+ projectLocale: Locale;
55
+ /**
56
+ * The aditional locales you want to support
57
+ */
58
+ outLocales: Locale[];
59
+ /**
60
+ * The translator for your messages
61
+ */
62
+ translator: Translator;
63
+ /**
64
+ * Maximum number of messages sent to the translator in a single call.
65
+ * Batches run concurrently and are saved independently, so a failing batch
66
+ * does not discard the others. Defaults to sending every message at once.
67
+ */
68
+ batchSize?: number;
69
+ };
70
+ //#endregion
71
+ export { Translator as i, Dictionary as n, Locale as r, Config as t };
72
+ //# sourceMappingURL=index-7t-AdJLS.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-7t-AdJLS.d.mts","names":[],"sources":["../../types/dist/index.d.mts"],"mappings":";;;;;;;;;;;;;;;;;;;;;KAoBY;;;KAGA,aAAa;;;KAKb,gBAAgB,YAAY,QAAQ;EAC9C,YAAY;EACZ,QAAQ;EACR,eAAe;MACX,QAAQ;;;;;;KAMF;;;;EAIV;;;;EAIA;;;;EAIA;;;;EAIA,eAAe;;;;EAIf,YAAY;;;;EAIZ,YAAY;;;;;;EAMZ"}
package/dist/index.cjs CHANGED
@@ -1,2 +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;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});async function e({dictionary:e,projectLocale:t,locale:n,translator:r}){return r({dictionary:e,projectLocale:t,locale:n})}async function t({dictionary:e,projectLocale:t,locale:n,translator:r,batchSize:i}){let a=Object.keys(e),o=i&&i>0?i:a.length,s=[];for(let e=0;e<a.length;e+=o)s.push(a.slice(e,e+o));let c=await Promise.allSettled(s.map(i=>r({dictionary:Object.fromEntries(i.map(t=>[t,e[t]])),projectLocale:t,locale:n}))),l={dictionary:{},missing:[],failed:[],errors:[]};return c.forEach((e,t)=>{let n=s[t];if(e.status===`rejected`)l.failed.push(...n),l.errors.push(e.reason);else for(let t of n){let n=e.value?.[t];typeof n==`string`&&n.trim()?l.dictionary[t]=n:l.missing.push(t)}}),l}exports.translate=e,exports.translateDictionary=t;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.cjs","names":["translate","translator","translateDictionary","ids","dictionary","size","batchSize","batches","i","results","batch","id","result","index","settled","value"],"sources":["../src/translate.ts","../src/translate-dictionary.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","// Types\nimport type { Config, Locale, Dictionary } from '@terai/types'\n\nexport type TranslateDictionaryOptions = Pick<\n\tConfig,\n\t'translator' | 'projectLocale' | 'batchSize'\n> & {\n\tdictionary: Dictionary\n\tlocale: Locale\n}\n\nexport type TranslateDictionaryResult = {\n\t/** Valid translations, keyed by the requested message ids only */\n\tdictionary: Dictionary\n\t/** Ids the translator returned no usable translation for */\n\tmissing: string[]\n\t/** Ids whose batch rejected */\n\tfailed: string[]\n\t/** Rejection reasons of the failed batches */\n\terrors: unknown[]\n}\n\nexport async function translateDictionary({\n\tdictionary,\n\tprojectLocale,\n\tlocale,\n\ttranslator,\n\tbatchSize\n}: TranslateDictionaryOptions): Promise<TranslateDictionaryResult> {\n\tconst ids = Object.keys(dictionary)\n\tconst size = batchSize && batchSize > 0 ? batchSize : ids.length\n\tconst batches: string[][] = []\n\n\tfor (let i = 0; i < ids.length; i += size) {\n\t\tbatches.push(ids.slice(i, i + size))\n\t}\n\n\tconst results = await Promise.allSettled(\n\t\tbatches.map((batch) =>\n\t\t\ttranslator({\n\t\t\t\tdictionary: Object.fromEntries(batch.map((id) => [id, dictionary[id]])),\n\t\t\t\tprojectLocale,\n\t\t\t\tlocale\n\t\t\t})\n\t\t)\n\t)\n\n\tconst result: TranslateDictionaryResult = {\n\t\tdictionary: {},\n\t\tmissing: [],\n\t\tfailed: [],\n\t\terrors: []\n\t}\n\n\tresults.forEach((settled, index) => {\n\t\tconst batch = batches[index]\n\n\t\tif (settled.status === 'rejected') {\n\t\t\tresult.failed.push(...batch)\n\t\t\tresult.errors.push(settled.reason)\n\t\t\treturn\n\t\t}\n\n\t\t// Keep only the ids that were asked for: translators (LLMs in particular)\n\t\t// may rename, drop or invent keys.\n\t\tfor (const id of batch) {\n\t\t\tconst value = settled.value?.[id]\n\n\t\t\tif (typeof value === 'string' && value.trim()) {\n\t\t\t\tresult.dictionary[id] = value\n\t\t\t} else {\n\t\t\t\tresult.missing.push(id)\n\t\t\t}\n\t\t}\n\t})\n\n\treturn result\n}\n"],"mappings":"A,mEAQA,eAAsBA,EAAU,CAC/B,aACA,gBACA,SACA,cACyC,CACzC,OAAOC,EAAW,CACjB,aACA,gBACA,QACD,CAAC,CACF,CCGA,eAAsBC,EAAoB,CACzC,aACA,gBACA,SACA,aACA,aACkE,CAClE,IAAMC,EAAM,OAAO,KAAKC,CAAU,EAC5BC,EAAOC,GAAaA,EAAY,EAAIA,EAAYH,EAAI,OACpDI,EAAsB,CAAC,EAE7B,IAAK,IAAIC,EAAI,EAAGA,EAAIL,EAAI,OAAQ,GAAKE,EACpCE,EAAQ,KAAKJ,EAAI,MAAMK,EAAGA,EAAIH,CAAI,CAAC,EAGpC,IAAMI,EAAU,MAAM,QAAQ,WAC7BF,EAAQ,IAAK,GACZN,EAAW,CACV,WAAY,OAAO,YAAYS,EAAM,IAAK,GAAO,CAACC,EAAIP,EAAWO,EAAG,CAAC,CAAC,EACtE,gBACA,QACD,CAAC,CACF,CACD,EAEMC,EAAoC,CACzC,WAAY,CAAC,EACb,QAAS,CAAC,EACV,OAAQ,CAAC,EACT,OAAQ,CAAC,CACV,EAwBA,OAtBAH,EAAQ,SAAS,EAAS,IAAU,CACnC,IAAMC,EAAQH,EAAQM,GAEtB,GAAIC,EAAQ,SAAW,WACtBF,EAAO,OAAO,KAAK,GAAGF,CAAK,EAC3BE,EAAO,OAAO,KAAKE,EAAQ,MAAM,OAMlC,IAAK,IAAMH,KAAMD,EAAO,CACvB,IAAMK,EAAQD,EAAQ,QAAQH,GAE1B,OAAOI,GAAU,UAAYA,EAAM,KAAK,EAC3C,EAAO,WAAWJ,GAAMI,EAExBH,EAAO,QAAQ,KAAKD,CAAE,CAExB,CACD,CAAC,EAEMC,CACR,C"}
package/dist/index.d.cts CHANGED
@@ -1,16 +1,26 @@
1
- import { Config, Dictionary, Locale } from "@terai/types";
2
-
1
+ import { n as Dictionary, r as Locale, t as Config } from "./index-7t-AdJLS.cjs";
3
2
  //#region src/translate.d.ts
4
- type TranslateOptions = Pick<Config, 'translator' | 'projectLocale'> & {
3
+ export type TranslateOptions = Pick<Config, 'translator' | 'projectLocale'> & {
5
4
  dictionary: Dictionary;
6
5
  locale: Locale;
7
6
  };
8
- declare function translate({
9
- dictionary,
10
- projectLocale,
11
- locale,
12
- translator
13
- }: TranslateOptions): Promise<Dictionary>;
7
+ export declare function translate({ dictionary, projectLocale, locale, translator }: TranslateOptions): Promise<Dictionary>;
8
+ //#endregion
9
+ //#region src/translate-dictionary.d.ts
10
+ export type TranslateDictionaryOptions = Pick<Config, 'translator' | 'projectLocale' | 'batchSize'> & {
11
+ dictionary: Dictionary;
12
+ locale: Locale;
13
+ };
14
+ export type TranslateDictionaryResult = {
15
+ /** Valid translations, keyed by the requested message ids only */
16
+ dictionary: Dictionary;
17
+ /** Ids the translator returned no usable translation for */
18
+ missing: string[];
19
+ /** Ids whose batch rejected */
20
+ failed: string[];
21
+ /** Rejection reasons of the failed batches */
22
+ errors: unknown[];
23
+ };
24
+ export declare function translateDictionary({ dictionary, projectLocale, locale, translator, batchSize }: TranslateDictionaryOptions): Promise<TranslateDictionaryResult>;
14
25
  //#endregion
15
- export { TranslateOptions, translate };
16
26
  //# sourceMappingURL=index.d.cts.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/translate.ts","../src/translate-dictionary.ts"],"mappings":";;YAGY,mBAAmB,KAAK;EACnC,YAAY;EACZ,QAAQ;;wBAGa,YACrB,YACA,eACA,QACA,cACE,mBAAmB,QAAQ;;;YCVlB,6BAA6B,KACxC;EAGA,YAAY;EACZ,QAAQ;;YAGG;;EAEX,YAAY;;EAEZ;;EAEA;;EAEA;;wBAGqB,sBACrB,YACA,eACA,QACA,YACA,aACE,6BAA6B,QAAQ"}
package/dist/index.d.mts CHANGED
@@ -1,16 +1,26 @@
1
- import { Config, Dictionary, Locale } from "@terai/types";
2
-
1
+ import { n as Dictionary, r as Locale, t as Config } from "./index-7t-AdJLS.mjs";
3
2
  //#region src/translate.d.ts
4
- type TranslateOptions = Pick<Config, 'translator' | 'projectLocale'> & {
3
+ export type TranslateOptions = Pick<Config, 'translator' | 'projectLocale'> & {
5
4
  dictionary: Dictionary;
6
5
  locale: Locale;
7
6
  };
8
- declare function translate({
9
- dictionary,
10
- projectLocale,
11
- locale,
12
- translator
13
- }: TranslateOptions): Promise<Dictionary>;
7
+ export declare function translate({ dictionary, projectLocale, locale, translator }: TranslateOptions): Promise<Dictionary>;
8
+ //#endregion
9
+ //#region src/translate-dictionary.d.ts
10
+ export type TranslateDictionaryOptions = Pick<Config, 'translator' | 'projectLocale' | 'batchSize'> & {
11
+ dictionary: Dictionary;
12
+ locale: Locale;
13
+ };
14
+ export type TranslateDictionaryResult = {
15
+ /** Valid translations, keyed by the requested message ids only */
16
+ dictionary: Dictionary;
17
+ /** Ids the translator returned no usable translation for */
18
+ missing: string[];
19
+ /** Ids whose batch rejected */
20
+ failed: string[];
21
+ /** Rejection reasons of the failed batches */
22
+ errors: unknown[];
23
+ };
24
+ export declare function translateDictionary({ dictionary, projectLocale, locale, translator, batchSize }: TranslateDictionaryOptions): Promise<TranslateDictionaryResult>;
14
25
  //#endregion
15
- export { TranslateOptions, translate };
16
26
  //# sourceMappingURL=index.d.mts.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/translate.ts","../src/translate-dictionary.ts"],"mappings":";;YAGY,mBAAmB,KAAK;EACnC,YAAY;EACZ,QAAQ;;wBAGa,YACrB,YACA,eACA,QACA,cACE,mBAAmB,QAAQ;;;YCVlB,6BAA6B,KACxC;EAGA,YAAY;EACZ,QAAQ;;YAGG;;EAEX,YAAY;;EAEZ;;EAEA;;EAEA;;wBAGqB,sBACrB,YACA,eACA,QACA,YACA,aACE,6BAA6B,QAAQ"}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- async function e({dictionary:e,projectLocale:t,locale:n,translator:r}){return r({dictionary:e,projectLocale:t,locale:n})}export{e as translate};
1
+ async function e({dictionary:e,projectLocale:t,locale:n,translator:r}){return r({dictionary:e,projectLocale:t,locale:n})}async function t({dictionary:e,projectLocale:t,locale:n,translator:r,batchSize:i}){let a=Object.keys(e),o=i&&i>0?i:a.length,s=[];for(let e=0;e<a.length;e+=o)s.push(a.slice(e,e+o));let c=await Promise.allSettled(s.map(i=>r({dictionary:Object.fromEntries(i.map(t=>[t,e[t]])),projectLocale:t,locale:n}))),l={dictionary:{},missing:[],failed:[],errors:[]};return c.forEach((e,t)=>{let n=s[t];if(e.status===`rejected`)l.failed.push(...n),l.errors.push(e.reason);else for(let t of n){let n=e.value?.[t];typeof n==`string`&&n.trim()?l.dictionary[t]=n:l.missing.push(t)}}),l}export{e as translate,t as translateDictionary};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"index.mjs","names":["translate","translator","translateDictionary","ids","dictionary","size","batchSize","batches","i","results","batch","id","result","index","settled","value"],"sources":["../src/translate.ts","../src/translate-dictionary.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","// Types\nimport type { Config, Locale, Dictionary } from '@terai/types'\n\nexport type TranslateDictionaryOptions = Pick<\n\tConfig,\n\t'translator' | 'projectLocale' | 'batchSize'\n> & {\n\tdictionary: Dictionary\n\tlocale: Locale\n}\n\nexport type TranslateDictionaryResult = {\n\t/** Valid translations, keyed by the requested message ids only */\n\tdictionary: Dictionary\n\t/** Ids the translator returned no usable translation for */\n\tmissing: string[]\n\t/** Ids whose batch rejected */\n\tfailed: string[]\n\t/** Rejection reasons of the failed batches */\n\terrors: unknown[]\n}\n\nexport async function translateDictionary({\n\tdictionary,\n\tprojectLocale,\n\tlocale,\n\ttranslator,\n\tbatchSize\n}: TranslateDictionaryOptions): Promise<TranslateDictionaryResult> {\n\tconst ids = Object.keys(dictionary)\n\tconst size = batchSize && batchSize > 0 ? batchSize : ids.length\n\tconst batches: string[][] = []\n\n\tfor (let i = 0; i < ids.length; i += size) {\n\t\tbatches.push(ids.slice(i, i + size))\n\t}\n\n\tconst results = await Promise.allSettled(\n\t\tbatches.map((batch) =>\n\t\t\ttranslator({\n\t\t\t\tdictionary: Object.fromEntries(batch.map((id) => [id, dictionary[id]])),\n\t\t\t\tprojectLocale,\n\t\t\t\tlocale\n\t\t\t})\n\t\t)\n\t)\n\n\tconst result: TranslateDictionaryResult = {\n\t\tdictionary: {},\n\t\tmissing: [],\n\t\tfailed: [],\n\t\terrors: []\n\t}\n\n\tresults.forEach((settled, index) => {\n\t\tconst batch = batches[index]\n\n\t\tif (settled.status === 'rejected') {\n\t\t\tresult.failed.push(...batch)\n\t\t\tresult.errors.push(settled.reason)\n\t\t\treturn\n\t\t}\n\n\t\t// Keep only the ids that were asked for: translators (LLMs in particular)\n\t\t// may rename, drop or invent keys.\n\t\tfor (const id of batch) {\n\t\t\tconst value = settled.value?.[id]\n\n\t\t\tif (typeof value === 'string' && value.trim()) {\n\t\t\t\tresult.dictionary[id] = value\n\t\t\t} else {\n\t\t\t\tresult.missing.push(id)\n\t\t\t}\n\t\t}\n\t})\n\n\treturn result\n}\n"],"mappings":"AAQA,eAAsBA,EAAU,CAC/B,aACA,gBACA,SACA,cACyC,CACzC,OAAOC,EAAW,CACjB,aACA,gBACA,QACD,CAAC,CACF,CCGA,eAAsBC,EAAoB,CACzC,aACA,gBACA,SACA,aACA,aACkE,CAClE,IAAMC,EAAM,OAAO,KAAKC,CAAU,EAC5BC,EAAOC,GAAaA,EAAY,EAAIA,EAAYH,EAAI,OACpDI,EAAsB,CAAC,EAE7B,IAAK,IAAIC,EAAI,EAAGA,EAAIL,EAAI,OAAQ,GAAKE,EACpCE,EAAQ,KAAKJ,EAAI,MAAMK,EAAGA,EAAIH,CAAI,CAAC,EAGpC,IAAMI,EAAU,MAAM,QAAQ,WAC7BF,EAAQ,IAAK,GACZN,EAAW,CACV,WAAY,OAAO,YAAYS,EAAM,IAAK,GAAO,CAACC,EAAIP,EAAWO,EAAG,CAAC,CAAC,EACtE,gBACA,QACD,CAAC,CACF,CACD,EAEMC,EAAoC,CACzC,WAAY,CAAC,EACb,QAAS,CAAC,EACV,OAAQ,CAAC,EACT,OAAQ,CAAC,CACV,EAwBA,OAtBAH,EAAQ,SAAS,EAAS,IAAU,CACnC,IAAMC,EAAQH,EAAQM,GAEtB,GAAIC,EAAQ,SAAW,WACtBF,EAAO,OAAO,KAAK,GAAGF,CAAK,EAC3BE,EAAO,OAAO,KAAKE,EAAQ,MAAM,OAMlC,IAAK,IAAMH,KAAMD,EAAO,CACvB,IAAMK,EAAQD,EAAQ,QAAQH,GAE1B,OAAOI,GAAU,UAAYA,EAAM,KAAK,EAC3C,EAAO,WAAWJ,GAAMI,EAExBH,EAAO,QAAQ,KAAKD,CAAE,CAExB,CACD,CAAC,EAEMC,CACR,C"}
@@ -1,4 +1,4 @@
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`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});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),e=null),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,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,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=(/* @__PURE__ */ 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`?/* @__PURE__ */ 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)}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 h=m.outdent`
2
2
  # Expert AI Translator
3
3
 
4
4
  ## Your Role
@@ -55,16 +55,16 @@ contextually appropriate, and maintain the natural feel of native language.
55
55
  ❌ INCORRECT:
56
56
  - "Welcome \${var}" → "Bienvenido Juan" (translated variable)
57
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:`no-schema`,system:t?h.outdent`
59
- ${g}
58
+ - "Click <strong>here</strong>" → "Haz clic **aquí**" (changed HTML to markdown)`,g=({model:e,systemPrompt:t=h})=>async({dictionary:n,projectLocale:r,locale:i})=>{let{object:a}=await(0,l.generateObject)({model:e,output:`no-schema`,system:t?m.outdent`
59
+ ${h}
60
60
 
61
61
  ## Additional User System Instructions (highest priority)
62
62
  ${t}
63
- `:g,prompt:h.outdent`
63
+ `:h,prompt:m.outdent`
64
64
  Translate the following JSON from locale:"${r}" to locale:"${i}".
65
65
 
66
66
  <target-json>
67
67
  ${JSON.stringify(n,null,2)}
68
68
  </target-json>
69
- `});return v.parse(a)},v=u.z.record(u.z.string(),u.z.string()),y=({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}},b=({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},x=({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}},S=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=y,exports.createAzureTranslator=b,exports.createDeepLTranslator=x,exports.createGoogleCloudTranslator=S;
69
+ `});return _.parse(a)},_=u.z.record(u.z.string(),u.z.string()),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}),c=await n.send(s);a[e]=c.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=g,exports.createAwsTranslator=v,exports.createAzureTranslator=y,exports.createDeepLTranslator=b,exports.createGoogleCloudTranslator=x;
70
70
  //# sourceMappingURL=index.cjs.map
@@ -1 +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 * const translator = createAiTranslator({ model })\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 (CRITICAL)\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 { 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: 'no-schema',\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## Additional User System Instructions (highest priority)\n\t\t\t\t${systemPrompt}\n\t\t\t`,\n\t\t\tprompt: outdent`\n\t\t\t\tTranslate the following JSON from locale:\"${projectLocale}\" to locale:\"${locale}\".\n\n\t\t\t\t<target-json>\n\t\t\t\t\t${JSON.stringify(dictionary, null, 2)}\n\t\t\t\t</target-json>\n\t\t\t`\n\t\t})\n\n\t\treturn JSONSchema.parse(translation)\n\t}\n\n\treturn translator\n}\n\nconst JSONSchema = z.record(z.string(), z.string())\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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"}
1
+ {"version":3,"file":"index.cjs","names":["generateObject","z","TranslateClient","TranslateTextCommand","deepl","v2","__create","__defProp","__getOwnPropDesc","__getOwnPropNames","__getProtoOf","__hasOwnProp","__commonJSMin","mod","cb","__copyProps","from","keys","i","n","key","to","except","k","desc","__toESM","isNodeMode","target","ai","zod","_aws_sdk_client_translate","deepl_node","_google_cloud_translate","import_lib","exports","noop","args","_i","createWeakMap","fakeSetOrMap","hop","has","obj","prop","extend","source","reLeadingNewline","reTrailingNewline","reStartsWithNewlineOrIsEmpty","reDetectIndentation","reOnlyWhitespaceWithAtLeastOneNewline","_outdentArray","indentationLevel","match","strings","reSource","reMatchIndent","firstInterpolatedValueSetsIndentationLevel","newline","options","trimLeadingNewline","trimTrailingNewline","normalizeNewlines","l","v","concatStringsAndValues","ret","values","isTemplateStringsArray","createInstance","arrayAutoIndentCache","arrayFirstInterpSetsIndentCache","outdent","stringsOrOptions","defaultOutdent","cache","renderedArray","str","module","DEFAULT_SYSTEM_PROMPT","createAiTranslator","translation","systemPrompt","projectLocale","locale","dictionary","JSONSchema","createAwsTranslator","clientConfig","client","translatedOutput","sourceLanguageCode","value","command","response","createAzureTranslator","texts","batches","keyIndex","batch","url","endpoint","subscriptionKey","region","errorText","results","result","createDeepLTranslator","deeplTranslator","authKey","targetLang","sourceLang","translationResults","createGoogleCloudTranslator","translate"],"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 * const translator = createAiTranslator({ model })\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 (CRITICAL)\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 { 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: 'no-schema',\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## Additional User System Instructions (highest priority)\n\t\t\t\t${systemPrompt}\n\t\t\t`,\n\t\t\tprompt: outdent`\n\t\t\t\tTranslate the following JSON from locale:\"${projectLocale}\" to locale:\"${locale}\".\n\n\t\t\t\t<target-json>\n\t\t\t\t\t${JSON.stringify(dictionary, null, 2)}\n\t\t\t\t</target-json>\n\t\t\t`\n\t\t})\n\n\t\treturn JSONSchema.parse(translation)\n\t}\n\n\treturn translator\n}\n\nconst JSONSchema = z.record(z.string(), z.string())\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"],"ignoreList":[0],"mappings":"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"}
@@ -1,11 +1,10 @@
1
- import { Translator } from "@terai/types";
1
+ import { i as Translator } from "../index-7t-AdJLS.cjs";
2
2
  import { LanguageModel } from "ai";
3
3
  import { TranslateClientConfig } from "@aws-sdk/client-translate";
4
4
  import * as deepl from "deepl-node";
5
5
  import { v2 } from "@google-cloud/translate";
6
-
7
6
  //#region src/translators/ai.d.ts
8
- type CreateAiTranslatorOptions = {
7
+ export type CreateAiTranslatorOptions = {
9
8
  /**
10
9
  * The AI model to use for translation.
11
10
  * Can be any model from AI SDK providers (@ai-sdk/openai, @ai-sdk/anthropic, @ai-sdk/groq, etc.)
@@ -41,13 +40,10 @@ type CreateAiTranslatorOptions = {
41
40
  * })
42
41
  * ```
43
42
  */
44
- declare const createAiTranslator: ({
45
- model,
46
- systemPrompt
47
- }: CreateAiTranslatorOptions) => Translator;
43
+ export declare const createAiTranslator: ({ model, systemPrompt }: CreateAiTranslatorOptions) => Translator;
48
44
  //#endregion
49
45
  //#region src/translators/aws.d.ts
50
- type CreateAwsTranslatorOptions = TranslateClientConfig & {
46
+ export type CreateAwsTranslatorOptions = TranslateClientConfig & {
51
47
  /**
52
48
  * The source language code (e.g., 'en', 'es', 'fr').
53
49
  * If not provided, AWS Translate will auto-detect the source language.
@@ -85,13 +81,10 @@ type CreateAwsTranslatorOptions = TranslateClientConfig & {
85
81
  * })
86
82
  * ```
87
83
  */
88
- declare const createAwsTranslator: ({
89
- sourceLanguageCode,
90
- ...clientConfig
91
- }: CreateAwsTranslatorOptions) => Translator;
84
+ export declare const createAwsTranslator: ({ sourceLanguageCode, ...clientConfig }: CreateAwsTranslatorOptions) => Translator;
92
85
  //#endregion
93
86
  //#region src/translators/azure.d.ts
94
- type CreateAzureTranslatorOptions = {
87
+ export type CreateAzureTranslatorOptions = {
95
88
  /**
96
89
  * Azure Translator subscription key.
97
90
  */
@@ -134,14 +127,10 @@ type CreateAzureTranslatorOptions = {
134
127
  * })
135
128
  * ```
136
129
  */
137
- declare const createAzureTranslator: ({
138
- subscriptionKey,
139
- region,
140
- endpoint
141
- }: CreateAzureTranslatorOptions) => Translator;
130
+ export declare const createAzureTranslator: ({ subscriptionKey, region, endpoint }: CreateAzureTranslatorOptions) => Translator;
142
131
  //#endregion
143
132
  //#region src/translators/deepl.d.ts
144
- type CreateDeepLTranslatorOptions = {
133
+ export type CreateDeepLTranslatorOptions = {
145
134
  /**
146
135
  * DeepL API authentication key.
147
136
  * Get your key from https://www.deepl.com/pro-api
@@ -208,16 +197,10 @@ type CreateDeepLTranslatorOptions = {
208
197
  * })
209
198
  * ```
210
199
  */
211
- declare const createDeepLTranslator: ({
212
- authKey,
213
- options,
214
- formality,
215
- preserveFormatting,
216
- tagHandling
217
- }: CreateDeepLTranslatorOptions) => Translator;
200
+ export declare const createDeepLTranslator: ({ authKey, options, formality, preserveFormatting, tagHandling }: CreateDeepLTranslatorOptions) => Translator;
218
201
  //#endregion
219
202
  //#region src/translators/google-cloud.d.ts
220
- type CreateGoogleCloudTranslatorOptions = v2.TranslateConfig;
203
+ export type CreateGoogleCloudTranslatorOptions = v2.TranslateConfig;
221
204
  /**
222
205
  * Creates a translator using Google Cloud Translation API.
223
206
  *
@@ -243,7 +226,6 @@ type CreateGoogleCloudTranslatorOptions = v2.TranslateConfig;
243
226
  * })
244
227
  * ```
245
228
  */
246
- declare const createGoogleCloudTranslator: (options: CreateGoogleCloudTranslatorOptions) => Translator;
229
+ export declare const createGoogleCloudTranslator: (options: CreateGoogleCloudTranslatorOptions) => Translator;
247
230
  //#endregion
248
- export { CreateAiTranslatorOptions, CreateAwsTranslatorOptions, CreateAzureTranslatorOptions, CreateDeepLTranslatorOptions, CreateGoogleCloudTranslatorOptions, createAiTranslator, createAwsTranslator, createAzureTranslator, createDeepLTranslator, createGoogleCloudTranslator };
249
231
  //# sourceMappingURL=index.d.cts.map
@@ -1 +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;AAiGA;;;;;EAiCC,KAAA,EAvHO,aAuHP;;;;ACjID;EAuCa,YAAA,CAAA,EAAA,MAAA;CAAuB;;;;;;;AC9CpC;AAqDA;;;;;;;;;;AClDA;AAwEa,cH4BA,kBGiBZ,EAAA,CAAA;EAAA,KAAA;EAAA;AAAA,CAAA,EHdE,yBGcF,EAAA,GHd8B,UGc9B;;;KFjHW,0BAAA,GAA6B;;;;;ADDzC;EAiGa,kBAAA,CAAA,EAiCZ,MAAA;CAjCkC;;;;;;;;AChGnC;AAuCA;;;;;;;;AC9CA;AAqDA;;;;;;;;;;AClDA;AAwEA;;AAAsC,cF7BzB,mBE6ByB,EAAA,CAAA;EAAA,kBAAA;EAAA,GAAA;AAAA,CAAA,EF1BnC,0BE0BmC,EAAA,GF1BN,UE0BM;;;KD3E1B,4BAAA;;;;;;AFMZ;AAiGA;;EAAmC,MAAA,EAAA,MAAA;EAGhC;;;;;;ACnGH;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;EAiGC;;;EAGV,OAAA,CAAA,EG7FQ,KAAA,CAAM,iBH6Fd;EAA4B;;;;;ACnG/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;AAiGA;;;;;;;;;AChGA;AAuCA;;;;;;;;AC9CA;AAqDA;AAAsC,cEvBzB,2BFuByB,EAAA,CAAA,OAAA,EEtB5B,kCFsB4B,EAAA,GErBnC,UFqBmC"}
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"],"mappings":";;;;;;YASY;;;;;;;;;;;EAWX,OAAO;;;;;EAMP;;;;;;;;;;;;;;;;;;;;qBAgFY,uBAAkB,OAAA,gBAG5B,8BAA4B;;;YCnGnB,6BAA6B;;;;;;EAMxC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAiCY,wBAAmB,uBAAA,gBAG7B,+BAA6B;;;YCjDpB;;;;EAIX;;;;;EAMA;;;;;EAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAqCY,0BAAqB,iBAAA,QAAA,YAI/B,iCAA+B;;;YCtDtB;;;;;EAKX;;;;EAKA,UAAU,MAAM;;;;;;;;;;EAWhB,YAAY,MAAM;;;;;EAMlB;;;;;EAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAuCY,0BAAqB,SAAA,SAAA,WAAA,oBAAA,eAM/B,iCAA+B;;;YC9EtB,qCAAqC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;qBA2BvC,8BAA2B,SAC9B,uCACP"}
@@ -1,11 +1,10 @@
1
+ import { i as Translator } from "../index-7t-AdJLS.mjs";
1
2
  import { LanguageModel } from "ai";
2
3
  import { TranslateClientConfig } from "@aws-sdk/client-translate";
3
4
  import * as deepl from "deepl-node";
4
5
  import { v2 } from "@google-cloud/translate";
5
- import { Translator } from "@terai/types";
6
-
7
6
  //#region src/translators/ai.d.ts
8
- type CreateAiTranslatorOptions = {
7
+ export type CreateAiTranslatorOptions = {
9
8
  /**
10
9
  * The AI model to use for translation.
11
10
  * Can be any model from AI SDK providers (@ai-sdk/openai, @ai-sdk/anthropic, @ai-sdk/groq, etc.)
@@ -41,13 +40,10 @@ type CreateAiTranslatorOptions = {
41
40
  * })
42
41
  * ```
43
42
  */
44
- declare const createAiTranslator: ({
45
- model,
46
- systemPrompt
47
- }: CreateAiTranslatorOptions) => Translator;
43
+ export declare const createAiTranslator: ({ model, systemPrompt }: CreateAiTranslatorOptions) => Translator;
48
44
  //#endregion
49
45
  //#region src/translators/aws.d.ts
50
- type CreateAwsTranslatorOptions = TranslateClientConfig & {
46
+ export type CreateAwsTranslatorOptions = TranslateClientConfig & {
51
47
  /**
52
48
  * The source language code (e.g., 'en', 'es', 'fr').
53
49
  * If not provided, AWS Translate will auto-detect the source language.
@@ -85,13 +81,10 @@ type CreateAwsTranslatorOptions = TranslateClientConfig & {
85
81
  * })
86
82
  * ```
87
83
  */
88
- declare const createAwsTranslator: ({
89
- sourceLanguageCode,
90
- ...clientConfig
91
- }: CreateAwsTranslatorOptions) => Translator;
84
+ export declare const createAwsTranslator: ({ sourceLanguageCode, ...clientConfig }: CreateAwsTranslatorOptions) => Translator;
92
85
  //#endregion
93
86
  //#region src/translators/azure.d.ts
94
- type CreateAzureTranslatorOptions = {
87
+ export type CreateAzureTranslatorOptions = {
95
88
  /**
96
89
  * Azure Translator subscription key.
97
90
  */
@@ -134,14 +127,10 @@ type CreateAzureTranslatorOptions = {
134
127
  * })
135
128
  * ```
136
129
  */
137
- declare const createAzureTranslator: ({
138
- subscriptionKey,
139
- region,
140
- endpoint
141
- }: CreateAzureTranslatorOptions) => Translator;
130
+ export declare const createAzureTranslator: ({ subscriptionKey, region, endpoint }: CreateAzureTranslatorOptions) => Translator;
142
131
  //#endregion
143
132
  //#region src/translators/deepl.d.ts
144
- type CreateDeepLTranslatorOptions = {
133
+ export type CreateDeepLTranslatorOptions = {
145
134
  /**
146
135
  * DeepL API authentication key.
147
136
  * Get your key from https://www.deepl.com/pro-api
@@ -208,16 +197,10 @@ type CreateDeepLTranslatorOptions = {
208
197
  * })
209
198
  * ```
210
199
  */
211
- declare const createDeepLTranslator: ({
212
- authKey,
213
- options,
214
- formality,
215
- preserveFormatting,
216
- tagHandling
217
- }: CreateDeepLTranslatorOptions) => Translator;
200
+ export declare const createDeepLTranslator: ({ authKey, options, formality, preserveFormatting, tagHandling }: CreateDeepLTranslatorOptions) => Translator;
218
201
  //#endregion
219
202
  //#region src/translators/google-cloud.d.ts
220
- type CreateGoogleCloudTranslatorOptions = v2.TranslateConfig;
203
+ export type CreateGoogleCloudTranslatorOptions = v2.TranslateConfig;
221
204
  /**
222
205
  * Creates a translator using Google Cloud Translation API.
223
206
  *
@@ -243,7 +226,6 @@ type CreateGoogleCloudTranslatorOptions = v2.TranslateConfig;
243
226
  * })
244
227
  * ```
245
228
  */
246
- declare const createGoogleCloudTranslator: (options: CreateGoogleCloudTranslatorOptions) => Translator;
229
+ export declare const createGoogleCloudTranslator: (options: CreateGoogleCloudTranslatorOptions) => Translator;
247
230
  //#endregion
248
- export { CreateAiTranslatorOptions, CreateAwsTranslatorOptions, CreateAzureTranslatorOptions, CreateDeepLTranslatorOptions, CreateGoogleCloudTranslatorOptions, createAiTranslator, createAwsTranslator, createAzureTranslator, createDeepLTranslator, createGoogleCloudTranslator };
249
231
  //# sourceMappingURL=index.d.mts.map
@@ -1 +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;AAiGA;;;;;EAiCC,KAAA,EAvHO,aAuHP;;;;ACjID;EAuCa,YAAA,CAAA,EAAA,MAAA;CAAuB;;;;;;;AC9CpC;AAqDA;;;;;;;;;;AClDA;AAwEa,cH4BA,kBGiBZ,EAAA,CAAA;EAAA,KAAA;EAAA;AAAA,CAAA,EHdE,yBGcF,EAAA,GHd8B,UGc9B;;;KFjHW,0BAAA,GAA6B;;;;;ADDzC;EAiGa,kBAAA,CAAA,EAiCZ,MAAA;CAjCkC;;;;;;;;AChGnC;AAuCA;;;;;;;;AC9CA;AAqDA;;;;;;;;;;AClDA;AAwEA;;AAAsC,cF7BzB,mBE6ByB,EAAA,CAAA;EAAA,kBAAA;EAAA,GAAA;AAAA,CAAA,EF1BnC,0BE0BmC,EAAA,GF1BN,UE0BM;;;KD3E1B,4BAAA;;;;;;AFMZ;AAiGA;;EAAmC,MAAA,EAAA,MAAA;EAGhC;;;;;;ACnGH;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;EAiGC;;;EAGV,OAAA,CAAA,EG7FQ,KAAA,CAAM,iBH6Fd;EAA4B;;;;;ACnG/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;AAiGA;;;;;;;;;AChGA;AAuCA;;;;;;;;AC9CA;AAqDA;AAAsC,cEvBzB,2BFuByB,EAAA,CAAA,OAAA,EEtB5B,kCFsB4B,EAAA,GErBnC,UFqBmC"}
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"],"mappings":";;;;;;YASY;;;;;;;;;;;EAWX,OAAO;;;;;EAMP;;;;;;;;;;;;;;;;;;;;qBAgFY,uBAAkB,OAAA,gBAG5B,8BAA4B;;;YCnGnB,6BAA6B;;;;;;EAMxC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAiCY,wBAAmB,uBAAA,gBAG7B,+BAA6B;;;YCjDpB;;;;EAIX;;;;;EAMA;;;;;EAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAqCY,0BAAqB,iBAAA,QAAA,YAI/B,iCAA+B;;;YCtDtB;;;;;EAKX;;;;EAKA,UAAU,MAAM;;;;;;;;;;EAWhB,YAAY,MAAM;;;;;EAMlB;;;;;EAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAuCY,0BAAqB,SAAA,SAAA,WAAA,oBAAA,eAM/B,iCAA+B;;;YC9EtB,qCAAqC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;qBA2BvC,8BAA2B,SAC9B,uCACP"}
@@ -1,4 +1,4 @@
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`
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=(/* @__PURE__ */ ((e,t)=>()=>(t||(e((t={exports:{}}).exports,t,t.exports),e=null),t.exports))(((e,t)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.outdent=void 0;function n(){}function r(){return typeof WeakMap<`u`?/* @__PURE__ */ 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)}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
2
  # Expert AI Translator
3
3
 
4
4
  ## Your Role
@@ -66,5 +66,5 @@ contextually appropriate, and maintain the natural feel of native language.
66
66
  <target-json>
67
67
  ${JSON.stringify(r,null,2)}
68
68
  </target-json>
69
- `});return l.parse(c)},l=t.record(t.string(),t.string()),u=({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}},d=({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},f=({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}},p=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,u as createAwsTranslator,d as createAzureTranslator,f as createDeepLTranslator,p as createGoogleCloudTranslator};
69
+ `});return l.parse(c)},l=t.record(t.string(),t.string()),u=({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}),l=await i.send(c);o[e]=l.TranslatedText||a})),o}},d=({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},f=({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}},p=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,u as createAwsTranslator,d as createAzureTranslator,f as createDeepLTranslator,p as createGoogleCloudTranslator};
70
70
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
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 * const translator = createAiTranslator({ model })\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 (CRITICAL)\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 { 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: 'no-schema',\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## Additional User System Instructions (highest priority)\n\t\t\t\t${systemPrompt}\n\t\t\t`,\n\t\t\tprompt: outdent`\n\t\t\t\tTranslate the following JSON from locale:\"${projectLocale}\" to locale:\"${locale}\".\n\n\t\t\t\t<target-json>\n\t\t\t\t\t${JSON.stringify(dictionary, null, 2)}\n\t\t\t\t</target-json>\n\t\t\t`\n\t\t})\n\n\t\treturn JSONSchema.parse(translation)\n\t}\n\n\treturn translator\n}\n\nconst JSONSchema = z.record(z.string(), z.string())\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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"}
1
+ {"version":3,"file":"index.mjs","names":["deepl","import_lib","mod","cb","exports","noop","createWeakMap","fakeSetOrMap","hop","has","obj","prop","extend","source","target","reLeadingNewline","reTrailingNewline","reStartsWithNewlineOrIsEmpty","reDetectIndentation","reOnlyWhitespaceWithAtLeastOneNewline","_outdentArray","indentationLevel","match","strings","reSource","reMatchIndent","firstInterpolatedValueSetsIndentationLevel","newline","options","trimLeadingNewline","trimTrailingNewline","normalizeNewlines","l","v","i","concatStringsAndValues","ret","values","isTemplateStringsArray","createInstance","arrayAutoIndentCache","arrayFirstInterpSetsIndentCache","outdent","stringsOrOptions","defaultOutdent","cache","renderedArray","str","module","DEFAULT_SYSTEM_PROMPT","createAiTranslator","translation","generateObject","systemPrompt","projectLocale","locale","dictionary","JSONSchema","z","createAwsTranslator","clientConfig","client","TranslateClient","translatedOutput","sourceLanguageCode","value","key","command","TranslateTextCommand","response","createAzureTranslator","keys","texts","batches","keyIndex","batch","url","endpoint","subscriptionKey","region","errorText","results","result","createDeepLTranslator","deeplTranslator","authKey","targetLang","sourceLang","translationResults","createGoogleCloudTranslator","translate","v2"],"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 * const translator = createAiTranslator({ model })\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 (CRITICAL)\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 { 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: 'no-schema',\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## Additional User System Instructions (highest priority)\n\t\t\t\t${systemPrompt}\n\t\t\t`,\n\t\t\tprompt: outdent`\n\t\t\t\tTranslate the following JSON from locale:\"${projectLocale}\" to locale:\"${locale}\".\n\n\t\t\t\t<target-json>\n\t\t\t\t\t${JSON.stringify(dictionary, null, 2)}\n\t\t\t\t</target-json>\n\t\t\t`\n\t\t})\n\n\t\treturn JSONSchema.parse(translation)\n\t}\n\n\treturn translator\n}\n\nconst JSONSchema = z.record(z.string(), z.string())\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"],"ignoreList":[0],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,15 @@
1
1
  {
2
2
  "name": "@terai/translator",
3
3
  "description": "terai core translator",
4
- "version": "0.0.16",
4
+ "version": "0.0.18",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",
7
- "types": "./dist/index.d.ts",
7
+ "types": "./dist/index.d.mts",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/terai-labs/terai.git",
11
+ "directory": "packages/translator"
12
+ },
8
13
  "author": "Hugo Corta <corta.hugo@gmail.com>",
9
14
  "files": [
10
15
  "dist"
@@ -37,18 +42,20 @@
37
42
  },
38
43
  "peerDependencies": {
39
44
  "@aws-sdk/client-translate": "^3",
40
- "@google-cloud/translate": "^8",
41
- "ai": "^5",
45
+ "@google-cloud/translate": "^8 || ^9 || ^10",
46
+ "ai": "^5 || ^6 || ^7",
42
47
  "deepl-node": "^1",
43
48
  "zod": "^4"
44
49
  },
45
50
  "devDependencies": {
46
- "@aws-sdk/client-translate": "^3.936.0",
47
- "@google-cloud/translate": "^9.3.0",
48
- "deepl-node": "^1.22.0",
49
- "@terai/runtime": "0.0.16",
50
- "@terai/types": "0.0.16",
51
- "@terai/utils": "0.0.16"
51
+ "@aws-sdk/client-translate": "^3.1152.0",
52
+ "@google-cloud/translate": "^10.3.0",
53
+ "ai": "^7.0.143",
54
+ "deepl-node": "^1.28.1",
55
+ "zod": "^4.6.7",
56
+ "@terai/runtime": "0.0.18",
57
+ "@terai/types": "0.0.18",
58
+ "@terai/utils": "0.0.18"
52
59
  },
53
60
  "scripts": {
54
61
  "dev": "tsdown --format=esm --no-dts --watch",