我有一个需要多语言的 Rails 项目。我在为我的 rails 项目启用 globalize 时遇到了一些问题。
我想知道是否有一个完整的清单/配方可以为 Rails 应用程序启用国际化。
请注意,我使用 ActiveAdmin,它也需要成为其中的一部分。
我有一个需要多语言的 Rails 项目。我在为我的 rails 项目启用 globalize 时遇到了一些问题。
我想知道是否有一个完整的清单/配方可以为 Rails 应用程序启用国际化。
请注意,我使用 ActiveAdmin,它也需要成为其中的一部分。
在您的 :中设置您希望支持的语言环境config/application.rb
:
config.i18n.available_locales = [:de, :en]
添加迁移,如Globalize 自述文件中所述
确保删除NOT NULL
对正在翻译的列的约束,因为它们将被迁移到新的翻译表:
change_column :categories, :title, :string, null: true
根据 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
''
译Globalize 为丢失的翻译提供了一种回退机制。我有点惊讶某些值在我的前端没有后备。这是由空白值引起的。为了解决这个问题,我必须fallbacks_for_empty_translations: true
为translates
方法调用添加选项:
translates :title, :description, fallbacks_for_empty_translations: true
注意:此选项也可用于active_admin_translates
方法调用。
使用翻译字段的范围也必须更改:
default_scope -> { order :title }
变成:
default_scope -> { order('category_translations.title').includes(:translations) }
有一个 gem 支持 Globalize 和 ActiveAdmin:
# For Rails 4 use the master branch from github
gem "activeadmin-globalize", github: 'stefanoverna/activeadmin-globalize', branch: 'master'
默认情况下,已翻译属性的过滤器将不再起作用:
filter :title
将不得不更改为:
# as: :string is required otherwise the filter won't be shown
filter :translations_name, as: :string
虽然以下适用于已翻译的列:
# Admin: Categories.rb
index do
column :title
end
一旦我们要排序,就会出现错误,因为该列title
不在数据库中。
更新我只在某些型号上有这个,当它失败时我不清楚。所以对于某些模型我不得不禁用排序:
column :title, sortable: false