我正在接管一个小应用程序 Ionic v2 的代码,我正在使用ng2-translate
进行翻译。我仅在模态窗口中进行翻译有问题。它在任何地方都运行良好,除了在这个模态上,我只能看到转换键。
这是我的AppModule
:
@NgModule({
declarations: [
MyApp,
// ...
SearchPersonModal
],
imports: [
IonicModule.forRoot(MyApp),
ChartModule,
TranslateModule.forRoot({
provide: TranslateLoader,
useFactory: (createTranslateLoader),
deps: [Http]
})
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
// ...
SearchPersonModal,
],
providers: [
ApiCaller
]
})
export class AppModule {}
模式在应用程序中用于搜索远程数据库中的用户。这是模态组件的代码:
@Component({
selector: 'page-search-person',
templateUrl: 'search-person.html',
})
export class SearchPersonModal {
public caller : ApiCaller = null;
public translate : TranslateService = null;
// ..
constructor(
public viewCtrl: ViewController,
public toastr: ToastController,
params: NavParams
) {
this.translate = params.get('translate');
this.caller = params.get('caller');
}
// ...
}
以下是模态的呈现方式:
let modal = this.modalCtrl.create(SearchPersonModal, {
caller: this.caller,
translate : this.translate
});
我认为代码的作者将服务作为参数传递,因为依赖注入不起作用。事实上,当我尝试这样做时,使用此构造函数:
export class SearchPersonModal {
//public caller : ApiCaller = null;
//public translate : TranslateService = null;
// ...
constructor(
public viewCtrl: ViewController,
public toastr: ToastController,
public caller: ApiCaller,
public translate: TranslateService,
params: NavParams
) {
//this.translate = params.get('translate');
//this.caller = params.get('caller');
}
// ...
}
翻译仍然不起作用,但ApiCaller
服务按预期工作。为什么这个服务效果很好,但翻译器不好?
这似乎是 Ionic 2 当前已知的问题,并且已在其存储库中报告。解决方法是需要为模式重新初始化翻译服务,如问题日志中所述:
事物在页面上工作,但在模态中不起作用。就好像翻译服务在模态中不可用一样。如果在模态内部,我通过运行 this.translate.use('fr') 重新初始化翻译服务;然后事情进展顺利。例如,以下代码工作正常。
import { TranslateService } from 'ng2-translate/ng2-translate';
@Component({
templateUrl: 'my-modal.html',
selector: 'my-modal',
})
export class MyModal {
constructor(
private translate: TranslateService
) {
var self = this;
this.translate.use('fr'); // Re-initializing the translate service inside a modal
// Here on translation works fine
}
}
因此,映射到当前实现的此解决方法应类似于以下内容:
import { TranslateService } from 'ng2-translate/ng2-translate';
export class SearchPersonModal {
public caller : ApiCaller = null;
public translate : TranslateService = null;
// ...
constructor(
public viewCtrl: ViewController,
public toastr: ToastController,
public caller: ApiCaller,
private translate: TranslateService
params: NavParams
) {
this.caller = params.get('caller');
this.translate.use('en'); // Re-initialised rather than passed via navParams.
}
// ...
}