我正在使用Angular2应用程序,使用ngx-translate进行文本翻译和本地化路由器,以便将语言附加到路径网址。
现在,不使用localize-router,everithing工作正常,我可以更改语言(通过下拉按钮)并查看应用的文本翻译。
安装localize-router后,如果我加载主页,我可以看到语言正确附加到网址。但问题是,当我更改语言时,组件(localize-router)将用户重定向到主页(新语言名称附加到URL),而不是保留到当前页面。
因此,在网站加载时,语言被正确附加,如果我尝试导航,则网址被正确翻译,但当我在与家庭不同的页面上并且我尝试更改语言时,我&#39 ; m重定向到主页,并附加新语言。
这里有我的文件和配置:
app.module.ts
@NgModule({
imports: [
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: (createTranslateLoader),
deps: [Http]
}
}),
RouterModule.forRoot(routes,{useHash: true}),
LocalizeRouterModule.forRoot(routes),
app.routes.ts
const appRoutes: Routes = [
{
path: '',
component: DefaultLayoutComponent,
children: [
{
path: '',
component: HomeComponent,
pathMatch: 'full'
},
{
path: 'error',
component: ErrorComponent
},
{
path: 'dashboard',
children: [
{
path: 'home',
component: DashboardComponent,
canActivate: [AuthGuard]
},
app.component.ts
@Component({
selector: 'my-app',
template: '<router-outlet></router-outlet>',
moduleId: module.id,
})
export class AppComponent implements OnInit {
constructor(
private translate: TranslateService,
public router: Router,
) {
this.translate.addLangs(['ita', 'eng']);
this.translate.setDefaultLang('ita');
this.translate.use('ita');
DefaulLayoutComponent.html
... my html common section ...
<router-outlet></router-outlet>
... the remaining common html section ...
topbar.component.ts 它处理菜单栏,当我点击下拉列表时,会调用以下函数(在topbar组件内部):
changeLanguage(lang: string){
this.translate.use(lang);
this.localizeService.changeLanguage(lang);
topbar.component.html (我刚刚编写了按钮模板)
<button (click)="changeLanguage('ita')">ITA</button>
<button (click)="changeLanguage('eng')">ENG</button>
文件夹结构
- app
- app.module.ts
- app.component.ts
- other "main" stuff
- components
- defaultLayout
- defaultLayoutComponent.ts
- defaultLayoutComponent.html
- other components
使用的软件版本是:
"@angular/common": "~2.4.1",
"@angular/compiler": "~2.4.1",
"@angular/compiler-cli": "~2.4.1",
"@angular/core": "~2.4.1",
"@angular/forms": "~2.4.1",
"@angular/http": "~2.4.1",
"@angular/platform-browser": "~2.4.1",
"@angular/platform-browser-dynamic": "~2.4.1",
"@angular/platform-server": "~2.4.1",
"@angular/router": "~3.2.3",
"@angular/upgrade": "~2.4.1",
"@ngx-translate/core": "^6.0.1",
"@ngx-translate/http-loader": "^0.1.0",
"localize-router": "^0.7.1",
我无法从angular2升级到angular4或更高。
那么我做错了什么?
为什么我在这个页面中例如:
我将我重定向的语言改为
我猜测问题是否在我的路线配置中,如果我打印 ActivatedRouteSnapshot 对象的toString(独立于当前页面)我总是得到
Route(url:'', path:'')
答案 0 :(得分:0)
将 topbar.component.js 更改为:
changeLanguage(lang: string){
this.translate.use(lang);
this.localizeService.translateRoute(this.router.url);
}
这将转换给定路线,而不是重定向到文档根/
。并且this.router.url
会返回当前用户所在的当前路径。
最后不要忘记将router
添加为您的topbar组件的依赖项。
答案 1 :(得分:0)
尝试坚持localize-router
存储库的工作示例和文档。将changeLanguage()
功能减少为:
changeLanguage(lang: string){
this.localizeService.changeLanguage(lang);
}
<强>文档强>
changeLanguage(lang: string, extras?: NavigationExtras, useNavigateMethod?: boolean)
:将当前网址翻译为指定语言 并更改应用程序的语言。额外的东西将传递给 角度路由器导航方法。 userNavigateMethod告诉 localize-router使用navigate而不是navigateByUrl方法。对于 德语和路由定义为:lang / users /:user_name / profile
答案 2 :(得分:0)
正如我所想,问题出在路径配置中,实际上我创建了DefaultLayoutComponents只是为了让所有页面都有一个共同的布局。
解决方案是删除DefaultLayoutComponent,将所有视图代码移动到app.component.html并修改路由配置,以这种方式删除DefaultLayoutComponent的级别:
const appRoutes: Routes = [
{
{
path: '',
component: HomeComponent,
pathMatch: 'full'
},
{
path: 'error',
component: ErrorComponent
},
{
path: 'dashboard',
children: [
{
path: 'home',
component: DashboardComponent,
canActivate: [AuthGuard]
},
因为本地化路由使用ActivatedRouteSnapshot循环路由的子节点。
使用以前的路由配置,DefaultLayoutComponents的子节点似乎为空。