8

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 パスのロケール プレフィックスにより、翻訳されたテンプレートの言語ごとのセットがキャッシュされます。

このアプローチは、翻訳処理を可能な限りサーバー側にプッシュします。

このアプローチに根本的な問題はありますか?

それはもっとうまくできるでしょうか?

4

2 に答える 2