我可以按照这个答案中的建议为每个语言环境生成一个 CSS ,但由于 CSS 是相同的,除了 I18n 位,我将有以下任何一个:
一个包含大量静态 CSS/LESS 并内联语言环境的文件夹,例如:
/* en */
.observation {
.box("Observation");
}
许多完全相同的动态CSS,例如
/* en */
html[lang=en] {
.observation {
.box("Observation")
}
}
相反,我选择创建 CSS 和 ERB 视图并使用页面缓存和 URL 中的语言环境代码进行交付,这样就没有重复。请参阅下面的代码。
配置/路由.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