?
我有一个多租户的Rails应用程序,它支持三种语言:es
,en
和pt-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
对此有任何想法或建议吗?
答案 0 :(得分:0)
您可以选择动态创建语言环境的选项。 Rails的目标是覆盖80%的用例,而您似乎只剩下20%。
除非您找到可以满足您用例的宝石(直到今天我才见过),否则我会按照您的指示进行。
但这是我的输入:
假设您使用的是像React这样的JavaScript框架,我将使用BootstrapController
,它会在加载JS应用时被调用,以便它提供诸如路由之类的配置。以及在本地存储的基本帐户语言环境中的number.currency
翻译。
然后,在需要的地方,我将专门加载存储的翻译,而不是要求Rails给我翻译。
然后,我将使用a Concern
,它将嵌入您已发布的hacky逻辑,并在需要它的控制器操作中,从这种担忧中调用一种方法,该方法将注入特殊的翻译。 / p>
为了加快这种情况的发生,我会进行一些缓存,这些缓存会在应用程序部署后失效(我猜翻译是与Rails应用程序一起部署的,因此,如果您更改翻译,则需要只是在部署阶段才无效,对吧?