8

我需要使用 AngularJS 前端和 Ruby on Rails 服务器来实现具有多语言支持的应用程序。我正在寻找一种合理的方法来以多种语言呈现翻译后的模板。我想出了一个我希望得到反馈的方法。

在 Angular 路由定义中,将模板属性设置为仅具有 ng-include 的 html 部分,其中 src 属性值由控制器设置。需要这种方法来动态修改要从服务器获取的模板的路径;它在这里描述: AngularJS - How to use $routeParams in generate the templateUrl?

所以 Angular 路由配置看起来像:

angular.module('myApp', []).
    config(function ($routeProvider) {
        $routeProvider.when('/sites/new', {
            template: '<div ng-include src="templateUrl"></div>',
            controller: 'RouteController'
        });
    });

控制器看起来像:

// Set a prefix on the URL path, something like “es”
function RouteController($scope, $routeParams) {
    $scope.templateUrl = $routeParams.locale + "/template/sites/site";
}

这里$routeParams.locale用于设置语言环境,但可以是用户操作设置的变量。动态修改模板 URL 路径以添加语言环境前缀的方法似乎有点复杂,但我不知道其他方法。

在 Rails 端,在 routes.rb 中,添加一个路由:

match '/:locale/template/*template' => 'template#get'

该路由使用路由通配符,因此该params[:template]值可以是多级路径。该TemplateController#get操作仅呈现由params[:template] 模板控制器代码确定的部分,如下所示:

class TemplateController < ApplicationController
    layout false
    caches_page :get

    def get
        render(template: "template/#{params[:template]}")
    end
end

Rails I18n 对翻译的支持用于 erb 模板中,根据 locale 参数进行翻译。在生产中,缓存将被打开。这将避免产生翻译开销。URL 路径的语言环境前缀将导致每个语言的翻译模板集被缓存。

这种方法尽可能地将翻译处理推送到服务器端。

这种方法有什么基本问题吗?

能不能做得更好?

4

2 回答 2

2

您可能对angular-translate模块感兴趣。

于 2013-07-29T10:17:36.290 回答
1

我们使用 i18next JQuery 插件http://i18next.com/在 AngularJS 中实现了客户端国际化,并创建了一个名为 i18n 的过滤器。

当您初始化 Angular 应用程序时,您会初始化 i18n 插件,您可以在其中提供一个模式来定位包含标签的文件,并在模板中将此用作绑定标签和值的示例。

{{'mynamespace:labels.firstname' | i18n}}

其中“mynamespace”用于在逻辑上分隔您的标签,并用于定位带有标签的 JSON 文件。在 json 文件中,您可以拥有一个或多个带有标签作为属性的 JSON 对象。在上面的示例中,如果您提供了模式,则名为 mynamespace-i18n-en-US.js 的文件__ns-i18n-__lng__.js

翻译必须在服务器上进行是否有原因?

您真的需要翻译整个模板吗?

于 2013-03-31T03:24:25.673 回答