将Globalize添加到我的Rails项目时涉及哪些步骤

Bes*_*esi 2 ruby ruby-on-rails activeadmin ruby-on-rails-4 globalize

我有一个需要多语言的rails项目.我在为rails项目启用globalize时遇到了一些问题.

我想知道是否有一个完整的清单/配方,可以为rails应用程序启用国际化.

请注意,我使用ActiveAdmin也需要参与其中.

Bes*_*esi 7

安装

在以下位置设置您希望支持的语言区域config/application.rb:

config.i18n.available_locales = [:de, :en]
Run Code Online (Sandbox Code Playgroud)

添加全球化自述文件中描述的迁移

确保删除NOT NULL您要翻译的列的约束,因为它们将迁移到新的翻译表:

change_column :categories, :title, :string, null: true
Run Code Online (Sandbox Code Playgroud)

设置区域设置

根据HTTP Accept Language Header检测语言:

application_controller.rb

# ...
def set_locale
  I18n.locale = extract_locale
end

def extract_locale
  headers = request.env['HTTP_ACCEPT_LANGUAGE'] || 'de'
  case headers.scan(/^[a-z]{2}/).first
    when 'en'
      'en'
    else
      'de'
  end
end
Run Code Online (Sandbox Code Playgroud)

''翻译

全球化为缺少翻译提供了回退机制.我有点惊讶的是,有些价值观在我的前端没有后退.这是由空白值引起的.为了解决这个问题,我不得不fallbacks_for_empty_translations: truetranslates方法调用添加选项:

translates :title, :description, fallbacks_for_empty_translations: true
Run Code Online (Sandbox Code Playgroud)

注意:此选项也可用于active_admin_translates方法调用.

ActiveRecord的

范围和查询

使用翻译字段的范围也必须更改:

default_scope -> { order :title }
Run Code Online (Sandbox Code Playgroud)

变为:

default_scope -> { order('category_translations.title').includes(:translations) }
Run Code Online (Sandbox Code Playgroud)

主动管理员

建立

有一个gem支持Globalize和ActiveAdmin:

# For Rails 4 use the master branch from github
gem "activeadmin-globalize", github: 'stefanoverna/activeadmin-globalize', branch: 'master'
Run Code Online (Sandbox Code Playgroud)

过滤器

默认情况下,已翻译属性的过滤器将不再有效:

filter :title
Run Code Online (Sandbox Code Playgroud)

必须改为:

# as: :string is required otherwise the filter won't be shown
filter :translations_name, as: :string
Run Code Online (Sandbox Code Playgroud)

排序

以下内容适用于已翻译的列:

# Admin: Categories.rb
index do
  column :title
end
Run Code Online (Sandbox Code Playgroud)

只要我们想要排序,就会出现错误,因为该列title不在DB中.

更新我只在某些型号上有此功能,当我失败时我不清楚.因此,对于某些型号,我必须禁用排序:

column :title, sortable: false
Run Code Online (Sandbox Code Playgroud)