【问题标题】:Customize rails i18n per tenant using postgre schemas使用 postgre 模式为每个租户自定义 rails i18n
【发布时间】:2017-06-23 00:15:42
【问题描述】:

我正在使用Apartment gem 为我们应用程序中的每个请求切换到 postgre 架构。找到租户后,我根据数据库字段设置语言环境:

I18n.locale = current_tenant.locale || I18n.default_locale

这非常适合切换语言。现在我有一个客户要求更改 yml 文件中的单个键。我想为我们的客户提供一种数据库驱动的方式来覆盖某些键,但我不确定如何设置 I18n 后端来覆盖单个键。我可以使用active_record gem,但这会将翻译存储在全局范围内,因此如果我为一个租户覆盖,它会覆盖所有租户。

我想我需要一种方法来预加载翻译并通过租户子域而不是语言来查找它们。我发现的所有方法似乎都是在初始化程序中进行后端加载,而不是按请求进行,所以我不知道该怎么做。

【问题讨论】:

    标签: ruby-on-rails ruby postgresql internationalization rails-i18n


    【解决方案1】:

    “覆盖某些键”是指键的值吗?

    如果是这样,实现此目的的一种方法是将覆盖存储在数据库中的表中 -- 我们称之为 -- custom_overrides

    此表将具有以下属性:iduser_idkey_namelocaleexpansion_string,以及时间戳等其他属性。

    修改:

    当客户想要修改带有key_name 的键值时,您需要在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 表协调起来(例如,定期运行迁移以删除custom_overrides 中的key_names 不在en.yml 文件中的条目。)

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2015-08-21
    • 2015-08-22
    相关资源
    最近更新 更多