我需要使用 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 路径的语言环境前缀将导致每个语言的翻译模板集被缓存。
这种方法尽可能地将翻译处理推送到服务器端。
这种方法有什么基本问题吗?
能不能做得更好?