AngularJS フロントエンドと Ruby on Rails サーバーを使用して、多言語をサポートするアプリケーションを実装する必要があります。翻訳されたテンプレートを複数の言語でレンダリングする合理的な方法を探しています。フィードバックが欲しいアプローチを思いつきました。
Angular ルート定義で、テンプレート プロパティを、コントローラーによって設定された src 属性値を持つ ng-include だけを持つ html パーシャルに設定します。このアプローチは、サーバーからフェッチされるテンプレートへのパスを動的に変更するために必要です。ここで説明されています: AngularJS - templateUrl の生成に $routeParams を使用する方法は?
したがって、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";
}
Here$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 パスのロケール プレフィックスにより、翻訳されたテンプレートの言語ごとのセットがキャッシュされます。
このアプローチは、翻訳処理を可能な限りサーバー側にプッシュします。
このアプローチに根本的な問題はありますか?
それはもっとうまくできるでしょうか?