---
source: https://cli.eloqnt.dev/docs/changelog/sdk
docs_index: https://cli.eloqnt.dev/llms.txt
---

# @eloqnt/sdk changelog

## 0.6.13

- `studio.eloqnt.dev` was renamed to `engine.eloqnt.dev`, with CLI docs remaining at `cli.eloqnt.dev`.
- `inconsistent-exact-plurals` now 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 lint` now flags a translation that breaks the ICU syntax of its source message (`inconsistent-args`).

## 0.6.11

- Improve `eloqnt crowdin` errors
- Support `dest` in `crowdin.yml`.
- Validate Xcode workflow states in String Catalogs: a target value marked `new` or `needs_review` now counts as a missing translation (reported by `missing-translation` and resolved by `eloqnt translate`), and entries Xcode marked stale are reported by `orphan-message`.

## 0.6.10

- Allow a `messages.codes` value that reads as a locale tag (`english`, `german`) when `messages.locales` lists 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 `null` in messages files instead of refusing the run.
- Read `.po` catalogs that wrap long strings across multiple lines, which previously failed to parse.

## 0.6.9

- Message keys named `prototype`, `constructor` or `__proto__` are now treated as regular messages instead of failing the run.
- Pin `@swc/core` minor range to avoid incompatibility with latest `@swc/core` version (a full upgrade will ship later).

## 0.6.8

- Added the `lint` config: set a rule's severity or turn it off via `lint.rules` (`'error'`, `'warn'`, `'off'`), and scope settings to matching message keys via `lint.overrides`.

## 0.6.7

- Support `languages_mapping` and `content_segmentation` in `crowdin.yml`.
- Translating a project that has no target locale now fails with a clear error, instead of reporting success after translating nothing.
- `Promise.all` is now supported for `getExtracted` and `getTranslations` (e.g. for the `orphan-message` lint rule).
- A `translate` run now runs in local batches and reports how far along it is while it works.

## 0.6.6

- Rename the `cwd` option to `rootDir` across the SDK (`translate`, `reviewSource`, `lint`, `updateMessages`, `prepareCrowdinSync`), since it names the project root rather than the invocation directory.
- Resolve relative `srcPath` entries against the `rootDir` option instead of the process working directory.
- Add a `styleguides` config option that sets the directory styleguides are loaded from, e.g. to share one set across multiple projects.

## 0.6.5

- `messages.format` can now reference a codec from an installed package by its name (e.g. `'@eloqnt/format-apple-xcstrings'`).
- `defineCodec` now accepts a shared-file variant for formats that keep every locale in one file.
- `messages.path` entries 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-case` lint rule for a `plural`, `selectordinal`, or `select` statement without an `other` case, 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](https://x.com/jamannnnnn/status/2082746902219559208)). The rule is replaced by two, since its halves answer to different authorities: `unreachable-plural-case` for a case the target locale never selects, and `inconsistent-exact-plurals` for `=0`-style cases that don't match the source.

## 0.6.1

- Fix typo in `inconsistent-plurals` lint message.

## 0.6.0

- Add an `inconsistent-plurals` lint 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-locale` lint rule reports them, and `eloqnt translate` stops before spending inference on one.
- `eloqnt translate` now reads CLDR data so `plural` and `selectordinal` statements are guaranteed to be adjusted for target locales.

## 0.5.2

- Add `eloqnt crowdin` commands for syncing messages with a Crowdin project via `crowdin.yml`: `upload sources`, `upload translations`, and `download translations`.

## 0.5.1

- Improve prompt caching.

## 0.5.0

- `eloqnt lint` now 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 `--strict` to 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.path` to 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/_internal` for 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/inference` into `@eloqnt/sdk`.
- Add support for messages extracted by experimental `useExtracted` in `next-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 `.json` formats, output file reference for `undefined-key` rule

## 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 `toJSONString` from the custom codec interface. Catalogs are loaded via `decode`, so codecs no longer define it.
- Handle messages split across several `messages.path` folders correctly, including a new `duplicate-id` lint rule for ids repeated across folders.

## 0.0.3

- The `inconsistent-args` lint 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.

---

For an index of every eloqnt/cli documentation page, see [https://cli.eloqnt.dev/llms.txt](https://cli.eloqnt.dev/llms.txt).
