@terai/translator 0.0.15 → 0.0.17

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,63 @@
1
+ //#region ../types/dist/index.d.mts
2
+ //#region src/locale.d.ts
3
+ /**
4
+ * BCP 47 Locale Identifiers
5
+ *
6
+ * This type represents all valid locale codes based on the Unicode CLDR v47 (2025).
7
+ * Format follows BCP 47 standard using hyphens (e.g., 'en-US', 'zh-Hans-CN').
8
+ *
9
+ * Structure:
10
+ * - language: ISO 639-1/639-3 language code (e.g., 'en', 'zh')
11
+ * - script: ISO 15924 script code (e.g., 'Hans', 'Latn')
12
+ * - region: ISO 3166-1 alpha-2 country code or UN M.49 region code (e.g., 'US', '419')
13
+ * - variant: Registered variant subtags (e.g., 'valencia', 'tarask')
14
+ *
15
+ * @see https://cldr.unicode.org/
16
+ * @see https://www.ietf.org/rfc/bcp/bcp47.txt
17
+ * @see https://www.iana.org/assignments/language-subtag-registry
18
+ */
19
+ type Locale = 'aa' | 'aa-DJ' | 'aa-ER' | 'ab' | '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-Arab' | 'az-Arab-IQ' | 'az-Arab-IR' | 'az-Arab-TR' | 'az-Cyrl' | 'az-Cyrl-AZ' | 'az-Latn' | 'az-Latn-AZ' | 'ba' | 'ba-RU' | 'bal' | 'bal-Arab' | 'bal-Arab-PK' | 'bal-Latn' | 'bal-Latn-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-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-US-POSIX' | '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-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' | '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' | 'haw' | 'haw-US' | 'he' | 'he-IL' | 'hi' | 'hi-IN' | 'hi-Latn' | 'hi-Latn-IN' | 'hnj' | 'hnj-Hmnp' | 'hnj-Hmnp-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' | '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-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' | 'ksb' | 'ksb-TZ' | 'ksf' | 'ksf-CM' | 'ksh' | 'ksh-DE' | 'ku' | 'ku-Arab' | 'ku-Arab-IQ' | 'ku-Arab-IR' | 'ku-Latn' | 'ku-Latn-IQ' | 'ku-Latn-SY' | 'ku-Latn-TR' | 'ku-TR' | 'kw' | 'kw-GB' | 'kxv' | 'kxv-Deva' | 'kxv-Deva-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-MN' | 'mn-Mong' | 'mn-Mong-CN' | 'mn-Mong-MN' | 'mni' | 'mni-Beng' | 'mni-Beng-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' | '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' | 'pap' | 'pap-AW' | 'pap-CW' | 'pcm' | 'pcm-NG' | 'pi' | 'pi-Latn' | 'pi-Latn-TH' | 'pis' | 'pis-SB' | 'pl' | 'pl-PL' | 'pms' | 'pms-IT' | 'prg' | 'prg-001' | '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-Rohg' | 'rhg-Rohg-BD' | 'rhg-Rohg-MM' | 'rif' | 'rif-MA' | 'rm' | 'rm-CH' | 'rn' | 'rn-BI' | 'ro' | 'ro-MD' | 'ro-RO' | 'rof' | 'rof-TZ' | 'root' | '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-Olck' | 'sat-Olck-IN' | 'sbp' | 'sbp-TZ' | 'sc' | 'sc-IT' | 'scn' | 'scn-IT' | 'sd' | 'sd-Arab' | 'sd-Arab-PK' | 'sd-Deva' | 'sd-Deva-IN' | '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-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-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' | 'ss' | 'ss-SZ' | 'ss-ZA' | 'ssy' | 'ssy-ER' | 'st' | 'st-LS' | 'st-ZA' | 'su' | 'su-Latn' | 'su-Latn-ID' | 'suz' | 'suz-Deva' | 'suz-Deva-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-Arab' | 'uz-Arab-AF' | 'uz-Cyrl' | 'uz-Cyrl-UZ' | 'uz-Latn' | 'uz-Latn-UZ' | 'vai' | '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-001' | 'yo' | 'yo-BJ' | 'yo-NG' | 'yrl' | 'yrl-BR' | 'yrl-CO' | 'yrl-VE' | 'yue' | 'yue-Hans' | 'yue-Hans-CN' | 'yue-Hant' | 'yue-Hant-CN' | 'yue-Hant-HK' | 'yue-Hant-MO' | 'za' | 'za-CN' | 'zgh' | 'zgh-MA' | 'zh' | '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' | 'zu' | 'zu-ZA';
20
+ //#endregion
21
+ //#region src/dictionary.d.ts
22
+ type Dictionary = Record<string, string>;
23
+ //#endregion
24
+ //#region src/translator.d.ts
25
+ type Translator = ({ dictionary, locale, projectLocale }: {
26
+ dictionary: Dictionary;
27
+ locale: Locale;
28
+ projectLocale: Locale;
29
+ }) => Promise<Dictionary>;
30
+ //#endregion
31
+ //#region src/config.d.ts
32
+ /**
33
+ * Configuration for Terai
34
+ */
35
+ type Config = {
36
+ /**
37
+ * List of files glob to to look for your locale declarations
38
+ */
39
+ include: string[];
40
+ /**
41
+ * List of files glob to ignore
42
+ */
43
+ exclude?: string[];
44
+ /**
45
+ * The output directory for your locale system
46
+ */
47
+ outDir: string;
48
+ /**
49
+ * The base locale used in your project messages
50
+ */
51
+ projectLocale: Locale;
52
+ /**
53
+ * The aditional locales you want to support
54
+ */
55
+ outLocales: Locale[];
56
+ /**
57
+ * The translator for your messages
58
+ */
59
+ translator: Translator;
60
+ };
61
+ //#endregion
62
+ export { Translator as i, Dictionary as n, Locale as r, Config as t };
63
+ //# sourceMappingURL=index-DTSqS4fv.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-DTSqS4fv.d.cts","names":[],"sources":["../../types/dist/index.d.mts"],"mappings":";;;;;;;;;;;;;;;;;;KAiBY;;;KAGA,aAAa;;;KAKb,gBAAgB,YAAY,QAAQ;EAC9C,YAAY;EACZ,QAAQ;EACR,eAAe;MACX,QAAQ;;;;;;KAMF;;;;EAIV;;;;EAIA;;;;EAIA;;;;EAIA,eAAe;;;;EAIf,YAAY;;;;EAIZ,YAAY"}
@@ -0,0 +1,63 @@
1
+ //#region ../types/dist/index.d.mts
2
+ //#region src/locale.d.ts
3
+ /**
4
+ * BCP 47 Locale Identifiers
5
+ *
6
+ * This type represents all valid locale codes based on the Unicode CLDR v47 (2025).
7
+ * Format follows BCP 47 standard using hyphens (e.g., 'en-US', 'zh-Hans-CN').
8
+ *
9
+ * Structure:
10
+ * - language: ISO 639-1/639-3 language code (e.g., 'en', 'zh')
11
+ * - script: ISO 15924 script code (e.g., 'Hans', 'Latn')
12
+ * - region: ISO 3166-1 alpha-2 country code or UN M.49 region code (e.g., 'US', '419')
13
+ * - variant: Registered variant subtags (e.g., 'valencia', 'tarask')
14
+ *
15
+ * @see https://cldr.unicode.org/
16
+ * @see https://www.ietf.org/rfc/bcp/bcp47.txt
17
+ * @see https://www.iana.org/assignments/language-subtag-registry
18
+ */
19
+ type Locale = 'aa' | 'aa-DJ' | 'aa-ER' | 'ab' | '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-Arab' | 'az-Arab-IQ' | 'az-Arab-IR' | 'az-Arab-TR' | 'az-Cyrl' | 'az-Cyrl-AZ' | 'az-Latn' | 'az-Latn-AZ' | 'ba' | 'ba-RU' | 'bal' | 'bal-Arab' | 'bal-Arab-PK' | 'bal-Latn' | 'bal-Latn-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-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-US-POSIX' | '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-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' | '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' | 'haw' | 'haw-US' | 'he' | 'he-IL' | 'hi' | 'hi-IN' | 'hi-Latn' | 'hi-Latn-IN' | 'hnj' | 'hnj-Hmnp' | 'hnj-Hmnp-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' | '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-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' | 'ksb' | 'ksb-TZ' | 'ksf' | 'ksf-CM' | 'ksh' | 'ksh-DE' | 'ku' | 'ku-Arab' | 'ku-Arab-IQ' | 'ku-Arab-IR' | 'ku-Latn' | 'ku-Latn-IQ' | 'ku-Latn-SY' | 'ku-Latn-TR' | 'ku-TR' | 'kw' | 'kw-GB' | 'kxv' | 'kxv-Deva' | 'kxv-Deva-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-MN' | 'mn-Mong' | 'mn-Mong-CN' | 'mn-Mong-MN' | 'mni' | 'mni-Beng' | 'mni-Beng-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' | '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' | 'pap' | 'pap-AW' | 'pap-CW' | 'pcm' | 'pcm-NG' | 'pi' | 'pi-Latn' | 'pi-Latn-TH' | 'pis' | 'pis-SB' | 'pl' | 'pl-PL' | 'pms' | 'pms-IT' | 'prg' | 'prg-001' | '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-Rohg' | 'rhg-Rohg-BD' | 'rhg-Rohg-MM' | 'rif' | 'rif-MA' | 'rm' | 'rm-CH' | 'rn' | 'rn-BI' | 'ro' | 'ro-MD' | 'ro-RO' | 'rof' | 'rof-TZ' | 'root' | '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-Olck' | 'sat-Olck-IN' | 'sbp' | 'sbp-TZ' | 'sc' | 'sc-IT' | 'scn' | 'scn-IT' | 'sd' | 'sd-Arab' | 'sd-Arab-PK' | 'sd-Deva' | 'sd-Deva-IN' | '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-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-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' | 'ss' | 'ss-SZ' | 'ss-ZA' | 'ssy' | 'ssy-ER' | 'st' | 'st-LS' | 'st-ZA' | 'su' | 'su-Latn' | 'su-Latn-ID' | 'suz' | 'suz-Deva' | 'suz-Deva-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-Arab' | 'uz-Arab-AF' | 'uz-Cyrl' | 'uz-Cyrl-UZ' | 'uz-Latn' | 'uz-Latn-UZ' | 'vai' | '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-001' | 'yo' | 'yo-BJ' | 'yo-NG' | 'yrl' | 'yrl-BR' | 'yrl-CO' | 'yrl-VE' | 'yue' | 'yue-Hans' | 'yue-Hans-CN' | 'yue-Hant' | 'yue-Hant-CN' | 'yue-Hant-HK' | 'yue-Hant-MO' | 'za' | 'za-CN' | 'zgh' | 'zgh-MA' | 'zh' | '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' | 'zu' | 'zu-ZA';
20
+ //#endregion
21
+ //#region src/dictionary.d.ts
22
+ type Dictionary = Record<string, string>;
23
+ //#endregion
24
+ //#region src/translator.d.ts
25
+ type Translator = ({ dictionary, locale, projectLocale }: {
26
+ dictionary: Dictionary;
27
+ locale: Locale;
28
+ projectLocale: Locale;
29
+ }) => Promise<Dictionary>;
30
+ //#endregion
31
+ //#region src/config.d.ts
32
+ /**
33
+ * Configuration for Terai
34
+ */
35
+ type Config = {
36
+ /**
37
+ * List of files glob to to look for your locale declarations
38
+ */
39
+ include: string[];
40
+ /**
41
+ * List of files glob to ignore
42
+ */
43
+ exclude?: string[];
44
+ /**
45
+ * The output directory for your locale system
46
+ */
47
+ outDir: string;
48
+ /**
49
+ * The base locale used in your project messages
50
+ */
51
+ projectLocale: Locale;
52
+ /**
53
+ * The aditional locales you want to support
54
+ */
55
+ outLocales: Locale[];
56
+ /**
57
+ * The translator for your messages
58
+ */
59
+ translator: Translator;
60
+ };
61
+ //#endregion
62
+ export { Translator as i, Dictionary as n, Locale as r, Config as t };
63
+ //# sourceMappingURL=index-DTSqS4fv.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-DTSqS4fv.d.mts","names":[],"sources":["../../types/dist/index.d.mts"],"mappings":";;;;;;;;;;;;;;;;;;KAiBY;;;KAGA,aAAa;;;KAKb,gBAAgB,YAAY,QAAQ;EAC9C,YAAY;EACZ,QAAQ;EACR,eAAe;MACX,QAAQ;;;;;;KAMF;;;;EAIV;;;;EAIA;;;;EAIA;;;;EAIA,eAAe;;;;EAIf,YAAY;;;;EAIZ,YAAY"}
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})}exports.translate=e;
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"],"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":"A,mEAQA,eAAsBA,EAAU,CAC/B,aACA,gBACA,SACA,cACyC,CACzC,OAAOC,EAAW,CACjB,aACA,gBACA,QACD,CAAC,CACF,C"}
package/dist/index.d.cts CHANGED
@@ -1,16 +1,9 @@
1
- import { Config, Dictionary, Locale } from "@terai/types";
2
-
1
+ import { n as Dictionary, r as Locale, t as Config } from "./index-DTSqS4fv.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>;
14
8
  //#endregion
15
- export { TranslateOptions, translate };
16
9
  //# 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"],"mappings":";;YAGY,mBAAmB,KAAK;EACnC,YAAY;EACZ,QAAQ;;wBAGa,YACrB,YACA,eACA,QACA,cACE,mBAAmB,QAAQ"}
package/dist/index.d.mts CHANGED
@@ -1,16 +1,9 @@
1
- import { Config, Dictionary, Locale } from "@terai/types";
2
-
1
+ import { n as Dictionary, r as Locale, t as Config } from "./index-DTSqS4fv.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>;
14
8
  //#endregion
15
- export { TranslateOptions, translate };
16
9
  //# 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"],"mappings":";;YAGY,mBAAmB,KAAK;EACnC,YAAY;EACZ,QAAQ;;wBAGa,YACrB,YACA,eACA,QACA,cACE,mBAAmB,QAAQ"}
@@ -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"],"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,eAAsBA,EAAU,CAC/B,aACA,gBACA,SACA,cACyC,CACzC,OAAOC,EAAW,CACjB,aACA,gBACA,QACD,CAAC,CACF,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
@@ -40,7 +40,7 @@ contextually appropriate, and maintain the natural feel of native language.
40
40
 
41
41
  ## Output Format
42
42
  - Return ONLY a valid JSON object
43
- - Use the EXACT SAME KEYS as the input
43
+ - Use the EXACT SAME KEYS as the input (CRITICAL)
44
44
  - Do NOT add newlines within string values
45
45
  - Do NOT modify, remove, or add keys
46
46
  - Do NOT include markdown code blocks or extra formatting
@@ -55,15 +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:`object`,schema:u.z.record(u.z.string(),u.z.string()),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
- ## Additonal User System Instructions (highest priority)
61
+ ## Additional User System Instructions (highest priority)
62
62
  ${t}
63
- `:g,prompt:h.outdent`
64
- Translate the following JSON from "${r}" to "${i}".
65
- <target-json>
66
- ${JSON.stringify(n,null,2)}
67
- </target-json>
68
- `});return a},v=({sourceLanguageCode:e=`auto`,...t})=>{let n=new d.TranslateClient(t);return async({dictionary:t,locale:r,projectLocale:i})=>{let a={},o=e===`auto`?i:e;return await Promise.all(Object.keys(t).map(async e=>{let i=t[e],s=new d.TranslateTextCommand({Text:i,SourceLanguageCode:o,TargetLanguageCode:r});a[e]=(await n.send(s)).TranslatedText||i})),a}},y=({subscriptionKey:e,region:t,endpoint:n=`https://api.cognitive.microsofttranslator.com`})=>async({dictionary:r,locale:i,projectLocale:a})=>{let o={},s=Object.keys(r),c=s.map(e=>({text:r[e]})),l=[];for(let e=0;e<c.length;e+=100)l.push(c.slice(e,e+100));let u=0;for(let c of l){let l=new URL(`/translate`,n);l.searchParams.set(`api-version`,`3.0`),l.searchParams.set(`from`,a),l.searchParams.set(`to`,i);let d=await fetch(l.toString(),{method:`POST`,headers:{"Ocp-Apim-Subscription-Key":e,"Ocp-Apim-Subscription-Region":t,"Content-Type":`application/json`},body:JSON.stringify(c)});if(!d.ok){let e=await d.text();throw Error(`Azure Translator API error: ${d.status} - ${e}`)}let f=await d.json();for(let e of f){let t=s[u];o[t]=e.translations[0]?.text||r[t],u++}}return o},b=({authKey:e,options:t,formality:n=`default`,preserveFormatting:r=!0,tagHandling:i=`xml`})=>{let a=new f.Translator(e,t);return async({dictionary:e,locale:t,projectLocale:o})=>{let s={},c=Object.keys(e),l=c.map(t=>e[t]),u=t.toUpperCase(),d=o.toUpperCase(),f=await a.translateText(l,d,u,{formality:n,preserveFormatting:r,tagHandling:i}),p=Array.isArray(f)?f:[f];for(let t=0;t<c.length;t++){let n=c[t];s[n]=p[t]?.text||e[n]}return s}},x=e=>{let t=new p.v2.Translate(e);return async({dictionary:e,locale:n})=>{let r={};return await Promise.all(Object.keys(e).map(async i=>{let a=e[i],[o]=await t.translate(a,n);r[i]=o})),r}};exports.createAiTranslator=_,exports.createAwsTranslator=v,exports.createAzureTranslator=y,exports.createDeepLTranslator=b,exports.createGoogleCloudTranslator=x;
63
+ `:h,prompt:m.outdent`
64
+ Translate the following JSON from locale:"${r}" to locale:"${i}".
65
+
66
+ <target-json>
67
+ ${JSON.stringify(n,null,2)}
68
+ </target-json>
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;
69
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 *\n\t * @example\n\t * import { createGroq } from '@ai-sdk/groq'\n\t * const groq = createGroq({ apiKey: process.env.GROQ_API_KEY })\n\t * const model = groq('llama-3.3-70b-versatile')\n\t */\n\tmodel: LanguageModel\n\n\t/**\n\t * Custom system prompt for translation.\n\t * If not provided, a generic prompt will be used that covers most app translation cases.\n\t */\n\tsystemPrompt?: string\n}\n\nconst DEFAULT_SYSTEM_PROMPT = outdent`\n# Expert AI Translator\n\n## Your Role\nYou are an expert translator and localization specialist with deep expertise in software\napplications, user interfaces, and technical documentation. Your translations are accurate,\ncontextually appropriate, and maintain the natural feel of native language.\n\n## Critical Requirements\n\n### 1. Preserve Code Patterns\n- **NEVER** translate template variables (e.g., \\${var}, {var}, %s, %d)\n- **ALWAYS** keep placeholder syntax exactly as provided\n- **MAINTAIN** all escape sequences and special characters\n- **PRESERVE** HTML tags, markdown syntax, and formatting codes\n\n### 2. Translation Quality\n- Use **natural, idiomatic** expressions in the target language\n- Maintain **consistent terminology** throughout all strings\n- Adapt **cultural references** appropriately for the target locale\n- Ensure **grammatical correctness** and proper sentence structure\n\n### 3. Context Awareness\n- **UI Elements**: Keep translations concise for buttons, labels, and menus\n- **Messages**: Maintain appropriate tone (error messages: clear, help text: friendly)\n- **Technical Terms**: Use standard industry terminology when available\n- **Brand Names**: Do not translate proper nouns, product names, or brand names\n\n### 4. Formatting Guidelines\n- **Punctuation**: Follow target language conventions\n- **Capitalization**: Match target language standards (e.g., German nouns)\n- **Numbers & Dates**: Keep placeholders unchanged; format will be handled at runtime\n- **Whitespace**: Preserve spacing around variables and special characters\n\n### 5. Tone & Style\n- **Consistency**: Maintain uniform voice across all translations\n- **Formality**: Match the formality level of the source text\n- **Clarity**: Prioritize understanding over literal translation\n- **Brevity**: Keep translations concise, especially for UI elements\n\n## Output Format\n- Return ONLY a valid JSON object\n- Use the EXACT SAME KEYS as the input\n- Do NOT add newlines within string values\n- Do NOT modify, remove, or add keys\n- Do NOT include markdown code blocks or extra formatting\n\n## Examples of What to Preserve\n\n✅ CORRECT:\n- \"Welcome \\${var}\" → \"Bienvenido \\${var}\"\n- \"You have {count} items\" → \"Tienes {count} elementos\"\n- \"Click <strong>here</strong>\" → \"Haz clic <strong>aquí</strong>\"\n\n❌ INCORRECT:\n- \"Welcome \\${var}\" → \"Bienvenido Juan\" (translated variable)\n- \"You have {var} items\" → \"Tienes 3 elementos\" (removed braces)\n- \"Click <strong>here</strong>\" → \"Haz clic **aquí**\" (changed HTML to markdown)`\n\n/**\n * Creates an AI-powered translator using the Vercel AI SDK.\n *\n * This translator uses structured output generation to translate dictionaries\n * while preserving template variables, formatting, and code patterns.\n *\n * @example\n * ```ts\n * import { createAiTranslator } from '@terai/translator/translators'\n * import { createOpenAI } from '@ai-sdk/openai'\n *\n * const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY })\n * const translator = createAiTranslator({\n * model: openai('gpt-4o')\n * })\n * ```\n *\n * @example With Groq\n * ```ts\n * import { createAiTranslator } from '@terai/translator/translators'\n * import { createGroq } from '@ai-sdk/groq'\n *\n * const groq = createGroq({ apiKey: process.env.GROQ_API_KEY })\n * const translator = createAiTranslator({\n * model: groq('llama-3.3-70b-versatile')\n * })\n * ```\n *\n * @example With custom system prompt\n * ```ts\n * import { createAiTranslator } from '@terai/translator/translators'\n * import { createAnthropic } from '@ai-sdk/anthropic'\n *\n * const anthropic = createAnthropic({ apiKey: process.env.ANTHROPIC_API_KEY })\n * const translator = createAiTranslator({\n * model: anthropic('claude-3-5-sonnet-20241022'),\n * systemPrompt: 'Custom prompt for my specific use case...'\n * })\n * ```\n */\nexport const createAiTranslator = ({\n\tmodel,\n\tsystemPrompt = DEFAULT_SYSTEM_PROMPT\n}: CreateAiTranslatorOptions): Translator => {\n\tconst translator: Translator = async ({\n\t\tdictionary,\n\t\tprojectLocale,\n\t\tlocale\n\t}) => {\n\t\tconst { object: translation } = await generateObject({\n\t\t\tmodel,\n\t\t\toutput: 'object',\n\t\t\tschema: z.record(z.string(), z.string()),\n\t\t\tsystem: !systemPrompt\n\t\t\t\t? DEFAULT_SYSTEM_PROMPT\n\t\t\t\t: outdent`\n\t\t\t\t${DEFAULT_SYSTEM_PROMPT}\n\t\t\t\t\n\t\t\t\t## Additonal User System Instructions (highest priority)\n\t\t\t\t${systemPrompt}\n\t\t\t`,\n\t\t\tprompt: outdent`\n\t\t\tTranslate the following JSON from \"${projectLocale}\" to \"${locale}\".\n\t\t\t<target-json>\n\t\t\t\t${JSON.stringify(dictionary, null, 2)}\n\t\t\t</target-json>\n\t\t\t`\n\t\t})\n\n\t\treturn translation\n\t}\n\n\treturn translator\n}\n","// Dependencies\nimport {\n\tTranslateClient,\n\tTranslateTextCommand,\n\ttype TranslateClientConfig\n} from '@aws-sdk/client-translate'\n\n// Types\nimport type { Dictionary, Translator } from '@terai/types'\n\nexport type CreateAwsTranslatorOptions = TranslateClientConfig & {\n\t/**\n\t * The source language code (e.g., 'en', 'es', 'fr').\n\t * If not provided, AWS Translate will auto-detect the source language.\n\t * @default 'auto'\n\t */\n\tsourceLanguageCode?: string\n}\n\n/**\n * Creates a translator using AWS Translate.\n *\n * AWS Translate is a neural machine translation service that delivers\n * fast, high-quality, and affordable language translation.\n *\n * @example\n * ```ts\n * import { createAwsTranslator } from '@terai/translator/translators'\n *\n * const translator = createAwsTranslator({\n * region: 'us-east-1',\n * credentials: {\n * accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n * secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY\n * }\n * })\n * ```\n *\n * @example With AWS profile\n * ```ts\n * import { createAwsTranslator } from '@terai/translator/translators'\n * import { fromIni } from '@aws-sdk/credential-providers'\n *\n * const translator = createAwsTranslator({\n * region: 'us-east-1',\n * credentials: fromIni({ profile: 'my-profile' })\n * })\n * ```\n */\nexport const createAwsTranslator = ({\n\tsourceLanguageCode = 'auto',\n\t...clientConfig\n}: CreateAwsTranslatorOptions): Translator => {\n\tconst client = new TranslateClient(clientConfig)\n\n\tconst translator: Translator = async ({\n\t\tdictionary,\n\t\tlocale,\n\t\tprojectLocale\n\t}) => {\n\t\tconst translatedOutput: Dictionary = {}\n\n\t\t// Use projectLocale as source if not set to auto\n\t\tconst source =\n\t\t\tsourceLanguageCode === 'auto' ? projectLocale : sourceLanguageCode\n\n\t\tawait Promise.all(\n\t\t\tObject.keys(dictionary).map(async (key) => {\n\t\t\t\tconst value = dictionary[key]\n\n\t\t\t\tconst command = new TranslateTextCommand({\n\t\t\t\t\tText: value,\n\t\t\t\t\tSourceLanguageCode: source,\n\t\t\t\t\tTargetLanguageCode: locale\n\t\t\t\t})\n\n\t\t\t\tconst response = await client.send(command)\n\n\t\t\t\ttranslatedOutput[key] = response.TranslatedText || value\n\t\t\t})\n\t\t)\n\n\t\treturn translatedOutput\n\t}\n\n\treturn translator\n}\n","// Types\nimport type { Dictionary, Translator } from '@terai/types'\n\nexport type CreateAzureTranslatorOptions = {\n\t/**\n\t * Azure Translator subscription key.\n\t */\n\tsubscriptionKey: string\n\n\t/**\n\t * Azure region where the Translator resource is located.\n\t * @example 'eastus', 'westeurope', 'southeastasia'\n\t */\n\tregion: string\n\n\t/**\n\t * Custom endpoint URL. If not provided, uses the global endpoint.\n\t * @default 'https://api.cognitive.microsofttranslator.com'\n\t */\n\tendpoint?: string\n}\n\ntype AzureTranslationResponse = Array<{\n\ttranslations: Array<{\n\t\ttext: string\n\t\tto: string\n\t}>\n}>\n\n/**\n * Creates a translator using Microsoft Azure Translator.\n *\n * Azure Translator is a cloud-based machine translation service\n * that supports 100+ languages.\n *\n * @example\n * ```ts\n * import { createAzureTranslator } from '@terai/translator/translators'\n *\n * const translator = createAzureTranslator({\n * subscriptionKey: process.env.AZURE_TRANSLATOR_KEY,\n * region: 'eastus'\n * })\n * ```\n *\n * @example With custom endpoint\n * ```ts\n * import { createAzureTranslator } from '@terai/translator/translators'\n *\n * const translator = createAzureTranslator({\n * subscriptionKey: process.env.AZURE_TRANSLATOR_KEY,\n * region: 'eastus',\n * endpoint: 'https://my-custom-endpoint.cognitiveservices.azure.com'\n * })\n * ```\n */\nexport const createAzureTranslator = ({\n\tsubscriptionKey,\n\tregion,\n\tendpoint = 'https://api.cognitive.microsofttranslator.com'\n}: CreateAzureTranslatorOptions): Translator => {\n\tconst translator: Translator = async ({\n\t\tdictionary,\n\t\tlocale,\n\t\tprojectLocale\n\t}) => {\n\t\tconst translatedOutput: Dictionary = {}\n\t\tconst keys = Object.keys(dictionary)\n\t\tconst texts = keys.map((key) => ({ text: dictionary[key] }))\n\n\t\t// Azure Translator API accepts up to 100 texts per request\n\t\tconst batchSize = 100\n\t\tconst batches: Array<Array<{ text: string }>> = []\n\n\t\tfor (let i = 0; i < texts.length; i += batchSize) {\n\t\t\tbatches.push(texts.slice(i, i + batchSize))\n\t\t}\n\n\t\tlet keyIndex = 0\n\n\t\tfor (const batch of batches) {\n\t\t\tconst url = new URL('/translate', endpoint)\n\t\t\turl.searchParams.set('api-version', '3.0')\n\t\t\turl.searchParams.set('from', projectLocale)\n\t\t\turl.searchParams.set('to', locale)\n\n\t\t\tconst response = await fetch(url.toString(), {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Ocp-Apim-Subscription-Key': subscriptionKey,\n\t\t\t\t\t'Ocp-Apim-Subscription-Region': region,\n\t\t\t\t\t'Content-Type': 'application/json'\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(batch)\n\t\t\t})\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst errorText = await response.text()\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Azure Translator API error: ${response.status} - ${errorText}`\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst results: AzureTranslationResponse = await response.json()\n\n\t\t\tfor (const result of results) {\n\t\t\t\tconst key = keys[keyIndex]\n\t\t\t\ttranslatedOutput[key] = result.translations[0]?.text || dictionary[key]\n\t\t\t\tkeyIndex++\n\t\t\t}\n\t\t}\n\n\t\treturn translatedOutput\n\t}\n\n\treturn translator\n}\n","// Dependencies\nimport * as deepl from 'deepl-node'\n\n// Types\nimport type { Dictionary, Translator } from '@terai/types'\n\nexport type CreateDeepLTranslatorOptions = {\n\t/**\n\t * DeepL API authentication key.\n\t * Get your key from https://www.deepl.com/pro-api\n\t */\n\tauthKey: string\n\n\t/**\n\t * Additional options for the DeepL Translator.\n\t */\n\toptions?: deepl.TranslatorOptions\n\n\t/**\n\t * Formality preference for translations.\n\t * - 'default': Default formality\n\t * - 'more': More formal language\n\t * - 'less': Less formal language\n\t * - 'prefer_more': Prefer more formal if available\n\t * - 'prefer_less': Prefer less formal if available\n\t * @default 'default'\n\t */\n\tformality?: deepl.Formality\n\n\t/**\n\t * Whether to preserve formatting in translations.\n\t * @default true\n\t */\n\tpreserveFormatting?: boolean\n\n\t/**\n\t * Specify how to handle XML tags in text.\n\t * @default 'xml'\n\t */\n\ttagHandling?: 'xml' | 'html'\n}\n\n/**\n * Creates a translator using DeepL API.\n *\n * DeepL is known for producing high-quality, natural-sounding translations\n * and is often considered one of the best machine translation services available.\n *\n * @example\n * ```ts\n * import { createDeepLTranslator } from '@terai/translator/translators'\n *\n * const translator = createDeepLTranslator({\n * authKey: process.env.DEEPL_API_KEY\n * })\n * ```\n *\n * @example With formality preference\n * ```ts\n * import { createDeepLTranslator } from '@terai/translator/translators'\n *\n * const translator = createDeepLTranslator({\n * authKey: process.env.DEEPL_API_KEY,\n * formality: 'less' // Use informal language\n * })\n * ```\n *\n * @example With HTML tag handling\n * ```ts\n * import { createDeepLTranslator } from '@terai/translator/translators'\n *\n * const translator = createDeepLTranslator({\n * authKey: process.env.DEEPL_API_KEY,\n * tagHandling: 'html',\n * preserveFormatting: true\n * })\n * ```\n */\nexport const createDeepLTranslator = ({\n\tauthKey,\n\toptions,\n\tformality = 'default',\n\tpreserveFormatting = true,\n\ttagHandling = 'xml'\n}: CreateDeepLTranslatorOptions): Translator => {\n\tconst deeplTranslator = new deepl.Translator(authKey, options)\n\n\tconst translator: Translator = async ({\n\t\tdictionary,\n\t\tlocale,\n\t\tprojectLocale\n\t}) => {\n\t\tconst translatedOutput: Dictionary = {}\n\t\tconst keys = Object.keys(dictionary)\n\t\tconst texts = keys.map((key) => dictionary[key])\n\n\t\t// DeepL uses specific language codes (e.g., 'EN-US' instead of 'en-US')\n\t\tconst targetLang = locale.toUpperCase() as deepl.TargetLanguageCode\n\t\tconst sourceLang = projectLocale.toUpperCase() as deepl.SourceLanguageCode\n\n\t\tconst results = await deeplTranslator.translateText(\n\t\t\ttexts,\n\t\t\tsourceLang,\n\t\t\ttargetLang,\n\t\t\t{\n\t\t\t\tformality,\n\t\t\t\tpreserveFormatting,\n\t\t\t\ttagHandling\n\t\t\t}\n\t\t)\n\n\t\t// Handle both single result and array of results\n\t\tconst translationResults = Array.isArray(results) ? results : [results]\n\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tconst key = keys[i]\n\t\t\ttranslatedOutput[key] = translationResults[i]?.text || dictionary[key]\n\t\t}\n\n\t\treturn translatedOutput\n\t}\n\n\treturn translator\n}\n","// Dependencies\nimport { v2 } from '@google-cloud/translate'\n\n// Types\nimport type { Dictionary, Translator } from '@terai/types'\n\nexport type CreateGoogleCloudTranslatorOptions = v2.TranslateConfig\n\n/**\n * Creates a translator using Google Cloud Translation API.\n *\n * This translator uses Google Cloud's Neural Machine Translation (NMT)\n * for high-quality translations.\n *\n * @example\n * ```ts\n * import { createGoogleCloudTranslator } from '@terai/translator/translators'\n *\n * const translator = createGoogleCloudTranslator({\n * projectId: process.env.GOOGLE_CLOUD_PROJECT_ID,\n * keyFilename: './google-credentials.json'\n * })\n * ```\n *\n * @example With API key\n * ```ts\n * import { createGoogleCloudTranslator } from '@terai/translator/translators'\n *\n * const translator = createGoogleCloudTranslator({\n * key: process.env.GOOGLE_CLOUD_API_KEY\n * })\n * ```\n */\nexport const createGoogleCloudTranslator = (\n\toptions: CreateGoogleCloudTranslatorOptions\n): Translator => {\n\tconst translate = new v2.Translate(options)\n\n\tconst translator: Translator = async ({ dictionary, locale }) => {\n\t\tconst translatedOutput: Dictionary = {}\n\n\t\tawait Promise.all(\n\t\t\tObject.keys(dictionary).map(async (key) => {\n\t\t\t\tconst value = dictionary[key]\n\n\t\t\t\tconst [translation] = await translate.translate(value, locale)\n\n\t\t\t\ttranslatedOutput[key] = translation\n\t\t\t})\n\t\t)\n\n\t\treturn translatedOutput\n\t}\n\n\treturn translator\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
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-DTSqS4fv.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.)
@@ -14,11 +13,7 @@ type CreateAiTranslatorOptions = {
14
13
  * import { createOpenAI } from '@ai-sdk/openai'
15
14
  * const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY })
16
15
  * const model = openai('gpt-4o')
17
- *
18
- * @example
19
- * import { createGroq } from '@ai-sdk/groq'
20
- * const groq = createGroq({ apiKey: process.env.GROQ_API_KEY })
21
- * const model = groq('llama-3.3-70b-versatile')
16
+ * const translator = createAiTranslator({ model })
22
17
  */
23
18
  model: LanguageModel;
24
19
  /**
@@ -36,28 +31,6 @@ type CreateAiTranslatorOptions = {
36
31
  * @example
37
32
  * ```ts
38
33
  * import { createAiTranslator } from '@terai/translator/translators'
39
- * import { createOpenAI } from '@ai-sdk/openai'
40
- *
41
- * const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY })
42
- * const translator = createAiTranslator({
43
- * model: openai('gpt-4o')
44
- * })
45
- * ```
46
- *
47
- * @example With Groq
48
- * ```ts
49
- * import { createAiTranslator } from '@terai/translator/translators'
50
- * import { createGroq } from '@ai-sdk/groq'
51
- *
52
- * const groq = createGroq({ apiKey: process.env.GROQ_API_KEY })
53
- * const translator = createAiTranslator({
54
- * model: groq('llama-3.3-70b-versatile')
55
- * })
56
- * ```
57
- *
58
- * @example With custom system prompt
59
- * ```ts
60
- * import { createAiTranslator } from '@terai/translator/translators'
61
34
  * import { createAnthropic } from '@ai-sdk/anthropic'
62
35
  *
63
36
  * const anthropic = createAnthropic({ apiKey: process.env.ANTHROPIC_API_KEY })
@@ -67,13 +40,10 @@ type CreateAiTranslatorOptions = {
67
40
  * })
68
41
  * ```
69
42
  */
70
- declare const createAiTranslator: ({
71
- model,
72
- systemPrompt
73
- }: CreateAiTranslatorOptions) => Translator;
43
+ export declare const createAiTranslator: ({ model, systemPrompt }: CreateAiTranslatorOptions) => Translator;
74
44
  //#endregion
75
45
  //#region src/translators/aws.d.ts
76
- type CreateAwsTranslatorOptions = TranslateClientConfig & {
46
+ export type CreateAwsTranslatorOptions = TranslateClientConfig & {
77
47
  /**
78
48
  * The source language code (e.g., 'en', 'es', 'fr').
79
49
  * If not provided, AWS Translate will auto-detect the source language.
@@ -111,13 +81,10 @@ type CreateAwsTranslatorOptions = TranslateClientConfig & {
111
81
  * })
112
82
  * ```
113
83
  */
114
- declare const createAwsTranslator: ({
115
- sourceLanguageCode,
116
- ...clientConfig
117
- }: CreateAwsTranslatorOptions) => Translator;
84
+ export declare const createAwsTranslator: ({ sourceLanguageCode, ...clientConfig }: CreateAwsTranslatorOptions) => Translator;
118
85
  //#endregion
119
86
  //#region src/translators/azure.d.ts
120
- type CreateAzureTranslatorOptions = {
87
+ export type CreateAzureTranslatorOptions = {
121
88
  /**
122
89
  * Azure Translator subscription key.
123
90
  */
@@ -160,14 +127,10 @@ type CreateAzureTranslatorOptions = {
160
127
  * })
161
128
  * ```
162
129
  */
163
- declare const createAzureTranslator: ({
164
- subscriptionKey,
165
- region,
166
- endpoint
167
- }: CreateAzureTranslatorOptions) => Translator;
130
+ export declare const createAzureTranslator: ({ subscriptionKey, region, endpoint }: CreateAzureTranslatorOptions) => Translator;
168
131
  //#endregion
169
132
  //#region src/translators/deepl.d.ts
170
- type CreateDeepLTranslatorOptions = {
133
+ export type CreateDeepLTranslatorOptions = {
171
134
  /**
172
135
  * DeepL API authentication key.
173
136
  * Get your key from https://www.deepl.com/pro-api
@@ -234,16 +197,10 @@ type CreateDeepLTranslatorOptions = {
234
197
  * })
235
198
  * ```
236
199
  */
237
- declare const createDeepLTranslator: ({
238
- authKey,
239
- options,
240
- formality,
241
- preserveFormatting,
242
- tagHandling
243
- }: CreateDeepLTranslatorOptions) => Translator;
200
+ export declare const createDeepLTranslator: ({ authKey, options, formality, preserveFormatting, tagHandling }: CreateDeepLTranslatorOptions) => Translator;
244
201
  //#endregion
245
202
  //#region src/translators/google-cloud.d.ts
246
- type CreateGoogleCloudTranslatorOptions = v2.TranslateConfig;
203
+ export type CreateGoogleCloudTranslatorOptions = v2.TranslateConfig;
247
204
  /**
248
205
  * Creates a translator using Google Cloud Translation API.
249
206
  *
@@ -269,7 +226,6 @@ type CreateGoogleCloudTranslatorOptions = v2.TranslateConfig;
269
226
  * })
270
227
  * ```
271
228
  */
272
- declare const createGoogleCloudTranslator: (options: CreateGoogleCloudTranslatorOptions) => Translator;
229
+ export declare const createGoogleCloudTranslator: (options: CreateGoogleCloudTranslatorOptions) => Translator;
273
230
  //#endregion
274
- export { CreateAiTranslatorOptions, CreateAwsTranslatorOptions, CreateAzureTranslatorOptions, CreateDeepLTranslatorOptions, CreateGoogleCloudTranslatorOptions, createAiTranslator, createAwsTranslator, createAzureTranslator, createDeepLTranslator, createGoogleCloudTranslator };
275
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;AA2HA;;;;;;;;;EC1HY,KAAA,EDcJ,aCdI;EAuCC;;;;EAqCZ,YAAA,CAAA,EAAA,MAAA;;;;ACnFD;AAqDA;;;;;;;;;;AClDA;AAwEA;;;;;;;;;;;;ACxEA;AA2BA;;;;;;;;;;;;;cJmGa;;;GAGV,8BAA4B;;;KC7HnB,0BAAA,GAA6B;;;;;ADDzC;EA2Ha,kBAAA,CAAA,EAiCZ,MAAA;CAjCkC;;;;;;;;AC1HnC;AAuCA;;;;;;;;AC9CA;AAqDA;;;;;;;;;;AClDA;AAwEA;;AAAsC,cF7BzB,mBE6ByB,EAAA,CAAA;EAAA,kBAAA;EAAA,GAAA;AAAA,CAAA,EF1BnC,0BE0BmC,EAAA,GF1BN,UE0BM;;;KD3E1B,4BAAA;;;;;;AFMZ;AA2HA;;EAAmC,MAAA,EAAA,MAAA;EAGhC;;;;;;AC7HH;AAuCA;;;;;;;;AC9CA;AAqDA;;;;;;;;;;AClDA;AAwEA;;;;;;AAMG,cD5BU,qBC4BV,EAAA,CAAA;EAAA,eAAA;EAAA,MAAA;EAAA;AAAA,CAAA,EDxBA,4BCwBA,EAAA,GDxB+B,UCwB/B;;;KA9ES,4BAAA;;;;;EHGA,OAAA,EAAA,MAAA;EA2HC;;;EAGV,OAAA,CAAA,EGvHQ,KAAA,CAAM,iBHuHd;EAA4B;;;;;AC7H/B;AAuCA;;;EAGgC,SAAA,CAAA,EEzBnB,KAAA,CAAM,SFyBa;EAkC/B;;;;ECnFW,kBAAA,CAAA,EAAA,OAAA;EAqDC;;;;EAIV,WAAA,CAAA,EAAA,KAAA,GAAA,MAAA;CAA+B;;;;;ACtDlC;AAwEA;;;;;;;;;;;;ACxEA;AA2BA;;;;;;;;;;;;;;;;;;cD6Ca;;;;;;GAMV,iCAA+B;;;KC9EtB,kCAAA,GAAqC,EAAA,CAAG;;;;;AJGpD;AA2HA;;;;;;;;;AC1HA;AAuCA;;;;;;;;AC9CA;AAqDA;AAAsC,cEvBzB,2BFuByB,EAAA,CAAA,OAAA,EEtB5B,kCFsB4B,EAAA,GErBnC,UFqBmC"}
1
+ {"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-DTSqS4fv.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.)
@@ -14,11 +13,7 @@ type CreateAiTranslatorOptions = {
14
13
  * import { createOpenAI } from '@ai-sdk/openai'
15
14
  * const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY })
16
15
  * const model = openai('gpt-4o')
17
- *
18
- * @example
19
- * import { createGroq } from '@ai-sdk/groq'
20
- * const groq = createGroq({ apiKey: process.env.GROQ_API_KEY })
21
- * const model = groq('llama-3.3-70b-versatile')
16
+ * const translator = createAiTranslator({ model })
22
17
  */
23
18
  model: LanguageModel;
24
19
  /**
@@ -36,28 +31,6 @@ type CreateAiTranslatorOptions = {
36
31
  * @example
37
32
  * ```ts
38
33
  * import { createAiTranslator } from '@terai/translator/translators'
39
- * import { createOpenAI } from '@ai-sdk/openai'
40
- *
41
- * const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY })
42
- * const translator = createAiTranslator({
43
- * model: openai('gpt-4o')
44
- * })
45
- * ```
46
- *
47
- * @example With Groq
48
- * ```ts
49
- * import { createAiTranslator } from '@terai/translator/translators'
50
- * import { createGroq } from '@ai-sdk/groq'
51
- *
52
- * const groq = createGroq({ apiKey: process.env.GROQ_API_KEY })
53
- * const translator = createAiTranslator({
54
- * model: groq('llama-3.3-70b-versatile')
55
- * })
56
- * ```
57
- *
58
- * @example With custom system prompt
59
- * ```ts
60
- * import { createAiTranslator } from '@terai/translator/translators'
61
34
  * import { createAnthropic } from '@ai-sdk/anthropic'
62
35
  *
63
36
  * const anthropic = createAnthropic({ apiKey: process.env.ANTHROPIC_API_KEY })
@@ -67,13 +40,10 @@ type CreateAiTranslatorOptions = {
67
40
  * })
68
41
  * ```
69
42
  */
70
- declare const createAiTranslator: ({
71
- model,
72
- systemPrompt
73
- }: CreateAiTranslatorOptions) => Translator;
43
+ export declare const createAiTranslator: ({ model, systemPrompt }: CreateAiTranslatorOptions) => Translator;
74
44
  //#endregion
75
45
  //#region src/translators/aws.d.ts
76
- type CreateAwsTranslatorOptions = TranslateClientConfig & {
46
+ export type CreateAwsTranslatorOptions = TranslateClientConfig & {
77
47
  /**
78
48
  * The source language code (e.g., 'en', 'es', 'fr').
79
49
  * If not provided, AWS Translate will auto-detect the source language.
@@ -111,13 +81,10 @@ type CreateAwsTranslatorOptions = TranslateClientConfig & {
111
81
  * })
112
82
  * ```
113
83
  */
114
- declare const createAwsTranslator: ({
115
- sourceLanguageCode,
116
- ...clientConfig
117
- }: CreateAwsTranslatorOptions) => Translator;
84
+ export declare const createAwsTranslator: ({ sourceLanguageCode, ...clientConfig }: CreateAwsTranslatorOptions) => Translator;
118
85
  //#endregion
119
86
  //#region src/translators/azure.d.ts
120
- type CreateAzureTranslatorOptions = {
87
+ export type CreateAzureTranslatorOptions = {
121
88
  /**
122
89
  * Azure Translator subscription key.
123
90
  */
@@ -160,14 +127,10 @@ type CreateAzureTranslatorOptions = {
160
127
  * })
161
128
  * ```
162
129
  */
163
- declare const createAzureTranslator: ({
164
- subscriptionKey,
165
- region,
166
- endpoint
167
- }: CreateAzureTranslatorOptions) => Translator;
130
+ export declare const createAzureTranslator: ({ subscriptionKey, region, endpoint }: CreateAzureTranslatorOptions) => Translator;
168
131
  //#endregion
169
132
  //#region src/translators/deepl.d.ts
170
- type CreateDeepLTranslatorOptions = {
133
+ export type CreateDeepLTranslatorOptions = {
171
134
  /**
172
135
  * DeepL API authentication key.
173
136
  * Get your key from https://www.deepl.com/pro-api
@@ -234,16 +197,10 @@ type CreateDeepLTranslatorOptions = {
234
197
  * })
235
198
  * ```
236
199
  */
237
- declare const createDeepLTranslator: ({
238
- authKey,
239
- options,
240
- formality,
241
- preserveFormatting,
242
- tagHandling
243
- }: CreateDeepLTranslatorOptions) => Translator;
200
+ export declare const createDeepLTranslator: ({ authKey, options, formality, preserveFormatting, tagHandling }: CreateDeepLTranslatorOptions) => Translator;
244
201
  //#endregion
245
202
  //#region src/translators/google-cloud.d.ts
246
- type CreateGoogleCloudTranslatorOptions = v2.TranslateConfig;
203
+ export type CreateGoogleCloudTranslatorOptions = v2.TranslateConfig;
247
204
  /**
248
205
  * Creates a translator using Google Cloud Translation API.
249
206
  *
@@ -269,7 +226,6 @@ type CreateGoogleCloudTranslatorOptions = v2.TranslateConfig;
269
226
  * })
270
227
  * ```
271
228
  */
272
- declare const createGoogleCloudTranslator: (options: CreateGoogleCloudTranslatorOptions) => Translator;
229
+ export declare const createGoogleCloudTranslator: (options: CreateGoogleCloudTranslatorOptions) => Translator;
273
230
  //#endregion
274
- export { CreateAiTranslatorOptions, CreateAwsTranslatorOptions, CreateAzureTranslatorOptions, CreateDeepLTranslatorOptions, CreateGoogleCloudTranslatorOptions, createAiTranslator, createAwsTranslator, createAzureTranslator, createDeepLTranslator, createGoogleCloudTranslator };
275
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;AA2HA;;;;;;;;;EC1HY,KAAA,EDcJ,aCdI;EAuCC;;;;EAqCZ,YAAA,CAAA,EAAA,MAAA;;;;ACnFD;AAqDA;;;;;;;;;;AClDA;AAwEA;;;;;;;;;;;;ACxEA;AA2BA;;;;;;;;;;;;;cJmGa;;;GAGV,8BAA4B;;;KC7HnB,0BAAA,GAA6B;;;;;ADDzC;EA2Ha,kBAAA,CAAA,EAiCZ,MAAA;CAjCkC;;;;;;;;AC1HnC;AAuCA;;;;;;;;AC9CA;AAqDA;;;;;;;;;;AClDA;AAwEA;;AAAsC,cF7BzB,mBE6ByB,EAAA,CAAA;EAAA,kBAAA;EAAA,GAAA;AAAA,CAAA,EF1BnC,0BE0BmC,EAAA,GF1BN,UE0BM;;;KD3E1B,4BAAA;;;;;;AFMZ;AA2HA;;EAAmC,MAAA,EAAA,MAAA;EAGhC;;;;;;AC7HH;AAuCA;;;;;;;;AC9CA;AAqDA;;;;;;;;;;AClDA;AAwEA;;;;;;AAMG,cD5BU,qBC4BV,EAAA,CAAA;EAAA,eAAA;EAAA,MAAA;EAAA;AAAA,CAAA,EDxBA,4BCwBA,EAAA,GDxB+B,UCwB/B;;;KA9ES,4BAAA;;;;;EHGA,OAAA,EAAA,MAAA;EA2HC;;;EAGV,OAAA,CAAA,EGvHQ,KAAA,CAAM,iBHuHd;EAA4B;;;;;AC7H/B;AAuCA;;;EAGgC,SAAA,CAAA,EEzBnB,KAAA,CAAM,SFyBa;EAkC/B;;;;ECnFW,kBAAA,CAAA,EAAA,OAAA;EAqDC;;;;EAIV,WAAA,CAAA,EAAA,KAAA,GAAA,MAAA;CAA+B;;;;;ACtDlC;AAwEA;;;;;;;;;;;;ACxEA;AA2BA;;;;;;;;;;;;;;;;;;cD6Ca;;;;;;GAMV,iCAA+B;;;KC9EtB,kCAAA,GAAqC,EAAA,CAAG;;;;;AJGpD;AA2HA;;;;;;;;;AC1HA;AAuCA;;;;;;;;AC9CA;AAqDA;AAAsC,cEvBzB,2BFuByB,EAAA,CAAA,OAAA,EEtB5B,kCFsB4B,EAAA,GErBnC,UFqBmC"}
1
+ {"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
@@ -40,7 +40,7 @@ contextually appropriate, and maintain the natural feel of native language.
40
40
 
41
41
  ## Output Format
42
42
  - Return ONLY a valid JSON object
43
- - Use the EXACT SAME KEYS as the input
43
+ - Use the EXACT SAME KEYS as the input (CRITICAL)
44
44
  - Do NOT add newlines within string values
45
45
  - Do NOT modify, remove, or add keys
46
46
  - Do NOT include markdown code blocks or extra formatting
@@ -55,15 +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)`,c=({model:n,systemPrompt:r=s})=>async({dictionary:i,projectLocale:a,locale:c})=>{let{object:l}=await e({model:n,output:`object`,schema:t.record(t.string(),t.string()),system:r?o.outdent`
58
+ - "Click <strong>here</strong>" → "Haz clic **aquí**" (changed HTML to markdown)`,c=({model:t,systemPrompt:n=s})=>async({dictionary:r,projectLocale:i,locale:a})=>{let{object:c}=await e({model:t,output:`no-schema`,system:n?o.outdent`
59
59
  ${s}
60
60
 
61
- ## Additonal User System Instructions (highest priority)
62
- ${r}
61
+ ## Additional User System Instructions (highest priority)
62
+ ${n}
63
63
  `:s,prompt:o.outdent`
64
- Translate the following JSON from "${a}" to "${c}".
65
- <target-json>
66
- ${JSON.stringify(i,null,2)}
67
- </target-json>
68
- `});return l},l=({sourceLanguageCode:e=`auto`,...t})=>{let i=new n(t);return async({dictionary:t,locale:n,projectLocale:a})=>{let o={},s=e===`auto`?a:e;return await Promise.all(Object.keys(t).map(async e=>{let a=t[e],c=new r({Text:a,SourceLanguageCode:s,TargetLanguageCode:n});o[e]=(await i.send(c)).TranslatedText||a})),o}},u=({subscriptionKey:e,region:t,endpoint:n=`https://api.cognitive.microsofttranslator.com`})=>async({dictionary:r,locale:i,projectLocale:a})=>{let o={},s=Object.keys(r),c=s.map(e=>({text:r[e]})),l=[];for(let e=0;e<c.length;e+=100)l.push(c.slice(e,e+100));let u=0;for(let c of l){let l=new URL(`/translate`,n);l.searchParams.set(`api-version`,`3.0`),l.searchParams.set(`from`,a),l.searchParams.set(`to`,i);let d=await fetch(l.toString(),{method:`POST`,headers:{"Ocp-Apim-Subscription-Key":e,"Ocp-Apim-Subscription-Region":t,"Content-Type":`application/json`},body:JSON.stringify(c)});if(!d.ok){let e=await d.text();throw Error(`Azure Translator API error: ${d.status} - ${e}`)}let f=await d.json();for(let e of f){let t=s[u];o[t]=e.translations[0]?.text||r[t],u++}}return o},d=({authKey:e,options:t,formality:n=`default`,preserveFormatting:r=!0,tagHandling:a=`xml`})=>{let o=new i.Translator(e,t);return async({dictionary:e,locale:t,projectLocale:i})=>{let s={},c=Object.keys(e),l=c.map(t=>e[t]),u=t.toUpperCase(),d=i.toUpperCase(),f=await o.translateText(l,d,u,{formality:n,preserveFormatting:r,tagHandling:a}),p=Array.isArray(f)?f:[f];for(let t=0;t<c.length;t++){let n=c[t];s[n]=p[t]?.text||e[n]}return s}},f=e=>{let t=new a.Translate(e);return async({dictionary:e,locale:n})=>{let r={};return await Promise.all(Object.keys(e).map(async i=>{let a=e[i],[o]=await t.translate(a,n);r[i]=o})),r}};export{c as createAiTranslator,l as createAwsTranslator,u as createAzureTranslator,d as createDeepLTranslator,f as createGoogleCloudTranslator};
64
+ Translate the following JSON from locale:"${i}" to locale:"${a}".
65
+
66
+ <target-json>
67
+ ${JSON.stringify(r,null,2)}
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}),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};
69
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 *\n\t * @example\n\t * import { createGroq } from '@ai-sdk/groq'\n\t * const groq = createGroq({ apiKey: process.env.GROQ_API_KEY })\n\t * const model = groq('llama-3.3-70b-versatile')\n\t */\n\tmodel: LanguageModel\n\n\t/**\n\t * Custom system prompt for translation.\n\t * If not provided, a generic prompt will be used that covers most app translation cases.\n\t */\n\tsystemPrompt?: string\n}\n\nconst DEFAULT_SYSTEM_PROMPT = outdent`\n# Expert AI Translator\n\n## Your Role\nYou are an expert translator and localization specialist with deep expertise in software\napplications, user interfaces, and technical documentation. Your translations are accurate,\ncontextually appropriate, and maintain the natural feel of native language.\n\n## Critical Requirements\n\n### 1. Preserve Code Patterns\n- **NEVER** translate template variables (e.g., \\${var}, {var}, %s, %d)\n- **ALWAYS** keep placeholder syntax exactly as provided\n- **MAINTAIN** all escape sequences and special characters\n- **PRESERVE** HTML tags, markdown syntax, and formatting codes\n\n### 2. Translation Quality\n- Use **natural, idiomatic** expressions in the target language\n- Maintain **consistent terminology** throughout all strings\n- Adapt **cultural references** appropriately for the target locale\n- Ensure **grammatical correctness** and proper sentence structure\n\n### 3. Context Awareness\n- **UI Elements**: Keep translations concise for buttons, labels, and menus\n- **Messages**: Maintain appropriate tone (error messages: clear, help text: friendly)\n- **Technical Terms**: Use standard industry terminology when available\n- **Brand Names**: Do not translate proper nouns, product names, or brand names\n\n### 4. Formatting Guidelines\n- **Punctuation**: Follow target language conventions\n- **Capitalization**: Match target language standards (e.g., German nouns)\n- **Numbers & Dates**: Keep placeholders unchanged; format will be handled at runtime\n- **Whitespace**: Preserve spacing around variables and special characters\n\n### 5. Tone & Style\n- **Consistency**: Maintain uniform voice across all translations\n- **Formality**: Match the formality level of the source text\n- **Clarity**: Prioritize understanding over literal translation\n- **Brevity**: Keep translations concise, especially for UI elements\n\n## Output Format\n- Return ONLY a valid JSON object\n- Use the EXACT SAME KEYS as the input\n- Do NOT add newlines within string values\n- Do NOT modify, remove, or add keys\n- Do NOT include markdown code blocks or extra formatting\n\n## Examples of What to Preserve\n\n✅ CORRECT:\n- \"Welcome \\${var}\" → \"Bienvenido \\${var}\"\n- \"You have {count} items\" → \"Tienes {count} elementos\"\n- \"Click <strong>here</strong>\" → \"Haz clic <strong>aquí</strong>\"\n\n❌ INCORRECT:\n- \"Welcome \\${var}\" → \"Bienvenido Juan\" (translated variable)\n- \"You have {var} items\" → \"Tienes 3 elementos\" (removed braces)\n- \"Click <strong>here</strong>\" → \"Haz clic **aquí**\" (changed HTML to markdown)`\n\n/**\n * Creates an AI-powered translator using the Vercel AI SDK.\n *\n * This translator uses structured output generation to translate dictionaries\n * while preserving template variables, formatting, and code patterns.\n *\n * @example\n * ```ts\n * import { createAiTranslator } from '@terai/translator/translators'\n * import { createOpenAI } from '@ai-sdk/openai'\n *\n * const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY })\n * const translator = createAiTranslator({\n * model: openai('gpt-4o')\n * })\n * ```\n *\n * @example With Groq\n * ```ts\n * import { createAiTranslator } from '@terai/translator/translators'\n * import { createGroq } from '@ai-sdk/groq'\n *\n * const groq = createGroq({ apiKey: process.env.GROQ_API_KEY })\n * const translator = createAiTranslator({\n * model: groq('llama-3.3-70b-versatile')\n * })\n * ```\n *\n * @example With custom system prompt\n * ```ts\n * import { createAiTranslator } from '@terai/translator/translators'\n * import { createAnthropic } from '@ai-sdk/anthropic'\n *\n * const anthropic = createAnthropic({ apiKey: process.env.ANTHROPIC_API_KEY })\n * const translator = createAiTranslator({\n * model: anthropic('claude-3-5-sonnet-20241022'),\n * systemPrompt: 'Custom prompt for my specific use case...'\n * })\n * ```\n */\nexport const createAiTranslator = ({\n\tmodel,\n\tsystemPrompt = DEFAULT_SYSTEM_PROMPT\n}: CreateAiTranslatorOptions): Translator => {\n\tconst translator: Translator = async ({\n\t\tdictionary,\n\t\tprojectLocale,\n\t\tlocale\n\t}) => {\n\t\tconst { object: translation } = await generateObject({\n\t\t\tmodel,\n\t\t\toutput: 'object',\n\t\t\tschema: z.record(z.string(), z.string()),\n\t\t\tsystem: !systemPrompt\n\t\t\t\t? DEFAULT_SYSTEM_PROMPT\n\t\t\t\t: outdent`\n\t\t\t\t${DEFAULT_SYSTEM_PROMPT}\n\t\t\t\t\n\t\t\t\t## Additonal User System Instructions (highest priority)\n\t\t\t\t${systemPrompt}\n\t\t\t`,\n\t\t\tprompt: outdent`\n\t\t\tTranslate the following JSON from \"${projectLocale}\" to \"${locale}\".\n\t\t\t<target-json>\n\t\t\t\t${JSON.stringify(dictionary, null, 2)}\n\t\t\t</target-json>\n\t\t\t`\n\t\t})\n\n\t\treturn translation\n\t}\n\n\treturn translator\n}\n","// Dependencies\nimport {\n\tTranslateClient,\n\tTranslateTextCommand,\n\ttype TranslateClientConfig\n} from '@aws-sdk/client-translate'\n\n// Types\nimport type { Dictionary, Translator } from '@terai/types'\n\nexport type CreateAwsTranslatorOptions = TranslateClientConfig & {\n\t/**\n\t * The source language code (e.g., 'en', 'es', 'fr').\n\t * If not provided, AWS Translate will auto-detect the source language.\n\t * @default 'auto'\n\t */\n\tsourceLanguageCode?: string\n}\n\n/**\n * Creates a translator using AWS Translate.\n *\n * AWS Translate is a neural machine translation service that delivers\n * fast, high-quality, and affordable language translation.\n *\n * @example\n * ```ts\n * import { createAwsTranslator } from '@terai/translator/translators'\n *\n * const translator = createAwsTranslator({\n * region: 'us-east-1',\n * credentials: {\n * accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n * secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY\n * }\n * })\n * ```\n *\n * @example With AWS profile\n * ```ts\n * import { createAwsTranslator } from '@terai/translator/translators'\n * import { fromIni } from '@aws-sdk/credential-providers'\n *\n * const translator = createAwsTranslator({\n * region: 'us-east-1',\n * credentials: fromIni({ profile: 'my-profile' })\n * })\n * ```\n */\nexport const createAwsTranslator = ({\n\tsourceLanguageCode = 'auto',\n\t...clientConfig\n}: CreateAwsTranslatorOptions): Translator => {\n\tconst client = new TranslateClient(clientConfig)\n\n\tconst translator: Translator = async ({\n\t\tdictionary,\n\t\tlocale,\n\t\tprojectLocale\n\t}) => {\n\t\tconst translatedOutput: Dictionary = {}\n\n\t\t// Use projectLocale as source if not set to auto\n\t\tconst source =\n\t\t\tsourceLanguageCode === 'auto' ? projectLocale : sourceLanguageCode\n\n\t\tawait Promise.all(\n\t\t\tObject.keys(dictionary).map(async (key) => {\n\t\t\t\tconst value = dictionary[key]\n\n\t\t\t\tconst command = new TranslateTextCommand({\n\t\t\t\t\tText: value,\n\t\t\t\t\tSourceLanguageCode: source,\n\t\t\t\t\tTargetLanguageCode: locale\n\t\t\t\t})\n\n\t\t\t\tconst response = await client.send(command)\n\n\t\t\t\ttranslatedOutput[key] = response.TranslatedText || value\n\t\t\t})\n\t\t)\n\n\t\treturn translatedOutput\n\t}\n\n\treturn translator\n}\n","// Types\nimport type { Dictionary, Translator } from '@terai/types'\n\nexport type CreateAzureTranslatorOptions = {\n\t/**\n\t * Azure Translator subscription key.\n\t */\n\tsubscriptionKey: string\n\n\t/**\n\t * Azure region where the Translator resource is located.\n\t * @example 'eastus', 'westeurope', 'southeastasia'\n\t */\n\tregion: string\n\n\t/**\n\t * Custom endpoint URL. If not provided, uses the global endpoint.\n\t * @default 'https://api.cognitive.microsofttranslator.com'\n\t */\n\tendpoint?: string\n}\n\ntype AzureTranslationResponse = Array<{\n\ttranslations: Array<{\n\t\ttext: string\n\t\tto: string\n\t}>\n}>\n\n/**\n * Creates a translator using Microsoft Azure Translator.\n *\n * Azure Translator is a cloud-based machine translation service\n * that supports 100+ languages.\n *\n * @example\n * ```ts\n * import { createAzureTranslator } from '@terai/translator/translators'\n *\n * const translator = createAzureTranslator({\n * subscriptionKey: process.env.AZURE_TRANSLATOR_KEY,\n * region: 'eastus'\n * })\n * ```\n *\n * @example With custom endpoint\n * ```ts\n * import { createAzureTranslator } from '@terai/translator/translators'\n *\n * const translator = createAzureTranslator({\n * subscriptionKey: process.env.AZURE_TRANSLATOR_KEY,\n * region: 'eastus',\n * endpoint: 'https://my-custom-endpoint.cognitiveservices.azure.com'\n * })\n * ```\n */\nexport const createAzureTranslator = ({\n\tsubscriptionKey,\n\tregion,\n\tendpoint = 'https://api.cognitive.microsofttranslator.com'\n}: CreateAzureTranslatorOptions): Translator => {\n\tconst translator: Translator = async ({\n\t\tdictionary,\n\t\tlocale,\n\t\tprojectLocale\n\t}) => {\n\t\tconst translatedOutput: Dictionary = {}\n\t\tconst keys = Object.keys(dictionary)\n\t\tconst texts = keys.map((key) => ({ text: dictionary[key] }))\n\n\t\t// Azure Translator API accepts up to 100 texts per request\n\t\tconst batchSize = 100\n\t\tconst batches: Array<Array<{ text: string }>> = []\n\n\t\tfor (let i = 0; i < texts.length; i += batchSize) {\n\t\t\tbatches.push(texts.slice(i, i + batchSize))\n\t\t}\n\n\t\tlet keyIndex = 0\n\n\t\tfor (const batch of batches) {\n\t\t\tconst url = new URL('/translate', endpoint)\n\t\t\turl.searchParams.set('api-version', '3.0')\n\t\t\turl.searchParams.set('from', projectLocale)\n\t\t\turl.searchParams.set('to', locale)\n\n\t\t\tconst response = await fetch(url.toString(), {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Ocp-Apim-Subscription-Key': subscriptionKey,\n\t\t\t\t\t'Ocp-Apim-Subscription-Region': region,\n\t\t\t\t\t'Content-Type': 'application/json'\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(batch)\n\t\t\t})\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst errorText = await response.text()\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Azure Translator API error: ${response.status} - ${errorText}`\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst results: AzureTranslationResponse = await response.json()\n\n\t\t\tfor (const result of results) {\n\t\t\t\tconst key = keys[keyIndex]\n\t\t\t\ttranslatedOutput[key] = result.translations[0]?.text || dictionary[key]\n\t\t\t\tkeyIndex++\n\t\t\t}\n\t\t}\n\n\t\treturn translatedOutput\n\t}\n\n\treturn translator\n}\n","// Dependencies\nimport * as deepl from 'deepl-node'\n\n// Types\nimport type { Dictionary, Translator } from '@terai/types'\n\nexport type CreateDeepLTranslatorOptions = {\n\t/**\n\t * DeepL API authentication key.\n\t * Get your key from https://www.deepl.com/pro-api\n\t */\n\tauthKey: string\n\n\t/**\n\t * Additional options for the DeepL Translator.\n\t */\n\toptions?: deepl.TranslatorOptions\n\n\t/**\n\t * Formality preference for translations.\n\t * - 'default': Default formality\n\t * - 'more': More formal language\n\t * - 'less': Less formal language\n\t * - 'prefer_more': Prefer more formal if available\n\t * - 'prefer_less': Prefer less formal if available\n\t * @default 'default'\n\t */\n\tformality?: deepl.Formality\n\n\t/**\n\t * Whether to preserve formatting in translations.\n\t * @default true\n\t */\n\tpreserveFormatting?: boolean\n\n\t/**\n\t * Specify how to handle XML tags in text.\n\t * @default 'xml'\n\t */\n\ttagHandling?: 'xml' | 'html'\n}\n\n/**\n * Creates a translator using DeepL API.\n *\n * DeepL is known for producing high-quality, natural-sounding translations\n * and is often considered one of the best machine translation services available.\n *\n * @example\n * ```ts\n * import { createDeepLTranslator } from '@terai/translator/translators'\n *\n * const translator = createDeepLTranslator({\n * authKey: process.env.DEEPL_API_KEY\n * })\n * ```\n *\n * @example With formality preference\n * ```ts\n * import { createDeepLTranslator } from '@terai/translator/translators'\n *\n * const translator = createDeepLTranslator({\n * authKey: process.env.DEEPL_API_KEY,\n * formality: 'less' // Use informal language\n * })\n * ```\n *\n * @example With HTML tag handling\n * ```ts\n * import { createDeepLTranslator } from '@terai/translator/translators'\n *\n * const translator = createDeepLTranslator({\n * authKey: process.env.DEEPL_API_KEY,\n * tagHandling: 'html',\n * preserveFormatting: true\n * })\n * ```\n */\nexport const createDeepLTranslator = ({\n\tauthKey,\n\toptions,\n\tformality = 'default',\n\tpreserveFormatting = true,\n\ttagHandling = 'xml'\n}: CreateDeepLTranslatorOptions): Translator => {\n\tconst deeplTranslator = new deepl.Translator(authKey, options)\n\n\tconst translator: Translator = async ({\n\t\tdictionary,\n\t\tlocale,\n\t\tprojectLocale\n\t}) => {\n\t\tconst translatedOutput: Dictionary = {}\n\t\tconst keys = Object.keys(dictionary)\n\t\tconst texts = keys.map((key) => dictionary[key])\n\n\t\t// DeepL uses specific language codes (e.g., 'EN-US' instead of 'en-US')\n\t\tconst targetLang = locale.toUpperCase() as deepl.TargetLanguageCode\n\t\tconst sourceLang = projectLocale.toUpperCase() as deepl.SourceLanguageCode\n\n\t\tconst results = await deeplTranslator.translateText(\n\t\t\ttexts,\n\t\t\tsourceLang,\n\t\t\ttargetLang,\n\t\t\t{\n\t\t\t\tformality,\n\t\t\t\tpreserveFormatting,\n\t\t\t\ttagHandling\n\t\t\t}\n\t\t)\n\n\t\t// Handle both single result and array of results\n\t\tconst translationResults = Array.isArray(results) ? results : [results]\n\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tconst key = keys[i]\n\t\t\ttranslatedOutput[key] = translationResults[i]?.text || dictionary[key]\n\t\t}\n\n\t\treturn translatedOutput\n\t}\n\n\treturn translator\n}\n","// Dependencies\nimport { v2 } from '@google-cloud/translate'\n\n// Types\nimport type { Dictionary, Translator } from '@terai/types'\n\nexport type CreateGoogleCloudTranslatorOptions = v2.TranslateConfig\n\n/**\n * Creates a translator using Google Cloud Translation API.\n *\n * This translator uses Google Cloud's Neural Machine Translation (NMT)\n * for high-quality translations.\n *\n * @example\n * ```ts\n * import { createGoogleCloudTranslator } from '@terai/translator/translators'\n *\n * const translator = createGoogleCloudTranslator({\n * projectId: process.env.GOOGLE_CLOUD_PROJECT_ID,\n * keyFilename: './google-credentials.json'\n * })\n * ```\n *\n * @example With API key\n * ```ts\n * import { createGoogleCloudTranslator } from '@terai/translator/translators'\n *\n * const translator = createGoogleCloudTranslator({\n * key: process.env.GOOGLE_CLOUD_API_KEY\n * })\n * ```\n */\nexport const createGoogleCloudTranslator = (\n\toptions: CreateGoogleCloudTranslatorOptions\n): Translator => {\n\tconst translate = new v2.Translate(options)\n\n\tconst translator: Translator = async ({ dictionary, locale }) => {\n\t\tconst translatedOutput: Dictionary = {}\n\n\t\tawait Promise.all(\n\t\t\tObject.keys(dictionary).map(async (key) => {\n\t\t\t\tconst value = dictionary[key]\n\n\t\t\t\tconst [translation] = await translate.translate(value, locale)\n\n\t\t\t\ttranslatedOutput[key] = translation\n\t\t\t})\n\t\t)\n\n\t\treturn translatedOutput\n\t}\n\n\treturn translator\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
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.15",
4
+ "version": "0.0.17",
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.15",
50
- "@terai/types": "0.0.15",
51
- "@terai/utils": "0.0.15"
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.17",
57
+ "@terai/types": "0.0.17",
58
+ "@terai/utils": "0.0.17"
52
59
  },
53
60
  "scripts": {
54
61
  "dev": "tsdown --format=esm --no-dts --watch",