【问题标题】:Rails 4 Manage File based Translations at Admin EndRails 4 在管理员端管理基于文件的翻译
【发布时间】:2015-09-16 06:06:33
【问题描述】:

我正在开发一个 Rails 网站,我需要将其设为多语言。我已经为翻译所需的语言创建了 yml 文件。

我想要的是通过管理面板中的一个部分提供对文件的管理员访问权限以编辑它们而不是浏览文件。是否有任何 gem 可以通过 Admin 端管理翻译。

我以前从未实现过翻译。

【问题讨论】:

    标签: ruby-on-rails-4 rubygems translation multilingual rails-i18n


    【解决方案1】:

    默认情况下,Rails 使用 YAML 文件来存储国际化信息。但是我们不限于使用 YAML(它只能读取翻译但不能动态存储它们)。我们可以使用任何数据库作为后端。

    首先,您可以使用这个 gem:https://github.com/svenfuchs/i18n-active_record

    您可以像这样更改默认后端:

    I18n.backend = Globalize::Backend::Static.new
    

    您还可以使用 Chan 后端将多个后端链接在一起。

    # config/initializers/locale.rb
    I18n.backend = I18n::Backend::Chain.new(I18n::Backend::ActiveRecord.new, I18n.backend)
    

    但是,由于在每个请求页面中都经常访问翻译,因此 ActiveRecord 并不是最好的方法。由于这些原因,键值存储是要走的路。

    您可以为此使用 Redis 数据库:

    首先安装Redis

    $ brew install redis
    

    安装redis gem:

    # Gemfile
    source 'http://rubygems.org'
    
    # ...    
    
    gem 'redis'
    

    现在您可以像这样更改后端:

    # config/initializers/locale.rb
    I18n.backend = I18n::Backend::KeyValue.new(Redis.new)
    

    添加翻译的代码:

    # /app/views/admin/translations/index.html.erb
    
    <%= form_tag admin_translations_path do %>
        <p>
            <%= label_tag :locale %><br>
            <%= text_field_tag :locale %>
        </p>
    
        <p>
            <%= label_tag :key %><br>
            <%= text_field_tag :key %>
        </p>
    
        <p>
            <%= label_tag :value %><br>
            <%= text_field_tag :value %>
        </p>
        <p><%= submit_tag "Submit" %></p>
    <% end %>
    

    此表单将 POST 到 admin/TranslationsController 的创建操作:

     # /app/controllers/admin/translations_controller.rb
     module Admin
        class TranslationsController < ApplicationController
             # ....
    
             def create
                 I18n.backend.store_translations(params[:locale]), {params[:key] => params[:value]}, escape: false)
                 redirect_to admin_translations_path, notice: "Translation Added"
             end
         end
    end
    

    你也可以使用redis-i18n gem 来做同样的事情:https://github.com/redis-store/redis-i18n

    【讨论】:

      猜你喜欢
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      相关资源
      最近更新 更多