Localization in JavaScript

Today, I created an advanced localization JavaScript library named l10n.js. The library enables localization through the native JavaScript method intended for it, gracefully degrading if the library is not present. As it gracefully degrades, you can make Ajax applications, JavaScript libraries, etc. that can be localized but not require l10n.js to function. There is already a placeholder method for all API calls as specified in the ECMAScript specification and is present in all JavaScript engines, so when l10n.js isn’t present, your application works fine.

Demo

You can try out the online demo to see l10n.js in action. Currently, only the languages mentioned in the readme are supported, but more will eventually be added.

Usage

API

API documentation can be found in the readme. All API calls gracefully degrade, so calling them even without l10n.js loaded causes no problems.

Localizing strings

Calling toLocaleString() on every localizable string can create a lot of extra typing and bloat for sending your JavaScript down the wire. I recommend using the following helper function to localize strings. The reason I don’t define this in l10n.js is to not introduce any new globals, which keeps l10n.js a one of the JavaScript libraries least-prone to conflicts with other libraries.

var l = function (string) {
    return string.toLocaleString();
};

With this helper function, you can start writing l("Your localizable string") instead of "Your localizable string".toLocaleString(). I chosel instead of _ (an underscore), because it’s easier to spot so you can quickly skim your code to see which strings are localizable.

Variable replacement

If you don’t mind requiring l10n.js for your JavaScript application or library to function, I suggest using short variable strings instead of default strings. It saves bandwidth by decreasing the size of localization files, and it enables you to write nice, short code as such in the following.

  • document.title = l("%title.search")
    • Example results: "Seach - Acme, Inc."
  • confirm(l("%confirm.deleteAccount"))
    • Example results: "Are you sure you want to delete your account?"
  • link.href = "http://www.google" + l("%locale.tld")
    • Example results: "http://www.google.co.uk"

Often, string concatenation is used instead of replacement in JavaScript. With l10n.js, to make localization easier, you may have to use replacements instead. You might want to use a JavaScript library that implements something similar to C++’s sprintf(). A nice JavaScript implementation I’d recommend is php.js’s sprintf().

When localizations are downloaded

If you are using single localization URLs (<link rel="localization" hreflang="..." href="..." type="application/x-l10n+json"/>), they will only be downloaded when needed. If you are using multiple localizations in one (<link rel="localizations" href="..." type="application/x-l10n+json"/>), then the file will be downloaded right away, but externally linked localizations in the localization file will not be. If you provide an interface for your users to change locales, any non-loaded localization files will be loaded when necessary.

Including localizations with link elements

Multiple localizations can be included with one localization JSON file, with all of the top properties being language codes. Instead of putting all of the localized strings directly in the file, you may want to assign a specifc localization JSON URL to each locale, as to save bandwidth by only downloading locales the user needs.
The following is an example localization file for <link rel="localizations" href="path/to/localizations.json" type="application/x-l10n+json"/>.

{
  "en-US": {
      "What is your favourite colour?": "What is your favorite color?"
  },
  "fr": "path/to/french-localization.json"
}

Using localization files is the same as calling String.toLocaleString() witht the JSON localizations object as the first parameter.

You can also include single localizations by specifying the standard HTML5 hreflang link element attribute and using a rel of localization instead of localizations with an ‘s’, as shown in the following.

<link rel="localization" hreflang="en-US" href="american-english.json" type="application/x-l10n+json"/>

The JSON file for the localization might look like the following.

{
    "What is your favourite colour?": "What is your favorite color?"
}
This entry was posted in JavaScript, JavaScript Libraries and tagged , , , . Bookmark the permalink.

12 Responses to Localization in JavaScript

  1. Pingback: Ajaxian » l10n.js: JS localization library

  2. Andy says:

    Do you know whether there are any current standardization efforts (perhaps relating to HTML5 or ARIA) in the area of localization? I can't find much information on the various dev wikis for the standards bodies.

  3. Pingback: Localización con Javascript | aNieto2K

  4. Nahuel says:

    Hi, I've just created a symfony plugin based on your work (http://www.symfony-project.org/plugins/ncJavascriptLocalizationPlugin). Great job!

  5. Pingback: JavaScriptで多言語メッセージを処理する「l10n.js」 | Web活メモ帳

  6. Pingback: J.Tirado.com » Blog Archive » Localización con Javascript

  7. Pingback: Localiza a tus visitantes con Javascript | Utilidad Web - Un recurso diario para tu web.

  8. Pingback: Dynamic localization in JavaScript « Official Get Localization Blog

  9. Barnaby Stone says:

    Do you know whether there are any current standardization efforts (perhaps relating to HTML5 or ARIA) in the area of localization? I can't find much information on the various dev wikis for the standards bodies.

blog comments powered by Disqus