1

我觉得我这样做有点滥用 Rails I18N ......有没有更好的方法?

我们正在构建一个具有 I18N 的应用程序,因此使用Rails Guides中记录的标准技术。

我们还希望为每个客户的应用程序打上品牌,我通过将其覆盖在本地化上来做到这一点。

例如,我有这个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

它有效,但我对我得到的 URL 并不感到疯狂。例如,我可能从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是默认语言环境),或者我什至可以使用http://arc.1click.local:3000/en/users/sign_up.

建议?

4

2 回答 2

2

如果您的品牌完全由文本更改组成,我认为使用 I18n 工具是有意义的。或者,您可以设置包含品牌之间不同设置的单独配置文件,并使用这些配置设置来更改您的应用程序的显示/行为方式。I18n 和配置文件的组合也可以工作。不确定这是否是最好的方法,但它被证明是有效的。

于 2013-06-26T18:57:06.907 回答
2

语言环境的定义很简单,语言+文化参考,字符集等......所以从这个意义上说,这种方法是完全有效的。

为了与地区定义的 ISO 风格更加一致,首先出现的是语言代码,然后是区域标识符(例如pt-BR),但无论如何,拥有语言 + DSL 标识符的想法对我来说似乎是完全合理的(想象一下en-medical,完全有道理)。

I18n 有一大堆功能可以派上用场,例如备用和默认值,它们可以帮助您从应用程序中抽象出内容。

除了这种系统可能造​​成的潜在维护负担之外,这种解决方案实际上似乎比 kludgy 更优雅。

抱歉,不是真的,回复,只是我的 2c。

于 2013-06-27T00:32:15.777 回答