##// END OF EJS Templates
Manually require i18n 0.4.2 before Rails tries to load the most recent gem (#7013)....
Jean-Philippe Lang -
r4402:3c1576e364c9
parent child
Show More
@@ -1,110 +1,122
1 1 # Don't change this file!
2 2 # Configure your app in config/environment.rb and config/environments/*.rb
3 3
4 4 RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
5 5
6 6 module Rails
7 7 class << self
8 8 def boot!
9 9 unless booted?
10 10 preinitialize
11 11 pick_boot.run
12 12 end
13 13 end
14 14
15 15 def booted?
16 16 defined? Rails::Initializer
17 17 end
18 18
19 19 def pick_boot
20 20 (vendor_rails? ? VendorBoot : GemBoot).new
21 21 end
22 22
23 23 def vendor_rails?
24 24 File.exist?("#{RAILS_ROOT}/vendor/rails")
25 25 end
26 26
27 27 def preinitialize
28 28 load(preinitializer_path) if File.exist?(preinitializer_path)
29 29 end
30 30
31 31 def preinitializer_path
32 32 "#{RAILS_ROOT}/config/preinitializer.rb"
33 33 end
34 34 end
35 35
36 36 class Boot
37 37 def run
38 38 load_initializer
39 39 Rails::Initializer.run(:set_load_path)
40 40 end
41 41 end
42 42
43 43 class VendorBoot < Boot
44 44 def load_initializer
45 45 require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
46 46 Rails::Initializer.run(:install_gem_spec_stubs)
47 47 Rails::GemDependency.add_frozen_gem_path
48 48 end
49 49 end
50 50
51 51 class GemBoot < Boot
52 52 def load_initializer
53 53 self.class.load_rubygems
54 54 load_rails_gem
55 55 require 'initializer'
56 56 end
57 57
58 58 def load_rails_gem
59 59 if version = self.class.gem_version
60 60 gem 'rails', version
61 61 else
62 62 gem 'rails'
63 63 end
64 64 rescue Gem::LoadError => load_error
65 65 $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
66 66 exit 1
67 67 end
68 68
69 69 class << self
70 70 def rubygems_version
71 71 Gem::RubyGemsVersion rescue nil
72 72 end
73 73
74 74 def gem_version
75 75 if defined? RAILS_GEM_VERSION
76 76 RAILS_GEM_VERSION
77 77 elsif ENV.include?('RAILS_GEM_VERSION')
78 78 ENV['RAILS_GEM_VERSION']
79 79 else
80 80 parse_gem_version(read_environment_rb)
81 81 end
82 82 end
83 83
84 84 def load_rubygems
85 85 min_version = '1.3.2'
86 86 require 'rubygems'
87 87 unless rubygems_version >= min_version
88 88 $stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.)
89 89 exit 1
90 90 end
91 91
92 92 rescue LoadError
93 93 $stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org)
94 94 exit 1
95 95 end
96 96
97 97 def parse_gem_version(text)
98 98 $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
99 99 end
100 100
101 101 private
102 102 def read_environment_rb
103 103 File.read("#{RAILS_ROOT}/config/environment.rb")
104 104 end
105 105 end
106 106 end
107 107 end
108 108
109 # TODO: Workaround for #7013 to be removed for 1.2.0
110 # Loads i18n 0.4.2 before Rails loads any more recent gem
111 # 0.5.0 is not compatible with the old interpolation syntax
112 # Plugins will have to migrate to the new syntax for 1.2.0
113 require 'rubygems'
114 begin
115 gem 'i18n', '0.4.2'
116 rescue Gem::LoadError => load_error
117 $stderr.puts %(Missing the i18n 0.4.2 gem. Please `gem install -v=0.4.2 i18n`)
118 exit 1
119 end
120
109 121 # All that for this:
110 122 Rails.boot!
@@ -1,104 +1,104
1 1
2 2 require 'active_record'
3 3
4 4 module ActiveRecord
5 5 class Base
6 6 include Redmine::I18n
7 7
8 8 # Translate attribute names for validation errors display
9 9 def self.human_attribute_name(attr)
10 10 l("field_#{attr.to_s.gsub(/_id$/, '')}")
11 11 end
12 12 end
13 13 end
14 14
15 15 module ActiveRecord
16 16 class Errors
17 17 def full_messages(options = {})
18 18 full_messages = []
19 19
20 20 @errors.each_key do |attr|
21 21 @errors[attr].each do |message|
22 22 next unless message
23 23
24 24 if attr == "base"
25 25 full_messages << message
26 26 elsif attr == "custom_values"
27 27 # Replace the generic "custom values is invalid"
28 28 # with the errors on custom values
29 29 @base.custom_values.each do |value|
30 30 value.errors.each do |attr, msg|
31 31 full_messages << value.custom_field.name + ' ' + msg
32 32 end
33 33 end
34 34 else
35 35 attr_name = @base.class.human_attribute_name(attr)
36 36 full_messages << attr_name + ' ' + message.to_s
37 37 end
38 38 end
39 39 end
40 40 full_messages
41 41 end
42 42 end
43 43 end
44 44
45 45 module ActionView
46 46 module Helpers
47 47 module DateHelper
48 48 # distance_of_time_in_words breaks when difference is greater than 30 years
49 49 def distance_of_date_in_words(from_date, to_date = 0, options = {})
50 50 from_date = from_date.to_date if from_date.respond_to?(:to_date)
51 51 to_date = to_date.to_date if to_date.respond_to?(:to_date)
52 52 distance_in_days = (to_date - from_date).abs
53 53
54 54 I18n.with_options :locale => options[:locale], :scope => :'datetime.distance_in_words' do |locale|
55 55 case distance_in_days
56 56 when 0..60 then locale.t :x_days, :count => distance_in_days.round
57 57 when 61..720 then locale.t :about_x_months, :count => (distance_in_days / 30).round
58 58 else locale.t :over_x_years, :count => (distance_in_days / 365).floor
59 59 end
60 60 end
61 61 end
62 62 end
63 63 end
64 64 end
65 65
66 66 ActionView::Base.field_error_proc = Proc.new{ |html_tag, instance| "#{html_tag}" }
67 67
68 68 # Adds :async_smtp and :async_sendmail delivery methods
69 69 # to perform email deliveries asynchronously
70 70 module AsynchronousMailer
71 71 %w(smtp sendmail).each do |type|
72 72 define_method("perform_delivery_async_#{type}") do |mail|
73 73 Thread.start do
74 74 send "perform_delivery_#{type}", mail
75 75 end
76 76 end
77 77 end
78 78 end
79 79
80 80 ActionMailer::Base.send :include, AsynchronousMailer
81 81
82 82 # TODO: Hack to support i18n 4.x on Rails 2.3.5. Remove post 2.3.6.
83 83 # See http://www.redmine.org/issues/6428 and http://www.redmine.org/issues/5608
84 84 module I18n
85 85 module Backend
86 86 module Base
87 87 def warn_syntax_deprecation!(*args)
88 88 return if @skip_syntax_deprecation
89 warn "The {{key}} interpolation syntax in I18n messages is deprecated. Please use %{key} instead.\nDowngrade your i18n gem to 0.3.7 (everything above must be deinstalled) to remove this warning, see http://www.redmine.org/issues/5608 for more information."
89 warn "The {{key}} interpolation syntax in I18n messages is deprecated and will be removed in Redmine 1.2. Please use %{key} instead, see http://www.redmine.org/issues/7013 for more information."
90 90 @skip_syntax_deprecation = true
91 91 end
92 92 end
93 93 end
94 94 end
95 95
96 96 module ActionController
97 97 module MimeResponds
98 98 class Responder
99 99 def api(&block)
100 100 any(:xml, :json, &block)
101 101 end
102 102 end
103 103 end
104 104 end
@@ -1,79 +1,79
1 1 module Redmine
2 2 module I18n
3 3 def self.included(base)
4 4 base.extend Redmine::I18n
5 5 end
6 6
7 7 def l(*args)
8 8 case args.size
9 9 when 1
10 10 ::I18n.t(*args)
11 11 when 2
12 12 if args.last.is_a?(Hash)
13 13 ::I18n.t(*args)
14 14 elsif args.last.is_a?(String)
15 15 ::I18n.t(args.first, :value => args.last)
16 16 else
17 17 ::I18n.t(args.first, :count => args.last)
18 18 end
19 19 else
20 20 raise "Translation string with multiple values: #{args.first}"
21 21 end
22 22 end
23 23
24 24 def l_or_humanize(s, options={})
25 25 k = "#{options[:prefix]}#{s}".to_sym
26 26 ::I18n.t(k, :default => s.to_s.humanize)
27 27 end
28 28
29 29 def l_hours(hours)
30 30 hours = hours.to_f
31 31 l((hours < 2.0 ? :label_f_hour : :label_f_hour_plural), :value => ("%.2f" % hours.to_f))
32 32 end
33 33
34 34 def ll(lang, str, value=nil)
35 35 ::I18n.t(str.to_s, :value => value, :locale => lang.to_s.gsub(%r{(.+)\-(.+)$}) { "#{$1}-#{$2.upcase}" })
36 36 end
37 37
38 38 def format_date(date)
39 39 return nil unless date
40 Setting.date_format.blank? ? ::I18n.l(date.to_date, :count => date.strftime('%d')) : date.strftime(Setting.date_format)
40 Setting.date_format.blank? ? ::I18n.l(date.to_date) : date.strftime(Setting.date_format)
41 41 end
42 42
43 43 def format_time(time, include_date = true)
44 44 return nil unless time
45 45 time = time.to_time if time.is_a?(String)
46 46 zone = User.current.time_zone
47 47 local = zone ? time.in_time_zone(zone) : (time.utc? ? time.localtime : time)
48 Setting.time_format.blank? ? ::I18n.l(local, :count => local.strftime('%d'), :format => (include_date ? :default : :time)) :
48 Setting.time_format.blank? ? ::I18n.l(local, :format => (include_date ? :default : :time)) :
49 49 ((include_date ? "#{format_date(time)} " : "") + "#{local.strftime(Setting.time_format)}")
50 50 end
51 51
52 52 def day_name(day)
53 53 ::I18n.t('date.day_names')[day % 7]
54 54 end
55 55
56 56 def month_name(month)
57 57 ::I18n.t('date.month_names')[month]
58 58 end
59 59
60 60 def valid_languages
61 61 @@valid_languages ||= Dir.glob(File.join(RAILS_ROOT, 'config', 'locales', '*.yml')).collect {|f| File.basename(f).split('.').first}.collect(&:to_sym)
62 62 end
63 63
64 64 def find_language(lang)
65 65 @@languages_lookup = valid_languages.inject({}) {|k, v| k[v.to_s.downcase] = v; k }
66 66 @@languages_lookup[lang.to_s.downcase]
67 67 end
68 68
69 69 def set_language_if_valid(lang)
70 70 if l = find_language(lang)
71 71 ::I18n.locale = l
72 72 end
73 73 end
74 74
75 75 def current_language
76 76 ::I18n.locale
77 77 end
78 78 end
79 79 end
@@ -1,112 +1,112
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2009 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require File.expand_path('../../../../test_helper', __FILE__)
19 19
20 20 class Redmine::I18nTest < ActiveSupport::TestCase
21 21 include Redmine::I18n
22 22 include ActionView::Helpers::NumberHelper
23 23
24 24 def setup
25 25 @hook_module = Redmine::Hook
26 26 end
27 27
28 28 def test_date_format_default
29 29 set_language_if_valid 'en'
30 30 today = Date.today
31 31 Setting.date_format = ''
32 assert_equal I18n.l(today, :count => today.strftime('%d')), format_date(today)
32 assert_equal I18n.l(today), format_date(today)
33 33 end
34 34
35 35 def test_date_format
36 36 set_language_if_valid 'en'
37 37 today = Date.today
38 38 Setting.date_format = '%d %m %Y'
39 39 assert_equal today.strftime('%d %m %Y'), format_date(today)
40 40 end
41 41
42 42 def test_date_and_time_for_each_language
43 43 Setting.date_format = ''
44 44 valid_languages.each do |lang|
45 45 set_language_if_valid lang
46 46 assert_nothing_raised "#{lang} failure" do
47 47 format_date(Date.today)
48 48 format_time(Time.now)
49 49 format_time(Time.now, false)
50 assert_not_equal 'default', ::I18n.l(Date.today, :count => Date.today.strftime('%d'), :format => :default), "date.formats.default missing in #{lang}"
50 assert_not_equal 'default', ::I18n.l(Date.today, :format => :default), "date.formats.default missing in #{lang}"
51 51 assert_not_equal 'time', ::I18n.l(Time.now, :format => :time), "time.formats.time missing in #{lang}"
52 52 end
53 53 assert l('date.day_names').is_a?(Array)
54 54 assert_equal 7, l('date.day_names').size
55 55
56 56 assert l('date.month_names').is_a?(Array)
57 57 assert_equal 13, l('date.month_names').size
58 58 end
59 59 end
60 60
61 61 def test_time_format_default
62 62 set_language_if_valid 'en'
63 63 now = Time.now
64 64 Setting.date_format = ''
65 65 Setting.time_format = ''
66 assert_equal I18n.l(now, :count => now.strftime('%d')), format_time(now)
67 assert_equal I18n.l(now, :count => now.strftime('%d'), :format => :time), format_time(now, false)
66 assert_equal I18n.l(now), format_time(now)
67 assert_equal I18n.l(now, :format => :time), format_time(now, false)
68 68 end
69 69
70 70 def test_time_format
71 71 set_language_if_valid 'en'
72 72 now = Time.now
73 73 Setting.date_format = '%d %m %Y'
74 74 Setting.time_format = '%H %M'
75 75 assert_equal now.strftime('%d %m %Y %H %M'), format_time(now)
76 76 assert_equal now.strftime('%H %M'), format_time(now, false)
77 77 end
78 78
79 79 def test_utc_time_format
80 80 set_language_if_valid 'en'
81 81 now = Time.now.utc
82 82 Setting.date_format = '%d %m %Y'
83 83 Setting.time_format = '%H %M'
84 84 assert_equal Time.now.strftime('%d %m %Y %H %M'), format_time(now)
85 85 assert_equal Time.now.strftime('%H %M'), format_time(now, false)
86 86 end
87 87
88 88 def test_number_to_human_size_for_each_language
89 89 valid_languages.each do |lang|
90 90 set_language_if_valid lang
91 91 assert_nothing_raised "#{lang} failure" do
92 92 number_to_human_size(1024*1024*4)
93 93 end
94 94 end
95 95 end
96 96
97 97 def test_valid_languages
98 98 assert valid_languages.is_a?(Array)
99 99 assert valid_languages.first.is_a?(Symbol)
100 100 end
101 101
102 102 def test_valid_language
103 103 to_test = {'fr' => :fr,
104 104 'Fr' => :fr,
105 105 'zh' => :zh,
106 106 'zh-tw' => :"zh-TW",
107 107 'zh-TW' => :"zh-TW",
108 108 'zh-ZZ' => nil }
109 109
110 110 to_test.each {|lang, expected| assert_equal expected, find_language(lang)}
111 111 end
112 112 end
General Comments 0
You need to be logged in to leave comments. Login now