diff --git a/package.json b/package.json index 89f6eef5ad..5314784c33 100644 --- a/package.json +++ b/package.json @@ -53,13 +53,14 @@ "js.clone": "0.0.3", "methods": "~1.1.2", "morgan": "^1.7.0", + "ng2-translate": "~4.0.1", "preboot": "~4.5.2", "rxjs": "5.0.0-beta.12", - "webfontloader": "^1.6.26", + "webfontloader": "^1.6.27", "zone.js": "~0.6.26" }, "devDependencies": { - "@ngtools/webpack": "~1.1.7", + "@ngtools/webpack": "1.1.7", "@types/body-parser": "0.0.33", "@types/compression": "0.0.33", "@types/cookie-parser": "^1.3.30", @@ -84,14 +85,14 @@ "json-loader": "^0.5.4", "memory-cache": "^0.1.6", "node-sass": "^3.13.0", - "nodemon": "^1.10.0", + "nodemon": "^1.11.0", "raw-loader": "^0.5.1", "reflect-metadata": "0.1.8", "rimraf": "^2.5.4", "sass-loader": "^4.0.2", "string-replace-loader": "^1.0.5", "ts-helpers": "^1.1.2", - "ts-node": "^1.3.0", + "ts-node": "^1.7.0", "tslint": "4.0.2", "tslint-loader": "3.2.1", "typescript": "2.0.10", diff --git a/resources/i18n/en.json b/resources/i18n/en.json new file mode 100644 index 0000000000..26237a935d --- /dev/null +++ b/resources/i18n/en.json @@ -0,0 +1,13 @@ +{ + "title": "DSpace Universal", + + "nav": { + "home": "Home" + }, + + "example": { + "with": { + "data": "{{greeting}}, {{recipient}}!" + } + } +} diff --git a/src/app/app.component.html b/src/app/app.component.html index a7d039d11d..a83351f943 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,9 +1,11 @@ -

DSpace

+

{{ 'title' | translate }}

+

{{ 'example.with.data' | translate:data }}

+

{{ example }}

diff --git a/src/app/app.component.ts b/src/app/app.component.ts index f73ec3d908..39f73ee36b 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,4 +1,6 @@ -import { Component, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core'; +import { Component, ChangeDetectionStrategy, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; + +import { TranslateService } from 'ng2-translate'; @Component({ changeDetection: ChangeDetectionStrategy.Default, @@ -7,5 +9,34 @@ import { Component, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/ templateUrl: './app.component.html', styleUrls: ['./app.component.scss'] }) -export class AppComponent { +export class AppComponent implements OnDestroy, OnInit { + + example: string; + + data: any = { + greeting: 'Hello', + recipient: 'World' + } + + private registerSubscription: any; + + constructor(public translate: TranslateService) { + // this language will be used as a fallback when a translation isn't found in the current language + translate.setDefaultLang('en'); + // the lang to use, if the lang isn't available, it will use the current loader to get them + translate.use('en'); + } + + ngOnInit() { + this.registerSubscription = this.translate.get('example.with.data', { greeting: 'Hello', recipient: 'DSpace' }).subscribe((translation: string) => { + this.example = translation; + }); + } + + ngOnDestroy() { + if (this.registerSubscription) { + this.registerSubscription.unsubscribe(); + } + } + } diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 86c72cdbba..0f8b5e5625 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -2,6 +2,9 @@ import { NgModule, ModuleWithProviders } from '@angular/core'; import { CommonModule } from '@angular/common'; import { RouterModule } from '@angular/router'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; + +import { TranslateModule } from 'ng2-translate/ng2-translate'; + import { ApiService } from './api.service'; import { ModelService } from './model/model.service'; @@ -9,6 +12,7 @@ const MODULES = [ // Do NOT include UniversalModule, HttpModule, or JsonpModule here CommonModule, RouterModule, + TranslateModule, FormsModule, ReactiveFormsModule ]; diff --git a/src/browser.module.ts b/src/browser.module.ts index 9a14476548..e6475cc118 100755 --- a/src/browser.module.ts +++ b/src/browser.module.ts @@ -1,9 +1,12 @@ import { NgModule } from '@angular/core'; +import { Http } from '@angular/http'; import { FormsModule } from '@angular/forms'; import { RouterModule } from '@angular/router'; import { UniversalModule, isBrowser, isNode, AUTO_PREBOOT } from 'angular2-universal/browser'; // for AoT we need to manually split universal packages import { IdlePreload, IdlePreloadModule } from '@angularclass/idle-preload'; +import { TranslateLoader, TranslateModule, TranslateStaticLoader } from 'ng2-translate'; + import { AppModule, AppComponent } from './app/app.module'; import { SharedModule } from './app/shared/shared.module'; import { CacheService } from './app/shared/cache.service'; @@ -14,6 +17,10 @@ import { Meta } from './angular2-meta'; // import * as LRU from 'modern-lru'; +export function createTranslateLoader(http: Http) { + return new TranslateStaticLoader(http, './assets/i18n', '.json'); +} + export function getLRU(lru?: any) { // use LRU for node // return lru || new LRU(10); @@ -35,7 +42,12 @@ export const UNIVERSAL_KEY = 'UNIVERSAL_CACHE'; @NgModule({ bootstrap: [AppComponent], imports: [ - // MaterialModule.forRoot() should be included first + TranslateModule.forRoot({ + provide: TranslateLoader, + useFactory: (createTranslateLoader), + deps: [Http] + }), + UniversalModule, // BrowserModule, HttpModule, and JsonpModule are included FormsModule, diff --git a/src/node.module.ts b/src/node.module.ts index 49ce6b3d3b..5395e54750 100755 --- a/src/node.module.ts +++ b/src/node.module.ts @@ -1,8 +1,11 @@ import { NgModule } from '@angular/core'; +import { Http } from '@angular/http'; import { FormsModule } from '@angular/forms'; import { RouterModule } from '@angular/router'; import { UniversalModule, isBrowser, isNode } from 'angular2-universal/node'; // for AoT we need to manually split universal packages +import { TranslateLoader, TranslateModule, TranslateStaticLoader } from 'ng2-translate'; + import { AppModule, AppComponent } from './app/app.module'; import { SharedModule } from './app/shared/shared.module'; import { CacheService } from './app/shared/cache.service'; @@ -11,6 +14,10 @@ import { CacheService } from './app/shared/cache.service'; // see https://github.com/angular/angular/pull/12322 import { Meta } from './angular2-meta'; +export function createTranslateLoader(http: Http) { + return new TranslateStaticLoader(http, './assets/i18n', '.json'); +} + export function getLRU() { return new Map(); } @@ -27,7 +34,12 @@ export const UNIVERSAL_KEY = 'UNIVERSAL_CACHE'; @NgModule({ bootstrap: [AppComponent], imports: [ - // MaterialModule.forRoot() should be included first + TranslateModule.forRoot({ + provide: TranslateLoader, + useFactory: (createTranslateLoader), + deps: [Http] + }), + UniversalModule, // BrowserModule, HttpModule, and JsonpModule are included FormsModule, diff --git a/webpack.config.ts b/webpack.config.ts index a6249585c2..63fae60aa4 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -2,6 +2,7 @@ var webpack = require('webpack'); var path = require('path'); var clone = require('js.clone'); var webpackMerge = require('webpack-merge'); +let CopyWebpackPlugin = require('copy-webpack-plugin'); export var commonPlugins = [ new webpack.ContextReplacementPlugin( @@ -13,6 +14,11 @@ export var commonPlugins = [ } ), + new CopyWebpackPlugin([{ + from: path.join(__dirname, 'resources', 'i18n'), + to: path.join('assets', 'i18n') + }]), + // Loader options new webpack.LoaderOptionsPlugin({ options: {