我正在使用公寓gem切换到我们应用程序中的每个请求的postgre架构。找到租户后,我根据数据库字段设置区域设置:
I18n.locale = current_tenant.locale || I18n.default_locale
这非常适合切换语言。现在,我收到了客户的请求,要求更改 yml 文件中的单个密钥。我想为我们的客户提供一种数据库驱动的方式来覆盖某些密钥,但我不确定如何设置 I18n 后端以覆盖单个密钥。我可以使用 active_record gem,但这会全局存储翻译,因此如果我覆盖一个租户,它会覆盖所有租户。
我想我需要一种方法来预加载翻译并按租户子域而不是语言查找它们。我发现的所有方法似乎都在初始化项中执行后端加载,而不是每个请求,所以我不确定如何做到这一点。
"覆盖某些键"是指键的值吗?
如果是这样,实现此目的的一种方法是将覆盖存储在数据库中的表中 - 我们称之为 -custom_overrides
。
此表将具有以下属性:id
、user_id
、key_name
、locale
、expansion_string
,以及其他类似时间戳的属性。
修改:
当客户想要使用key_name
"okn" 修改键的值时,您将在custom_overrides
表中创建新记录。
读取键:
当您读取密钥时,"okn"而不是执行
t(:okn)
你会做:
CustomOverride.where(
:key_name => :okn,
:locale => config.locale,
:user_id => current_user.id
).first.try(:expansion_string)
||
t(:okn)
也就是说,始终执行数据库读取以确定key_name
是否由current_user
定义,如果不是,则回退到 i18n。
您最终可能会在生产数据库中拥有已过时的密钥。您必须将locale.yml
文件与custom_overrides
表进行协调(例如,定期运行迁移以删除key_name
不在en.yml
文件中的custom_overrides
条目。