Skip to content

Instantly share code, notes, and snippets.

@jdanyow
Forked from charlespockert/app.html
Last active March 22, 2017 09:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save jdanyow/be99269ff5295eb3872ff4cea419e3c6 to your computer and use it in GitHub Desktop.
Save jdanyow/be99269ff5295eb3872ff4cea419e3c6 to your computer and use it in GitHub Desktop.
Aurelia + i18n plugin issue with binding behaviour
<template>
<require from="tbind.js"></require>
<h1>${message}</h1>
<h2>${prop}</h2>
<div>${'val1' & t}</div>
<div>${'val1' & t}</div>
<div>${'val1' & t}</div>
<hr/>
<div>
<compose containerless view.bind="'custom-view.html'"></compose>
</div>
<hr/>
<button click.trigger="changeLocale('de')">de</button>
<button click.trigger="changeLocale('en')">en</button>
</template>
import {BindingSignaler} from 'aurelia-templating-resources';
import {I18N} from 'aurelia-i18n';
import {inject} from 'aurelia-framework';
@inject(I18N, BindingSignaler)
export class App {
message = 'Hello World';
prop = "test";
constructor(i18n, bindingSignaler) {
this.signaler = bindingSignaler;
this.i18n = i18n;
}
changeLocale(locale) {
this.i18n.setLocale(locale);
this.signaler.signal('trans');
}
getLabel(propName) {
return propName;
}
}
<template>
<require from="tbind.js"></require>
Custom view
<p>
${'val1' | t & signal:'trans'}
</p>
</template>
<!doctype html>
<html>
<head>
<title>Aurelia</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body aurelia-app="main">
<h1>Loading...</h1>
<script src="https://cdn.rawgit.com/valichek/aurelia-bundle/i18n-0.5.2v0.0.4/jspm_packages/system.js"></script>
<script src="https://cdn.rawgit.com/valichek/aurelia-bundle/i18n-0.5.2v0.0.4/config.js"></script>
<script>
System.import('aurelia-bootstrapper');
</script>
</body>
</html>
{
"val1" : "DE-tr1",
"val1test" : "DE-tr1-test",
"DE-tr1" : "wtf"
}
{
"val1" : "EN-tr1",
"val1test" : "EN-tr1-test"
}
import Backend from 'i18next-xhr-backend';
export function configure(aurelia) {
aurelia.use
.standardConfiguration()
.developmentLogging()
.plugin('aurelia-i18n', (instance) => {
// register backend plugin
instance.i18next.use(Backend);
// adapt options to your needs (see http://i18next.com/docs/options/)
return instance.setup({
backend: { // <-- configure backend settings
loadPath: 'locale-{{lng}}-{{ns}}.json' // <-- XHR settings for where to get the files from
},
lng: 'de',
attributes: ['t', 'i18n'],
fallbackLng: 'en',
debug: true,
//compatibilityJSON: 'v1',
ns: ['translation', 'custom']
});
});
aurelia.start().then(a => a.setRoot());
}
import {SignalBindingBehavior} from 'aurelia-templating-resources';
import {ValueConverter} from 'aurelia-binding';
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;
if (sourceExpression.rewritten) {
return;
}
sourceExpression.rewritten = true;
let expression = sourceExpression.expression;
sourceExpression.expression = new ValueConverter(
expression,
't',
sourceExpression.args,
[expression, ...sourceExpression.args]);
}
unbind(binding, source) {
// unbind the signal behavior
this.signalBindingBehavior.unbind(binding, source);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment