外部I18n语言环境路径(AWS)

时间:2016-08-23 13:48:09

标签: ruby-on-rails amazon-web-services heroku amazon-s3

我为我的Rails应用程序提供了一个基于数据库的翻译系统,除了它显然向数据库发送了大量请求之外,它的效果很好。我只能对一定数量的请求使用缓存,但对我来说可行的选择是将转换表导出到YAML文件中,系统可以读取该文件。

我遇到的问题是我的应用程序在Heroku上,你无法写入该文件系统,我必须使用AWS(使用Carrierwave)来存储语言环境文件。我可以写信给AWS,但我无法让我的Rails应用程序从我的AWS存储中读取语言环境文件。

我尝试了以下设置(这只是试错)但它不起作用。

application.rb中

config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
config.i18n.load_path += Dir["https://s3-eu-west-1.amazonaws.com/myapp/locales/", '*.{rb,yml}'.to_s]
config.i18n.available_locales = [:en, :se] 

编辑:我当前(繁琐)的工作流程是在数据库中创建所有翻译(使用数据库翻译对我来说绝对是绝对的)。然后我将表导出到yaml到我的AWS存储中。从那里我将语言环境文件下载到我的本地应用程序和locale-folder。我再次将它全部上传回Heroku。所有这些都是因为我无法写入Heroku文件系统。

如何设置我的应用以便从此外部源读取区域设置文件(例如https://s3-eu-west-1.amazonaws.com/myapp/locales/en.yml)?它甚至可能吗?如果没有,是否有解决方法?

2 个答案:

答案 0 :(得分:3)

我们想到的是为您的数据库实现缓存(因此您不需要使用任何YML文件)。首先,如果访问了一个密钥,结果将被缓存,并且在第二次查找时 - i18n将使用缓存值。

I18n::Backend::ActiveRecord.send(:include, I18n::Backend::Cache)
I18n.cache_store = ActiveSupport::Cache.lookup_store(:memory_store) # or whatever store you prefer

一种方法是使用以下方法预热缓存:I18n.cache_store.write({"en.some.key" => "value"})。我想从数据库中填充它不应该太难。

问题在于您想要使缓存无效。您需要为activerecord创建自己的后端。 Here是商店方法。您需要创建一个新的后端模块,以清除和重新填充缓存。

def store_translations(locale, data, options = {})
  I18n.cache_store.clear
  super
  I18n.cache_store.write(#cached_values)
end

如果缓存非常大,您需要实施更智能的store_translation方法,以管理特定的翻译项目。

这是一些 armchair-engineering ,但我付出了一些努力,我认为你可以为你的activerecord翻译创建一个强大的内存存储。

答案 1 :(得分:1)

我觉得,您不能直接使用' Dir'添加外部翻译。因为它在本地工作。 要解决此问题,您可以将外部文件加载到本地系统,然后使用Dir以相同的方式在I18n中访问它。 无论如何,如果要加载外部文件中的任何更改,您将始终需要重新启动生产服务器。所以它与存储文件localy相同。