この回答で提案されているように、ロケールごとに 1 つの CSS を生成できますが、CSS は I18n ビットを除いて同じであるため、次のいずれかになります。
ロケールがインライン化された多数の静的 CSS/LESS を含むフォルダー。
/* en */
.observation {
.box("Observation");
}
まったく同じ動的 CSS がたくさんあります。たとえば、
/* en */
html[lang=en] {
.observation {
.box("Observation")
}
}
代わりに、CSS と ERB ビューを作成し、URL にロケール コードを含むページ キャッシングを使用して配信することを選択しました。この方法では、重複はありません。以下のコードを参照してください。
config/routes.rb
X::Application.routes.draw do
get 'index.:locale.:format' => 'css#index',
constraints: { locale: /[a-z]{2}(-[A-Z]{2})?/,
format: 'css' }
end
アプリ/コントローラー/css_controller.rb
class CssController < ActionController::Base
caches_page :index
def index
@locale = params[:locale]
end
end
アプリ/ビュー/css/index.css.less.erb
@import "mixins";
.observation {
.box("<%= t 'box.observation', locale: @locale %>");
}
アプリ/アセット/スタイルシート/mixins.less
.box (@legend) {
/* Echo out a label for the example */
&:after {
content: @legend;
}
}
この例は単純な ERB ビューであるかのように機能しますが、Less を使用しているため、Rails 4 の時点で ERB と LESS を手動で解析する必要があります。
class CssController < ActionController::Base
caches_page :index
def index
@locale = params[:locale]
erb_source = find_template.source
less_source = Tilt::ERBTemplate.new { erb_source }.render(self)
css_source = Less::Parser.new(paths: Rails.application.config.less.paths).parse(less_source).to_css
render text: css_source
end
private
def find_template(_action_name = action_name)
lookup_context.disable_cache { lookup_context.find_template(_action_name, lookup_context.prefixes) }
end
end