1
0
Fork 0
mirror of https://github.com/aasm/aasm synced 2023-03-27 23:22:41 -04:00

Merge pull request #28 from etehtsea/i18n

I18n support
This commit is contained in:
Thorsten Böttger 2011-09-02 09:40:44 -07:00
commit d92a679def
5 changed files with 116 additions and 2 deletions

View file

@ -7,3 +7,4 @@ require File.join(File.dirname(__FILE__), 'aasm', 'supporting_classes')
require File.join(File.dirname(__FILE__), 'aasm', 'state_machine')
require File.join(File.dirname(__FILE__), 'aasm', 'persistence')
require File.join(File.dirname(__FILE__), 'aasm', 'aasm')
require File.join(File.dirname(__FILE__), 'aasm', 'i18n')

View file

@ -7,6 +7,7 @@ module AASM
def self.included(base) #:nodoc:
base.extend AASM::ClassMethods
AASM::Persistence.set_persistence(base)
unless AASM::StateMachine[base]
AASM::StateMachine[base] = AASM::StateMachine.new('')
@ -41,7 +42,7 @@ module AASM
aasm_current_state == name
end
end
def aasm_event(name, options = {}, &block)
sm = AASM::StateMachine[self]
@ -70,8 +71,11 @@ module AASM
AASM::StateMachine[self].states.map { |state| state.for_select }
end
def human_event_name(event)
AASM::I18n.new.human_event_name(self, event)
end
end
# Instance methods
def aasm_current_state
return @aasm_current_state if @aasm_current_state
@ -105,6 +109,10 @@ module AASM
events.map {|event| event.name}
end
def human_state
AASM::I18n.new.human_state(self)
end
private
def set_aasm_current_state_with_persistence(state)

36
lib/aasm/i18n.rb Normal file
View file

@ -0,0 +1,36 @@
class AASM::I18n
def human_event_name(klass, event)
defaults = ancestors_list(klass).map do |ancestor|
:"#{i18n_scope(klass)}.events.#{i18n_klass(ancestor)}.#{event}"
end << event.to_s.humanize
I18n.translate(defaults.shift, :default => defaults, :raise => true)
end
def human_state(obj)
klass = obj.class
defaults = ancestors_list(klass).map do |ancestor|
:"#{i18n_scope(klass)}.attributes.#{i18n_klass(ancestor)}.#{klass.aasm_column}.#{obj.aasm_current_state}"
end << obj.aasm_current_state.to_s.humanize
I18n.translate(defaults.shift, :default => defaults, :raise => true)
end
private
# added for rails 2.x compatibility
def i18n_scope(klass)
klass.respond_to?(:i18n_scope) ? klass.i18n_scope : :activerecord
end
# added for rails < 3.0.3 compatibility
def i18n_klass(klass)
klass.model_name.respond_to?(:i18n_key) ? klass.model_name.i18n_key : klass.name.underscore
end
def ancestors_list(klass)
klass.ancestors.select do |ancestor|
ancestor.respond_to?(:model_name) unless ancestor == ActiveRecord::Base
end
end
end

10
spec/en.yml Normal file
View file

@ -0,0 +1,10 @@
en:
activerecord:
events:
i18n_test_model:
close: "Let's close it!"
attributes:
i18n_test_model:
aasm_state:
open: "It's opened now!"

59
spec/unit/i18n_spec.rb Normal file
View file

@ -0,0 +1,59 @@
require 'spec_helper'
require 'active_record'
require 'logger'
require 'i18n'
ActiveRecord::Base.logger = Logger.new(STDERR)
class Connection
end
class I18nTestModel < ActiveRecord::Base
include AASM
attr_accessor :aasm_state
aasm_initial_state :open
aasm_state :opened
aasm_state :closed
aasm_event :close
aasm_event :open
end
describe AASM::I18n do
before(:all) do
I18n.load_path << 'spec/en.yml'
I18n.default_locale = :en
end
after(:all) { I18n.load_path.clear }
before do
connection = mock(Connection, :columns => [])
I18nTestModel.stub!(:connection).and_return(connection)
end
let (:foo_opened) { I18nTestModel.new }
let (:foo_closed) { I18nTestModel.new.tap { |x| x.aasm_state = :closed } }
context '.human_state' do
it 'should return translated state value' do
foo_opened.human_state.should == "It's opened now!"
end
it 'should return humanized value if not localized' do
foo_closed.human_state.should == "Closed"
end
end
context '.human_event_name' do
it 'should return translated event name' do
I18nTestModel.human_event_name(:close).should == "Let's close it!"
end
it 'should return humanized event name' do
I18nTestModel.human_event_name(:open).should == "Open"
end
end
end