Jakoś nikt nie podjął tematu ale … żeby nie zostawić problemu bez rozwiązania …
Udało mi się stworzyć działające rozwiązane w formie pluginu (mój pierwszy )
# <plugin_dir>/init.rb
require 'globalize_fields'
ActionView::Base.send :include, GlobalizeFields
[code=ruby]# <plugin_dir>/lib/globalize_fields.rb
module GlobalizeFields
LANGUAGES=[[“bg”,“Български”],[“cz”,“Český”],
[“en”,“English”],[“de”,“Deutsch”],[“fr”,“Français”],
[“hu”,“Magyar”],[“it”,“Italiano”],[“pl”,“Polski”],
[“ro”,“Română”],[“ru”,“Pусский”],
[“sl”,“Slovenský”],[“sp”,“Español”],
[“ua”,“Yкраїнський”]]
def globalize_tabs(object_name)
concat(content_tag(:div, nil, :id=>"#{object_name}tabnav", :class=>“tabnav”) do
concat(content_tag(:ul) do
(I18n.available_locales - [:root]).map do |l|
lang = LANGUAGES.assoc(l.to_s)[1]
content_tag(:li) do
link_to_function(lang,nil,:id=>"tabnav#{l}") do |page|
page << “$$('div.#{object_name}tab_content’).each(function(item){item.hide()})"
page << “$$(’.tab_active’).each(function(item){item.removeClassName(‘tab_active’)})”
page["#{object_name}tab_content#{l}"].show()
page["tabnav#{l}”].addClassName(‘tab_active’)
end
end
end
end)
end)
end
def globalize_show_first(object_name)
concat(update_page_tag do |page|
page << “$$(‘div.#{object_name}_tab_content’).first().show()”
page << “$$(‘div.tabnav a’).first().addClassName(‘tab_active’)”
end)
end
end
module ActionView
module Helpers
class FormBuilder
def globalize_fields(*args, &block)
@template.concat(%Q!
!)
@template.globalize_tabs(
@object_name)
fields_for(:globalize_translations, *args) do |g|
@template.concat(%Q!
!
)
block.call(g)
@template.concat("
")
end
@template.globalize_show_first(@object_name)
@template.concat("
")
end
end
end
end[/code]
I jeszcze przykład zastosowania:
[code=ruby]# app/models/group.rb
class Group < ActiveRecord::Base
translates :name
has_many :features
accepts_nested_attributes_for :globalize_translations
end
app/views/groups/new.html.erb
<% form_for(@group) do |f| %>
<%= render :partial => “form”, :locals => { :f => f } %>
<%= f.submit t('common.Create') %>
<% end %>
app/views/groups/_form.html.erb
<%= f.error_messages %>
<%= f.label :index %>
<%= f.text_field :index, :maxlength=>3 %>
<% f.globalize_fields do |g| %>
<%= g.hidden_field :locale %>
<%= f.label :name %>
<%= g.text_area :name,:size=>'35x5' %>
<% end %>[/code]
Kod pluginu nie jest jakiś szczególnie piękny ale działa. Może ktoś bardziej doświadczony zechciałby go skomentować/poprawić i możliwe że komuś się przyda takie rozwiązanie.