From 2e7e70b901b061e5b1bc7bce6e21f87eecb442b2 Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Sat, 17 May 2025 18:21:21 +0300 Subject: [PATCH] Adapt basic language select to update multiple language values --- .../basic_preferences_controller.rb | 10 +++- .../basic_preferences_controller_test.rb | 52 +++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/app/controllers/preferences/basic_preferences_controller.rb b/app/controllers/preferences/basic_preferences_controller.rb index dba739bd6..a39a1cd9a 100644 --- a/app/controllers/preferences/basic_preferences_controller.rb +++ b/app/controllers/preferences/basic_preferences_controller.rb @@ -3,7 +3,15 @@ module Preferences private def update_preferences - current_user.languages = [params[:language]] + if params[:language] != I18n.locale.to_s + matching_languages, other_languages = current_user.languages.partition do |language| + Locale.available.preferred(Locale.list([language]), :default => nil).to_s == params[:language] + end + + current_user.languages = [params[:language]] + + current_user.languages += (matching_languages - [params[:language]]) + other_languages unless matching_languages.empty? + end current_user.preferred_editor = if params[:user][:preferred_editor] == "default" nil diff --git a/test/controllers/preferences/basic_preferences_controller_test.rb b/test/controllers/preferences/basic_preferences_controller_test.rb index b6195717c..d6e24bf15 100644 --- a/test/controllers/preferences/basic_preferences_controller_test.rb +++ b/test/controllers/preferences/basic_preferences_controller_test.rb @@ -61,6 +61,42 @@ module Preferences assert_equal "light", user.preferences.find_by(:k => "map.color_scheme")&.v end + def test_update_preferred_language_from_en_selecting_fr + check_language_change %w[en], "fr", %w[fr] + end + + def test_update_preferred_language_from_unknown_selecting_fr + check_language_change %w[unknown], "fr", %w[fr] + end + + def test_update_preferred_language_from_unknown_en_selecting_en + check_language_change %w[unknown en], "en", %w[unknown en] + end + + def test_update_preferred_language_from_unknown_en_selecting_fr + check_language_change %w[unknown en], "fr", %w[fr] + end + + def test_update_preferred_language_from_en_unknown_selecting_fr + check_language_change %w[en unknown], "fr", %w[fr] + end + + def test_update_preferred_language_from_ru_en_selecting_en + check_language_change %w[ru en], "en", %w[en ru] + end + + def test_update_preferred_language_from_fr_enau_selecting_en + check_language_change %w[fr en-AU], "en", %w[en en-AU fr] + end + + def test_update_preferred_language_from_fr_enau_en_selecting_en + check_language_change %w[fr en-AU en], "en", %w[en en-AU fr] + end + + def test_update_preferred_language_from_fr_es_selecting_de + check_language_change %w[fr es], "de", %w[de] + end + def test_update_preferred_site_color_scheme user = create(:user, :languages => []) session_for(user) @@ -104,5 +140,21 @@ module Preferences assert_select ".alert-success", /^Preferences updated/ assert_equal "auto", user.preferences.find_by(:k => "map.color_scheme")&.v end + + private + + def check_language_change(from_languages, selecting_language, to_languages) + user = create(:user, :languages => from_languages) + another_user = create(:user, :languages => %w[not going to change]) + session_for(user) + + put basic_preferences_path, :params => { :user => { :preferred_editor => "default" }, :language => selecting_language } + + assert_redirected_to basic_preferences_path + user.reload + assert_equal to_languages, user.languages + another_user.reload + assert_equal %w[not going to change], another_user.languages + end end end -- 2.39.5