i18n
Light-weight Internationalization library for client-side projects.
What is i18n?
i18n is the short-hand for the word "internationalization". There are exactly 18 letters between the first and last letter of the word, hence i18n. Likewise, L10n is the short-hand for the word "Localization".
i18n
should always be referenced with a lowercasei
because a capitalI
looks too much like a1
(one).
L10n
should always be referenced with a capitalL
because a lowercasel
looks too much like a1
(one).
The term 'internationalization' or 'i10n' refers to the master process while 'localization' refers to a specific implementation of internationalization. In other words, i18n is the recipe and L10n is the cookies.
Philosophy
This library has been developed with the following requirements in mind:
- IE9+ Browser Compatibility - We've committed to support any major browser released after IE9.
- No Dependancies - Everything is written in vanilla javascript with exception of dates (we're using moment.js).
-
Don't Reinvent the Wheel - We're using we'll documented, native JS methods such as
toLocaleString()
as much as possible.
Supported Use Cases
- Number Formatting - ex. 1000 --> 1,000
- Currency Formatting - ex. 1000.35 --> $1,000.35
- Percentage Formatting - ex 0.35 --> 35%
- Summary Numbers - ex 1242.4 > 1.242K
- String Translations - ex. "Hello World" --> "Hallo Welt"
- Image Switching
What about dates?
I've not yet implemented a solution for dates. In accordance with the 'don't reinvent the wheel' philosophy, I figure that any time we're dealing with dates, we're probably going to be pulling in a date library to help. In my experience, nobody likes dealing with javascript dates directly . Most (good) date libraries have internationalization built in. For more info:
Usage
The i18n
object will be a global variable that you can use to help you localize your project. More documentation coming soon.
Methods
// L for language. This is the current language getter/setter.
i18n.l('en-us')
// C for currency. This is the current currency getter/setter.
i18n.c('USD')
// TODO: Gets language setting from server, its the most accurate place to get it.
i18n.getLanguage()
// TODO: Gets currency setting from server.
i18n.getCurrency()
// Truncates a string to a specified number of characters.
i18n.trunc('string', 5, true)
// Fetches the translation file and then executes a callback function.
i18n.init(callback)
// T for translate. This will return a specified translation.
i18n.t('dot.notation')
// Returns a summarized number like '152.3K'.
i18n.summaryNumber(number)
// Return the number and magnitude of number as an object.
i18n.summaryNumberToObject(number)
// Converts summary number back to actual number.
i18n.reverseSummaryNumber('123K')
Variables
// the current currency symbol
i18n.$ = "$";
/******************************************
I STRONGLY SUGGEST YOU DON'T USE THESE:
******************************************/
// the current language code
i18n.defaultLanguage
// the current currency code
i18n.defaultCurrency
toLocaleString()
Shim The toLocaleString()
is a very powerful method on the number prototype in JavaScript. The only bad thing is that it's not fully implemented in Safari. I've created a shim (that follows the documented spec perfectly) so that it will work on any browser. Please, read the docs and learn how to incorporate this into your projects.
Notes
What works
Basically, everything except the translation piece. Getting the user's settings from product and/or server are also not ready yet so you'll have to hard code those values for now.
Needed Product Features
- Get locale settings exposed from product.
- A place to host language files. This probably won't happen until we get Mason v1.
TODO
- Finish the shim.
- Test, Test, and Retest.