使用Rails服务器进行AngularJS模板转换的方法

Tse*_*ing 8 translation ruby-on-rails internationalization angularjs

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

在Angular路径定义中,将template属性设置为一个html partial,它只有一个ng-include,并且控制器设置了src属性值.需要这种方法来动态修改要从服务器获取的模板的路径; 它在这里描述: AngularJS - 如何使用$ routeParams生成templateUrl?

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

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

控制器看起来像:

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

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

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

match '/:locale/template/*template' => 'template#get'
Run Code Online (Sandbox Code Playgroud)

该路由使用路由通配,因此该params[:template]值可以是多级路径.该TemplateController#get操作只是呈现由params[:template] 模板控制器代码确定的部分类似于:

class TemplateController < ApplicationController
    layout false
    caches_page :get

    def get
        render(template: "template/#{params[:template]}")
    end
end
Run Code Online (Sandbox Code Playgroud)

Rails I18n支持翻译在erb模板中使用,根据locale参数进行翻译.在生产中,将启用缓存.这样可以避免产生翻译费用.URL路径的区域设置前缀将导致要缓存的每种语言的已翻译模板集.

该方法尽可能地将翻译处理推送到服务器端.

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

可以做得更好吗?

Ket*_*tan 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

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

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

  • 对于需要在浏览器上动态进行的翻译,我使用 i18n-js gem 的类似方法:https://github.com/fnando/i18n-js。在服务器端翻译的优点是翻译的开销只需要完成一次(如果翻译的模板被缓存)。 (2认同)