[我有一个使用Angularjs翻译库-https://angular-translate.github.io/使用Angularjs构建的应用程序,并且已使用UI路由器对其进行了设置,因为Google已使用当前语言(例如www.domain.com/en/us)将当前网站编入索引/,并且我需要保持相同的URL结构。该网站有30多种语言,但它是SPA(单页应用程序)。
下面是我的应用配置Javascript:
app.run(['$rootScope', '$translate', '$state', function ($rootScope, $translate, $state) {
$rootScope.onChangeValue = function (e) {
$rootScope.$broadcast("changeValue", e);
};
$rootScope.$on('$stateChangeSuccess', onStateChangeSuccess);
function onStateChangeSuccess(event, toState, toParams) {
var current = $translate.use();
if (!current || current !== toParams.lang)
$translate.use(toParams.lang);
}
}]);
app.config(['$translateProvider', function ($translateProvider) {
$translateProvider.useStaticFilesLoader({
prefix: '../languages/locale-',
suffix: '.json'
});
$translateProvider.fallbackLanguage('en');
$translateProvider.preferredLanguage('en');
$translateProvider.useSanitizeValueStrategy('escape');
$translateProvider.useCookieStorage();
}]);
app.config(['$stateProvider', '$locationProvider', function ($stateProvider, $locationProvider) {
$locationProvider.html5Mode(true);
$locationProvider.hashPrefix('');
$stateProvider.state('catalog', {
url: '/{lang}',
controller: "SudokuController",
params: {
lang: {
value: function ($translate) {
return $translate.use();
}
}
}
});
}]);
并且在控制器中,我具有以下功能:
app.controller("SudokuController", ['$scope', 'Chronicle', '$timeout', '$cookies', '$translate', '$state', '$stateParams', function ($scope, Chronicle, $timeout, $cookies, $translate, $state, $stateParams) {
$scope.params = $stateParams;
$scope.changeLanguage = function (newLang) {
var params = angular.extend($stateParams, { lang: newLang });
$translate.use(newLang).then(function () {
$state.transitionTo($state.current, params, {
reload: true, inherit: false, notify: true
});
});
}
}]);
这里是使用多种语言生成导航的HTML:
<div class="language-dropdown">
<ul class="country-list" ng-controller="navigationLanguages">
<li class="country" ng-repeat="language in languagesMenu">
<div class="country-flag" style="background-image: url('images/mk.png');"></div>
<a ng-bind="language.Language" ng-click="changeLanguage(language.Code)"></a>
</li>
</ul>
</div>
到目前为止,我已经实现了将所选语言添加到URL的操作,例如,如果单击英语,则获得www.domain.com/en,如果单击西班牙语,则获得www.domain.com/es。但是,当我直接访问www.domain.com/en时,出现错误404-找不到对象!
与网址一起插入网址时,我该如何做/之后使用该特定语言访问网站而不显示错误404。
如何使语言状态如www.domain.com/en/us而不是www.domain.com/en(因此首先输入语言代码,然后输入国家代码)?
这些URL /语言是否可以被Google抓取?
"/"
上的索引页面提供服务,因此,如果您以非根目录的任何路由刷新页面,它将无法提供任何服务,并且您将找不到。基本上,对于单页应用程序,路由应该完全在客户端处理,因为那是具有有关您的应用程序的上下文以了解该做什么的部分。因此,无论哪个路由,始终让您的服务器服务于索引页,这将使ui路由器接管并发挥其神奇作用/en/us
,请更新您的状态配置。另外,除非您需要默认值,否则实际上不需要定义params
。$stateProvider.state('catalog', {
url: '/{lang}/{region}',
controller: "SudokuController"
});