diff --git a/package.json b/package.json index a9989b0e5..fe07e6e69 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "build": "ionic-app-scripts build", "lint": "ionic-app-scripts lint", "ionic:build": "ionic-app-scripts build", - "ionic:serve": "ionic-app-scripts serve" + "ionic:serve": "ionic-app-scripts serve", + "extract": "ngx-translate-extract --input ./src --output ./src/assets/i18n/app.pot --clean --sort --format pot" }, "dependencies": { "@angular/common": "4.1.3", @@ -20,16 +21,18 @@ "@angular/platform-browser": "4.1.3", "@angular/platform-browser-dynamic": "4.1.3", "@angular/tsc-wrapped": "^4.3.2", + "@biesbjerg/ngx-translate-po-http-loader": "^1.0.1", "@ionic-native/core": "3.12.1", "@ionic-native/splash-screen": "3.12.1", "@ionic-native/status-bar": "3.12.1", "@ionic/storage": "2.0.1", - "@nsalaun/ng-logger": "^2.0.1", "autoprefixer": "^7.1.2", - "ionic-angular": "3.5.3", + "@ngx-translate/core": "^6.0.1", + "@nsalaun/ng-logger": "2.0.1", + "ajv": "^5.2.2", + "ionic-angular": "3.6.0", "ionicons": "3.0.0", - "lodash": "^4.17.4", - "pre-commit": "^1.2.2", + "lodash": "4.17.4", "rxjs": "5.4.0", "sw-toolbox": "3.6.0", "zone.js": "0.8.12" @@ -46,7 +49,9 @@ "@types/lodash": "^4.14.71", "@types/node": "^8.0.19", "codecov": "^2.2.0", + "@biesbjerg/ngx-translate-extract": "^2.3.2", "ionic": "3.6.0", + "pre-commit": "^1.2.2", "jasmine-core": "^2.6.4", "jasmine-spec-reporter": "^4.1.1", "karma": "^1.7.0", diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 93b7bd2b3..d8317a01e 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -5,6 +5,7 @@ import { SplashScreen } from '@ionic-native/splash-screen'; import { Logger } from '@nsalaun/ng-logger'; import { AppProvider } from '../providers/app/app'; +import { TranslateService } from '@ngx-translate/core'; import { TabsPage } from '../pages/tabs/tabs'; @@ -19,7 +20,8 @@ export class Copay { statusBar: StatusBar, splashScreen: SplashScreen, log: Logger, - app: AppProvider + app: AppProvider, + translate: TranslateService ) { platform.ready().then(() => { app.getName().subscribe((name) => { @@ -37,6 +39,9 @@ export class Copay { statusBar.styleDefault(); splashScreen.hide(); } + + translate.setDefaultLang('en'); + translate.use(platform.lang()); }); } } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 266733251..a3f3bdfb3 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,8 +1,10 @@ -import { NgModule, ErrorHandler, isDevMode } from '@angular/core'; +import { NgModule, ErrorHandler } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; -import { HttpModule } from '@angular/http'; +import { HttpModule, Http } from '@angular/http'; import { NgLoggerModule, Level } from '@nsalaun/ng-logger'; +import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; +import { TranslatePoHttpLoader } from '@biesbjerg/ngx-translate-po-http-loader'; import { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular'; import { Copay } from './app.component'; @@ -24,10 +26,8 @@ import { StorageProvider } from '../providers/storage/storage'; import { AppProvider } from '../providers/app/app'; import { PlatformProvider } from '../providers/platform/platform'; -// Set different log level depending on environment. -const LOG_LEVEL = Level.LOG; -if (isDevMode()) { - const LOG_LEVEL = Level.ERROR; +export function createTranslateLoader(http: Http) { + return new TranslatePoHttpLoader(http, './assets/i18n/', '.po'); } @NgModule({ @@ -44,7 +44,14 @@ if (isDevMode()) { imports: [ BrowserModule, HttpModule, - NgLoggerModule.forRoot(LOG_LEVEL), + NgLoggerModule.forRoot(Level.LOG), + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: (createTranslateLoader), + deps: [Http] + } + }), IonicModule.forRoot(Copay) ], bootstrap: [IonicApp], diff --git a/src/assets/i18n/app.pot b/src/assets/i18n/app.pot new file mode 100644 index 000000000..9dbbab552 --- /dev/null +++ b/src/assets/i18n/app.pot @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Home" +msgstr "" + +msgid "Receive" +msgstr "" + +msgid "Send" +msgstr "" + +msgid "Setting" +msgstr "" \ No newline at end of file diff --git a/src/assets/i18n/en.mo b/src/assets/i18n/en.mo new file mode 100644 index 000000000..52852c9d5 Binary files /dev/null and b/src/assets/i18n/en.mo differ diff --git a/src/assets/i18n/en.po b/src/assets/i18n/en.po new file mode 100644 index 000000000..c3f8d9ac0 --- /dev/null +++ b/src/assets/i18n/en.po @@ -0,0 +1,25 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Language-Team: \n" +"X-Generator: Poedit 2.0.3\n" +"Last-Translator: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: en\n" + +msgid "Home" +msgstr "Home" + +msgid "Receive" +msgstr "Receive" + +msgid "Send" +msgstr "Send" + +msgid "Setting" +msgstr "Setting" diff --git a/src/assets/i18n/es.mo b/src/assets/i18n/es.mo new file mode 100644 index 000000000..944da2672 Binary files /dev/null and b/src/assets/i18n/es.mo differ diff --git a/src/assets/i18n/es.po b/src/assets/i18n/es.po new file mode 100644 index 000000000..ac6acb48a --- /dev/null +++ b/src/assets/i18n/es.po @@ -0,0 +1,25 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Language-Team: \n" +"X-Generator: Poedit 2.0.3\n" +"Last-Translator: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: es\n" + +msgid "Home" +msgstr "Inicio" + +msgid "Receive" +msgstr "Recibir" + +msgid "Send" +msgstr "Enviar" + +msgid "Setting" +msgstr "ConfiguraciĆ³n" diff --git a/src/pages/setting/setting.html b/src/pages/setting/setting.html index f1cc276a7..d48c36de9 100644 --- a/src/pages/setting/setting.html +++ b/src/pages/setting/setting.html @@ -20,6 +20,16 @@ Notification + + + + Language + + + English + Spanish + +   diff --git a/src/pages/setting/setting.ts b/src/pages/setting/setting.ts index d05aa2608..223add837 100644 --- a/src/pages/setting/setting.ts +++ b/src/pages/setting/setting.ts @@ -2,6 +2,7 @@ import { Component } from '@angular/core'; import { NavController, NavParams } from 'ionic-angular'; import { AppProvider } from '../../providers/app/app'; +import { TranslateService } from '@ngx-translate/core'; import { AboutPage } from '../about/about'; @@ -10,15 +11,18 @@ import { AboutPage } from '../about/about'; templateUrl: 'setting.html', }) export class SettingPage { + language: string; appName: string; constructor( public navCtrl: NavController, public navParams: NavParams, - public app: AppProvider + public app: AppProvider, + public i18n: TranslateService, ) { app.getName().subscribe((data) => { this.appName = data; + this.language = i18n.currentLang; }); } diff --git a/src/pages/tabs/tabs.html b/src/pages/tabs/tabs.html index a682cef33..7d7e56024 100644 --- a/src/pages/tabs/tabs.html +++ b/src/pages/tabs/tabs.html @@ -1,6 +1,6 @@ - - - - + + + +