我觉得我有点滥用Rails I18N这样做...有更好的方法吗?
我们正在构建一个拥有I18N的应用,因此请使用Rails Guides中记录的标准技术。
我们还希望为每个客户提供应用程序的品牌,我正在通过覆盖来实现本地化。
E.g。我在application_controller.rb
:
class ApplicationController < ActionController::Base
before_filter :set_locale
def set_locale
brand = request.subdomains.first || nil
I18n.locale = [brand, params[:locale] || I18n.default_locale].compact.join('_')
end
end
然后在en.yml
:
en:
home: "Home"
arc_en:
home: "ARC 1-Click Home"
yata_en:
home: "YATA Home"
它有效,但这感觉有些笨拙,也许我会后悔的。还有更好的方法吗?
好的,我有点遇到这种方法的问题。我在application_controller.rb
中完全拥有的是:
def set_locale
I18n.locale = [brand, params[:locale] || I18n.default_locale].compact.join('_')
end
def default_url_options(options={})
{ :locale => ((I18n.locale == I18n.default_locale) ? nil : I18n.locale) }
end
并在routes.rb
我做:
Oneclick::Application.routes.draw do
scope "(:locale)", locale: /arc_en|arc_es|yata_en|yata_es/ do
authenticated :user do
root :to => 'home#index'
end
devise_for :users
resources :users
match '/' => 'home#index'
end
root :to => "home#index"
end
它有效,但我对我得到的网址并不感到疯狂。例如,我可能会在我的开发环境中的http://arc.1click.local:3000/
处开始(默认为:en
中指定的application.rb
),但注册链接为http://arc.1click.local:3000/arc_en/users/sign_up
我宁愿它是http://arc.1click.local:3000/users/sign_up
(因为它可以从域名获得品牌arc
而en
是默认的区域设置)或者我甚至可以住{{1} }}
建议?
答案 0 :(得分:2)
如果您的品牌完全由文字更改组成,我认为使用I18n设施是有道理的。或者,您可以设置包含品牌之间不同设置的单独配置文件,并使用这些配置设置更改应用的显示/行为方式。 I18n和配置文件的组合也可以工作。不确定这是否是最佳方式,但事实证明它有效。
答案 1 :(得分:2)
语言环境的定义是简单的,语言+文化参考,字符集等......所以从这个意义上讲,这种方法是完全有效的。
为了更加符合区域设置定义的ISO风格,首先会出现语言代码,然后是区域标识符(例如pt-BR
),但无论如何都要使用语言+ DSL标识符对我来说似乎是完全合法的(想象一下en-medical
,这是完全合理的)。
I18n中有很多功能可以派上用场,例如回退和默认设置,可以帮助您从应用程序中抽象内容。
除了这样一个系统可能造成的潜在维护负担之外,这个解决方案实际上似乎比kludgy更优雅。
对不起,不是真的,回复,只是我的2c。