i18n Padrino 0.12.2 with Mongoid 3.0.23 + Auto Locale

时间:2014-07-17 16:00:45

标签: ruby internationalization mongoid padrino

存储库:https://github.com/bcsantos/translate

直播实例:http://ta-translate.herokuapp.com/

直播实例管理员:http://ta-translate.herokuapp.com/admin(电子邮件:foo@bar.com pwd:foobar)


注意

,如下所述,目前我可以在管理员中更改区域设置的唯一方法是

set :locales, []

并刷新网站前端和管理员。这似乎不适用于实例。

I18n.default_locale = :pt_br
admin / app.rb中的

是我到目前为止在admin中设置语言环境的唯一方法,而

I18n.locale = :pt_br

不起作用。

https://github.com/bcsantos/translate/blob/master/admin/app.rb


#的boot.rb

Padrino.before_load do
  I18n.locale = :en
end

require 'padrino-contrib/auto_locale'

https://github.com/bcsantos/translate/blob/master/config/boot.rb

#app.rb

set :locales, [:en, :pt_br]

https://github.com/bcsantos/translate/blob/master/app/app.rb


问题A

switch_to_lang(:lang)

没有在这种情况下工作

%li.divider
%li
  =link_to "EN", switch_to_lang(:en)
%li.divider
%li
  =link_to "PT", switch_to_lang(:pt_br)

https://github.com/bcsantos/translate/blob/master/app/views/partials/_menu.haml

就目前而言,我能找到设置区域设置的唯一方法是

set :locales, [:en, :pt_br] # in front-end

I18n.default_locale = :pt_br # in admin

问题B

是一种在特定路线下包含所有路径的方法吗?

本地化的唯一网址是由

生成的
get :image, with: [:id, :name] do
  # params[:splat] still contains whatever is entered at the end
  amenity = Amenity.find(params[:id])
  content_type amenity.picture.content_type      
  #response.headers['Content-Length'] = amenity.picture.length
  response.write(amenity.picture.read)
  response.finish
end

https://github.com/bcsantos/translate/blob/master/app/controllers/amenities.rb

应生成http://tourapart.herokuapp.com/artworks/image/53ac2904895e9fa4f4000018/picture.jpg/picture 但是在localhost中的当前分支下得到类似

的内容
/amenities/image/5391dbdef2c796e026000001/picture.jpg?lang=en
因此找不到。有没有办法

set :locale_exclusive_paths, ['/amenities/image/']

包含该下的所有路线?正则表达式

set :locale_exclusive_paths, ['/\/amenities\/image\/*/']

没有工作。

<小时/> 问题C,......

页面已经消失,找不到,重命名模板以包含文件名中的语言环境在此之前没有做任何事情,语言环境数据适用于链接但不适用于模型属性:

%a= link_to "#{t "links.amenities"}".upcase!, '/amenities'

有效,但是:

class Amenity
  include Mongoid::Document
  include Mongoid::Timestamps # adds created_at and updated_at fields

  # field <name>, :type => <type>, :default => <value>

  field :name, localize: true, :type => String
  field :description, localize: true, :type => String
  field :category, localize: true, :type => String
  field :price, localize: true, :type => Integer
  field :phone, :type => String

  mount_uploader :picture, Uploader

  field :featured, :type => Boolean

  # You can define indexes on documents using the index macro:
  # index :field <, :unique => true>

  # You can create a composite key in mongoid to replace the default id using the key macro:
  # key :field <, :another_field, :one_more ....>
end

https://github.com/bcsantos/translate/blob/master/app/models/amenity.rb

更改admin中的属性名称,使用此yml:

pt_br:
  models:
    amenity: 
      name: Complemento
      attributes:
        created_at: Criado em
        updated_at: Actualizado em
        name: Nome
        description: Descrição
        category: Categoria
        price: Preço
        phone: Telefone
        medium: Meio
        featured: Destacado
        picture: Imagem

并不自行翻译模型名称

https://github.com/bcsantos/translate/blob/master/app/locale/models/amenity/pt_br.yml

最后,

url('path')

不生成本地化网址,不是吗?

简而言之,

  • 只有主页显示在前端;

  • 图像路线被破坏;

  • admin 确实翻译用户的onterface和模型属性名称,但不会翻译模型名称,在菜单中;

  • 但是,
  • admin会通过set:locales [](仅在开发模式下)更改时正确显示每个区域设置的字段,并且数据会保留。

1 个答案:

答案 0 :(得分:1)

让我们试一试。一步一步。

使用正确的 gem版本

你应该使用HEAD padrino-contrib。从最新发布的稳定版(v0.1.13)到master,它们似乎修复了许多关于auto_locale的错误。

# Gemfile
gem "padrino-contrib", github: "padrino/padrino-contrib"

设置区域设置

忘掉default_locale。它用于旧版本。在I18n.locale=中设置before_load是正确的做法。

尽管如此,在使用auto_locale时,此设置会被locales变量中设置的first locale覆盖。它根本没有设置,defaultsen

也就是说,为了保持一致性,我将I18n.locale=设置为locales数组的第一个元素的相同值。如果它被其他图书馆使用,例如发电机。

问题A

使用上面的设置,switch_to_lang按预期工作。它只是将传递的lang参数附加到request.path_info,从而生成:

# GET /admin
switch_to_lang(:en) # => /admin/en

问题B

是的,您可以在locale_exclusive_paths中使用正则表达式,但要注意引用正则表达式会将其转换为String。输入的padrino checks the type决定要排除的内容。

> "/foo/".is_a?(Regexp) # => false
> "/foo/".is_a?(String) # => true
> /foo/.is_a?(Regexp)   # => true
> /foo/.is_a?(String)   # => false

问题C

我从未使用过padrino-admin,所以我对此无能为力。但您是否尝试过model_translate(或mt)视图助手?

最后,url生成本地化的网址,但仅限于映射的路由,例如

# GET /en
# Suppose there is in your controller the following definition
# get :index { ... }
url("/") # => /
url(:index) # => /en

我真的希望有所帮助。 Padrino似乎是一个有趣的项目,但仍有改进的余地。如果您的项目变得更加复杂,即更多型号,控制器等,您可以考虑将其切换到轨道。

最佳!