我正在使用ui-router进行路由和角度转换以进行翻译。我想要实现的是将所选语言绑定到URL,如下所示:
www.mydomain.com/en/
www.mydomain.com/ru/
www.mydomain.com/en/about
www.mydomain.com/ru/about
它将作出相应的回应。
试图寻找例子,但没有找到任何东西。 如果有人实施了类似的解决方案,我很想听听你是如何做到的。
由于
答案 0 :(得分:30)
我在这些方面使用了一些东西:
<强>的CoffeeScript 强>
angular.module('app')
.config([
'$stateProvider'
($stateProvider) ->
$stateProvider.state 'app',
abstract: true
url: '/{locale}'
$stateProvider.state 'app.root',
url: ''
$stateProvider.state 'app.root.about',
url: '/about'
])
<强>的JavaScript 强>
angular.module('app').config([
'$stateProvider', function($stateProvider) {
$stateProvider.state('app', {
abstract: true,
url: '/{locale}'
});
$stateProvider.state('app.root', {
url: ''
});
return $stateProvider.state('app.root.about', {
url: '/about'
});
}
]);
有了这个,您可以将$stateParams
注入您的控制器并访问那里的语言环境:
<强>的CoffeeScript 强>
angular.module('app')
.controller('appCtrl', [
'$scope', '$stateParams'
($scope, $stateParams) ->
$scope.locale = $stateParams.locale
])
<强>的JavaScript 强>
angular.module('app').controller('appCtrl', [
'$scope', '$stateParams', function($scope, $stateParams) {
return $scope.locale = $stateParams.locale;
}
]);
或者,如果您想自动影响整个页面,请在应用程序控制器或类似程序中使用$stateChangeStart
事件:
<强>的CoffeeScript 强>
$scope.$on '$stateChangeStart', (event, toState, toParams, fromState, fromParams) ->
$translate.use(toParams.locale)
<强>的JavaScript 强>
$scope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
$translate.use(toParams.locale);
});
请注意,如果您使用的是angular-translate v1.x,则应使用$translate.uses
代替$translate.use
。
答案 1 :(得分:4)
只有当您想要具有以下格式的网址时,该解决方案才有效:
domain.com/{locale}/about
因此:
domain.com/en/about
domain.com/mt/about
最近我们需要为完整的URL实现翻译,因此:
domain.com/{locale}/{about}
其中{about}
以相应的语言翻译:
domain.com/en/about
domain.com/mt/fuqna
我不知道下面的方法是否是最好的方法,但确实有效。
对于初学者来说,第一个区别是我们设置了ui-router状态,使用从JSON文件中检索路由的服务动态生成。这与@ChrisT在Angular - UI Router - programmatically add states
中的答案类似module.service("routingService", ["$http", function($http) {
self.get = function(options) {
return self.getByLocale({
market: options.urlMarketCode
});
};
self.getByLocale = function(options) {
var market = options.market;
// loads the different .json files based on the different market values passed, ex: routes-en.json
var configurationKey = "routes-" + market;
return $http({
method: "GET",
url: configurationKey + ".json",
headers: {
"Content-Type": "application/json"
}
}).then(function(response) {
if (response.data) {
return response.data;
}
return undefined;
}).catch(function(e) {
console.log(e);
});
};
return self;
}]);
然后我们会在应用程序的routingService
块中使用上面的run
:
// run the module and register the state change handler
angular.module("sportsbook-app").run(["$state", "$rootScope", "routingService", "stateService",
function ($state, $rootScope, routingService, stateService) {
// retrieve the routing heirarchy from file
routingService.get({
urlMarketCode: $rootScope.language
}).then(function (response) {
if (response) {
// add the routes to the $stateProvider
stateService.generate(response);
}
});
}
]);
最后,stateService
只是解析JSON文件并使用ChrisT的runtimeStates.addState创建路由层次结构。
我会尝试在不久的将来加入一个有效的演示。
积分也归@ karl-agius。
答案 2 :(得分:2)
我写了一篇关于确切问题的博客文章: http://fadeit.dk/post/angular-translate-ui-router-seo
答案 3 :(得分:1)
对于想要使用ngRoute包含URL的人(我来这里谷歌搜索),我已经实现了如下。
(1)在我的.htaccess
中,我抓住了没有语言子域的所有网址,并将其重定向到默认值(在我的情况下为fr)。唯一真正的缺点是我必须手动指定每种语言。
# https://stackoverflow.com/questions/19570572/htaccess-multi-language-site-with-sub-directories-and-default-301/19902914#19902914
# Add language to URL - redirect to default if missing
RewriteBase /
# empty url -> redirect to nl/
RewriteCond %{QUERY_STRING} !lang=(nl|fr)
RewriteRule ^$ fr/ [R=301,L]
# url is ONLY '/nl' or '/fr' -> redirect to /nl/ or /fr/ (adding slash)
RewriteRule ^(nl|fr)$ $1/ [R=301,L]
# now all urls have nl/ fr/ -> parse them
RewriteRule ^(nl|fr)/(.*)$ $2?lang=$1&%{query_STRING} [L]
(2)在我的Angular项目的config
块中,我只是解析了URL以获取当前语言。
config.$inject = ['$translateProvider', '$windowProvider'];
function config($translateProvider, $windowProvider) {
var $window,
language;
$window = $windowProvider.$get();
language = $window.location.pathname.replace(/\//g, '');
//////
$translateProvider
.useStaticFilesLoader({
prefix: 'translations/',
suffix: '.json'
})
.useSanitizeValueStrategy('sanitizeParameters')
.preferredLanguage( language )
}
(3)为了获取HTML文件中的语言,我还将其添加到$rootScope
。
run.$inject = ['$window', '$rootScope'];
function run($window, $rootScope ) {
$rootScope.language = $window.location.pathname.replace(/\//g, '');
}