diff --git a/lib/redmine/i18n.rb b/lib/redmine/i18n.rb index 1e52439fc..b1066539f 100644 --- a/lib/redmine/i18n.rb +++ b/lib/redmine/i18n.rb @@ -159,14 +159,14 @@ module Redmine # * available_locales are determined by looking at translation file names class Backend < ::I18n::Backend::Simple module Implementation - include ::I18n::Backend::Pluralization - # Get available locales from the translations filenames def available_locales @available_locales ||= ::I18n.load_path.map {|path| File.basename(path, '.*')}.uniq.sort.map(&:to_sym) end end + # Adds custom pluralization rules + include ::I18n::Backend::Pluralization # Adds fallback to default locale for untranslated strings include ::I18n::Backend::Fallbacks end diff --git a/test/unit/lib/redmine/i18n_test.rb b/test/unit/lib/redmine/i18n_test.rb index 4856c5190..4e15ae56b 100644 --- a/test/unit/lib/redmine/i18n_test.rb +++ b/test/unit/lib/redmine/i18n_test.rb @@ -255,4 +255,13 @@ class Redmine::I18nTest < ActiveSupport::TestCase set_language_if_valid 'fr' assert_equal 'French (Français)', l(:general_lang_name) end + + def test_custom_pluralization_rules + I18n.backend.store_translations :pt, i18n: {plural: {rule: ->(n) {[0, 1].include?(n) ? :one : :other }}} + I18n.backend.store_translations :pt, apples: {one: 'one or none', other: 'more than one'} + assert_equal 'one or none', ll(:pt, :apples, count: 0) + assert_equal 'more than one', ll(:pt, :apples, count: 2) + ensure + I18n.reload! + end end