Angularjs 本地化URL';带ui路由器和角度转换的s
我使用用户界面路由器路由和角度翻译翻译。我希望实现的是将所选语言绑定到url,如下所示:Angularjs 本地化URL';带ui路由器和角度转换的s,angularjs,angular-ui-router,angular-translate,Angularjs,Angular Ui Router,Angular Translate,我使用用户界面路由器路由和角度翻译翻译。我希望实现的是将所选语言绑定到url,如下所示: www.mydomain.com/en/ www.mydomain.com/ru/ www.mydomain.com/en/about www.mydomain.com/ru/about 它将作出相应的反应 试图寻找例子,但什么也没找到。 如果有人实施了类似的解决方案,我很想听听您是如何做到的 谢谢我使用了以下内容: 咖啡脚本 angular.module('app') .config([ '$sta
www.mydomain.com/en/
www.mydomain.com/ru/
www.mydomain.com/en/about
www.mydomain.com/ru/about
它将作出相应的反应
试图寻找例子,但什么也没找到。
如果有人实施了类似的解决方案,我很想听听您是如何做到的
谢谢我使用了以下内容: 咖啡脚本
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'
])
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'
});
}
]);
angular.module('app')
.controller('appCtrl', [
'$scope', '$stateParams'
($scope, $stateParams) ->
$scope.locale = $stateParams.locale
])
angular.module('app').controller('appCtrl', [
'$scope', '$stateParams', function($scope, $stateParams) {
return $scope.locale = $stateParams.locale;
}
]);
$scope.$on '$stateChangeStart', (event, toState, toParams, fromState, fromParams) ->
$translate.use(toParams.locale)
$scope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
$translate.use(toParams.locale);
});
JavaScript
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'
])
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'
});
}
]);
angular.module('app')
.controller('appCtrl', [
'$scope', '$stateParams'
($scope, $stateParams) ->
$scope.locale = $stateParams.locale
])
angular.module('app').controller('appCtrl', [
'$scope', '$stateParams', function($scope, $stateParams) {
return $scope.locale = $stateParams.locale;
}
]);
$scope.$on '$stateChangeStart', (event, toState, toParams, fromState, fromParams) ->
$translate.use(toParams.locale)
$scope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
$translate.use(toParams.locale);
});
通过此操作,您可以将$stateParams
注入控制器并访问其中的区域设置:
咖啡脚本
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'
])
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'
});
}
]);
angular.module('app')
.controller('appCtrl', [
'$scope', '$stateParams'
($scope, $stateParams) ->
$scope.locale = $stateParams.locale
])
angular.module('app').controller('appCtrl', [
'$scope', '$stateParams', function($scope, $stateParams) {
return $scope.locale = $stateParams.locale;
}
]);
$scope.$on '$stateChangeStart', (event, toState, toParams, fromState, fromParams) ->
$translate.use(toParams.locale)
$scope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
$translate.use(toParams.locale);
});
JavaScript
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'
])
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'
});
}
]);
angular.module('app')
.controller('appCtrl', [
'$scope', '$stateParams'
($scope, $stateParams) ->
$scope.locale = $stateParams.locale
])
angular.module('app').controller('appCtrl', [
'$scope', '$stateParams', function($scope, $stateParams) {
return $scope.locale = $stateParams.locale;
}
]);
$scope.$on '$stateChangeStart', (event, toState, toParams, fromState, fromParams) ->
$translate.use(toParams.locale)
$scope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
$translate.use(toParams.locale);
});
或者,如果要自动影响整个页面,请在应用程序控制器或类似程序中使用$stateChangeStart
事件:
咖啡脚本
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'
])
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'
});
}
]);
angular.module('app')
.controller('appCtrl', [
'$scope', '$stateParams'
($scope, $stateParams) ->
$scope.locale = $stateParams.locale
])
angular.module('app').controller('appCtrl', [
'$scope', '$stateParams', function($scope, $stateParams) {
return $scope.locale = $stateParams.locale;
}
]);
$scope.$on '$stateChangeStart', (event, toState, toParams, fromState, fromParams) ->
$translate.use(toParams.locale)
$scope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
$translate.use(toParams.locale);
});
JavaScript
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'
])
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'
});
}
]);
angular.module('app')
.controller('appCtrl', [
'$scope', '$stateParams'
($scope, $stateParams) ->
$scope.locale = $stateParams.locale
])
angular.module('app').controller('appCtrl', [
'$scope', '$stateParams', function($scope, $stateParams) {
return $scope.locale = $stateParams.locale;
}
]);
$scope.$on '$stateChangeStart', (event, toState, toParams, fromState, fromParams) ->
$translate.use(toParams.locale)
$scope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
$translate.use(toParams.locale);
});
请注意,如果使用angular translate v1.x,则应使用
$translate.uses
而不是$translate.use
我已经就具体问题写了一篇博文:
仅当您希望URL采用以下格式时,此解决方案才有效:
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路由器状态,以便使用从JSON文件检索路由的服务动态生成。这与《基督的回答》中的内容类似:
然后,我们将在应用程序的run
块中使用上述routingService
:
// 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。对于希望使用ngRoute包含URL的人(我来谷歌就是为了这个),我实现了如下 (1) 在我的
.htaccess
中,我捕获了所有没有语言子域的URL,并将其重定向到默认值(在我的例子中是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, '');
}
啊,是的-这似乎在v1.x和v2.x之间发生了变化,我现在正在使用v1.x--我会在答案中做一个说明,谢谢。当用户通过
domain.com
->domain.com/en/
导航到网页主页时,我希望url有一个语言代码。要这样做,我需要先检测用户的语言,然后添加{locale}
params到url。有好的解决方案吗?如果仍然相关,请在更新中查看我的问题和我的解决方案:)感谢链接到您的帖子@ozooner。您可以查看我创建的应用程序:www.azorly.comPlease在您的答案中引用帖子的相关部分,您好,我对这个解决方案感兴趣。您能不能t详细描述此解决方案的链接或文章?提前感谢。@Seto我试图包括一个模拟此场景的plunker,但我不得不将其稍微缩小。请注意,我不确定是否推荐此方法。如果您还想包括语言更改而不刷新,您可能需要听t他$stateChangeStart
事件并从那里更新状态。代码:演示URL:Hello@KevinFarrugia for en language我不想添加区域设置。例如en=>domain.com/about mt=>domain.com/mt/fuqna我能做什么?请帮助。ThanksHi@ashihmehta很遗憾,我没有参与这个项目(或类似项目)很长一段时间,我没有使用最新的解决方案进行更新;但是,我假设,{locale}