ionic2 ng2-translate 在模式下不工作
ionic2 ng2-translate not working in modal
我在将 ng2-translate 与 ionic2 中的模态结合使用时遇到问题。正常页面中的翻译正常。
这是我的app.module.ts文件:
import ...
@NgModule({
declarations: [
MyApp,
//...
],
imports: [
TranslateModule.forRoot({
provide: TranslateLoader,
useFactory: (createTranslateLoader),
deps: [Http]
}),
IonicModule.forRoot(MyApp),
],
exports: [
TranslateModule
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
//...
],
providers: [Storage, {provide: ErrorHandler, useClass: IonicErrorHandler}]
})
export class AppModule {}
export function createTranslateLoader(http: Http) {
return new TranslateStaticLoader(http, 'assets/i18n', '.json');
}
例如,在我的 仪表板 中,我可以使用以下 HTML-代码并获得正确的翻译:
<h2>{{'general.tasks' | translate}}</h2>
但是当我现在通过以下代码使用 ionic-angular 中的 ModalController 打开一个新模式时:
let taskModal = this.modalCtrl.create(TaskCancelPage, {'task': task});
taskModal.onDidDismiss(data => {
console.log(data);
});
taskModal.present();
在那个新的 TaskCancelPage 中有相同的 HTML 代码
<h2>{{'general.tasks' | translate}}</h2>
但这里我只得到general.tasks而不是翻译后的值。
这对我有用,这是我所做的:
在[项目]/src//app.module.ts:
import { TranslateModule, TranslateStaticLoader, TranslateLoader } from 'ng2-translate/ng2-translate';
export function createTranslateLoader(http: Http) {
return new TranslateStaticLoader(http, './assets/i18n', '.json');
}
import { TranslationService } from '../services/translation/translation';
//custom pipe
import { CapitalizePipe } from '../custom-pipes/capitalize/capitalize';
@NgModule({
declarations: [
...,
CapitalizePipe,
....
],
imports: [
IonicModule.forRoot(MyApp),
TranslateModule.forRoot({provide: TranslateLoader,
useFactory: (createTranslateLoader),
deps: [Http]})
],
bootstrap: [IonicApp],
entryComponents: [
...
],
providers: [
TranslationService,
....
]
})
在[项目]/src/app/app.component.ts
...
import { TranslationService } from '../services/translation/translation';
import { CapitalizePipe } from '../custom-pipes/capitalize/capitalize';
@Component({
templateUrl: 'app.html',
})
export class MyApp {
....
constructor(
...,
public translationService: TranslationService, ...
) {}
....
ngOnInit() {
return this.defineLang().then(
(event) => {
console.log(MyApp.CLASS_TAG + " this.defineLang() fired: ",event , " getLangs is " , this.translationService.getLangs());
this.[yourFunctionToDefineRootPage]();
}
);
}
...
private defineLang(): Promise<any> {
let appDfltLang = 'fr';
this.translationService.getBestLanguageAccordingToBrowserAvailability(appDfltLang);
let promise = this.translationService.langSettingOnInit();
return promise;
}
....
}
在[项目]/src/custom-pipe/capitalize/capitalize.ts:
import { PipeTransform, Pipe } from '@angular/core';
@Pipe({name:'capitalize'})
export class CapitalizePipe implements PipeTransform {
transform(value?: any,args?: any): any{
return (!!value)?value.charAt(0).toUpperCase()+value.substr(1):value;
}
}
在[项目]/src/services/translation/translation.ts
import { Injectable } from '@angular/core';
import { LangChangeEvent, TranslateService } from 'ng2-translate/ng2-translate';
import { Observable } from 'rxjs/Observable';
import { CapitalizePipe } from '../../custom-pipes/capitalize/capitalize';
@Injectable()
export class TranslationService {
private static readonly CLASS_TAG = "TranslationService";
private availableLang: Array<string> = ["fr","en","nl"];
private defaultLanguage:string = "en";
constructor(
private translateService: TranslateService
) { }
setDefaultLang(lang: string) {
return this.translateService.setDefaultLang(lang);
}
use(lang: string): Observable<any> {
let brLgSubStr:string = this.getBrowserLang().substr(0,2);
let findLg:number = this.availableLang.indexOf(brLgSubStr);
if(findLg==-1){
lang = this.defaultLanguage;
}
return this.translateService.use(lang);
}
getCurrentLang(): string {
return this.translateService.currentLang;
}
getDefaultLang(): string {
return this.translateService.getDefaultLang();
}
getBestLanguageAccordingToBrowserAvailability(appDfltLang:string) {
console.log(TranslationService.CLASS_TAG + "getBestLanguageAccordingToBrowserAvailability() starts ");
let brLang = this.getBrowserLang().substr(0,2);
let brLangAmongPossibilities:boolean = false;
for(let i in this.availableLang){
if(this.availableLang[i]==brLang){
brLangAmongPossibilities=true;
}
}
if(brLangAmongPossibilities){
this.translateService.use(brLang);
} else {
this.translateService.use(appDfltLang);
}
this.translateService.setDefaultLang(appDfltLang);
}
getBrowserLang():string {
return this.translateService.getBrowserLang();
}
getLangs():Array<string> {
return this.translateService.getLangs();
}
getAvailableLangs():Array<string>{
return this.availableLang;
}
langSettingOnInit(): Promise<LangChangeEvent> {
return new Promise((resolve, reject) => {
this.translateService.onLangChange.subscribe(
(event) => {
resolve(event);
},
(error) => {
console.log(TranslationService.CLASS_TAG + "onLangChangeInit() error: " ,error);
reject(error);
}
);
});
}
instant(key: string | Array<string>, interpolateParams?: Object): string | any {
let result = key && this.translateService.instant(key, interpolateParams);
result = (result !== key) ? result : '';
if (key && !result) {
console.error(`[not translated key]::${key}`);
}
return result;
}
instantCapitalize(key: string | Array<string>, interpolateParams?: Object): string | any {
return new CapitalizePipe().transform(this.instant(key));
}
}
然后在您要使用它的页面(模态或非模态)中导入服务:
import { TranslationService } from '[root folder]/services/translation/translation';
并在页面的构造函数中声明服务:
@Component({
selector:'custom',
templateUrl: 'custom.html'
})
export class CustomPage {
constructor(...,public translationService:TranslationService,...){
}
....
}
在您的 html 模板中调用它:
<[some text tag]>{{ "[some id word from your trad file]" | translate | capitalize }}</some text tag]>
或者如果您不想将第一个字母大写:
<[some text tag]>{{ "[some id word from your trad file]" | translate }}</some text tag]>
并且在一个页面中,如果你调用一个 AlertController
例如你可以做 -:
this.translationService.instantCapitalize("[some id word from your trad file]");
或者如果您不想将第一个字母大写:
this.translationService.instant("[some id word from your trad file]");
出于某种原因,它只读取 [项目]/wwww/assets/i18n/[2 个字符语言代码] 下的交易文件。json
对于ionic 5在当前模块中声明模态组件或页面
前任:
声明:[HomePage,FilterComponent]
我在将 ng2-translate 与 ionic2 中的模态结合使用时遇到问题。正常页面中的翻译正常。
这是我的app.module.ts文件:
import ...
@NgModule({
declarations: [
MyApp,
//...
],
imports: [
TranslateModule.forRoot({
provide: TranslateLoader,
useFactory: (createTranslateLoader),
deps: [Http]
}),
IonicModule.forRoot(MyApp),
],
exports: [
TranslateModule
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
//...
],
providers: [Storage, {provide: ErrorHandler, useClass: IonicErrorHandler}]
})
export class AppModule {}
export function createTranslateLoader(http: Http) {
return new TranslateStaticLoader(http, 'assets/i18n', '.json');
}
例如,在我的 仪表板 中,我可以使用以下 HTML-代码并获得正确的翻译:
<h2>{{'general.tasks' | translate}}</h2>
但是当我现在通过以下代码使用 ionic-angular 中的 ModalController 打开一个新模式时:
let taskModal = this.modalCtrl.create(TaskCancelPage, {'task': task});
taskModal.onDidDismiss(data => {
console.log(data);
});
taskModal.present();
在那个新的 TaskCancelPage 中有相同的 HTML 代码
<h2>{{'general.tasks' | translate}}</h2>
但这里我只得到general.tasks而不是翻译后的值。
这对我有用,这是我所做的:
在[项目]/src//app.module.ts:
import { TranslateModule, TranslateStaticLoader, TranslateLoader } from 'ng2-translate/ng2-translate';
export function createTranslateLoader(http: Http) {
return new TranslateStaticLoader(http, './assets/i18n', '.json');
}
import { TranslationService } from '../services/translation/translation';
//custom pipe
import { CapitalizePipe } from '../custom-pipes/capitalize/capitalize';
@NgModule({
declarations: [
...,
CapitalizePipe,
....
],
imports: [
IonicModule.forRoot(MyApp),
TranslateModule.forRoot({provide: TranslateLoader,
useFactory: (createTranslateLoader),
deps: [Http]})
],
bootstrap: [IonicApp],
entryComponents: [
...
],
providers: [
TranslationService,
....
]
})
在[项目]/src/app/app.component.ts
...
import { TranslationService } from '../services/translation/translation';
import { CapitalizePipe } from '../custom-pipes/capitalize/capitalize';
@Component({
templateUrl: 'app.html',
})
export class MyApp {
....
constructor(
...,
public translationService: TranslationService, ...
) {}
....
ngOnInit() {
return this.defineLang().then(
(event) => {
console.log(MyApp.CLASS_TAG + " this.defineLang() fired: ",event , " getLangs is " , this.translationService.getLangs());
this.[yourFunctionToDefineRootPage]();
}
);
}
...
private defineLang(): Promise<any> {
let appDfltLang = 'fr';
this.translationService.getBestLanguageAccordingToBrowserAvailability(appDfltLang);
let promise = this.translationService.langSettingOnInit();
return promise;
}
....
}
在[项目]/src/custom-pipe/capitalize/capitalize.ts:
import { PipeTransform, Pipe } from '@angular/core';
@Pipe({name:'capitalize'})
export class CapitalizePipe implements PipeTransform {
transform(value?: any,args?: any): any{
return (!!value)?value.charAt(0).toUpperCase()+value.substr(1):value;
}
}
在[项目]/src/services/translation/translation.ts
import { Injectable } from '@angular/core';
import { LangChangeEvent, TranslateService } from 'ng2-translate/ng2-translate';
import { Observable } from 'rxjs/Observable';
import { CapitalizePipe } from '../../custom-pipes/capitalize/capitalize';
@Injectable()
export class TranslationService {
private static readonly CLASS_TAG = "TranslationService";
private availableLang: Array<string> = ["fr","en","nl"];
private defaultLanguage:string = "en";
constructor(
private translateService: TranslateService
) { }
setDefaultLang(lang: string) {
return this.translateService.setDefaultLang(lang);
}
use(lang: string): Observable<any> {
let brLgSubStr:string = this.getBrowserLang().substr(0,2);
let findLg:number = this.availableLang.indexOf(brLgSubStr);
if(findLg==-1){
lang = this.defaultLanguage;
}
return this.translateService.use(lang);
}
getCurrentLang(): string {
return this.translateService.currentLang;
}
getDefaultLang(): string {
return this.translateService.getDefaultLang();
}
getBestLanguageAccordingToBrowserAvailability(appDfltLang:string) {
console.log(TranslationService.CLASS_TAG + "getBestLanguageAccordingToBrowserAvailability() starts ");
let brLang = this.getBrowserLang().substr(0,2);
let brLangAmongPossibilities:boolean = false;
for(let i in this.availableLang){
if(this.availableLang[i]==brLang){
brLangAmongPossibilities=true;
}
}
if(brLangAmongPossibilities){
this.translateService.use(brLang);
} else {
this.translateService.use(appDfltLang);
}
this.translateService.setDefaultLang(appDfltLang);
}
getBrowserLang():string {
return this.translateService.getBrowserLang();
}
getLangs():Array<string> {
return this.translateService.getLangs();
}
getAvailableLangs():Array<string>{
return this.availableLang;
}
langSettingOnInit(): Promise<LangChangeEvent> {
return new Promise((resolve, reject) => {
this.translateService.onLangChange.subscribe(
(event) => {
resolve(event);
},
(error) => {
console.log(TranslationService.CLASS_TAG + "onLangChangeInit() error: " ,error);
reject(error);
}
);
});
}
instant(key: string | Array<string>, interpolateParams?: Object): string | any {
let result = key && this.translateService.instant(key, interpolateParams);
result = (result !== key) ? result : '';
if (key && !result) {
console.error(`[not translated key]::${key}`);
}
return result;
}
instantCapitalize(key: string | Array<string>, interpolateParams?: Object): string | any {
return new CapitalizePipe().transform(this.instant(key));
}
}
然后在您要使用它的页面(模态或非模态)中导入服务:
import { TranslationService } from '[root folder]/services/translation/translation';
并在页面的构造函数中声明服务:
@Component({
selector:'custom',
templateUrl: 'custom.html'
})
export class CustomPage {
constructor(...,public translationService:TranslationService,...){
}
....
}
在您的 html 模板中调用它:
<[some text tag]>{{ "[some id word from your trad file]" | translate | capitalize }}</some text tag]>
或者如果您不想将第一个字母大写:
<[some text tag]>{{ "[some id word from your trad file]" | translate }}</some text tag]>
并且在一个页面中,如果你调用一个 AlertController
例如你可以做 -:
this.translationService.instantCapitalize("[some id word from your trad file]");
或者如果您不想将第一个字母大写:
this.translationService.instant("[some id word from your trad file]");
出于某种原因,它只读取 [项目]/wwww/assets/i18n/[2 个字符语言代码] 下的交易文件。json
对于ionic 5在当前模块中声明模态组件或页面 前任: 声明:[HomePage,FilterComponent]