Module: Redmine::I18n

Defined Under Namespace

Classes: Backend

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



26
27
28
# File 'lib/redmine/i18n.rb', line 26

def self.included(base)
  base.extend Redmine::I18n
end

Instance Method Details

#abbr_day_name(day) ⇒ Object



120
121
122
# File 'lib/redmine/i18n.rb', line 120

def abbr_day_name(day)
  ::I18n.t('date.abbr_day_names')[day % 7]
end

#current_languageObject



172
173
174
# File 'lib/redmine/i18n.rb', line 172

def current_language
  ::I18n.locale
end

#day_letter(day) ⇒ Object



124
125
126
# File 'lib/redmine/i18n.rb', line 124

def day_letter(day)
  ::I18n.t('date.abbr_day_names')[day % 7].first
end

#day_name(day) ⇒ Object



116
117
118
# File 'lib/redmine/i18n.rb', line 116

def day_name(day)
  ::I18n.t('date.day_names')[day % 7]
end

#find_language(lang) ⇒ Object



157
158
159
160
161
162
163
164
# File 'lib/redmine/i18n.rb', line 157

def find_language(lang)
  @@languages_lookup ||=
    valid_languages.inject({}) do |k, v|
      k[v.to_s.downcase] = v
      k
    end
  @@languages_lookup[lang.to_s.downcase]
end

#format_date(date) ⇒ Object



73
74
75
76
77
78
79
# File 'lib/redmine/i18n.rb', line 73

def format_date(date)
  return nil unless date

  options = {}
  options[:format] = Setting.date_format unless Setting.date_format.blank?
  ::I18n.l(date.to_date, **options)
end

#format_hours(hours) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
# File 'lib/redmine/i18n.rb', line 92

def format_hours(hours)
  return "" if hours.blank?

  minutes = (hours * 60).round
  if Setting.timespan_format == 'minutes'
    h, m = minutes.divmod(60)
    "%d:%02d" % [h, m]
  else
    number_with_delimiter(sprintf('%.2f', minutes.fdiv(60)), delimiter: nil)
  end
end

#format_time(time, include_date = true, user = nil) ⇒ Object



81
82
83
84
85
86
87
88
89
90
# File 'lib/redmine/i18n.rb', line 81

def format_time(time, include_date=true, user=nil)
  return nil unless time

  user ||= User.current
  options = {}
  options[:format] = (Setting.time_format.blank? ? :time : Setting.time_format)
  time = time.to_time if time.is_a?(String)
  local = user.convert_time_to_user_timezone(time)
  (include_date ? "#{format_date(local)} " : "") + ::I18n.l(local, **options)
end

#l(*args) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/redmine/i18n.rb', line 30

def l(*args)
  case args.size
  when 1
    ::I18n.t(*args)
  when 2
    if args.last.is_a?(Hash)
      ::I18n.t(*args.first, **args.last)
    elsif args.last.is_a?(String)
      ::I18n.t(args.first, :value => args.last)
    else
      ::I18n.t(args.first, :count => args.last)
    end
  else
    raise "Translation string with multiple values: #{args.first}"
  end
end

#l_hours(hours) ⇒ Object



52
53
54
55
# File 'lib/redmine/i18n.rb', line 52

def l_hours(hours)
  hours = hours.to_f unless hours.is_a?(Numeric)
  l((hours < 2.0 ? :label_f_hour : :label_f_hour_plural), :value => format_hours(hours))
end

#l_hours_short(hours) ⇒ Object



57
58
59
# File 'lib/redmine/i18n.rb', line 57

def l_hours_short(hours)
  l(:label_f_hour_short, :value => format_hours(hours.is_a?(Numeric) ? hours : hours.to_f))
end

#l_or_humanize(s, options = {}) ⇒ Object



47
48
49
50
# File 'lib/redmine/i18n.rb', line 47

def l_or_humanize(s, options={})
  k = :"#{options[:prefix]}#{s}"
  ::I18n.t(k, :default => s.to_s.humanize)
end

#languages_options(options = {}) ⇒ Object

Returns an array of languages names and code sorted by names, example:

[“Deutsch”, “de”], [“English”, “en”

…]

The result is cached to prevent from loading all translations files unless :cache => false option is given



141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/redmine/i18n.rb', line 141

def languages_options(options={})
  options =
    if options[:cache] == false
      available_locales = ::I18n.backend.available_locales
      valid_languages.
        select {|locale| available_locales.include?(locale)}.
        map {|lang| [ll(lang.to_s, :general_lang_name), lang.to_s]}.
        sort_by(&:first)
    else
      ActionController::Base.cache_store.fetch "i18n/languages_options/#{Redmine::VERSION}" do
        languages_options :cache => false
      end
    end
  options.map {|name, lang| [name.force_encoding("UTF-8"), lang.force_encoding("UTF-8")]}
end

#ll(lang, str, arg = nil) ⇒ Object



61
62
63
64
65
# File 'lib/redmine/i18n.rb', line 61

def ll(lang, str, arg=nil)
  options = arg.is_a?(Hash) ? arg : {:value => arg}
  locale = lang.to_s.gsub(%r{(.+)\-(.+)$}) {"#{$1}-#{$2.upcase}"}
  ::I18n.t(str.to_s, **options, locale: locale)
end

#lu(user, *args) ⇒ Object

Localizes the given args with user’s language



68
69
70
71
# File 'lib/redmine/i18n.rb', line 68

def lu(user, *args)
  lang = user.try(:language).presence || Setting.default_language
  ll(lang, *args)
end

#month_name(month) ⇒ Object



128
129
130
# File 'lib/redmine/i18n.rb', line 128

def month_name(month)
  ::I18n.t('date.month_names')[month]
end

#normalize_float(value) ⇒ Object

Note:

The delimiter cannot be used here if it is a decimal point since it will clash with the dot separator.

Will consider language specific separator in user input and normalize them to a unified format to be accepted by Kernel.Float().

Parameters:

  • value (String)

    A string represenation of a float value.



111
112
113
114
# File 'lib/redmine/i18n.rb', line 111

def normalize_float(value)
  separator = ::I18n.t('number.format.separator')
  value.gsub(/[#{separator}]/, separator => '.')
end

#set_language_if_valid(lang) ⇒ Object



166
167
168
169
170
# File 'lib/redmine/i18n.rb', line 166

def set_language_if_valid(lang)
  if l = find_language(lang)
    ::I18n.locale = l
  end
end

#valid_languagesObject



132
133
134
# File 'lib/redmine/i18n.rb', line 132

def valid_languages
  ::I18n.available_locales
end