#459 languageResolver, docs updated

This commit is contained in:
krzysztofmadejski
2016-11-14 14:56:43 +00:00
parent 8f9607e053
commit 8b362bf81c
3 changed files with 41 additions and 28 deletions

View File

@@ -135,15 +135,12 @@ When using section-tags in existing templates be sure to remove a bracket from v
``` ```
Then to setup Backbone and Mustache to use translation you have to extend some objects: Then setup Mustache to use translation by injecting tranlation tags in `render` function:
```javascript ```javascript
// ============== BEFORE =================== // ============== BEFORE ===================
my.MultiView = Backbone.View.extend({ my.MultiView = Backbone.View.extend({
initialize: function(options) {
...:
},
render: function() { render: function() {
var tmplData = this.model.toTemplateJSON(); var tmplData = this.model.toTemplateJSON();
var output = Mustache.render(this.template, tmplData); var output = Mustache.render(this.template, tmplData);
@@ -151,32 +148,37 @@ my.MultiView = Backbone.View.extend({
} }
}); });
var multiView = new recline.View.MultiView({
model: dataset
});
// ============== AFTER ==================== // ============== AFTER ====================
my.MultiView = Backbone.I18nView.extend({ // extend I18n view my.MultiView = Backbone.View.extend({
initialize: function(options) {
this.initializeI18n(options.locale);
...:
},
render: function() { render: function() {
var tmplData = this.model.toTemplateJSON(); var tmplData = this.model.toTemplateJSON();
tmplData = _.extend(tmplData, this.MustacheFormatter()); // inject Moustache formatter tmplData = I18nMessages('recline', recline.View.translations).injectMustache(tmplData); // inject Moustache formatter
var output = Mustache.render(this.template, tmplData); var output = Mustache.render(this.template, tmplData);
... ...
} }
}); });
var multiView = new recline.View.MultiView({
model: dataset,
locale: 'pl' // set Locale used
});
``` ```
### Language resolution
By default the language is detected from the root `lang` attributes - <html lang="xx">` and `<html xml:lang="xx">`.
If you want to override this functionality then override `I18nMessages.languageResolver` with your implementation.
```html
<script type="text/javascript" src="common-intl-wmustache.js"></script>
<script type="text/javascript">
I18nMessages.languageResolver = function() {
// implement here your language resolution
return 'fr';
};
</script>
```
Libraries can also ask for specific language: `I18nMessages('recline', recline.View.translations, 'pl')`. Language resolver is not used in that case.
If you're creating templates using default language other than English (why?) set appropriately appHardcodedLocale: `I18nMessages('recline', recline.View.translations, undefined, 'pl')`. Then missing strings won't be reported in console and underscores in simple translations will be converted to spaces.
### Adding new language ### Adding new language

View File

@@ -102,13 +102,24 @@ test('I18nMessages default locale', function () {
equal(fmt.getLocale(), 'en'); equal(fmt.getLocale(), 'en');
}); });
test('I18nMessages default locale custom resolver', function () { test('I18nMessages custom language resolver', function () {
var localeResolver = function() { return 'fr'; }; var localeResolver = function() { return 'fr'; };
var fmt = I18nMessages('somelib', {}, localeResolver); var fmt = I18nMessages('somelib', {}, localeResolver);
equal(fmt.getLocale(), 'fr'); equal(fmt.getLocale(), 'fr');
}); });
test('I18nMessages override language resolver', function () {
var oldResolver = I18nMessages.languageResolver;
I18nMessages.languageResolver = function() {
return 'fr';
};
var fmt = I18nMessages('somelib', {});
equal(fmt.getLocale(), 'fr');
I18nMessages.languageResolver = oldResolver;
});
test('I18nMessages singletons', function () { test('I18nMessages singletons', function () {
var lib1_pl = I18nMessages('lib1', {}, 'pl'); var lib1_pl = I18nMessages('lib1', {}, 'pl');
var lib2_pl = I18nMessages('lib2', {}, 'pl'); var lib2_pl = I18nMessages('lib2', {}, 'pl');

View File

@@ -9,13 +9,8 @@ var I18nMessages = function(libraryID, translations, languageResolverOrLocale, a
return new I18nMessages(libraryID, translations, languageResolverOrLocale, appHardcodedLocale); return new I18nMessages(libraryID, translations, languageResolverOrLocale, appHardcodedLocale);
} }
var defaultResolver = function() {
var h = $('html');
return h.attr('lang') || h.attr('xml:lang');
};
// which locale should we use? // which locale should we use?
languageResolverOrLocale = (typeof languageResolverOrLocale !== 'undefined') ? languageResolverOrLocale : defaultResolver; languageResolverOrLocale = (typeof languageResolverOrLocale !== 'undefined') ? languageResolverOrLocale : I18nMessages.languageResolver;
appHardcodedLocale = appHardcodedLocale || 'en'; appHardcodedLocale = appHardcodedLocale || 'en';
if (typeof(languageResolverOrLocale) === 'function') { if (typeof(languageResolverOrLocale) === 'function') {
@@ -118,3 +113,8 @@ var I18nMessages = function(libraryID, translations, languageResolverOrLocale, a
return _.extend(tmplData, self.mustacheI18Tags()); return _.extend(tmplData, self.mustacheI18Tags());
} }
}; };
I18nMessages.languageResolver = function() {
var h = $('html');
return h.attr('lang') || h.attr('xml:lang');
};