Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Play 2.0 add-on allowing to compute localized messages on client side
Scala Java Other
branch: master

This branch is 6 commits ahead, 13 commits behind julienrf:master

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.

Play JsMessages library Build Status

This library allows you to compute localized messages on client-side, in Play! projects.

Basically, play-jsmessages takes the i18n messages of your Play! application, sends them to the client-side as a JSON object and defines a JavaScript function returning a message value from a given language and the message key and arguments.

Take a look at the Scala and Java samples to see it in action.

Installation (using sbt)

Add a dependency on the following artifact:

libraryDependencies += "org.julienrf" %% "play-jsmessages" % "1.6.1"

The current 1.6.1 version is compatible with Play! 2.2.

Previous versions are available here:

API Documentation

You can browse the online scaladoc, which contains the documentation of both the Scala and Java APIs.

Quick start

Create a JsMessages instance

On server-side, create an instance of the jsmessages.api.JsMessages class (or jsmessages.JsMessages for Java users):

import jsmessages.api.JsMessages
import play.api.Play.current

val messages = JsMessages.default

Generate a JavaScript asset for the client’s language

Then you typically want to define an action returning a JavaScript resource containing all the machinery to compute localized messages from client-side:

Action { implicit request =>

Or in Java:

final static jsmessages.JsMessages messages = jsmessages.JsMessages.create(play.Play.application());

public static Result jsMessages() {
    return ok(messages.generate("window.Messages"));

The above code creates a Play! action that returns a JavaScript fragment containing the localized messages of the application for the client language and defining a global function window.Messages. This function returns a localized message given its key and its arguments:

console.log(Messages('greeting', 'Julien')); // will print e.g. "Hello, Julien!" or "Bonjour Julien!"

The JavaScript function can also be supplied alternative keys that will be used if the main key is not defined. Keys will be tried in order until a defined key is found:

  alert(Messages(['greeting', 'saluting'], 'Julien'));

The JavaScript function stores the messages map in a messages property that is publicly accessible so you can update the messages without reloading the page:

// Update a single message
Messages.messages['greeting'] = 'Hi there {0}!';
// Update all messages
Messages.messages = {
  'greeting': 'Hello, {0}!'

Generate a JavaScript asset for all the languages

Alternatively, use the all method (generateAll in Java) to generate a JavaScript fragment containing all the messages of the application instead of just those of the client’s current language, making it possible to switch the language from client-side without reloading the page. In this case, the generated JavaScript function takes an additional parameter corresponding to the language to use:

console.log(Messages('en', 'greeting', 'Julien')); // "Hello, Julien!"
console.log(Messages('fr', 'greeting', 'Julien')); // "Bonjour Julien!"

In that case the messages property of the JavaScript function is a map of languages indexing maps of messages.

The JavaScript function can also be partially applied to fix its first parameter:

val messagesFr = Messages('fr'); // Use only the 'fr' messages
console.log(messagesFr('greeting', 'Julien')); // "Bonjour Julien!"

Note: if you pass undefined as the language parameter, it will use the default messages.

Generate a JavaScript asset with a subset of your messages

You can select which messages you want to export on client-side by using the subset factory method:

val messages = JsMessages.subset(

Or you can select the messages to keep by using a filter predicate:

val messages = JsMessages.filtering(_.startsWith("error."))


  • v1.6.1

    • Fix crash when undefined is passed as the language parameter (thanks to Paul Dijou).
  • v1.6.0

    • Big changes in the API ;
    • Make it possible to return messages of all languages (thanks to Paul Dijou) ;
    • Discard methods returning HTML, keep just JavaScript.
  • v1.5.2

    • Export the messages property on client-side (thanks to Paul Dijou).
  • v1.5.1

    • Play 2.2.x compatibility.
  • v1.5.0

    • Fix the subset method of the Java API (thanks to Seppel Hardt) ;
    • Refactor the whole API in order to make it more extensible (thanks to Jacques Bachellerie).


This content is released under the MIT License.

Something went wrong with that request. Please try again.