如何使用en结合Rails I18n语言环境,但将es与number.currency结合使用?

时间:2019-12-15 17:16:37

标签: ruby-on-rails rails-i18n

?

我有一个多租户的Rails应用程序,它支持三种语言:esenpt-BR

用户可以选择所需的语言,例如en,但是如果他们要访问的基本帐户位于es中,尽管他们可以切换到en,但我们仍然希望根据基本帐户es.number.currency显示货币。无论用户选择哪种语言,他们仍然会根据基本帐户查看币种。

我最初的想法是动态设置I18n.backend.store_translations

around_action :switch_locale

def switch_locale(&action)
  I18n.backend.store_translations(
    user_locale,
    number: {
      currency: I18n.t('number.currency', locale: base_account_locale)
    }
  )
  I18n.with_locale(user_locale, &action)
end

但这不适用于线程。如果使用en的用户和使用es的基本帐户,这将“解决”该用户的问题,但同时也会引入一个错误,使en中的所有基本帐户都无法鉴于es不是针对每个请求的,因此请查看I18n.backend.store_translations中的货币。

另一个似乎过于“骇人听闻”的选择是动态创建语言环境,例如en-with-currency-es

def switch_locale(&action)
  new_combined_locale = "#{user_locale}-with-currency-#{base_account_locale}"

  original_user_locale_translations = I18n.t(user_locale)

  # combine user locale with the base account currency
  original_user_locale_translations = original_user_locale_translations.merge(
    number: {
      currency: I18n.t('number.currency', locale: current_box.locale)
    }
  )

  I18n.backend.store_translations(
    new_combined_locale,
    original_user_locale_translations
  )

  I18n.with_locale(new_combined_locale, &action)
end

对此有任何想法或建议吗?

1 个答案:

答案 0 :(得分:0)

您可以选择动态创建语言环境的选项。 Rails的目标是覆盖80%的用例,而您似乎只剩下20%。

除非您找到可以满足您用例的宝石(直到今天我才见过),否则我会按照您的指示进行。

但这是我的输入:

如果您有一个JavaScript应用程序

假设您使用的是像React这样的JavaScript框架,我将使用BootstrapController,它会在加载JS应用时被调用,以便它提供诸如路由之类的配置。以及在本地存储的基本帐户语言环境中的number.currency翻译。

然后,在需要的地方,我将专门加载存储的翻译,而不是要求Rails给我翻译。

如果您没有JavaScript应用程序

然后,我将使用a Concern,它将嵌入您已发布的hacky逻辑,并在需要它的控制器操作中,从这种担忧中调用一种方法,该方法将注入特殊的翻译。 / p>

为了加快这种情况的发生,我会进行一些缓存,这些缓存会在应用程序部署后失效(我猜翻译是与Rails应用程序一起部署的,因此,如果您更改翻译,则需要只是在部署阶段才无效,对吧?