product icon

Paraglide JS




#Patch Changes

  • b8573fa: Improved error-reporting


#Minor Changes

  • eb941fe: Prompt about adding the Ninja Github Action for translation-linting during paraglide-js init. Also exposes it over the internal API.

#Patch Changes

  • 9566348: Better handling of tsconfig files that extends another config.


#Minor Changes

  • 21ab0a0: Add an output mode where each message is it's own file. This enables treeshaking in less capable bundlers. Currently this is only available via the programmatic API.

#Patch Changes

  • 21ab0a0: performance improvements


#Patch Changes

  • 32cbe48: Improve bestMatch reliability


#Patch Changes

  • 6105a50: No longer log "Exiting the Watcher" when stopping the watching process, as it was causing annoying CMD popups on windows


#Patch Changes

  • 4d24188: paraglide-js init now uses the createNewProject API from @inlang/sdk for creating new projects. This resulits in higher reliability.


#Minor Changes

  • 0774c1a: Expose CLI programmatically to enable framework-specific init clis


#Patch Changes

  • cee4692: Use index accesses instead of .at function for better compatability with legacy browsers
  • 4b631aa: Update invalid type-declarations
  • 3c7a87c: Fixes a race-condition when creating the messages directory during paraglide-js init
  • ab1fe48: When initialising and a single project is available, it no longer suggests and empty string as the project path


#Patch Changes

  • fa6aa31: Update internal adapter-utilities
  • dee5aa6: Add --silent option to paraglide-js compile command that will only log errors


#Minor Changes

  • 462325b: Paraglide now ships with internal utility functions that handle common adapter tasks such as language-negotiation. These aren't public facing, but the version bump is required to make sure adapter-packages resolve the correct version of paragldie.


#Minor Changes

  • 2428451: paraglide-js init now finds more existing projects


#Minor Changes

  • d47b2aa: Generate empty messages/{lang}.js files if no messages are present. This way the "shape" of the generated output is always the same regardless of messages

#Patch Changes

  • 192fdec: prompt the user for the outdir during paraglide-js init
  • 0b7c82e: Inline package-version at build time to be more robust


#Patch Changes

  • 1cc9cbc: Run compiler after paraglide-js init so that initial files are present
  • 5401f95: Add --outdir flag to the generated CLI commands


#Patch Changes

  • 526b0ba: paraglide-js init now prompts for which languages should be supported
  • 26d2ba1: No longer add identical-pattern lint rule by default


#Patch Changes

  • 7dce581: fix openRepository crash in non-git environments


#Patch Changes

  • 2a42b6e: bump @lix-js/client dependency


#Patch Changes

  • 11f0e18: Update dependency
  • 10e3c28: fix JSDoc annotations on message aliases


#Patch Changes

  • 45975c0: Fail gracefully if adding .vscode folder fails


#Patch Changes

  • afaaffa: Bundle @inlang/cross-sell-sherlock. This is used to promot once during paraglide-js init to ask if you want to install the Sherlock vscode extension


#Minor Changes

  • 4970afc: paraglide deprecate aliases
  • 4837297: File locking for concurrent message updates through the load/store plugin api Auto-generated human-IDs and aliases - only with experimental: { aliases: true }

#Patch Changes

  • @inlang/cross-sell-sherlock@0.0.2


#Patch Changes

  • a99e35fee: use @inlang/cross-sell-sherlock during vscode extension initialization
  • Updated dependencies [a99e35fee]
    • @inlang/cross-sell-sherlock@0.0.2


#Patch Changes

  • b0f1e908b: Prompt user for tech-stack when running paraglide-js init & recommend Adapters


#Patch Changes

  • f6ec6cdc9: bump @inlang/sdk dependency


#Patch Changes

  • 960f8fb70: rename the vscode extension to "Sherlock"


#Patch Changes

  • 00f181ad3: fix broken dependency


#Patch Changes

  • Updated dependencies [244442698]
    • @inlang/language-tag@1.5.0


#Patch Changes

  • 4c26fa70a: bump dependencies


#Patch Changes

  • 613ef9877: fix: Bump @lix-js/client dependency


#Patch Changes

  • 74dc1f8c6: Update dependencies
  • 4ae6295d0: Detect when paraglide-js init is being run inside the VsCode terminal and skip the VsCode question if so
  • Updated dependencies [74ac11c47]
    • @inlang/language-tag@1.4.0


#Minor Changes

  • 0f0e8496d: Throw runtime error if languageTag() returns a non-language tag value


#Patch Changes

  • 7ea9753fb: Improve onboarding message
  • 4277232db: fix: better formatting of messageID fallbacks


#Minor Changes

  • cd29edb11: bumbing fixed env var dependecy issue affected packages


Bump Version to 1.0 as no more breaking changes are expected.


Hotfix: Bundle SDK


Update dependencies


feat: Support language Fallbacks according to BCP 47 specification


Update dependencies


Update dependencies


feat: Handle variables that have invalid JS identifiers as names. fix: Better text escaping in the compiler. fix: Compiler now fails reliably when a message ID is an invalid JS identifier.


Paraglide now checks if the messages have actually changed before recompiling. This should improve reliability and performance.


fix: Fix inlang/internal#195


paraglide-js init now adds @inlang/message-lint-rule-valid-js-identifier by default.


paraglide-js init now adds paraglide-js compile to the postinstall script by default. This sidesteps numerous linting issues when using paraglide in CI environments.


Fix paraglide-js compile hanging for a couple seconds after successful compilation


Fix crash when using npx @inlang/paraglide-js init and selecting vscode.


Added --watch flag to the paraglide-js compile command. This will keep the process alive and recompile whenever messages are changed.

paraglide-js compile --project ./project.inlang --watch


./paraglide/runtime.js now exports a function called isAvailableLanguageTag. This is the recommended way to check if something is a valid language tag, while maintaining type safety.

//Pseudo code
import { isAvailableLanguageTag } from "./paraglide/runtime"

if (isAvailableLanguageTag(params.lang)) {
	return renderSite(params.lang)
} else {
	return 404


[Internal Change] Expose the compiler so that bundler plugins can call it programmatically instead of going through the CLI.


onSetLanguageTag no longer throws when called multiple times. Newer callbacks will overwrite old ones. Developers still should not call onSetLanguageTag multiple times, this is needed for HMR to work reliably.

Big thanks to @KraXen72 for helping us find this bug.


Add an optional options argument to message functions, to allow forcing a languageTag regardless of which languageTag is currently set.

import * as m from "./paraglide/messages"
const msg = m.hello({ name: "John" }, { languageTag: "de" })


The paraglide-js init command now uses the inlang message format 2.0 which is human readable.


IMPROVE: Paraglide now splits messages into different resource files as a step towards splitting messages by language via a bundler plugin.

import * as en from "./paraglide/messages/en"
import * as de from "./paraglide/messages/de"



FIX: type error

export const currentLanguageTag = (params) => {
+	/** @type {Record<string, string>} */
	const variants = {
		en: `The current language tag is "${params.languageTag}".`,
		de: `Der aktuelle Sprachtag ist "${params.languageTag}".`,
	return variants[languageTag()] ?? "currentLanguageTag"


BREAKING: Paraglide JS now compiles into source code, see

What you need to change:

  1. Remove --namespace from the compile command
  2. Replace imports from paraglide to point to the directory in ther source code:
-import { setLanguageTag, languageTag } from '@inlang/paraglide-js/sveltekit-example';
+import { setLanguageTag, languageTag } from '../../paraglide-js/runtime';
-import * as m from "@inlang/paraglide-js/sveltekit-example/messages"
+import * as m from "../../paraglide-js/messages"


improve: paraglide-js init now adds the Visual Studio Code extension (Sherlock) if vscode is used


add: paraglide-js init command which simplifies the setup process




#fix: Jetbrains based editors not detecting @inlang/paraglide-js/{namespace}/messages imports

The bug has been fixed by moving ./*/messages above the less specifc ./* export.

	"exports": {
		"./*/messages": "./dist/compiled-output/*/messages.js",
		"./*": "./dist/compiled-output/*/runtime.js"