The two chapters that I would like to include in the 1.1 edition of Patters in Polymer are i18n and deployment considerations. I thoroughly enjoyed my recent foray back into the Dart side of things, but I think tonight I need to spend a little time with a JavaScript solution to better understand one of those chapter topics.
So I revisit my old, hand-coded i18n solution by first installing i18next via Bower:
➜ js git:(master) ✗ bower install --save i18next ... bower i18next#~1.7.2 install i18next#1.7.2 i18next#1.7.2 bower_components/i18nextMy current solution has Polymer do the heavy lifting. Specifically, my Polymer reads the specified localization JSON files and replaces values like
{{hello}} and {{done}} with the appropriate value from the current locale:<link rel="import" href="../bower_components/polymer/polymer.html">
<link rel="import" href="hello-you-en.json">
<link rel="import" href="hello-you-fr.json">
<link rel="import" href="hello-you-es.json">
<polymer-element name="hello-you" attributes="locale">
<template>
<div>
<h2>{{hello}} {{your_name}}</h2>
</div>
<p>
<input value="{{your_name}}">
<input type=submit value="{{done}}!" on-click="{{feelingLucky}}">
</p>
<!-- ... -->
</template>
<script src="hello_you.js"></script>
</polymer-element>With i18next already installed, I start by adding it to my Polymer with a script tag at the end of the <template>:<link rel="import" href="../bower_components/polymer/polymer.html">
<polymer-element name="hello-you" attributes="locale">
<template>
<!-- ... -->
<script type="text/javascript" src="../bower_components/i18next/i18next.js"></script>
</template>
<script src="hello_you.js"></script>
</polymer-element>When I reload the page containing the Polymer, I see that it is now 404ing on /locales/en-US/translation.json, so I add that as:{
"app": {
"hello": "Hello",
"done": "Done",
"how_many": "How many?",
"instructions": "Introduce yourself for an amazing personalized experience!"
}
}Then, in my Polymer's ready, I run the i18n initialization:Polymer('hello-you', {
// ...
ready: function() {
setTimeout(function(){
i18n.init(function(t) {
$(".app").i18n();
});
}, 500);
// ...
}
// ...
});Unfortunately, I cannot quite figure out how to make jQuery find the app class in the Polymer's shadow DOM. I am able to configure this by explicitly setting the Polymer bound variables instead: ready: function() {
var that = this;
setTimeout(function(){
i18n.init(function(t) {
$(".app").i18n();
that.hello = t('app.hello');
that.done = t('app.done');
that.how_many = t('app.how_many');
that.instructions = t('app.instructions');
});
}, 500);
// ...
}Which results in an English localized version of the <hello-you> Polymer:
That's really no different from the approach that I already took with raw Polymer except that I was previously able to leverage some of the Polymer platform to avoid the timeout (which prevents the code from running before i18next is loaded). Still, even if I cannot get jQuery working with the shadow DOM, there is still power to be explored in i18next (dates and plural forms). I will pick back up with that tomorrow.
Day #1,031
No comments:
Post a Comment