Skip to content

Commit

Permalink
feat(signaling): provides TBindingBehavior
Browse files Browse the repository at this point in the history
 adds the new TBindingBehavior to cowork with the TValueConverter for signaled changes. Auto signal on locale changes
  • Loading branch information
zewa666 committed Nov 18, 2015
1 parent de20e1b commit d9877ee
Show file tree
Hide file tree
Showing 25 changed files with 343 additions and 43 deletions.
2 changes: 1 addition & 1 deletion bower.json
@@ -1,6 +1,6 @@
{
"name": "aurelia-i18n",
"version": "0.4.1",
"version": "0.4.2",
"description": "A plugin that provides i18n support.",
"keywords": [
"aurelia",
Expand Down
1 change: 1 addition & 0 deletions config.js
Expand Up @@ -17,6 +17,7 @@ System.config({
System.config({
"map": {
"Intl.js": "github:andyearnshaw/Intl.js@0.1.4",
"aurelia-binding": "npm:aurelia-binding@1.0.0-beta.1.0.1",
"aurelia-dependency-injection": "npm:aurelia-dependency-injection@1.0.0-beta.1",
"aurelia-event-aggregator": "npm:aurelia-event-aggregator@1.0.0-beta.1",
"aurelia-loader-default": "npm:aurelia-loader-default@1.0.0-beta.1",
Expand Down
10 changes: 9 additions & 1 deletion dist/amd/aurelia-i18n.d.ts
Expand Up @@ -3,6 +3,8 @@ declare module 'aurelia-i18n' {
import { resolver } from 'aurelia-dependency-injection';
import { EventAggregator } from 'aurelia-event-aggregator';
import { customAttribute, ViewResources } from 'aurelia-templating';
import { SignalBindingBehavior, BindingSignaler } from 'aurelia-templating-resources';
import { ValueConverter } from 'aurelia-binding';
import { DefaultLoader } from 'aurelia-loader-default';

/*eslint no-irregular-whitespace: 0*/
Expand All @@ -18,7 +20,7 @@ declare module 'aurelia-i18n' {
/*eslint no-cond-assign: 0*/
export class I18N {
globalVars: any;
constructor(ea: any, loader: any);
constructor(ea: any, loader: any, signaler: any);
setup(options: any): any;
setLocale(locale: any): any;
getLocale(): any;
Expand Down Expand Up @@ -80,6 +82,12 @@ declare module 'aurelia-i18n' {
valueChanged(newValue: any): any;
unbind(): any;
}
export class TBindingBehavior {
static inject: any;
constructor(signalBindingBehavior: any);
bind(binding: any, source: any): any;
unbind(binding: any, source: any): any;
}
export class RtValueConverter {
static inject(): any;
constructor(relativeTime: any);
Expand Down
7 changes: 3 additions & 4 deletions dist/amd/aurelia-i18n.js
@@ -1,10 +1,8 @@
define(['exports', 'aurelia-event-aggregator', 'aurelia-templating', 'aurelia-loader-default', './i18n', './relativeTime', './df', './nf', './rt', './t', './base-i18n'], function (exports, _aureliaEventAggregator, _aureliaTemplating, _aureliaLoaderDefault, _i18n, _relativeTime, _df, _nf, _rt, _t, _baseI18n) {
define(['exports', 'aurelia-event-aggregator', 'aurelia-templating', 'aurelia-loader-default', 'aurelia-templating-resources', './i18n', './relativeTime', './df', './nf', './rt', './t', './base-i18n'], function (exports, _aureliaEventAggregator, _aureliaTemplating, _aureliaLoaderDefault, _aureliaTemplatingResources, _i18n, _relativeTime, _df, _nf, _rt, _t, _baseI18n) {
'use strict';

exports.__esModule = true;

console.log(_aureliaLoaderDefault.DefaultLoader);

function configure(frameworkConfig, cb) {
if (cb === undefined || typeof cb !== 'function') {
var errorMsg = 'You need to provide a callback method to properly configure the library';
Expand All @@ -16,7 +14,7 @@ define(['exports', 'aurelia-event-aggregator', 'aurelia-templating', 'aurelia-lo
frameworkConfig.globalResources('./df');
frameworkConfig.globalResources('./rt');

var instance = new _i18n.I18N(frameworkConfig.container.get(_aureliaEventAggregator.EventAggregator), frameworkConfig.container.get(_aureliaLoaderDefault.DefaultLoader));
var instance = new _i18n.I18N(frameworkConfig.container.get(_aureliaEventAggregator.EventAggregator), frameworkConfig.container.get(_aureliaLoaderDefault.DefaultLoader), frameworkConfig.container.get(_aureliaTemplatingResources.BindingSignaler));
frameworkConfig.container.registerInstance(_i18n.I18N, instance);

var ret = cb(instance);
Expand Down Expand Up @@ -45,6 +43,7 @@ define(['exports', 'aurelia-event-aggregator', 'aurelia-templating', 'aurelia-lo
exports.NfValueConverter = _nf.NfValueConverter;
exports.RtValueConverter = _rt.RtValueConverter;
exports.TValueConverter = _t.TValueConverter;
exports.TBindingBehavior = _t.TBindingBehavior;
exports.TCustomAttribute = _t.TCustomAttribute;
exports.TParamsCustomAttribute = _t.TParamsCustomAttribute;
exports.BaseI18N = _baseI18n.BaseI18N;
Expand Down
4 changes: 3 additions & 1 deletion dist/amd/i18n.js
Expand Up @@ -10,14 +10,15 @@ define(['exports', 'i18next', './utils'], function (exports, _i18next, _utils) {
var _i18n = _interopRequireDefault(_i18next);

var I18N = (function () {
function I18N(ea, loader) {
function I18N(ea, loader, signaler) {
_classCallCheck(this, I18N);

this.globalVars = {};

this.i18next = _i18n['default'];
this.ea = ea;
this.Intl = window.Intl;
this.signaler = signaler;

var i18nName = loader.normalizeSync('aurelia-i18n');
var intlName = loader.normalizeSync('Intl.js', i18nName);
Expand Down Expand Up @@ -54,6 +55,7 @@ define(['exports', 'i18next', './utils'], function (exports, _i18next, _utils) {
var oldLocale = _this.getLocale();
_this.i18next.setLng(locale, function (tr) {
_this.ea.publish('i18n:locale:changed', { oldValue: oldLocale, newValue: locale });
_this.signaler.signal('aurelia-translation-signal');
resolve(tr);
});
});
Expand Down
34 changes: 33 additions & 1 deletion dist/amd/t.js
@@ -1,4 +1,4 @@
define(['exports', './i18n', 'aurelia-event-aggregator', 'aurelia-templating', './utils'], function (exports, _i18n, _aureliaEventAggregator, _aureliaTemplating, _utils) {
define(['exports', './i18n', 'aurelia-event-aggregator', 'aurelia-templating', 'aurelia-templating-resources', 'aurelia-binding', './utils'], function (exports, _i18n, _aureliaEventAggregator, _aureliaTemplating, _aureliaTemplatingResources, _aureliaBinding, _utils) {
'use strict';

exports.__esModule = true;
Expand Down Expand Up @@ -107,4 +107,36 @@ define(['exports', './i18n', 'aurelia-event-aggregator', 'aurelia-templating', '
})();

exports.TCustomAttribute = TCustomAttribute;

var TBindingBehavior = (function () {
_createClass(TBindingBehavior, null, [{
key: 'inject',
value: [_aureliaTemplatingResources.SignalBindingBehavior],
enumerable: true
}]);

function TBindingBehavior(signalBindingBehavior) {
_classCallCheck(this, TBindingBehavior);

this.signalBindingBehavior = signalBindingBehavior;
}

TBindingBehavior.prototype.bind = function bind(binding, source) {
this.signalBindingBehavior.bind(binding, source, 'aurelia-translation-signal');

var sourceExpression = binding.sourceExpression;
var expression = sourceExpression.expression;
sourceExpression.expression = new _aureliaBinding.ValueConverter(expression, 't', sourceExpression.args, [expression].concat(sourceExpression.args));
};

TBindingBehavior.prototype.unbind = function unbind(binding, source) {
binding.sourceExpression.expression = binding.sourceExpression.expression.expression;

this.signalBindingBehavior.unbind(binding, source);
};

return TBindingBehavior;
})();

exports.TBindingBehavior = TBindingBehavior;
});
10 changes: 9 additions & 1 deletion dist/aurelia-i18n.d.ts
Expand Up @@ -3,6 +3,8 @@ declare module 'aurelia-i18n' {
import { resolver } from 'aurelia-dependency-injection';
import { EventAggregator } from 'aurelia-event-aggregator';
import { customAttribute, ViewResources } from 'aurelia-templating';
import { SignalBindingBehavior, BindingSignaler } from 'aurelia-templating-resources';
import { ValueConverter } from 'aurelia-binding';
import { DefaultLoader } from 'aurelia-loader-default';

/*eslint no-irregular-whitespace: 0*/
Expand All @@ -18,7 +20,7 @@ declare module 'aurelia-i18n' {
/*eslint no-cond-assign: 0*/
export class I18N {
globalVars: any;
constructor(ea: any, loader: any);
constructor(ea: any, loader: any, signaler: any);
setup(options: any): any;
setLocale(locale: any): any;
getLocale(): any;
Expand Down Expand Up @@ -80,6 +82,12 @@ declare module 'aurelia-i18n' {
valueChanged(newValue: any): any;
unbind(): any;
}
export class TBindingBehavior {
static inject: any;
constructor(signalBindingBehavior: any);
bind(binding: any, source: any): any;
unbind(binding: any, source: any): any;
}
export class RtValueConverter {
static inject(): any;
constructor(relativeTime: any);
Expand Down
43 changes: 39 additions & 4 deletions dist/aurelia-i18n.js
Expand Up @@ -2,6 +2,8 @@ import i18n from 'i18next';
import {resolver} from 'aurelia-dependency-injection';
import {EventAggregator} from 'aurelia-event-aggregator';
import {customAttribute,ViewResources} from 'aurelia-templating';
import {SignalBindingBehavior,BindingSignaler} from 'aurelia-templating-resources';
import {ValueConverter} from 'aurelia-binding';
import {DefaultLoader} from 'aurelia-loader-default';

/*eslint no-irregular-whitespace: 0*/
Expand Down Expand Up @@ -283,10 +285,11 @@ export class I18N {

globalVars = {};

constructor(ea, loader) {
constructor(ea, loader, signaler) {
this.i18next = i18n;
this.ea = ea;
this.Intl = window.Intl;
this.signaler = signaler;

// check whether Intl is available, otherwise load the polyfill
let i18nName = loader.normalizeSync('aurelia-i18n');
Expand Down Expand Up @@ -323,6 +326,7 @@ export class I18N {
let oldLocale = this.getLocale();
this.i18next.setLng(locale, tr => {
this.ea.publish('i18n:locale:changed', { oldValue: oldLocale, newValue: locale });
this.signaler.signal('aurelia-translation-signal');
resolve(tr);
});
});
Expand Down Expand Up @@ -628,6 +632,37 @@ export class TCustomAttribute {
}
}

export class TBindingBehavior {
static inject = [SignalBindingBehavior];

constructor(signalBindingBehavior) {
this.signalBindingBehavior = signalBindingBehavior;
}

bind(binding, source) {
// bind the signal behavior
this.signalBindingBehavior.bind(binding, source, 'aurelia-translation-signal');

// rewrite the expression to use the TValueConverter.
// pass through any args to the binding behavior to the TValueConverter
let sourceExpression = binding.sourceExpression;
let expression = sourceExpression.expression;
sourceExpression.expression = new ValueConverter(
expression,
't',
sourceExpression.args,
[expression, ...sourceExpression.args]);
}

unbind(binding, source) {
// undo the expression rewrite
binding.sourceExpression.expression = binding.sourceExpression.expression.expression;

// unbind the signal behavior
this.signalBindingBehavior.unbind(binding, source);
}
}

export class RtValueConverter {
static inject() { return [RelativeTime]; }
constructor(relativeTime) {
Expand All @@ -639,8 +674,6 @@ export class RtValueConverter {
}
}

console.log(DefaultLoader);

function configure(frameworkConfig, cb) {
if (cb === undefined || typeof cb !== 'function') {
let errorMsg = 'You need to provide a callback method to properly configure the library';
Expand All @@ -652,7 +685,8 @@ function configure(frameworkConfig, cb) {
frameworkConfig.globalResources('./df');
frameworkConfig.globalResources('./rt');

let instance = new I18N(frameworkConfig.container.get(EventAggregator), frameworkConfig.container.get(DefaultLoader));
let instance = new I18N(frameworkConfig.container.get(EventAggregator),
frameworkConfig.container.get(DefaultLoader), frameworkConfig.container.get(BindingSignaler));
frameworkConfig.container.registerInstance(I18N, instance);

let ret = cb(instance);
Expand Down Expand Up @@ -681,6 +715,7 @@ export {
NfValueConverter,
RtValueConverter,
TValueConverter,
TBindingBehavior,
TCustomAttribute,
TParamsCustomAttribute,
BaseI18N,
Expand Down
10 changes: 9 additions & 1 deletion dist/commonjs/aurelia-i18n.d.ts
Expand Up @@ -3,6 +3,8 @@ declare module 'aurelia-i18n' {
import { resolver } from 'aurelia-dependency-injection';
import { EventAggregator } from 'aurelia-event-aggregator';
import { customAttribute, ViewResources } from 'aurelia-templating';
import { SignalBindingBehavior, BindingSignaler } from 'aurelia-templating-resources';
import { ValueConverter } from 'aurelia-binding';
import { DefaultLoader } from 'aurelia-loader-default';

/*eslint no-irregular-whitespace: 0*/
Expand All @@ -18,7 +20,7 @@ declare module 'aurelia-i18n' {
/*eslint no-cond-assign: 0*/
export class I18N {
globalVars: any;
constructor(ea: any, loader: any);
constructor(ea: any, loader: any, signaler: any);
setup(options: any): any;
setLocale(locale: any): any;
getLocale(): any;
Expand Down Expand Up @@ -80,6 +82,12 @@ declare module 'aurelia-i18n' {
valueChanged(newValue: any): any;
unbind(): any;
}
export class TBindingBehavior {
static inject: any;
constructor(signalBindingBehavior: any);
bind(binding: any, source: any): any;
unbind(binding: any, source: any): any;
}
export class RtValueConverter {
static inject(): any;
constructor(relativeTime: any);
Expand Down
7 changes: 4 additions & 3 deletions dist/commonjs/aurelia-i18n.js
Expand Up @@ -8,6 +8,8 @@ var _aureliaTemplating = require('aurelia-templating');

var _aureliaLoaderDefault = require('aurelia-loader-default');

var _aureliaTemplatingResources = require('aurelia-templating-resources');

var _i18n = require('./i18n');

var _relativeTime = require('./relativeTime');
Expand All @@ -22,8 +24,6 @@ var _t = require('./t');

var _baseI18n = require('./base-i18n');

console.log(_aureliaLoaderDefault.DefaultLoader);

function configure(frameworkConfig, cb) {
if (cb === undefined || typeof cb !== 'function') {
var errorMsg = 'You need to provide a callback method to properly configure the library';
Expand All @@ -35,7 +35,7 @@ function configure(frameworkConfig, cb) {
frameworkConfig.globalResources('./df');
frameworkConfig.globalResources('./rt');

var instance = new _i18n.I18N(frameworkConfig.container.get(_aureliaEventAggregator.EventAggregator), frameworkConfig.container.get(_aureliaLoaderDefault.DefaultLoader));
var instance = new _i18n.I18N(frameworkConfig.container.get(_aureliaEventAggregator.EventAggregator), frameworkConfig.container.get(_aureliaLoaderDefault.DefaultLoader), frameworkConfig.container.get(_aureliaTemplatingResources.BindingSignaler));
frameworkConfig.container.registerInstance(_i18n.I18N, instance);

var ret = cb(instance);
Expand Down Expand Up @@ -64,6 +64,7 @@ exports.DfValueConverter = _df.DfValueConverter;
exports.NfValueConverter = _nf.NfValueConverter;
exports.RtValueConverter = _rt.RtValueConverter;
exports.TValueConverter = _t.TValueConverter;
exports.TBindingBehavior = _t.TBindingBehavior;
exports.TCustomAttribute = _t.TCustomAttribute;
exports.TParamsCustomAttribute = _t.TParamsCustomAttribute;
exports.BaseI18N = _baseI18n.BaseI18N;
Expand Down
4 changes: 3 additions & 1 deletion dist/commonjs/i18n.js
Expand Up @@ -13,14 +13,15 @@ var _i18next2 = _interopRequireDefault(_i18next);
var _utils = require('./utils');

var I18N = (function () {
function I18N(ea, loader) {
function I18N(ea, loader, signaler) {
_classCallCheck(this, I18N);

this.globalVars = {};

this.i18next = _i18next2['default'];
this.ea = ea;
this.Intl = window.Intl;
this.signaler = signaler;

var i18nName = loader.normalizeSync('aurelia-i18n');
var intlName = loader.normalizeSync('Intl.js', i18nName);
Expand Down Expand Up @@ -57,6 +58,7 @@ var I18N = (function () {
var oldLocale = _this.getLocale();
_this.i18next.setLng(locale, function (tr) {
_this.ea.publish('i18n:locale:changed', { oldValue: oldLocale, newValue: locale });
_this.signaler.signal('aurelia-translation-signal');
resolve(tr);
});
});
Expand Down

0 comments on commit d9877ee

Please sign in to comment.