From be9369a76b76cf8a68d5447ed314e67ca53a4ef5 Mon Sep 17 00:00:00 2001 From: Thomas Flori Date: Sat, 18 Mar 2017 22:49:21 +0100 Subject: [PATCH 1/3] change the structure to work with angular cli --- .npmignore | 10 ++-- README.md | 59 +++++++++++-------- bundle.js | 2 +- bundles/angular2-translator.js | 2 +- index.ts | 7 +++ karma.conf.js | 7 +-- package.json | 6 +- .../TranslateComponent.ts | 0 .../TranslateConfig.ts | 0 .../TranslateLoader.ts | 0 .../TranslateLoaderJson.ts | 2 +- {angular2-translator => src}/TranslatePipe.ts | 0 .../TranslateService.ts | 0 .../TranslatorModule.ts | 19 ++---- tests/TranslateComponent.spec.ts | 2 +- tests/TranslateConfig.spec.ts | 2 +- tests/TranslateLoader.spec.ts | 2 +- tests/TranslateLoaderJson.spec.ts | 2 +- tests/TranslatePipe.spec.ts | 2 +- tests/TranslateService.spec.ts | 2 +- tests/helper/TranslateLoaderMock.ts | 2 +- 21 files changed, 70 insertions(+), 58 deletions(-) create mode 100644 index.ts rename {angular2-translator => src}/TranslateComponent.ts (100%) rename {angular2-translator => src}/TranslateConfig.ts (100%) rename {angular2-translator => src}/TranslateLoader.ts (100%) rename {angular2-translator => src}/TranslateLoaderJson.ts (98%) rename {angular2-translator => src}/TranslatePipe.ts (100%) rename {angular2-translator => src}/TranslateService.ts (100%) rename angular2-translator.ts => src/TranslatorModule.ts (72%) diff --git a/.npmignore b/.npmignore index 5c582af..a4f4ded 100644 --- a/.npmignore +++ b/.npmignore @@ -1,8 +1,8 @@ -/angular2-translator/* -!/angular2-translator/*.ts -/angular2-translator.* -!/angular2-translator.ts -!/angular2-translator.d.ts +/src/* +!/src/*.ts +/index.* +!/index.ts +!/index.d.ts /coverage/ /typings/ diff --git a/README.md b/README.md index 3cf8f0a..86884e7 100644 --- a/README.md +++ b/README.md @@ -75,45 +75,58 @@ To learn more have a look at [the documentation](https://tflori.github.io/angula ## How to install ### Via npm + First you need to install the package. The easiest way is to install it via npm: + ```bash npm install --save angular2-translator ``` -Then you need to tell systemjs where to load angular2-translator: -```js -System.config({ - map: { - 'angular2-translator': 'npm:angular2-translator/bundles/angular2-translator.js' - } -}); -``` - -Or you load the file directly: -```html - +### Manually + +You also can clone the repository and symlink the project folder or what ever: + +```bash +git clone https://gitlab.w00tserver.org:617/tflori/angular2-translator +ln -s angular2-translator MyApp/libs/angular2-translator ``` -Now you have to set up your NgModule to use the `TranslatorModule` and may be configure it: +> You should know what you do and don't follow this guide for installation. + +## How to use + +You have to set up your `NgModule` to import the `TranslatorModule` and may be configure it: + ```ts import {TranslateConfig, TranslatorModule} from "angular2-translator"; +export function factoryTranslateConfig() { + return new TranslateConfig({}); +}; + @NgModule({ imports: [ TranslatorModule ], providers: [ - { provide: TranslateConfig, useValue: new TranslateConfig({ - defaultLang: "de", - providedLangs: [ "de", "en" ], - })}, + { provide: TranslateConfig, useFactory: factoryTranslateConfig } ] }) export class AppModule {} ``` -### Manually -You also can clone the repository and symlink the project folder or what ever: -```bash -git clone https://gitlab.w00tserver.org:617/tflori/angular2-translator -ln -s angular2-translator MyApp/libs/angular2-translator +### Using SystemJs + +When you are using SystemJs you need to configure where to load angular2-translator: + +```js +System.config({ + map: { + 'angular2-translator': 'npm:angular2-translator/bundles/angular2-translator.js' + } +}); +``` + +Or you load the file directly: + +```html + ``` -> You should know what you do and don't follow this guide for installation. diff --git a/bundle.js b/bundle.js index 1828363..c58e28f 100644 --- a/bundle.js +++ b/bundle.js @@ -27,7 +27,7 @@ var builder = new Builder({ }); builder - .buildStatic('angular2-translator', path.resolve(__dirname, 'bundles/', name + '.js'), { + .buildStatic('index', path.resolve(__dirname, 'bundles/', name + '.js'), { format: 'umd', minify: true, sourceMaps: true, diff --git a/bundles/angular2-translator.js b/bundles/angular2-translator.js index 47199a3..c98bdb7 100644 --- a/bundles/angular2-translator.js +++ b/bundles/angular2-translator.js @@ -1,2 +1,2 @@ -!function(a){function b(a){Object.defineProperty(this,a,{enumerable:!0,get:function(){return this[o][a]}})}function c(a){var b;if(a&&a.__esModule){b={};for(var c in a)Object.hasOwnProperty.call(a,c)&&(b[c]=a[c]);b.__useDefault&&delete b.__useDefault,b.__esModule=!0}else{if("[object Module]"===Object.prototype.toString.call(a)||"undefined"!=typeof System&&System.isModule&&System.isModule(a))return a;b={default:a,__useDefault:!0}}return new d(b)}function d(a){Object.defineProperty(this,o,{value:a}),Object.keys(a).forEach(b,this)}function e(a){return"@node/"===a.substr(0,6)?m(a,c(p(a.substr(6))),{}):n[a]}function f(a){var b=e(a);if(!b)throw new Error('Module "'+a+'" expected, but not contained in build.');if(b.module)return b.module;var c=b.linkRecord;return g(b,c),l(b,c,[]),b.module}function g(a,b){if(!b.depLoads){b.declare&&h(a,b),b.depLoads=[];for(var c=0;c1)for(var l=1;l=0;h--)(e=a[h])&&(g=(f<3?e(g):f>3?e(b,c,g):e(b,c))||g);return f>3&&g&&Object.defineProperty(b,c,g),g}),e=b&&b.__metadata||function(a,b){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(a,b)},f=b&&b.__param||function(a,b){return function(c,d){b(c,d,a)}};Object.defineProperty(b,"__esModule",{value:!0});var g=a("c"),h=a("d"),i=function(){function a(a){var b=this;this.translation="",this._params={},this._translate=a,a.languageChanged.subscribe(function(){b._startTranslation()})}return Object.defineProperty(a.prototype,"key",{set:function(a){this._key=a,this._startTranslation()},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"params",{set:function(a){if("object"!=typeof a)return void this._translate.logHandler.error("Params have to be an object");this._params=a,this._startTranslation()},enumerable:!0,configurable:!0}),a.prototype._startTranslation=function(){var a=this;this._key&&this._translate.translate(this._key,this._params).then(function(b){return a.translation=String(b)})},a}();d([h.Input("translate"),e("design:type",String),e("design:paramtypes",[String])],i.prototype,"key",null),d([h.Input("translateParams"),e("design:type",Object),e("design:paramtypes",[Object])],i.prototype,"params",null),i=d([h.Component({selector:"[translate]",template:"{{translation}}"}),f(0,h.Inject(g.TranslateService)),e("design:paramtypes",[g.TranslateService])],i),b.TranslateComponent=i}),$__System.registerDynamic("e",["f","d","10"],!0,function(a,b,c){"use strict";var d=(this||self,b&&b.__extends||function(){var a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,b){a.__proto__=b}||function(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c])};return function(b,c){function d(){this.constructor=b}a(b,c),b.prototype=null===c?Object.create(c):(d.prototype=c.prototype,new d)}}()),e=b&&b.__decorate||function(a,b,c,d){var e,f=arguments.length,g=f<3?b:null===d?d=Object.getOwnPropertyDescriptor(b,c):d;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)g=Reflect.decorate(a,b,c,d);else for(var h=a.length-1;h>=0;h--)(e=a[h])&&(g=(f<3?e(g):f>3?e(b,c,g):e(b,c))||g);return f>3&&g&&Object.defineProperty(b,c,g),g},f=b&&b.__metadata||function(a,b){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(a,b)},g=b&&b.__param||function(a,b){return function(c,d){b(c,d,a)}};Object.defineProperty(b,"__esModule",{value:!0});var h=a("f"),i=a("d"),j=a("10"),k=function(){function a(a,b){this.path="i18n/",this.extension=".json",a&&(this.path=a.replace(/\/+$/,"")+"/"),b&&(this.extension=b)}return a}();b.TranslateLoaderJsonConfig=k;var l=function(a){function b(b,c){var d=a.call(this)||this;return d._http=b,d._config=c,d}return d(b,a),b.prototype.load=function(a){var b=this;return new Promise(function(c,d){var e=b._config.path+a+b._config.extension;b._http.get(e).subscribe(function(a){if(200===a.status){var e={};b.flattenTranslations(e,a.json()),c(e)}else d("StatusCode: "+a.status)},function(a){d(a.message)})})},b.prototype.flattenTranslations=function(a,b,c){void 0===c&&(c="");for(var d in b)Array.isArray(b[d])?a[c+d]=b[d].filter(function(a){return"string"==typeof a}).join(""):"object"==typeof b[d]?this.flattenTranslations(a,b[d],c+d+"."):"string"==typeof b[d]&&(a[c+d]=b[d])},b}(h.TranslateLoader);l=e([i.Injectable(),g(0,i.Inject(j.Http)),g(1,i.Inject(k)),f("design:paramtypes",[j.Http,k])],l),b.TranslateLoaderJson=l}),$__System.registerDynamic("11",["c","d"],!0,function($__require,exports,module){"use strict";var global=this||self,GLOBAL=global,__decorate=exports&&exports.__decorate||function(a,b,c,d){var e,f=arguments.length,g=f<3?b:null===d?d=Object.getOwnPropertyDescriptor(b,c):d;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)g=Reflect.decorate(a,b,c,d);else for(var h=a.length-1;h>=0;h--)(e=a[h])&&(g=(f<3?e(g):f>3?e(b,c,g):e(b,c))||g);return f>3&&g&&Object.defineProperty(b,c,g),g},__metadata=exports&&exports.__metadata||function(a,b){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(a,b)},__param=exports&&exports.__param||function(a,b){return function(c,d){b(c,d,a)}};Object.defineProperty(exports,"__esModule",{value:!0});var TranslateService_1=$__require("c"),core_1=$__require("d"),TranslatePipe=TranslatePipe_1=function(){function TranslatePipe(a){var b=this;this._translation="",this._translate=a,a.languageChanged.subscribe(function(){b._startTranslation()})}return TranslatePipe._parseParams=function(arg){try{var o=eval("("+arg+")");if("object"==typeof o)return o}catch(a){}return{}},TranslatePipe.prototype.transform=function(a,b){void 0===b&&(b=[]);var c={};return b[0]&&("string"==typeof b[0]?(c=TranslatePipe_1._parseParams(b[0]),Object.keys(c).length||this._translate.logHandler.error("'"+b[0]+"' could not be parsed to object")):"object"==typeof b[0]&&(c=b[0])),this._translated&&this._promise&&(this._translated.key!==a||JSON.stringify(this._translated.params)!==JSON.stringify(c))&&(this._promise=null),this._promise||(this._translated={key:a,params:c},this._startTranslation()),this._translation},TranslatePipe.prototype._startTranslation=function(){var a=this;this._translated&&this._translated.key&&(this._promise=this._translate.translate(this._translated.key,this._translated.params),this._promise.then(function(b){return a._translation=String(b)}))},TranslatePipe}();TranslatePipe=TranslatePipe_1=__decorate([core_1.Pipe({name:"translate",pure:!1}),__param(0,core_1.Inject(TranslateService_1.TranslateService)),__metadata("design:paramtypes",[TranslateService_1.TranslateService])],TranslatePipe),exports.TranslatePipe=TranslatePipe;var TranslatePipe_1}),$__System.registerDynamic("12",[],!0,function(a,b,c){"use strict";this||self;Object.defineProperty(b,"__esModule",{value:!0});var d=function(){function a(b){var c=b.defaultLang,d=void 0===c?"en":c,e=b.providedLangs,f=void 0===e?["en"]:e,g=b.detectLanguageOnStart,h=void 0===g||g;this.defaultLang=f.indexOf(d)>-1?d:f[0],this.providedLangs=f,this.detectLanguageOnStart=h,this.navigatorLanguages=function(){var b=a.navigator;return b.languages instanceof Array?Array.prototype.slice.call(b.languages):"string"==typeof b.languages?[String(b.languages)]:"string"==typeof b.language?[b.language]:[]}()}return a.prototype.langProvided=function(a,b){void 0===b&&(b=!1);var c,d=!1,e=function(a){var b=/^([A-Za-z]{2})(?:[\.\-_\/]?([A-Za-z]{2}))?$/;return a.match(b)?a.replace(b,function(a,b,c){return void 0===c&&(c=""),b=b.toLowerCase(),c=c.toUpperCase(),c?b+"-"+c:b}):""},f=this.providedLangs.map(e);return a=e(a),0===a.length?d:(c=f.indexOf(a),c>-1?d=this.providedLangs[c]:b||(a=a.substr(0,2),c=f.indexOf(a),c>-1?d=this.providedLangs[c]:(c=f.map(function(a){return a.substr(0,2)}).indexOf(a),c>-1&&(d=this.providedLangs[c]))),d)},a}();d.navigator=window&&window.navigator?window.navigator:{},b.TranslateConfig=d}),$__System.registerDynamic("f",[],!0,function(a,b,c){"use strict";this||self;Object.defineProperty(b,"__esModule",{value:!0});var d=function(){function a(){}return a}();b.TranslateLoader=d}),$__System.registerDynamic("c",["12","f","d","13","14"],!0,function($__require,exports,module){"use strict";var global=this||self,GLOBAL=global,__decorate=exports&&exports.__decorate||function(a,b,c,d){var e,f=arguments.length,g=f<3?b:null===d?d=Object.getOwnPropertyDescriptor(b,c):d;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)g=Reflect.decorate(a,b,c,d);else for(var h=a.length-1;h>=0;h--)(e=a[h])&&(g=(f<3?e(g):f>3?e(b,c,g):e(b,c))||g);return f>3&&g&&Object.defineProperty(b,c,g),g},__metadata=exports&&exports.__metadata||function(a,b){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(a,b)},__param=exports&&exports.__param||function(a,b){return function(c,d){b(c,d,a)}};Object.defineProperty(exports,"__esModule",{value:!0});var TranslateConfig_1=$__require("12"),TranslateLoader_1=$__require("f"),core_1=$__require("d"),Observable_1=$__require("13");$__require("14"),exports.TranslateLogHandler={debug:function(){},error:function(a){return console&&console.error&&console.error(a)},info:function(){}};var TranslateService=function(){function TranslateService(a,b,c){var d=this;if(this._loadedLangs={},this._translations={},this._config=a,this._loader=b,this.logHandler=c,this._lang=a.defaultLang,a.detectLanguageOnStart){var e=this.detectLang(a.navigatorLanguages);e&&(this._lang=String(e),c.info("Language "+e+" got detected"))}this.languageChanged=new Observable_1.Observable(function(a){return d._languageChangedObserver=a}).share()}return Object.defineProperty(TranslateService.prototype,"lang",{get:function(){return this._lang},set:function(a){var b=this._config.langProvided(a,!0);if("string"==typeof b)return this._lang=b,this.logHandler.info("Language changed to "+b),void(this._languageChangedObserver&&this._languageChangedObserver.next(this._lang));throw new Error("Language not provided")},enumerable:!0,configurable:!0}),TranslateService.prototype.detectLang=function(a){var b,c=!1;for(b=0;b0)return this.logHandler.error("Parse error only first parameter can be passed as params in '"+a+"'"),"";j="wait_getter"}break;case"read_param_key":if(b[e].match(/[A-Za-z0-9_]/))g+=b[e];else if("="===b[e])j="wait_getter";else if(","===b[e])l(!1),j="wait_param";else{if(!b[e].match(/\s/))return this._referencedError(a,"character","comma, equal sign or end",e);j="param_key_readed"}break;case"param_key_readed":if(b[e].match(/\s/));else if("="===b[e])j="wait_getter";else{if(","!==b[e])return this._referencedError(a,"character","comma, equal sign or end",e);l(!1),j="wait_param"}break;case"wait_getter":if(b[e].match(/\s/));else{if(!b[e].match(/[A-Za-z0-9_]/))return this._referencedError(a,"character","getter",e);j="read_getter",h=b[e]}break;case"read_getter":if(b[e].match(/[A-Za-z0-9_.]/))h+=b[e];else if(b[e].match(/\s/))j="getter_readed";else{if(","!==b[e])return this._referencedError(a,"character","comma or end",e);l(),j="wait_param"}break;case"getter_readed":if(b[e].match(/\s/));else{if(","!==b[e])return this._referencedError(a,"character","comma or end",e);l(),j="wait_param"}}switch(j){case"param_key_readed":case"read_param_key":l(!1);break;case"getter_readed":case"read_getter":l();break;case"wait_key":return this._referencedError(a,"end","key");case"wait_param":return this._referencedError(a,"end","parameter");case"wait_getter":return this._referencedError(a,"end","getter")}return String(this.instant(f,k,d))},TranslateService}();TranslateService=__decorate([core_1.Injectable(),__param(0,core_1.Inject(TranslateConfig_1.TranslateConfig)),__param(1,core_1.Inject(TranslateLoader_1.TranslateLoader)),__param(2,core_1.Inject(exports.TranslateLogHandler)),__metadata("design:paramtypes",[TranslateConfig_1.TranslateConfig,TranslateLoader_1.TranslateLoader,Object])],TranslateService),exports.TranslateService=TranslateService}),$__System.registerDynamic("a",["b","12","f","e","11","c","d","10"],!0,function(a,b,c){"use strict";function d(a){for(var c in a)b.hasOwnProperty(c)||(b[c]=a[c])}var e=(this||self,b&&b.__decorate||function(a,b,c,d){var e,f=arguments.length,g=f<3?b:null===d?d=Object.getOwnPropertyDescriptor(b,c):d;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)g=Reflect.decorate(a,b,c,d);else for(var h=a.length-1;h>=0;h--)(e=a[h])&&(g=(f<3?e(g):f>3?e(b,c,g):e(b,c))||g);return f>3&&g&&Object.defineProperty(b,c,g),g});Object.defineProperty(b,"__esModule",{value:!0});var f=a("b"),g=a("12"),h=a("f"),i=a("e"),j=a("11"),k=a("c"),l=a("d"),m=a("10");d(a("c")),d(a("11")),d(a("b")),d(a("12")),d(a("f")),d(a("e"));var n=function(){function a(){}return a}();n=e([l.NgModule({declarations:[j.TranslatePipe,f.TranslateComponent],exports:[j.TranslatePipe,f.TranslateComponent],imports:[m.HttpModule],providers:[{provide:g.TranslateConfig,useValue:new g.TranslateConfig({})},{provide:i.TranslateLoaderJsonConfig,useValue:new i.TranslateLoaderJsonConfig},{provide:h.TranslateLoader,useClass:i.TranslateLoaderJson},{provide:k.TranslateLogHandler,useValue:k.TranslateLogHandler},k.TranslateService]})],n),b.TranslatorModule=n,b.TRANSLATE_PROVIDERS=[{provide:g.TranslateConfig,useValue:new g.TranslateConfig({})},{provide:i.TranslateLoaderJsonConfig,useValue:new i.TranslateLoaderJsonConfig},{provide:h.TranslateLoader,useClass:i.TranslateLoaderJson},{provide:k.TranslateLogHandler,useValue:k.TranslateLogHandler},k.TranslateService]})})(function(a){if("function"==typeof define&&define.amd)define(["@angular/core","@angular/http","rxjs/Observable","rxjs/add/operator/share"],a);else{if("object"!=typeof module||!module.exports||"function"!=typeof require)throw new Error("Module must be loaded as AMD or CommonJS");module.exports=a(require("@angular/core"),require("@angular/http"),require("rxjs/Observable"),require("rxjs/add/operator/share"))}}); +!function(a){function b(a){Object.defineProperty(this,a,{enumerable:!0,get:function(){return this[o][a]}})}function c(a){var b;if(a&&a.__esModule){b={};for(var c in a)Object.hasOwnProperty.call(a,c)&&(b[c]=a[c]);b.__useDefault&&delete b.__useDefault,b.__esModule=!0}else{if("[object Module]"===Object.prototype.toString.call(a)||"undefined"!=typeof System&&System.isModule&&System.isModule(a))return a;b={default:a,__useDefault:!0}}return new d(b)}function d(a){Object.defineProperty(this,o,{value:a}),Object.keys(a).forEach(b,this)}function e(a){return"@node/"===a.substr(0,6)?m(a,c(p(a.substr(6))),{}):n[a]}function f(a){var b=e(a);if(!b)throw new Error('Module "'+a+'" expected, but not contained in build.');if(b.module)return b.module;var c=b.linkRecord;return g(b,c),l(b,c,[]),b.module}function g(a,b){if(!b.depLoads){b.declare&&h(a,b),b.depLoads=[];for(var c=0;c1)for(var l=1;l=0;h--)(e=a[h])&&(g=(f<3?e(g):f>3?e(b,c,g):e(b,c))||g);return f>3&&g&&Object.defineProperty(b,c,g),g}),e=b&&b.__metadata||function(a,b){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(a,b)},f=b&&b.__param||function(a,b){return function(c,d){b(c,d,a)}};Object.defineProperty(b,"__esModule",{value:!0});var g=a("c"),h=a("d"),i=function(){function a(a){var b=this;this.translation="",this._params={},this._translate=a,a.languageChanged.subscribe(function(){b._startTranslation()})}return Object.defineProperty(a.prototype,"key",{set:function(a){this._key=a,this._startTranslation()},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"params",{set:function(a){if("object"!=typeof a)return void this._translate.logHandler.error("Params have to be an object");this._params=a,this._startTranslation()},enumerable:!0,configurable:!0}),a.prototype._startTranslation=function(){var a=this;this._key&&this._translate.translate(this._key,this._params).then(function(b){return a.translation=String(b)})},a}();d([h.Input("translate"),e("design:type",String),e("design:paramtypes",[String])],i.prototype,"key",null),d([h.Input("translateParams"),e("design:type",Object),e("design:paramtypes",[Object])],i.prototype,"params",null),i=d([h.Component({selector:"[translate]",template:"{{translation}}"}),f(0,h.Inject(g.TranslateService)),e("design:paramtypes",[g.TranslateService])],i),b.TranslateComponent=i}),$__System.registerDynamic("e",["f","d","10"],!0,function(a,b,c){"use strict";var d=(this||self,b&&b.__extends||function(){var a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,b){a.__proto__=b}||function(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c])};return function(b,c){function d(){this.constructor=b}a(b,c),b.prototype=null===c?Object.create(c):(d.prototype=c.prototype,new d)}}()),e=b&&b.__decorate||function(a,b,c,d){var e,f=arguments.length,g=f<3?b:null===d?d=Object.getOwnPropertyDescriptor(b,c):d;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)g=Reflect.decorate(a,b,c,d);else for(var h=a.length-1;h>=0;h--)(e=a[h])&&(g=(f<3?e(g):f>3?e(b,c,g):e(b,c))||g);return f>3&&g&&Object.defineProperty(b,c,g),g},f=b&&b.__metadata||function(a,b){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(a,b)},g=b&&b.__param||function(a,b){return function(c,d){b(c,d,a)}};Object.defineProperty(b,"__esModule",{value:!0});var h=a("f"),i=a("d"),j=a("10"),k=function(){function a(a,b){this.path="assets/i18n/",this.extension=".json",a&&(this.path=a.replace(/\/+$/,"")+"/"),b&&(this.extension=b)}return a}();b.TranslateLoaderJsonConfig=k;var l=function(a){function b(b,c){var d=a.call(this)||this;return d._http=b,d._config=c,d}return d(b,a),b.prototype.load=function(a){var b=this;return new Promise(function(c,d){var e=b._config.path+a+b._config.extension;b._http.get(e).subscribe(function(a){if(200===a.status){var e={};b.flattenTranslations(e,a.json()),c(e)}else d("StatusCode: "+a.status)},function(a){d(a.message)})})},b.prototype.flattenTranslations=function(a,b,c){void 0===c&&(c="");for(var d in b)Array.isArray(b[d])?a[c+d]=b[d].filter(function(a){return"string"==typeof a}).join(""):"object"==typeof b[d]?this.flattenTranslations(a,b[d],c+d+"."):"string"==typeof b[d]&&(a[c+d]=b[d])},b}(h.TranslateLoader);l=e([i.Injectable(),g(0,i.Inject(j.Http)),g(1,i.Inject(k)),f("design:paramtypes",[j.Http,k])],l),b.TranslateLoaderJson=l}),$__System.registerDynamic("11",["c","d"],!0,function($__require,exports,module){"use strict";var global=this||self,GLOBAL=global,__decorate=exports&&exports.__decorate||function(a,b,c,d){var e,f=arguments.length,g=f<3?b:null===d?d=Object.getOwnPropertyDescriptor(b,c):d;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)g=Reflect.decorate(a,b,c,d);else for(var h=a.length-1;h>=0;h--)(e=a[h])&&(g=(f<3?e(g):f>3?e(b,c,g):e(b,c))||g);return f>3&&g&&Object.defineProperty(b,c,g),g},__metadata=exports&&exports.__metadata||function(a,b){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(a,b)},__param=exports&&exports.__param||function(a,b){return function(c,d){b(c,d,a)}};Object.defineProperty(exports,"__esModule",{value:!0});var TranslateService_1=$__require("c"),core_1=$__require("d"),TranslatePipe=TranslatePipe_1=function(){function TranslatePipe(a){var b=this;this._translation="",this._translate=a,a.languageChanged.subscribe(function(){b._startTranslation()})}return TranslatePipe._parseParams=function(arg){try{var o=eval("("+arg+")");if("object"==typeof o)return o}catch(a){}return{}},TranslatePipe.prototype.transform=function(a,b){void 0===b&&(b=[]);var c={};return b[0]&&("string"==typeof b[0]?(c=TranslatePipe_1._parseParams(b[0]),Object.keys(c).length||this._translate.logHandler.error("'"+b[0]+"' could not be parsed to object")):"object"==typeof b[0]&&(c=b[0])),this._translated&&this._promise&&(this._translated.key!==a||JSON.stringify(this._translated.params)!==JSON.stringify(c))&&(this._promise=null),this._promise||(this._translated={key:a,params:c},this._startTranslation()),this._translation},TranslatePipe.prototype._startTranslation=function(){var a=this;this._translated&&this._translated.key&&(this._promise=this._translate.translate(this._translated.key,this._translated.params),this._promise.then(function(b){return a._translation=String(b)}))},TranslatePipe}();TranslatePipe=TranslatePipe_1=__decorate([core_1.Pipe({name:"translate",pure:!1}),__param(0,core_1.Inject(TranslateService_1.TranslateService)),__metadata("design:paramtypes",[TranslateService_1.TranslateService])],TranslatePipe),exports.TranslatePipe=TranslatePipe;var TranslatePipe_1}),$__System.registerDynamic("12",[],!0,function(a,b,c){"use strict";this||self;Object.defineProperty(b,"__esModule",{value:!0});var d=function(){function a(b){var c=b.defaultLang,d=void 0===c?"en":c,e=b.providedLangs,f=void 0===e?["en"]:e,g=b.detectLanguageOnStart,h=void 0===g||g;this.defaultLang=f.indexOf(d)>-1?d:f[0],this.providedLangs=f,this.detectLanguageOnStart=h,this.navigatorLanguages=function(){var b=a.navigator;return b.languages instanceof Array?Array.prototype.slice.call(b.languages):"string"==typeof b.languages?[String(b.languages)]:"string"==typeof b.language?[b.language]:[]}()}return a.prototype.langProvided=function(a,b){void 0===b&&(b=!1);var c,d=!1,e=function(a){var b=/^([A-Za-z]{2})(?:[\.\-_\/]?([A-Za-z]{2}))?$/;return a.match(b)?a.replace(b,function(a,b,c){return void 0===c&&(c=""),b=b.toLowerCase(),c=c.toUpperCase(),c?b+"-"+c:b}):""},f=this.providedLangs.map(e);return a=e(a),0===a.length?d:(c=f.indexOf(a),c>-1?d=this.providedLangs[c]:b||(a=a.substr(0,2),c=f.indexOf(a),c>-1?d=this.providedLangs[c]:(c=f.map(function(a){return a.substr(0,2)}).indexOf(a),c>-1&&(d=this.providedLangs[c]))),d)},a}();d.navigator=window&&window.navigator?window.navigator:{},b.TranslateConfig=d}),$__System.registerDynamic("f",[],!0,function(a,b,c){"use strict";this||self;Object.defineProperty(b,"__esModule",{value:!0});var d=function(){function a(){}return a}();b.TranslateLoader=d}),$__System.registerDynamic("c",["12","f","d","13","14"],!0,function($__require,exports,module){"use strict";var global=this||self,GLOBAL=global,__decorate=exports&&exports.__decorate||function(a,b,c,d){var e,f=arguments.length,g=f<3?b:null===d?d=Object.getOwnPropertyDescriptor(b,c):d;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)g=Reflect.decorate(a,b,c,d);else for(var h=a.length-1;h>=0;h--)(e=a[h])&&(g=(f<3?e(g):f>3?e(b,c,g):e(b,c))||g);return f>3&&g&&Object.defineProperty(b,c,g),g},__metadata=exports&&exports.__metadata||function(a,b){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(a,b)},__param=exports&&exports.__param||function(a,b){return function(c,d){b(c,d,a)}};Object.defineProperty(exports,"__esModule",{value:!0});var TranslateConfig_1=$__require("12"),TranslateLoader_1=$__require("f"),core_1=$__require("d"),Observable_1=$__require("13");$__require("14"),exports.TranslateLogHandler={debug:function(){},error:function(a){return console&&console.error&&console.error(a)},info:function(){}};var TranslateService=function(){function TranslateService(a,b,c){var d=this;if(this._loadedLangs={},this._translations={},this._config=a,this._loader=b,this.logHandler=c,this._lang=a.defaultLang,a.detectLanguageOnStart){var e=this.detectLang(a.navigatorLanguages);e&&(this._lang=String(e),c.info("Language "+e+" got detected"))}this.languageChanged=new Observable_1.Observable(function(a){return d._languageChangedObserver=a}).share()}return Object.defineProperty(TranslateService.prototype,"lang",{get:function(){return this._lang},set:function(a){var b=this._config.langProvided(a,!0);if("string"==typeof b)return this._lang=b,this.logHandler.info("Language changed to "+b),void(this._languageChangedObserver&&this._languageChangedObserver.next(this._lang));throw new Error("Language not provided")},enumerable:!0,configurable:!0}),TranslateService.prototype.detectLang=function(a){var b,c=!1;for(b=0;b0)return this.logHandler.error("Parse error only first parameter can be passed as params in '"+a+"'"),"";j="wait_getter"}break;case"read_param_key":if(b[e].match(/[A-Za-z0-9_]/))g+=b[e];else if("="===b[e])j="wait_getter";else if(","===b[e])l(!1),j="wait_param";else{if(!b[e].match(/\s/))return this._referencedError(a,"character","comma, equal sign or end",e);j="param_key_readed"}break;case"param_key_readed":if(b[e].match(/\s/));else if("="===b[e])j="wait_getter";else{if(","!==b[e])return this._referencedError(a,"character","comma, equal sign or end",e);l(!1),j="wait_param"}break;case"wait_getter":if(b[e].match(/\s/));else{if(!b[e].match(/[A-Za-z0-9_]/))return this._referencedError(a,"character","getter",e);j="read_getter",h=b[e]}break;case"read_getter":if(b[e].match(/[A-Za-z0-9_.]/))h+=b[e];else if(b[e].match(/\s/))j="getter_readed";else{if(","!==b[e])return this._referencedError(a,"character","comma or end",e);l(),j="wait_param"}break;case"getter_readed":if(b[e].match(/\s/));else{if(","!==b[e])return this._referencedError(a,"character","comma or end",e);l(),j="wait_param"}}switch(j){case"param_key_readed":case"read_param_key":l(!1);break;case"getter_readed":case"read_getter":l();break;case"wait_key":return this._referencedError(a,"end","key");case"wait_param":return this._referencedError(a,"end","parameter");case"wait_getter":return this._referencedError(a,"end","getter")}return String(this.instant(f,k,d))},TranslateService}();TranslateService=__decorate([core_1.Injectable(),__param(0,core_1.Inject(TranslateConfig_1.TranslateConfig)),__param(1,core_1.Inject(TranslateLoader_1.TranslateLoader)),__param(2,core_1.Inject(exports.TranslateLogHandler)),__metadata("design:paramtypes",[TranslateConfig_1.TranslateConfig,TranslateLoader_1.TranslateLoader,Object])],TranslateService),exports.TranslateService=TranslateService}),$__System.registerDynamic("15",["b","12","f","e","11","c","d","10"],!0,function(a,b,c){"use strict";var d=(this||self,b&&b.__decorate||function(a,b,c,d){var e,f=arguments.length,g=f<3?b:null===d?d=Object.getOwnPropertyDescriptor(b,c):d;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)g=Reflect.decorate(a,b,c,d);else for(var h=a.length-1;h>=0;h--)(e=a[h])&&(g=(f<3?e(g):f>3?e(b,c,g):e(b,c))||g);return f>3&&g&&Object.defineProperty(b,c,g),g});Object.defineProperty(b,"__esModule",{value:!0});var e=a("b"),f=a("12"),g=a("f"),h=a("e"),i=a("11"),j=a("c"),k=a("d"),l=a("10"),m=function(){function a(){}return a}();m=d([k.NgModule({declarations:[i.TranslatePipe,e.TranslateComponent],exports:[i.TranslatePipe,e.TranslateComponent],imports:[l.HttpModule],providers:[{provide:f.TranslateConfig,useValue:new f.TranslateConfig({})},{provide:h.TranslateLoaderJsonConfig,useValue:new h.TranslateLoaderJsonConfig},{provide:g.TranslateLoader,useClass:h.TranslateLoaderJson},{provide:j.TranslateLogHandler,useValue:j.TranslateLogHandler},j.TranslateService]})],m),b.TranslatorModule=m,b.TRANSLATE_PROVIDERS=[{provide:f.TranslateConfig,useValue:new f.TranslateConfig({})},{provide:h.TranslateLoaderJsonConfig,useValue:new h.TranslateLoaderJsonConfig},{provide:g.TranslateLoader,useClass:h.TranslateLoaderJson},{provide:j.TranslateLogHandler,useValue:j.TranslateLogHandler},j.TranslateService]}),$__System.registerDynamic("a",["c","11","b","12","f","e","15"],!0,function(a,b,c){"use strict";function d(a){for(var c in a)b.hasOwnProperty(c)||(b[c]=a[c])}this||self;Object.defineProperty(b,"__esModule",{value:!0}),d(a("c")),d(a("11")),d(a("b")),d(a("12")),d(a("f")),d(a("e")),d(a("15"))})})(function(a){if("function"==typeof define&&define.amd)define(["@angular/core","@angular/http","rxjs/Observable","rxjs/add/operator/share"],a);else{if("object"!=typeof module||!module.exports||"function"!=typeof require)throw new Error("Module must be loaded as AMD or CommonJS");module.exports=a(require("@angular/core"),require("@angular/http"),require("rxjs/Observable"),require("rxjs/add/operator/share"))}}); //# sourceMappingURL=angular2-translator.js.map \ No newline at end of file diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..debd143 --- /dev/null +++ b/index.ts @@ -0,0 +1,7 @@ +export * from "./src/TranslateService"; +export * from "./src/TranslatePipe"; +export * from "./src/TranslateComponent"; +export * from "./src/TranslateConfig"; +export * from "./src/TranslateLoader"; +export * from "./src/TranslateLoaderJson"; +export * from "./src/TranslatorModule"; diff --git a/karma.conf.js b/karma.conf.js index 61374cc..12138ed 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -29,8 +29,8 @@ module.exports = function (config) { {pattern: 'node_modules/@angular/**/*.js', included: false, watched: false}, // sources - { pattern: 'angular2-translator.js', included: false, watched: true}, - { pattern: 'angular2-translator/**/*.js', included: false, watched: true}, + { pattern: 'index.js', included: false, watched: false}, + { pattern: 'src/**/*.js', included: false, watched: true}, // helper { pattern: 'tests/helper/**/*.js', included: false, watched: true}, @@ -47,8 +47,7 @@ module.exports = function (config) { ], preprocessors: { - 'angular2-translator.js': 'coverage', - 'angular2-translator/**/*.js': 'coverage' + 'src/**/*.js': 'coverage' }, reporters: [ diff --git a/package.json b/package.json index 39660f2..9e79e29 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "angular2-translator", - "version": "1.3.4", + "version": "1.4.0-beta1", "description": "A translate-service, translate-pipe and translate-component for angular2", "repository": { "type": "git", @@ -37,9 +37,9 @@ "url": "https://github.com/tflori/angular2-translator/issues" }, "typescript": { - "main": "./angular2-translator.ts" + "main": "./index.ts" }, - "typings": "./angular2-translator.d.ts", + "typings": "./index.d.ts", "homepage": "https://github.com/tflori/angular2-translator", "peerDependencies": { "@angular/common": "2.*", diff --git a/angular2-translator/TranslateComponent.ts b/src/TranslateComponent.ts similarity index 100% rename from angular2-translator/TranslateComponent.ts rename to src/TranslateComponent.ts diff --git a/angular2-translator/TranslateConfig.ts b/src/TranslateConfig.ts similarity index 100% rename from angular2-translator/TranslateConfig.ts rename to src/TranslateConfig.ts diff --git a/angular2-translator/TranslateLoader.ts b/src/TranslateLoader.ts similarity index 100% rename from angular2-translator/TranslateLoader.ts rename to src/TranslateLoader.ts diff --git a/angular2-translator/TranslateLoaderJson.ts b/src/TranslateLoaderJson.ts similarity index 98% rename from angular2-translator/TranslateLoaderJson.ts rename to src/TranslateLoaderJson.ts index 7f7cdbf..230fede 100644 --- a/angular2-translator/TranslateLoaderJson.ts +++ b/src/TranslateLoaderJson.ts @@ -3,7 +3,7 @@ import {Inject, Injectable} from "@angular/core"; import {Http} from "@angular/http"; export class TranslateLoaderJsonConfig { - public path: string = "i18n/"; + public path: string = "assets/i18n/"; public extension: string = ".json"; // @todo maybe we will change it to a destructed parameter like we did for TranslateConfig diff --git a/angular2-translator/TranslatePipe.ts b/src/TranslatePipe.ts similarity index 100% rename from angular2-translator/TranslatePipe.ts rename to src/TranslatePipe.ts diff --git a/angular2-translator/TranslateService.ts b/src/TranslateService.ts similarity index 100% rename from angular2-translator/TranslateService.ts rename to src/TranslateService.ts diff --git a/angular2-translator.ts b/src/TranslatorModule.ts similarity index 72% rename from angular2-translator.ts rename to src/TranslatorModule.ts index e8fc1fb..a9e0249 100644 --- a/angular2-translator.ts +++ b/src/TranslatorModule.ts @@ -1,20 +1,13 @@ -import {TranslateComponent} from "./angular2-translator/TranslateComponent"; -import {TranslateConfig} from "./angular2-translator/TranslateConfig"; -import {TranslateLoader} from "./angular2-translator/TranslateLoader"; -import {TranslateLoaderJson, TranslateLoaderJsonConfig} from "./angular2-translator/TranslateLoaderJson"; -import {TranslatePipe} from "./angular2-translator/TranslatePipe"; -import {TranslateLogHandler, TranslateService} from "./angular2-translator/TranslateService"; +import {TranslateComponent} from "./TranslateComponent"; +import {TranslateConfig} from "./TranslateConfig"; +import {TranslateLoader} from "./TranslateLoader"; +import {TranslateLoaderJson, TranslateLoaderJsonConfig} from "./TranslateLoaderJson"; +import {TranslatePipe} from "./TranslatePipe"; +import {TranslateLogHandler, TranslateService} from "./TranslateService"; import {NgModule} from "@angular/core"; import {HttpModule} from "@angular/http"; -export * from "./angular2-translator/TranslateService"; -export * from "./angular2-translator/TranslatePipe"; -export * from "./angular2-translator/TranslateComponent"; -export * from "./angular2-translator/TranslateConfig"; -export * from "./angular2-translator/TranslateLoader"; -export * from "./angular2-translator/TranslateLoaderJson"; - @NgModule({ declarations: [ TranslatePipe, diff --git a/tests/TranslateComponent.spec.ts b/tests/TranslateComponent.spec.ts index 248049e..b66fa86 100644 --- a/tests/TranslateComponent.spec.ts +++ b/tests/TranslateComponent.spec.ts @@ -5,7 +5,7 @@ import { TranslateLoader, TranslateLogHandler, TranslateService, -} from "../angular2-translator"; +} from "../index"; import {JasmineHelper} from "./helper/JasmineHelper"; import {TranslateLoaderMock} from "./helper/TranslateLoaderMock"; diff --git a/tests/TranslateConfig.spec.ts b/tests/TranslateConfig.spec.ts index 6da8449..41a39f2 100644 --- a/tests/TranslateConfig.spec.ts +++ b/tests/TranslateConfig.spec.ts @@ -1,4 +1,4 @@ -import {TranslateConfig} from "../angular2-translator/TranslateConfig"; +import {TranslateConfig} from "../index"; describe("TranslateConfig", function() { it("is defined", function() { diff --git a/tests/TranslateLoader.spec.ts b/tests/TranslateLoader.spec.ts index 1820bec..990d63c 100644 --- a/tests/TranslateLoader.spec.ts +++ b/tests/TranslateLoader.spec.ts @@ -1,4 +1,4 @@ -import {TranslateLoader} from "../angular2-translator/TranslateLoader"; +import {TranslateLoader} from "../index"; describe("TranslateLoader", function() { it("is defined", function() { diff --git a/tests/TranslateLoaderJson.spec.ts b/tests/TranslateLoaderJson.spec.ts index 167f3df..8741683 100644 --- a/tests/TranslateLoaderJson.spec.ts +++ b/tests/TranslateLoaderJson.spec.ts @@ -1,7 +1,7 @@ import { TranslateLoaderJson, TranslateLoaderJsonConfig, -} from "../angular2-translator"; +} from "../index"; import {JasmineHelper} from "./helper/JasmineHelper"; import {PromiseMatcher} from "./helper/promise-matcher"; diff --git a/tests/TranslatePipe.spec.ts b/tests/TranslatePipe.spec.ts index 061c288..26b97b8 100644 --- a/tests/TranslatePipe.spec.ts +++ b/tests/TranslatePipe.spec.ts @@ -5,7 +5,7 @@ import { TranslateLogHandler, TranslatePipe, TranslateService, -} from "../angular2-translator"; +} from "../index"; import {JasmineHelper} from "./helper/JasmineHelper"; import {TranslateLoaderMock} from "./helper/TranslateLoaderMock"; diff --git a/tests/TranslateService.spec.ts b/tests/TranslateService.spec.ts index ca202c2..dc93bfb 100644 --- a/tests/TranslateService.spec.ts +++ b/tests/TranslateService.spec.ts @@ -4,7 +4,7 @@ import { TranslateLogHandler, TranslateService, TranslatorModule, -} from "../angular2-translator"; +} from "../index"; import {JasmineHelper} from "./helper/JasmineHelper"; import {JasminePromise, PromiseMatcher} from "./helper/promise-matcher"; diff --git a/tests/helper/TranslateLoaderMock.ts b/tests/helper/TranslateLoaderMock.ts index 86ac18f..fe2bed5 100644 --- a/tests/helper/TranslateLoaderMock.ts +++ b/tests/helper/TranslateLoaderMock.ts @@ -1,4 +1,4 @@ -import {TranslateLoader} from "../../angular2-translator/TranslateLoader"; +import {TranslateLoader} from "../../src/TranslateLoader"; export class TranslateLoaderMock extends TranslateLoader { private _provided: Object = {}; From cb90c863cc711f97baee3bc092550a15627d5dc6 Mon Sep 17 00:00:00 2001 From: Thomas Flori Date: Sun, 19 Mar 2017 08:44:30 +0100 Subject: [PATCH 2/3] fix tests after changing default path for language files --- tests/TranslateLoaderJson.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/TranslateLoaderJson.spec.ts b/tests/TranslateLoaderJson.spec.ts index 8741683..ffc3cc4 100644 --- a/tests/TranslateLoaderJson.spec.ts +++ b/tests/TranslateLoaderJson.spec.ts @@ -27,7 +27,7 @@ describe("TranslateLoaderJsonConfig", function () { it("defines default path and extension", function () { let config = new TranslateLoaderJsonConfig(); - expect(config.path).toBe("i18n/"); + expect(config.path).toBe("assets/i18n/"); expect(config.extension).toBe(".json"); }); @@ -101,7 +101,7 @@ describe("TranslateLoaderJson", function () { expect(backend.createConnection).toHaveBeenCalled(); let request = JasmineHelper.calls(backend.createConnection).mostRecent().args[0]; - expect(request.url).toBe("i18n/en.json"); + expect(request.url).toBe("assets/i18n/en.json"); expect(request.method).toBe(RequestMethod.Get); }); From fb033e22bf3e1270bfc6eb2b387127dd47d1e81f Mon Sep 17 00:00:00 2001 From: Thomas Flori Date: Sun, 19 Mar 2017 13:23:18 +0100 Subject: [PATCH 3/3] update the docs according to changes for angular cli --- README.md | 42 +++++++++++++------ docs/TranslateConfig.md | 33 ++++++++++----- docs/TranslateLoader.md | 40 ++++++++++++------ docs/TranslateLoaderJson.md | 31 +++++++++++--- docs/TranslateLogHandler.md | 35 +++++++++++++++- docs/index.md | 81 ++++++++++++++++++++++++------------- src/TranslateConfig.ts | 13 +++--- 7 files changed, 200 insertions(+), 75 deletions(-) diff --git a/README.md b/README.md index 86884e7..1d3d22e 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ It supports interpolation so you can: ### Refer to other translations By referring to other translations you can make it easy to have everywhere the same text without copy and paste. + ```json { "GREETING": "Hello {{name}}!", @@ -54,6 +55,7 @@ translations (to make the files readable and better structured). ## How to use Simple basic usage: + ```ts import {Component} from "angular2/core"; import {TranslateService, TranslatePipe, TranslateComponent} from "angular2-translator"; @@ -70,6 +72,7 @@ export class AppComponent { } } ``` + To learn more have a look at [the documentation](https://tflori.github.io/angular2-translator/). ## How to install @@ -87,7 +90,7 @@ npm install --save angular2-translator You also can clone the repository and symlink the project folder or what ever: ```bash -git clone https://gitlab.w00tserver.org:617/tflori/angular2-translator +git clone https://github.com/tflori/angular2-translator.git ln -s angular2-translator MyApp/libs/angular2-translator ``` @@ -98,19 +101,34 @@ ln -s angular2-translator MyApp/libs/angular2-translator You have to set up your `NgModule` to import the `TranslatorModule` and may be configure it: ```ts -import {TranslateConfig, TranslatorModule} from "angular2-translator"; - -export function factoryTranslateConfig() { - return new TranslateConfig({}); -}; +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { TranslateConfig, TranslatorModule } from "angular2-translator"; + +import { AppComponent } from './app.component'; + +export function translateConfigFactory() { + return new TranslateConfig({ + defaultLang: "de", + providedLangs: [ "de", "en" ], + detectLanguageOnStart: false + }); +} @NgModule({ - imports: [ TranslatorModule ], - providers: [ - { provide: TranslateConfig, useFactory: factoryTranslateConfig } - ] + declarations: [ + AppComponent + ], + imports: [ + BrowserModule, + TranslatorModule, + ], + providers: [ + { provide: TranslateConfig, useFactory: translateConfigFactory}, + ], + bootstrap: [AppComponent] }) -export class AppModule {} +export class AppModule { } ``` ### Using SystemJs @@ -125,7 +143,7 @@ System.config({ }); ``` -Or you load the file directly: +Or load the file directly: ```html diff --git a/docs/TranslateConfig.md b/docs/TranslateConfig.md index d730448..bcd5071 100644 --- a/docs/TranslateConfig.md +++ b/docs/TranslateConfig.md @@ -22,7 +22,7 @@ new TranslateConfig({ | defaultLang | string | `'en'` | Defines the default language to be used if no language got set and language detection is disabled or does not detect a language. | | providedLangs | string[] | `['en']` | Defines a list of the languages that are supported from you. The provided languages has to match your file names. To make language detection work you should use the ISO format 639-1 (e.g. 'en') or the IETF language tag (e.g. 'de-AT'). You don't have to use "-" and don't have to care about case sensitive. A language 'en/us' will also match a browser language en-US and vise versa - but the file has to be *path*\*en/us\**extension* then. | | detectLanguageOnStart | string | `true` | Defines whether the language should be detected by navigator.language(s) when TranslateService got initialized or not. | -| navigatorLanguages | string[] | - | Holds an array of languages the browser accepts. Mostly it is exactly `navigator.languages` but for browsers that only define `navigator.language` it is `[navigator.language]`. If nothing is defined by the browser it is simply an empty array. | +| navigatorLanguages | string[] | - | Holds an array of languages the browser accepts. Mostly it is exactly `navigator.languages` but for browsers that does not define `navigator.languages` it is one of `navigator.language`, `navigator.browserLanguage` or `navigator.userLanguage`. | ## The Methods @@ -56,17 +56,32 @@ expect(translateConfig.langProvided('en-US')).toBe('EN/usa'); This example shows how you usually use the TranslateConfig class: ```ts -import {TranslateConfig, TranslatorModule} from "angular2-translator"; +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { TranslateConfig, TranslatorModule } from "angular2-translator"; -@NgModule({ - imports: [ TranslatorModule ], - providers: [ - { provide: TranslateConfig, useValue: new TranslateConfig({ +import { AppComponent } from './app.component'; + +export function translateConfigFactory() { + return new TranslateConfig({ defaultLang: "de", providedLangs: [ "de", "en" ], detectLanguageOnStart: false - })}, - ] + }); +} + +@NgModule({ + declarations: [ + AppComponent + ], + imports: [ + BrowserModule, + TranslatorModule, + ], + providers: [ + { provide: TranslateConfig, useFactory: translateConfigFactory}, + ], + bootstrap: [AppComponent] }) -export class AppModule {} +export class AppModule { } ``` diff --git a/docs/TranslateLoader.md b/docs/TranslateLoader.md index 92039b4..3d0c715 100644 --- a/docs/TranslateLoader.md +++ b/docs/TranslateLoader.md @@ -36,7 +36,7 @@ import {TranslateLoader} from "angular2-translator"; @Injectable() export class TranslateLoaderStatic extends TranslateLoader { - private translations:object = { + private translations:Object = { en: { "HELLO WORLD": "Hello World!" }, @@ -68,20 +68,34 @@ To use this loader in your application you have to provide it for your applicati bootstrap can look like: ```ts -import {TranslateConfig, TranslateLoader, TranslatorModule} from "angular2-translator"; +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { TranslateConfig, TranslateLoader, TranslatorModule } from "angular2-translator"; -import {TranslateLoaderStatic} from "./TranslateLoaderStatic"; +import { AppComponent } from './app.component'; +import { TranslateLoaderStatic } from "./TranslateLoaderStatic" + +export function translateConfigFactory() { + return new TranslateConfig({ + defaultLang: "ru", + providedLangs: [ "de", "en", "fr", "ru" ], + detectLanguageOnStart: false + }); +} @NgModule({ - imports: [ TranslatorModule ], - providers: [ - { provide: TranslateConfig, useValue: new TranslateConfig({ - defaultLang: "de", - providedLangs: [ "de", "en", "fr", "ru" ], - detectLanguageOnStart: false - })}, - { provide: TranslateLoader, useClass: TranslateLoaderStatic }, - ] + declarations: [ + AppComponent + ], + imports: [ + BrowserModule, + TranslatorModule, + ], + providers: [ + { provide: TranslateConfig, useFactory: translateConfigFactory }, + { provide: TranslateLoader, useClass: TranslateLoaderStatic }, + ], + bootstrap: [AppComponent] }) -export class AppModule {} +export class AppModule { } ``` diff --git a/docs/TranslateLoaderJson.md b/docs/TranslateLoaderJson.md index 441f4fa..9b295cf 100644 --- a/docs/TranslateLoaderJson.md +++ b/docs/TranslateLoaderJson.md @@ -71,7 +71,10 @@ class TranslateLoaderJsonConfig { } ``` -Default values are `path = 'i18n'` and `extension = '.json'` . +Default values are `path = 'assets/i18n'` and `extension = '.json'` . + +> **CAUTION:** the default values changed from version 1.4. Before the default path was `i18n` - so you either change +> this in your config or move the files. ### Example with customized path and extension: Directory structure: @@ -90,12 +93,28 @@ Directory structure: main.ts: ```ts -import {TranslateLoaderJsonConfig, TranslatorModule} from "angular2-translator"; +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { TranslateLoaderJsonConfig, TranslatorModule } from "angular2-translator"; + +import { AppComponent } from './app.component'; + +export function translateLoaderConfigFactory() { + return new TranslateLoaderJsonConfig('app/localization', '-lang.json') +} @NgModule({ - imports: [ TranslatorModule ], - providers: [ - { provide: TranslateLoaderJsonConfig, useValue: new TranslateLoaderJsonConfig('app/localization', '-lang.json') }, - ] + declarations: [ + AppComponent + ], + imports: [ + BrowserModule, + TranslatorModule, + ], + providers: [ + { provide: TranslateLoaderJsonConfig, useFactory: translateLoaderConfigFactory }, + ], + bootstrap: [AppComponent] }) +export class AppModule { } ``` diff --git a/docs/TranslateLogHandler.md b/docs/TranslateLogHandler.md index b39e09a..89bbd42 100644 --- a/docs/TranslateLogHandler.md +++ b/docs/TranslateLogHandler.md @@ -11,13 +11,46 @@ implements this interface uses console.error() to log errors. The other two func ## Declartion ```ts -interface TranslateLogHandler { +export interface ITranslateLogHandler { error(message:string):void; info(message:string):void; debug(message:string):void; } ``` +The default TranslateLogHandler is: + +```ts +export const TranslateLogHandler = { + debug: () => {}, + error: (message) => console && console.error && console.error(message), + info: () => {}, +}; +``` + +To overwrite this you can just write this in your app module: + ```ts +import {TranslateLogHandler, ITranslateLogHandler, TranslatorModule} from "angular2-translator"; + +export function translateLogFactory() { + return { + debug: () => {}, + error: (message) => console && console.error && console.error(message), + info: () => {}, + }; +} + +@NgModule({ + imports: [ TranslatorModule ], + providers: [ + { provide: TranslateLogHandler, useFactory: translateLogFactory}, + ] +}) +export class AppModule {} +``` + +> Unfortunately this leads to an error message for `ng serve` and `ng build`. Here is [the bug report](https://github.com/angular/angular/issues/15287). + ## Error messages Currently there are just 4 error messages: diff --git a/docs/index.md b/docs/index.md index 67e29dd..b1c2ba5 100644 --- a/docs/index.md +++ b/docs/index.md @@ -24,9 +24,9 @@ It supports interpolation so you can: - calculate in your translations `"ANSWER":"The answer is {{7*6}}"` - pluralize in your translations - `"MESSAGES":"You have {{count}} new message{{count != 1 ? 's' : ''}}` + `"MESSAGES":"You have {{count}} new message{{count != 1 ? 's' : ''}}"` - execute functions in your translations - `"LAST_LOGIN":"Your last login was on {{lastLogin.format('MM/DD/YYYY')}}` + `"LAST_LOGIN":"Your last login was on {{lastLogin.format('MM/DD/YYYY')}}"` {% endraw %} ### Refer to other translations @@ -75,54 +75,77 @@ export class AppComponent { ## How to install ### Via npm + First you need to install the package. The easiest way is to install it via npm: ```bash npm install --save angular2-translator ``` -Then you need to tell systemjs where to load angular2-translator: +### Manually -```js -System.config({ - map: { - 'angular2-translator': 'npm:angular2-translator/bundles/angular2-translator.js' - } -}); -``` - -Or you load the file directly: +You also can clone the repository and symlink the project folder or what ever: -```html - +```bash +git clone https://github.com/tflori/angular2-translator.git +ln -s angular2-translator MyApp/libs/angular2-translator ``` -Now you have to set up your NgModule to use the `TranslatorModule` and may be configure it: +> You should know what you do and don't follow this guide for installation. + +## How to use + +You have to set up your `NgModule` to import the `TranslatorModule` and may be configure it: ```ts -import {TranslateConfig, TranslatorModule} from "angular2-translator"; +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { TranslateConfig, TranslatorModule } from "angular2-translator"; -@NgModule({ - imports: [ TranslatorModule ], - providers: [ - { provide: TranslateConfig, useValue: new TranslateConfig({ +import { AppComponent } from './app.component'; + +export function translateConfigFactory() { + return new TranslateConfig({ defaultLang: "de", providedLangs: [ "de", "en" ], - })}, - ] + detectLanguageOnStart: false + }); +} + +@NgModule({ + declarations: [ + AppComponent + ], + imports: [ + BrowserModule, + TranslatorModule, + ], + providers: [ + { provide: TranslateConfig, useFactory: translateConfigFactory}, + ], + bootstrap: [AppComponent] }) -export class AppModule {} +export class AppModule { } ``` -### Manually -You also can clone the repository and symlink the project folder or what ever: +### Using SystemJs -```bash -git clone https://gitlab.w00tserver.org:617/tflori/angular2-translator -ln -s angular2-translator MyApp/libs/angular2-translator +When you are using SystemJs you need to configure where to load angular2-translator: + +```js +System.config({ + map: { + 'angular2-translator': 'npm:angular2-translator/bundles/angular2-translator.js' + } +}); +``` + +Or load the file directly: + +```html + ``` -> You should know what you do and don't follow this guide for installation. ## The Classes diff --git a/src/TranslateConfig.ts b/src/TranslateConfig.ts index adc29e0..0a22a2f 100644 --- a/src/TranslateConfig.ts +++ b/src/TranslateConfig.ts @@ -23,12 +23,15 @@ export class TranslateConfig { if (navigator.languages instanceof Array) { return Array.prototype.slice.call(navigator.languages); - } else if (typeof navigator.languages === "string") { - return [String(navigator.languages)]; - } else if (typeof navigator.language === "string") { - return [navigator.language]; } else { - return []; + return [ + navigator.languages || + navigator.language || + navigator.browserLanguage || + navigator.userLanguage, + ].filter((v) => { + return typeof v === "string"; + }); } })(); }