Repository navigation
v0.7.0
Released 0.7.0 across the coordinated @comvi/* release train.
The GitHub Release asset comvi-v0.7.0.tar.gz is the single archive for this release. It contains the packed npm tarballs plus manifest.json and SHA256SUMS.
Comvi i18n 0.7.0 is a CLI release: comvi gets one exit-code scheme for every command, comvi check validates catalogs offline, and comvi translate fills missing values with machine translation. The in-context editor now sends only the languages you changed, the package READMEs are rewritten, and SvelteKit and SolidStart join the examples. Twelve packages ship at one version.
Before you upgrade
- The breaking changes are confined to
@comvi/cli: exit codes, whatpushvalidates and how it handles conflicts, and the counts inPushResult. A CI script that tests$?after anycomvicommand may need the changes in the next section. The runtime packages ship at 0.7.0 with no API change;@comvi/vite-pluginmoves its ICU scanner into a shared module, which changes the generated types only for apluralorselectordinalexplicit value@comvi/corealready rejects (=x,=1e3,=.5,=+1,=Infinity): such a key now reports the ICU issue and gets no parameters, as{price, number}already did. comvi pushfails on a locale the project lacks and on a push with nothing in it. Both used to pass. See--skip-unknown-localesand--allow-emptybelow.comvi pushin the default--force-mode askcan now exit1with nothing written. When the preview finds no conflict, the commit runs with conflict checking on, so a value a translator saves on the platform between the preview and the commit stops the push; the error says how many values changed and that running the push again resolves it. Before, that value was overwritten.comvi translateneeds a new API key scope,mt:use, which comvi.io now offers. In the Comvi app a key's scopes are set when it is created, so create a new key with it.
CLI: one exit-code scheme
Every command now exits with one of five codes, so CI can tell a conflict, an outage and a bad key apart:
| Code | Meaning |
|---|---|
0 |
Done |
1 |
The command ran and found a problem: a conflict under --force-mode abort, outdated types under typegen --check, errors under comvi check (warnings too with --strict), a value comvi translate could not translate; also a local failure such as an unwritable file |
2 |
The platform was unreachable, timed out, answered 408, 409, 425, 429 or 5xx, or sent an unexpected response: retry |
3 |
The API key was rejected or lacks access, or a plan or credit limit was reached |
4 |
Invalid input |
What a script that tests exit codes should know:
1is narrower. It no longer covers outages (now2), a rejected key (now3), a missing.comvirc.json, an existing.comvirc.jsonunderinit,--force-mode askwithout a terminal when a conflict needs an answer, an unknown command or option, or a schema the emitter refuses (all now4).typegen --check. A rejected key (401 or 403) now exits3, not2, and so does a project that no longer exists. Other 4xx responses, such as a 404 from a wrongapiBaseUrl, exit4, where 0.6 exited2. The retryable 408, 409, 425 and 429 still exit2, as does a platform that could not be reached. A declaration file the check cannot read (for example a directory at that path) exits4, not1as "outdated".comvi pushchecks local locales first. Before writing anything, it compares the local locales with the locales the project has, as the key may write them. A locale the project lacks exits4and names it; pass--skip-unknown-localesto push the rest. Spellings are matched as the platform matches them (pt_brispt-BR), and two spellings of one locale, or two files for the same locale and namespace, exit4. A platform that cannot list its locales skips the check with a warning.comvi pushwith nothing to push exits4, where it used to exit0. That covers no files, files without values, and every locale skipped. Pass--allow-emptywhen that is expected; then no commit is sent.comvi pull --empty-dirdeletes only translation files. It removes the files thefileTemplateparses as a catalog, and only for the locales the pull received; a file the template does not match (source code, a README,index.ts) is never removed, so--empty-dir -p srcno longer wipessrc. Files of locales the key cannot read, or the project no longer has, are left in place. AfileTemplatethat puts{languageTag}and{namespace}in one file name cannot tell which locale a file belongs to, so--empty-dirrefuses it with exit4. With the default template any<dir>/<locale>.jsonreads as a namespace, so run--dry-runfirst whentranslationsPathholds other JSON.- A locale the key may not read or write. The platform lists to a key only the locales it may read, so
pull --locale dewith a key restricted fromdeexits4like a locale the project lacks, naming the locales the key may read; before, the pull wrote nothing for it and exited0. Exit3with "Locales not readable with this API key" is kept for the case where the platform lists the locale but sends no data for it. Inpush, a locale the key may not write is reported with the locales the project lacks and exits4. - A plan or credit limit (
LIMIT_EXCEEDED) exits3whatever the HTTP status. In 0.6 it exited1, or2undertypegen --check. - Empty filter values.
--locale ""or--ns "", as in--locale "$UNSET_VAR", exits4in every command that takes them:pull,push,translateandcheck. Before, an empty value counted as not given. - Running
comviwith no command exits4. - An unreadable local translation file. In
push,checkand the readtranslatedoes before its push, it exits4. A target filetranslatecannot read while writing is left untouched and the run exits1.pullwarns about it and replaces it. - Summary output changed. A script that parses it should know that
pulllists the locales and namespaces it wrote, not every project locale, and thatpushno longer printsUpdatedor aProgress:line: it reports values new, changed and kept on the platform, see below. - Rolled-back commits are retried once. A commit the platform rolled back on a database conflict (
409 TRANSACTION_CONFLICT) is sent once more instead of failing. --localeinpullandpushmatches a locale ignoring case and surrounding whitespace, with_and-alike.
comvi check: offline catalog validation
comvi check validates the local catalogs against the source locale without an API key, a .comvirc.json, a .env file or the network. It reports keys a translation lacks, keys it has that the source does not (stale), keys whose source value is empty, and translations whose parameter names or select branches differ from the source's, or whose tags differ when the source has tags; plural branches are judged against each locale's own plural rules. It also reports ICU syntax the runtime does not support. --identical also warns when a translation equals its source. Output is text or --format json.
Exit codes follow the scheme: 0 clean, 1 findings (--no-fail turns that into 0, --strict fails on warnings too), 4 invalid input, a catalog or directory it cannot read, an unknown locale or a usage error. It never talks to the platform, so never 2 or 3. A .comvirc.json read by check may use a fileTemplate without {namespace}, such as {languageTag}.json, and may carry sourceLocale and a check section (identical, strict); pull and push still require {namespace}.
comvi translate: machine translation from the CLI
comvi translate machine-translates the values your project is missing on the platform and writes them into your local files. It pushes the local files first (--no-push skips this; --force-mode works as in comvi push), starts machine translation for every key and locale whose value is empty, waits for the jobs, and writes the platform's values where the local files have none, human translations included. The translations are saved on the platform as not reviewed.
- Local files. It writes only keys that are in your source catalog, and only where the local value is missing: absent or
"", andnullunder--no-push(the push that runs by default rejects anullvalue). It never overwrites a local value. Each file keeps its keys and shape, nested or flat; the file is rewritten with two-space indentation. - Limits.
--max-keys(default1000) caps how many key and locale pairs one run translates; a run over it starts no machine translation and exits4, though the push before it may already have updated the platform;--max-keys 0removes the cap.--dry-runprints the count and the credit estimate, over the--nsnamespaces when given, and changes nothing. - Waiting.
--timeout(default20m) stops the wait. The jobs keep running on the platform, and what is ready is written. - Access. The API key needs the
mt:usescope ("Machine translation (uses credits)"). Without it, the command exits3before it pushes anything. - Exit codes.
0done;1some values failed or could not be written;2the wait ended with values still missing, a project busy with another translation request, or the platform was unavailable;3credits ran out, or the key lacks access;4invalid input, over--max-keys, or a platform without this command. After failed jobs or exhausted credits the command still fetches and writes the values that completed; a failed fetch or local write can stop some or all of those writes.--format jsonprints a summary for scripts; when the push runs and it is not a dry run, it needs a--force-modeother thanask.
Other CLI fixes
- The push commit gets five minutes, not 30 seconds, so the first push of a large catalog no longer reports a timeout for a push the platform then applies. A commit that does time out says the push may already have been applied and that re-running it is safe. The new
COMVI_TIMEOUT_MSsets the read timeout in milliseconds and can only lengthen the commit, never shorten it below five minutes; a value that is not a whole number from 1 to 2147483647 exits4before any request. comvi pushreports what the platform did: keys created and values new, changed and kept, and a warning about local locales the platform did not import. TheProgress:line is gone; the push is a single request. Access-denied errors keep the platform's reason and name the scope the command needs.comvi pullshows what it changes.--dry-runlists each file with its key changes,+2 ~1 −1for added, changed and removed keys, and names removed keys. Before writing, a pull warns about keys that exist only locally and local files it cannot read, and points tocomvi push; the pull still runs and exits0. A layout where two catalogs would land in the same file is refused with exit4before anything is written.comvi typegen --watchreconnects. After a 502, a refused connection or a dropped socket it waits 1, 2, 4 seconds and so on between tries, doubling up to 30; a stream that sends nothing for 45 seconds is replaced; a 401 or 403 stops the watcher with exit3instead of leaving it running with no stream;SIGTERMstops it like Ctrl-C.comvi initusesCOMVI_API_BASE_URLwhen--api-urlis not given, both to validate the key and in the written config. Before, a staging or self-hosted key was sent to production for validation.- Network errors name their cause:
fetch failed (connect ECONNREFUSED 127.0.0.1:9)instead of onlyfetch failed. - The programmatic API of
@comvi/clichanged too.PushResult.updatednow counts changed values and is 0 on a platform without per-value counts;ApiClienttakes acommitTimeoutand gainsfillMissing()andgetMtJobStatus();ConfigLoader.loadtakes{ requireApiKey, optional }. The@comvi/clisection of the changelog below has the details.
In-context editor
- A save writes only the languages whose value changed. Before, every language of the key was sent back and marked "not reviewed" on the platform, so one German edit also reset the review status of the untouched English and French values. A value typed back to what was stored is not sent either.
- A save with nothing to write sends no request. Before, an edit typed and then reverted still sent the key's plural flag, which could undo a plural change a teammate had just made. A save the platform accepted also stays saved when the page cannot show the new value at once: the editor reports that the value appears after a reload, and saving again sends nothing.
Docs and examples
- Package READMEs are rewritten against the source: a short intro per package and claims checked against the code, including the CLI's exit codes and
comvi check, the Next.js routing options, the Nuxt request order, locale-detector resolution, and what the in-context editor loads and discloses. - SvelteKit and SolidStart examples.
examples/sveltekitandexamples/solidstartare the server-rendering recipes from the docs as apps: an instance per request on the server, the catalogs handed to the browser as data, and a browser instance that follows the URL on client navigation./is English and/uk,/de,/arare the others; Arabic turns the page right-to-left. Both run in the examples end-to-end suite alongside the seven gallery examples.
Requirements
- Unchanged from 0.6.0: Node 20 or newer for the runtime packages, Node 22 for
@comvi/cliand@comvi/vite-plugin. Install the same version of every@comvi/*package. - comvi.io already serves what
comvi translateand the conflict check behindpush --force-mode askneed. An older platform answerscomvi translatewith exit4, as a platform without this command.
Documentation: https://comvi.io/docs/i18n
@comvi/core
0.6.0
Minor Changes
-
1fb2046: Keep flat plain-object catalogs by reference instead of copying them. A catalog passed to
messages,addMessages()or returned by a loader is eligible when every leaf is a string and its prototype is either null or exactlyObject.prototype— the latter only whileObject.prototypeitself carries no enumerable key. It is validated with one pass over its enumerable keys and then stored as the object you passed. Everything else (a nested value, a non-string leaf, any other prototype, or a pollutedObject.prototype) is still flattened into a fresh null-prototype copy.Comvi never writes your catalog object, and
getMessages()returns that same object until anaddMessages()merges into that locale and namespace: a merge builds a fresh null-prototype object, so identity holds for the first adoption only. Your later edits to it are read byt()without anamespaceLoadedorconfigChangedevent: useaddMessages()when bindings must be notified, and pass a copy when you want the instance isolated from later edits.A lookup value is a translation only if it is a non-empty string. Members inherited from
Object.prototype(constructor,toString,__proto__) therefore never resolve, while an own string property under such a key does.Outside the supported catalog shape: non-enumerable own properties, accessor properties, Proxies and symbol keys (a lookup may see what SSR serialization omits). Enumerable keys added to
Object.prototypeafter a catalog was ingested are not guarded against. -
1fb2046:
#insidepluralandselectordinalis now formatted for the message's locale, as ICU MessageFormat defines it:{count, plural, other {# items}}renders1,234 itemsinenand1.234 itemsinde. Previously#inserted the raw digits.#follows theIntl.NumberFormatdefaults, so a fractional count is rounded to three fraction digits (1.23456renders1.235). Exact-match selectors (=0,=1) still compare the number itself. A count of negative zero renders0, without a sign. Use{count}instead of#where the raw digits are wanted.
Patch Changes
-
1fb2046: Reduce template-cache lookup overhead: compiled templates are now partitioned by a numeric key (message compiler, syntax extensions, plural
#context) instead of a string built on every lookup, still bounded by one global 1000-entry FIFO.Fix a template-cache collision between message compilers when more than 65535 exist in one process. The overflow warning is removed because compiler ids no longer wrap.
-
1fb2046:
devtools()installs a page-level editor loader the Comvi browser extension uses to load the in-context editor from jsDelivr; neweditorVersionoption pins the editor. TheEditorLoadResulttype declareseditorVersion,codeandhostas always present, holdingundefinedwhere they do not apply. -
1fb2046:
devtools({ editorVersion })fails closed. An explicit value that is not an exact version (SemVermajor.minor.patchwith no leading zeros, optionally with a prerelease such as0.6.0-rc.1; build metadata is not accepted) no longer falls back tolatest: the editor loader is still installed so the Comvi browser extension can explain the problem, but it requests nothing, and itsload()answers the new failure codeinvalid-editor-version. The extension's popup tells the translator that the pin must be an exact version like1.2.3, and development builds warn as before. LeavingeditorVersionout, or passing"latest", still loadslatest. -
1fb2046: A
{name}placeholder whose parameter is a function no longer prints the function's source code. It now renders as a missing parameter does: the literal{name}by default, with a development warning that says the parameter is a function, or an empty string undermissingParam: "drop". This is what a translator hits by typing{link}where the message needs<link>…</link>, both int()with a tag handler and in<T components={{ link }}>. Tag handlers themselves, and every other parameter value, are unchanged. -
1fb2046: In development, the "parameter is a function" warning and the "missing parameter" warning no longer silence each other for the same message and placeholder, and the warning always describes the value that was rendered.
-
1fb2046:
#in a plural branch resolves to that plural's count even after a tag handler inside the branch callst()and catches what that render throws. Until now the count the failed inner plural had set stayed behind, and the outer#printed it. -
1fb2046:
icuCompilerno longer reads an argument whose only comma sits inside a nested pair of braces as a parameter.{{,}\t}used to become a parameter named{,}, and{{count, plural, …}}a parameter named after the whole inner plural. Such an argument now fails like any unsupported ICU syntax, as the default compiler already did:E_ICU_SYNTAXat ingestion in development, and in production the braced text renders literally and is reported once throughonError.
@comvi/cli
Minor Changes
-
50f8dae: Breaking: one exit-code scheme for every command. CI can now tell a conflict, an outage and a bad key apart:
Code Meaning 0Done 1The command ran and found a problem: a conflict under --force-mode abort, outdated types undertypegen --check, errors undercomvi check(warnings too with--strict), a valuecomvi translatecould not translate; also a local failure such as an unwritable file2The platform was unreachable, timed out, answered 408, 409, 425, 429 or 5xx, or sent an unexpected response: retry 3The API key was rejected or lacks access, or a plan or credit limit was reached 4Invalid input Migration, for scripts that test exit codes:
1is narrower. It no longer covers outages (now2), a rejected key (now3), a missing.comvirc.json, an existing.comvirc.jsonunderinit,--force-mode askwithout a terminal when a conflict needs an answer, an unknown command or option, or a schema the emitter refuses (all now4).typegen --check. A rejected key now exits3, not2, and so does a project that no longer exists. Other 4xx responses, such as a wrongapiBaseUrl, exit4; 408, 409, 425 and 429 still exit2.2covers connection failures, timeouts, retryable HTTP responses and unexpected responses.- Other mappings. Running
comviwith no command exits4. A plan or credit limit (LIMIT_EXCEEDED) exits3whatever the HTTP status; in 0.6 it exited1, or2undertypegen --check. An unreadable local translation file exits4inpush,checkand the readtranslatedoes before its push; a target filetranslatecannot read while writing is left untouched and the run exits1. comvi pushchecks local locales first. Before writing anything, it compares local locales with the locales the project has, as the key may write them. A locale the project lacks exits4and names it. Pass--skip-unknown-localesto push the rest. Locale spellings are matched as the platform matches them (pt_brispt-BR), and two spellings of one locale, or two files for the same locale and namespace, exit4. A platform that cannot list its locales skips the check with a warning.comvi pushwith nothing to push exits4instead of0. That covers no files, files without values, and every locale skipped. Pass--allow-emptywhen that is expected; then no commit is sent.comvi pulland locales the key may not read. The platform lists only the locales a key may read, so a requested locale the key may not read exits4like one the project lacks, naming the locales the key may read. A locale the platform lists but sends no data for exits3.- Restricted locales. In
push, a locale the key's owner is restricted from is reported with the locales the project lacks, and also exits4. - Rolled-back commits are retried once. A commit the platform rolled back on a database conflict (
409 TRANSACTION_CONFLICT) is sent once more instead of failing. --localespellings.--localeinpullandpushmatches a locale ignoring case and surrounding whitespace, with_and-alike.
-
50f8dae:
comvi check: offline validation of local catalogs against the source locale (missing, stale, empty source, parameters, plural, select, tags, unsupported ICU, and opt-in identical); text and JSON output. Exit codes follow the CLI's scheme: 0 clean, 1 findings (or a local failure that fits no other code), 4 invalid input (flags, config, a catalog or directory it cannot read, an unknown locale, a usage error);checknever talks to the platform, so never 2 or 3. No API key,.comvirc.json,.envor network needed. A.comvirc.jsonread bycheckmay use afileTemplatewithout{namespace}({languageTag}.json);pullandpushstill require it.TranslationSyncnow reads a file template without{namespace}as one default-namespace catalog per locale, where it used to find no files:readTranslationsreturns those catalogs andclearDirectory/previewClearsee them. -
50f8dae: New command
comvi translate. It machine-translates the values your project is missing on the platform and writes them into your local files. The translations are saved on the platform as not reviewed.- What it does. It pushes your local files first (
--no-pushskips this;--force-modeworks as incomvi push), starts machine translation for every key and locale whose value is empty, waits for the jobs, and writes the platform's values where your files have none, human translations included. - Local files. It writes only keys that are in your source catalog, and only where the local value is missing: absent or
"", andnullunder--no-push(the push that runs by default rejects anullvalue). It never overwrites a local value. Each file keeps its keys and shape, nested or flat; a changed file is rewritten with two-space indentation. - Limits.
--max-keys(default 1000) caps how many key and locale pairs one run translates. A run over it starts no machine translation and exits4, though the push before it may already have updated the platform;--max-keys 0removes the cap.--dry-runprints the count and the credit estimate, over the--nsnamespaces when given, and changes nothing. - Waiting.
--timeout(default20m) stops the wait. The jobs keep running on the platform, and what is ready is written. - Access. The API key needs the new
mt:usescope ("Machine translation (uses credits)"). Without it, the command exits3before it pushes anything. - Exit codes.
0done;1some values failed or could not be written;2the wait ended with values still missing, a project busy with another translation request, or the platform was unavailable;3credits ran out, or the key lacks access;4invalid input, over--max-keys, or a platform without this command. After failed jobs or exhausted credits the command still fetches and writes the values that completed; a failed fetch or local write can stop some or all of those writes.--format jsonprints a summary for scripts; when the push runs and it is not a dry run, it needs a--force-modeother thanask.
ApiClientgainsfillMissing()andgetMtJobStatus(), andpushTranslations()takesscheduleAutoMt; a platform without the route throwsErrorCodes.API_UNSUPPORTED. - What it does. It pushes your local files first (
Patch Changes
-
50f8dae:
comvi push --force-mode askno longer overwrites a value saved on the platform after its preview. When the preview finds no conflict, the push now commits with conflict checking on (fail) instead ofoverride. A value a translator saves between the preview and the commit then stops the push. The error says how many values changed, that nothing was written, and to run the push again. The platform side of this check, which compares under its lock, ships with the matching platform release. -
50f8dae:
comvi pushgives the commit request five minutes instead of 30 seconds, so the first push of a large catalog no longer reports a timeout for a push the platform then applies. A commit that does time out now says the push may already have been applied and that re-running it is safe.COMVI_TIMEOUT_MSsets the read timeout in milliseconds and can only lengthen the commit, never shorten it below five minutes. A value that is not a whole number from 1 to 2147483647 exits4before any request.ApiClienttakes acommitTimeoutoption. A caller that passes onlytimeoutkeeps the old behaviour: that value covers the commit too. -
50f8dae:
comvi pull --empty-dirno longer deletes everything under the translations directory.- What it removes. Only files the
fileTemplateparses as a catalog, and only for locales the pull actually received. A file the template does not match is never removed: source code, a README,index.ts. So--empty-dir -p srcno longer wipessrc. Only directories emptied by those removals are removed. - Translation-shaped files. With the default template, any
<dir>/<locale>.jsonreads as a namespace,src/fixtures/en.jsonincluded. Run--dry-runfirst whentranslationsPathholds other JSON. - What it leaves. Files of locales your API key cannot read, or that the project no longer has, are left in place; delete those by hand. The directory is no longer created when there is nothing to clear.
- Ambiguous templates. A
fileTemplatewith{languageTag}and{namespace}in one file name, such as{languageTag}-{namespace}.json, cannot tell which locale a file belongs to.--empty-dirrefuses it with exit4.
comvi pullnow judges--localeagainst the locales that came back with data.- A locale the project has but the key's owner is restricted from exits
3with "Locales not readable with this API key". Before, the pull wrote nothing for it and succeeded. - The summary lists the locales and namespaces it wrote, not every project locale.
--localeand--nsgiven an empty value, as in--locale "$UNSET_VAR", now exit4inpullandpush. Before, an empty value counted as not given. - What it removes. Only files the
-
50f8dae:
comvi pullshows what it changes in each file:--dry-run. Each file it would write is listed with its key changes:(+2 ~1 −1)for added, changed and removed keys, ornew,unchanged,nested keys written flatorreplaces an unreadable file. Under each file it names up to ten removed keys.- Local work it is about to lose. A pull replaces each file with the platform's catalog. Before writing, it warns on stderr about keys that exist only locally, local files it cannot read (bad JSON, a non-string value) and, with
--empty-dir, files it deletes because the platform has no catalog for them. It points tocomvi push; the pull still runs and exits0.
-
50f8dae:
comvi pushreports what the platform actually did. Before, "Updated" counted the conflicts kept on the platform inkeepmode and was 0 after a real overwrite.- Summary. It shows keys created and values new, changed and kept on the platform.
- Locales not imported. It warns about local locales the platform did not import, because the project lacks them or the API key may not write them. On a platform that predates these counts it prints only the number of keys created.
- Dry run.
--dry-runcounts values ("New values", "Changed values") instead of calling them keys. Its counts still include values of locales the platform will not import. - Progress line. The
Progress:line is gone; the push is a single request.
Access-denied errors keep the platform's reason (a missing scope, a plan limit, read-only billing) and name the scope the command needs:
schema:readfortypegen,translations:readforpull,translations:writeforpush. A validation error without a message shows its code and field.PushResultgains optionalvaluesCreated,skippedLocalesanddetailed. Itsupdated, andupdatedinPushProgress, now count changed values; on a platform without per-value counts they are 0 rather than the platform's misnamed figure. -
50f8dae: Smaller CLI fixes:
initandCOMVI_API_BASE_URL.comvi initusesCOMVI_API_BASE_URLwhen--api-urlis not given, both to validate the key and in the written config. Before, a staging or self-hosted key was sent to production for validation.- Pulling into one file twice.
comvi pullrefuses (exit4), before writing anything, a layout where two catalogs land in the same file. That coversen+US-shopanden-US+shopunder{languageTag}-{namespace}.json, names that differ only in case (they share a file on macOS and Windows), and a namespace whose directory would be another catalog's file. Before, the second catalog silently replaced the first, or the pull failed halfway. - Network errors. They name their cause:
fetch failed (connect ECONNREFUSED 127.0.0.1:9)instead of onlyfetch failed. typegenoutput. It says it fetches the schema, and prints each step and failure once instead of twice.typegen --checkand an unreadable file. The check reports a declaration file it cannot read (for example a directory at that path) as an error the check could not get past, not as outdated (exit1).
-
50f8dae:
comvi typegen --watchsurvives a platform deploy and stops loudly when it cannot recover.- A lost stream is reopened. After a 502, a refused connection or a dropped socket, the watcher waits 1, 2, 4… up to 30 seconds between tries and says so. Before, any non-200 ended the stream for good while the watcher kept running, or exited 0 when stdin was closed.
- A silent stream is replaced. One that sends nothing for 45 seconds, not even the platform's 15-second ping, is closed and reopened.
- A rejected key stops the watcher. A 401 or 403 now exits
3with the reason, instead of leaving a watcher that runs with no stream. - SIGTERM stops the watcher like Ctrl-C (exit
0), for Docker, systemd and CI runners.
-
50f8dae:
ConfigLoader.loadaccepts{ requireApiKey, optional }: withrequireApiKey: falseit neither requires an API key nor readsCOMVI_API_KEY/COMVI_API_BASE_URL, and withoptional: truea project without.comvirc.jsonloads the defaults..comvirc.jsonacceptssourceLocaleand achecksection (identical,strict).
@comvi/next
Patch Changes
- @comvi/core@0.7.0
- @comvi/react@0.7.0
@comvi/nuxt
Patch Changes
- 50f8dae: The package description on npm now says what the module does (type-checked keys, ICU plurals, a
<T>component for markup inside translations) instead of naming Nuxt versions.- @comvi/core@0.7.0
- @comvi/vue@0.7.0
@comvi/plugin-fetch-loader
0.6.0
@comvi/plugin-in-context-editor
Patch Changes
- 50f8dae: Saving in the in-context editor now writes only the languages whose value changed. Before, every language of the key was sent back and marked "not reviewed" on the platform, so one German edit also reset the review status of the untouched English and French values. A value typed back to what was stored, or one a plural or variant switch leaves as it was, is not sent either.
- 50f8dae: A save in the in-context editor with nothing to write no longer sends a request. Before, an edit typed and then reverted still sent the key's plural flag, which could undo a plural change a teammate had just made on the platform. A save the platform accepted now also stays saved when the page cannot show the new value at once (for example a message the runtime rejects in development): the editor reports that the value appears after a reload, and saving again sends nothing.
@comvi/plugin-locale-detector
0.6.0
@comvi/react
Patch Changes
- @comvi/core@0.7.0
@comvi/solid
Patch Changes
- @comvi/core@0.7.0
@comvi/svelte
Patch Changes
- @comvi/core@0.7.0
@comvi/vite-plugin
Patch Changes
- 50f8dae: Internal: the ICU scanner that reads parameters out of translation values moved to the workspace-private typegen module, so other tools can share it. Generated types are unchanged for every message
@comvi/coreaccepts. One change for messages core refuses: apluralorselectordinalexplicit value outside core's grammar (=x,=1e3,=.5,=+1,=Infinity) now makes the key report the ICU issue and get no parameters, as{price, number}already did, instead of generating parameters for a key core rejects withE_ICU_SYNTAX.
@comvi/vue
Patch Changes
- @comvi/core@0.7.0