Changelog
@eloqnt/sdk
Historic reference of all changes to @eloqnt/sdk.
0.6.31
- Add
eloqnt crowdin context extract,upload, anddownloadto add a source outline of where your code uses each string to its context on Crowdin. Context you write in place of an outline is kept until the string’s text changes. undefined-keynow also flagsuseExtractedandgetExtractedmessages that are missing from the source messages file, e.g. when code was changed without running next-intl's extraction.- A string used across many files now sends source context from at most two of them, keeping requests for widely shared strings small.
messages.localesnow accepts a readonly array, so a locale list declared withas constno longer needs to be spread into a mutable copy.- Fail with an error when a
srcPathfolder doesn’t exist or holds no next-intl calls, instead of runninglint,translate, andreview sourcewithout source analysis.
0.6.30
inconsistent-argsno longer reports an ICU argument as missing when the source spells it only inside plural cases the target locale never selects.
0.6.29
- With your own
model, a translation that fails the post-translation checks is now retried with raised reasoning effort, the way the hosted engine already does. Reasoning options you set for your provider take precedence. eloqnt reviewnow reports its post-review checks as a step of their own, the wayeloqnt translatedoes for its post-translation checks.eloqnt reviewnow retries a fix that fails the post-review checks, telling the model what was wrong, instead of dropping it. A fix that still fails after the retries is dropped as before.- Attach source outlines as context:
translateandreviewruns withsrcPathconfigured now collapse each module around its call sites into a small, deterministic code excerpt and send it alongside the strings, so the model can e.g. tell an alert title from a button label and more.
0.6.28
translateleaves a key whose shape in a target conflicts with the source (reported bystructure-mismatch) as it is and reports it as missing. Pass the key viaidsto replace it in the source's shape, which also copies a boolean or number from the source again.
0.6.27
- Depend on
@eloqnt/config,@eloqnt/format-jsonand@eloqnt/format-pothrough^0.1.0ranges instead of pinning one version each, so they resolve to a single copy alongside anything else that depends on them.
0.6.26
ELOQNT_ENGINE_URLnow takes the production engine origin or a localhost address, and reports anINVALID_ENGINE_URLerror for anything else.- Publish under the MIT license, with a
LICENSEfile in the package.
0.6.23
- Use the stable release of the extractor SWC plugin.
0.6.19
- The built-in
poandjsonformats now resolve to@eloqnt/format-poand@eloqnt/format-json.
0.6.18
- Allow a
messages.codesentry whose code reads as a locale tag (e.g.rue→ry) when locales are inferred. Two files resolving to one locale is now reported when it happens, naming both.
0.6.17
- Recognize locales CLDR carries no plural rules for, such as Occitan (
oc) and Latin (la). They no longer reportinvalid-locale,eloqnt translateno longer refuses them, and the rules that need plural categories stand down for them while every other rule keeps checking.
0.6.16
- Add support for
import {useTranslations} from 'use-intl'in usage detection.
0.6.15
- Added a
localesselector tolint.overrides, so a rule can be scoped to specific locales instead of turned off everywhere.
0.6.14
- Repair mechanical translation defects deterministically instead of retrying them.
0.6.13
studio.eloqnt.devwas renamed toengine.eloqnt.dev, with CLI docs remaining atcli.eloqnt.dev.inconsistent-exact-pluralsnow compares a message's repeated plural blocks on one variable with the source's block in the same position, instead of always the first.
0.6.12
eloqnt lintnow flags a translation that breaks the ICU syntax of its source message (inconsistent-args).
0.6.11
- Improve
eloqnt crowdinerrors - Support
destincrowdin.yml. - Validate Xcode workflow states in String Catalogs: a target value marked
neworneeds_reviewnow counts as a missing translation (reported bymissing-translationand resolved byeloqnt translate), and entries Xcode marked stale are reported byorphan-message.
0.6.10
- Allow a
messages.codesvalue that reads as a locale tag (english,german) whenmessages.localeslists the locales — the mapping is only refused now when it collides with another locale you've listed. - Update the next-intl message extractor.
- Support arrays, booleans, numbers and
nullin messages files instead of refusing the run. - Read
.pocatalogs that wrap long strings across multiple lines, which previously failed to parse.
0.6.9
- Message keys named
prototype,constructoror__proto__are now treated as regular messages instead of failing the run. - Pin
@swc/coreminor range to avoid incompatibility with latest@swc/coreversion (a full upgrade will ship later).
0.6.8
- Added the
lintconfig: set a rule's severity or turn it off vialint.rules('error','warn','off'), and scope settings to matching message keys vialint.overrides.
0.6.7
- Support
languages_mappingandcontent_segmentationincrowdin.yml. - Translating a project that has no target locale now fails with a clear error, instead of reporting success after translating nothing.
Promise.allis now supported forgetExtractedandgetTranslations(e.g. for theorphan-messagelint rule).- A
translaterun now runs in local batches and reports how far along it is while it works.
0.6.6
- Rename the
cwdoption torootDiracross the SDK (translate,reviewSource,lint,updateMessages,prepareCrowdinSync), since it names the project root rather than the invocation directory. - Resolve relative
srcPathentries against therootDiroption instead of the process working directory. - Add a
styleguidesconfig option that sets the directory styleguides are loaded from, e.g. to share one set across multiple projects.
0.6.5
messages.formatcan now reference a codec from an installed package by its name (e.g.'@eloqnt/format-apple-xcstrings').defineCodecnow accepts a shared-file variant for formats that keep every locale in one file.messages.pathentries can now split into{source, targets}for when source and target files need a different path structure.
0.6.4
- Explain what to do when a messages file holds a value that can't be translated. An array now says so and points at giving each item its own key or configuring a custom codec, instead of asking you to fix a file that already parses.
0.6.3
- Strip unsupported plural forms deterministically.
0.6.2
- Add a
missing-other-caselint rule for aplural,selectordinal, orselectstatement without anothercase, which throws where the message is formatted. Messages like these were previously skipped by every rule, so their ICU arguments now get checked too. - A translation no longer has to spell out every plural category its locale can select on (ref). The rule is replaced by two, since its halves answer to different authorities:
unreachable-plural-casefor a case the target locale never selects, andinconsistent-exact-pluralsfor=0-style cases that don't match the source.
0.6.1
- Fix typo in
inconsistent-pluralslint message.
0.6.0
- Add an
inconsistent-pluralslint rule that reports plural cases which don't match the target locale's CLDR categories. - Locales that aren't recognised now fail loudly instead of being silently treated as the default locale. A new
invalid-localelint rule reports them, andeloqnt translatestops before spending inference on one. eloqnt translatenow reads CLDR data sopluralandselectordinalstatements are guaranteed to be adjusted for target locales.
0.5.2
- Add
eloqnt crowdincommands for syncing messages with a Crowdin project viacrowdin.yml:upload sources,upload translations, anddownload translations.
0.5.1
- Improve prompt caching.
0.5.0
eloqnt lintnow distinguishes errors from warnings. Missing translations are warnings and no longer fail the run, so lint can gate CI without requiring translations on every commit. Pass--strictto treat warnings as errors.
0.4.0
- Added
eloqnt review source: Reviews source strings for typos and grammatical errors and fixes them in place.
0.3.1
- Support path templates for
messages.pathto support non-next-intl consumers (e.g. i18next)
0.3.0
- Drop internal exports from
@eloqnt/sdk's public entry. The main entry now surfaces only what's intended for external use (lint,defineConfig,defineCodec,translate, and their return types); everything else moved to@eloqnt/sdk/_internalfor workspace-only consumption.
- Drop the engine API's backward-compat fields for pre-split CLIs. The older clients weren't actually picking them up in practice, so the fallback wasn't doing anything anyway.
- Merge
@eloqnt/inferenceinto@eloqnt/sdk. - Add support for messages extracted by experimental
useExtractedinnext-intl@<4.13. - When config discovery fails, check for common misspellings of
.eloqnt(.eloquent,.eloqunt,.eloqent) and point the user at the rename. - Load
.eloqnt/config.{ts,mts,js,mjs}and custom codec files through jiti instead of Node's native loader. The host project no longer needs"type": "module"to use TypeScript, and TypeScript files now work on older Node versions.
0.2.0
- Upgrade to AI SDK 7.
0.1.0
- Split plans into "Hosted model" and "Bring your own model"
0.0.8
- Run static post-translation checks (ICU placeholder parity) on every received translation, with up to two automatic re-translations on failure.
0.0.7
- Consume AST context for
.jsonformats, output file reference forundefined-keyrule
0.0.6
- Speed up linting on large projects by scanning source files for message usage concurrently.
0.0.5
- Drop a redundant prompt fetch in engine-mode translation. A run with nothing to translate now makes no request, so it no longer fails up front when signed out or unsubscribed.
0.0.4
- Remove
toJSONStringfrom the custom codec interface. Catalogs are loaded viadecode, so codecs no longer define it. - Handle messages split across several
messages.pathfolders correctly, including a newduplicate-idlint rule for ids repeated across folders.
0.0.3
- The
inconsistent-argslint rule now catches rich tags (<b>…</b>) a translation drops or invents, not just{argument}placeholders. Placeholders are compared by their literal token, so a<name>tag never stands in for a{name}argument, and the reporter underlines the stray tag in the value.
0.0.2
- Make CLI errors friendlier.
0.0.1
- Exercise the automated release pipeline. No functional changes since the initial 0.0.0 publish.