【问题标题】:Always Redirected To Home On Language Change - Angular2 with Localize-Router语言更改时始终重定向到主页 - 使用 Localize-Router 的 Angular2
【发布时间】:2018-05-07 10:51:34
【问题描述】:

我正在开发一个 Angular2 应用程序,它使用 ngx-translate 进行文本翻译和 localize-router 以便将语言附加到路由 url。

现在,不使用 localize-router,一切正常,我可以更改语言(通过下拉按钮)并查看应用的文本翻译。

安装 localize-router 后,如果我加载主页,我可以看到语言已正确附加到 url。但问题是当我更改语言时,组件(localize-router)将用户重定向到主页(新语言名称附加到 url)而不是保留到当前页面。

所以在网站加载时,语言被正确附加,如果我尝试导航,url 被正确翻译,但是当我在与主页不同的页面上并尝试更改语言时,我被重定向到附加了新语言的主页。

这是我的文件和配置:

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 或更高版本。

那么我做错了什么?

为什么当我在这个页面中时:

http://mywebsite/#/ita/login

我更改了重定向到的语言

http://mywebsite/#/eng?

我猜测问题是否出在我的路由配置中,如果我打印 ActivatedRouteSnapshot 对象的 toString(独立于当前页面),我总是会得到 ​​p>

  Route(url:'', path:'')

【问题讨论】:

  • “语言变化”是什么样子的?例如,它是一个简单的锚标签吗?您能否提供您要更改语言的 HTML 模板?
  • 嗨@MichaelCzechowski,我刚刚更新了添加按钮html模板的问题

标签: javascript typescript localization angular2-routing url-routing


【解决方案1】:

topbar.component.js 更改为:

changeLanguage(lang: string){
  this.translate.use(lang);
  this.localizeService.translateRoute(this.router.url);
}

这将转换给定的路由,而不是重定向到文档根/this.router.url 返回当前路径,即您的用户当前所在的位置。

最后不要忘记将router 作为依赖添加到您的顶栏组件。

【讨论】:

  • 已经试过了,但什么也没发生,事实上“this.localizeService.translateRoute”只是返回一个字符串,如果我将它打印到console.log我得到:“/ita/ita/dashboard/home "(假设当前页面是“ita/dashboard/home”)所以它只是返回一个字符串,再次将以前的语言附加到 url
  • 通过添加路由器作为依赖项是指注入构造函数吗?如果是的话,这也已经完成了
【解决方案2】:

尽量坚持localize-router 存储库的工作示例和文档。将您的 changeLanguage() 函数简化为:

changeLanguage(lang: string){
  this.localizeService.changeLanguage(lang);
}

文档

changeLanguage(lang: string, extras?: NavigationExtras, useNavigateMethod?: boolean): 将当前 url 翻译成给定的语言 并更改应用程序的语言。额外的将被传递给 Angular Router 导航方法。 userNavigateMethod 告诉 localize-router 使用 navigate 而不是 navigateByUrl 方法。为了 德语语言和路由定义为 :lang/users/:user_name/profile

Source

【讨论】:

  • 已经尝试过这个,但我仍然得到相同的效果,所以我被重定向到主页,并将新选择的语言附加到 url :-(
【解决方案3】:

正如我所想,问题出在路由配置中,实际上我创建 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 的子级似乎是空的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    相关资源
    最近更新 更多