如何使用angular-translate和angular-ui-router动态切换语言?

时间:2016-04-14 12:38:10

标签: angularjs angular-ui-router angular-translate

我的应用程序使用angular-translate,angular-ui-router和模板。除index.html之外的应用程序html页面被打包到模板中,并由S3支持的Amazon CloudFront提供。我想要做的是找到一种方法来根据域名后面的两个字母代码动态切换语言,如果可能的话,还可以选择用户区域设置并将其用于默认切换。

我想这样做的原因是出于搜索引擎优化的目的,因为我读过Google建议将国家/地区代码放入以下地址。

这是我到目前为止所拥有的:

路由器文件

    var home = {
        name: 'home',
        url: '/home/'
    };

    var homeAccess = {
        name: 'home.access',
        url: 'access',
        views: {
            'home@': {
                templateProvider: ['$templateCache', ($templateCache) => {
                    return $templateCache.get('webapi.html');
                }],
            }
        }
    };

不知何故,我想这样做,以便在搜索引擎选择时:

www.example.com/de/home/webapi  or
www.example.com/en/home/webapi  or
www.example.com/fr/home/webapi

在提供webapi.html文件之前,该角度路由器会切换到相应的语言文件。

有关如何做到这一点的任何建议将不胜感激。理想情况下,我希望看到一个简单的语言文件切换器示例,它可以帮助我和社区中的其他人做所需的事情。

请注意那里有另一个类似的问题:

Localize URL's with ui-router and angular-translate

答案很好,但我也希望通过打开这个问题,我可以得到一个更好,更新的答案,或许有一些国际化的SEO技巧投入。我只是认为这是如此重要在这个论坛上帮助人们的答案越多越好。

1 个答案:

答案 0 :(得分:10)

您需要创建通用的抽象ui-router状态并在那里设置语言设置:

$stateProvider.state('common', {
  abstract: true,
  url: '/{lang:(?:es|en)}'
});

并且在你的home州成为共同的孩子之后:

$stateProvider.state('common.home', {
  url: '/home',
  templateUrl: 'views/home.html',
});

现在您可以设置状态更改事件的语言切换:

app.run(($rootScope) => {
  $rootScope.$on('$stateChangeSuccess', (event, toState, toParams) => {
    if(toParams.lang && $translate.use() !== toParams.lang){
      $translate.use(toParams.lang);
    }
  });
});

[19.04.2016] 我声明Google仍然无法以巧妙的方式解析您的网络应用程序。相关问题 - SEO: How does Google index Angular applications 2016

所以我和 @shershen 我建议使用prerender.io服务以获得更好的搜索引擎优化。