You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

i18n_test.rb 7.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. # frozen_string_literal: true
  2. # Redmine - project management software
  3. # Copyright (C) 2006-2022 Jean-Philippe Lang
  4. #
  5. # This program is free software; you can redistribute it and/or
  6. # modify it under the terms of the GNU General Public License
  7. # as published by the Free Software Foundation; either version 2
  8. # of the License, or (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program; if not, write to the Free Software
  17. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18. require File.expand_path('../../../../test_helper', __FILE__)
  19. class Redmine::I18nTest < ActiveSupport::TestCase
  20. include Redmine::I18n
  21. include ActionView::Helpers::NumberHelper
  22. def setup
  23. User.current = nil
  24. end
  25. def teardown
  26. set_language_if_valid 'en'
  27. end
  28. def test_date_format_default
  29. set_language_if_valid 'en'
  30. today = Date.today
  31. with_settings :date_format => '' do
  32. assert_equal I18n.l(today), format_date(today)
  33. end
  34. end
  35. def test_date_format
  36. set_language_if_valid 'en'
  37. today = Date.today
  38. with_settings :date_format => '%d %m %Y' do
  39. assert_equal today.strftime('%d %m %Y'), format_date(today)
  40. end
  41. end
  42. def test_date_format_with_month_name_should_translate_with_current_locale
  43. set_language_if_valid 'es'
  44. date = Date.parse('2011-02-20 14:00:00')
  45. with_settings :date_format => '%d %B %Y' do
  46. assert_equal '20 Febrero 2011', format_date(date)
  47. end
  48. end
  49. def test_date_and_time_for_each_language
  50. with_settings :date_format => '' do
  51. valid_languages.each do |lang|
  52. set_language_if_valid lang
  53. assert_nothing_raised do
  54. format_date(Date.today)
  55. format_time(Time.now)
  56. format_time(Time.now, false)
  57. assert_not_equal 'default', ::I18n.l(Date.today, :format => :default),
  58. "date.formats.default missing in #{lang}"
  59. assert_not_equal 'time', ::I18n.l(Time.now, :format => :time),
  60. "time.formats.time missing in #{lang}"
  61. end
  62. assert l('date.day_names').is_a?(Array)
  63. assert_equal 7, l('date.day_names').size
  64. assert l('date.month_names').is_a?(Array)
  65. assert_equal 13, l('date.month_names').size
  66. end
  67. end
  68. end
  69. def test_time_for_each_zone
  70. ActiveSupport::TimeZone.all.each do |zone|
  71. User.current.stubs(:time_zone).returns(zone.name)
  72. assert_nothing_raised do
  73. format_time(Time.now)
  74. end
  75. end
  76. end
  77. def test_time_format
  78. set_language_if_valid 'en'
  79. now = Time.parse('2011-02-20 15:45:22')
  80. with_settings :time_format => '%H:%M' do
  81. with_settings :date_format => '' do
  82. assert_equal '02/20/2011 15:45', format_time(now)
  83. assert_equal '15:45', format_time(now, false)
  84. end
  85. with_settings :date_format => '%Y-%m-%d' do
  86. assert_equal '2011-02-20 15:45', format_time(now)
  87. assert_equal '15:45', format_time(now, false)
  88. end
  89. end
  90. end
  91. def test_time_format_default
  92. set_language_if_valid 'en'
  93. now = Time.parse('2011-02-20 15:45:22')
  94. with_settings :time_format => '' do
  95. with_settings :date_format => '' do
  96. assert_equal '02/20/2011 03:45 PM', format_time(now)
  97. assert_equal '03:45 PM', format_time(now, false)
  98. end
  99. with_settings :date_format => '%Y-%m-%d' do
  100. assert_equal '2011-02-20 03:45 PM', format_time(now)
  101. assert_equal '03:45 PM', format_time(now, false)
  102. end
  103. end
  104. end
  105. def test_utc_time_format
  106. set_language_if_valid 'en'
  107. now = Time.now
  108. with_settings :date_format => '%d %m %Y', :time_format => '%H %M' do
  109. assert_equal now.localtime.strftime('%d %m %Y %H %M'), format_time(now.utc), "User time zone was #{User.current.time_zone}"
  110. assert_equal now.localtime.strftime('%H %M'), format_time(now.utc, false)
  111. end
  112. end
  113. def test_number_to_human_size_for_each_language
  114. valid_languages.each do |lang|
  115. set_language_if_valid lang
  116. assert_nothing_raised do
  117. size = number_to_human_size(257024)
  118. assert_match /251/, size, "#{lang} failure"
  119. end
  120. end
  121. end
  122. def test_day_name
  123. set_language_if_valid 'fr'
  124. assert_equal 'dimanche', day_name(0)
  125. assert_equal 'jeudi', day_name(4)
  126. end
  127. def test_day_letter
  128. set_language_if_valid 'fr'
  129. assert_equal 'd', day_letter(0)
  130. assert_equal 'j', day_letter(4)
  131. end
  132. def test_number_to_currency_for_each_language
  133. valid_languages.each do |lang|
  134. set_language_if_valid lang
  135. assert_nothing_raised do
  136. number_to_currency(-1000.2)
  137. end
  138. end
  139. end
  140. def test_l_hours_short
  141. set_language_if_valid 'en'
  142. assert_equal '2:00 h', l_hours_short(2.0)
  143. end
  144. def test_number_to_currency_default
  145. set_language_if_valid 'bs'
  146. assert_equal "KM -1000,20", number_to_currency(-1000.2)
  147. set_language_if_valid 'de'
  148. assert_equal '-1000,20 €', number_to_currency(-1000.2)
  149. end
  150. def test_lu_should_not_error_when_user_language_is_an_empty_string
  151. user = User.new
  152. user.language = ''
  153. assert_nothing_raised do
  154. lu(user, :label_issue)
  155. end
  156. end
  157. def test_valid_languages
  158. assert valid_languages.is_a?(Array)
  159. assert valid_languages.first.is_a?(Symbol)
  160. end
  161. def test_languages_options
  162. options = languages_options
  163. assert options.is_a?(Array)
  164. assert_equal valid_languages.size, options.size
  165. assert_nil options.detect {|option| !option.is_a?(Array)}
  166. assert_nil options.detect {|option| option.size != 2}
  167. assert_nil options.detect {|option| !option.first.is_a?(String) || !option.last.is_a?(String)}
  168. assert_include ["English", "en"], options
  169. assert_include ['Japanese (日本語)', "ja"], options
  170. end
  171. def test_languages_options_should_return_strings_with_utf8_encoding
  172. strings = languages_options.flatten
  173. assert_equal ["UTF-8"], strings.map(&:encoding).uniq.map(&:name).sort
  174. end
  175. def test_languages_options_should_ignore_locales_without_general_lang_name_key
  176. stubs(:valid_languages).returns([:en, :foo])
  177. assert_equal [["English", "en"]], languages_options(:cache => false)
  178. end
  179. def test_locales_validness
  180. lang_files_count = Dir["#{Rails.root}/config/locales/*.yml"].size
  181. assert_equal lang_files_count, valid_languages.size
  182. valid_languages.each do |lang|
  183. assert set_language_if_valid(lang)
  184. end
  185. set_language_if_valid('en')
  186. end
  187. def test_valid_language
  188. to_test = {'fr' => :fr,
  189. 'Fr' => :fr,
  190. 'zh' => :zh,
  191. 'zh-tw' => :"zh-TW",
  192. 'zh-TW' => :"zh-TW"}
  193. to_test.each {|lang, expected| assert_equal expected, find_language(lang)}
  194. end
  195. def test_find_language_with_invalid_language_should_return_nil
  196. assert_nil find_language('zh-ZZ')
  197. end
  198. def test_fallback
  199. ::I18n.backend.store_translations(:en, {:untranslated => "Untranslated string"})
  200. ::I18n.locale = 'en'
  201. assert_equal "Untranslated string", l(:untranslated)
  202. ::I18n.locale = 'fr'
  203. assert_equal "Untranslated string", l(:untranslated)
  204. ::I18n.backend.store_translations(:fr, {:untranslated => "Pas de traduction"})
  205. ::I18n.locale = 'en'
  206. assert_equal "Untranslated string", l(:untranslated)
  207. ::I18n.locale = 'fr'
  208. assert_equal "Pas de traduction", l(:untranslated)
  209. end
  210. def test_utf8
  211. set_language_if_valid 'ja'
  212. i18n_ja_yes = l(:general_text_Yes)
  213. assert_equal 'はい', i18n_ja_yes
  214. assert_equal "UTF-8", i18n_ja_yes.encoding.to_s
  215. end
  216. def test_traditional_chinese_locale
  217. set_language_if_valid 'zh-TW'
  218. assert_equal 'Chinese/Traditional (繁體中文)', l(:general_lang_name)
  219. end
  220. def test_french_locale
  221. set_language_if_valid 'fr'
  222. assert_equal 'French (Français)', l(:general_lang_name)
  223. end
  224. end