+ This feature is in beta and will improve over time. Another way to tailor your feed is to discover and follow members who write in your preferred language.
+
diff --git a/app/views/users/_misc.html.erb b/app/views/users/_misc.html.erb
index b5fb9f6f7..08413026c 100644
--- a/app/views/users/_misc.html.erb
+++ b/app/views/users/_misc.html.erb
@@ -13,7 +13,7 @@
<%= form_for(@user) do |f| %>
<%= f.label :editor_version, "Editor version: v1 or v2" %>
- <%= f.select :editor_version, options_for_select(["v1", "v2"], @user.editor_version) %>
+ <%= f.select :editor_version, options_for_select(%w[v1 v2], @user.editor_version) %>
v2 is currently in beta
- This feature is in beta and will improve over time. Another way to tailor your feed is to discover and follow members who write in your preferred language.
-
+<%= render "language_settings" %>
Sponsors
@@ -157,12 +116,11 @@
<%= f.label :inbox_type, "Open your inbox to messages from people you don't follow or keep your inbox private to mutual follows." %>
<%= f.text_area :inbox_guidelines, maxlength: 200, placeholder: "For example:
-
- Only contact me about consulting opportunities.
- I'm happy to help beginners with CSS.
- Allow for a few days to respond.
diff --git a/config/routes.rb b/config/routes.rb
index 2c972a2cd..6d42f8cb6 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -198,6 +198,7 @@ Rails.application.routes.draw do
to: redirect("anotherdevblog/every-developer-should-write-a-personal-automation-api")
# Settings
+ post "users/update_language_settings" => "users#update_language_settings"
post "users/join_org" => "users#join_org"
post "users/leave_org" => "users#leave_org"
post "users/add_org_admin" => "users#add_org_admin"
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 1e97c613b..c1e538571 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -1,7 +1,7 @@
require "rails_helper"
RSpec.describe User, type: :model do
- let(:user) { create(:user) }
+ let!(:user) { create(:user) }
let(:returning_user) { create(:user, signup_cta_variant: nil) }
let(:second_user) { create(:user) }
let(:article) { create(:article, user_id: user.id) }
@@ -392,6 +392,18 @@ RSpec.describe User, type: :model do
end
context "when estimating the default language" do
+ it "sets correct language_settings by default" do
+ user2 = create(:user, email: nil)
+ expect(user2.language_settings).to eq("preferred_languages" => %w[en])
+ end
+
+ it "sets correct language_settings by default after the callbacks" do
+ perform_enqueued_jobs do
+ user2 = create(:user, email: nil)
+ expect(user2.language_settings).to eq("preferred_languages" => %w[en])
+ end
+ end
+
it "estimates default language to be nil" do
perform_enqueued_jobs do
user.estimate_default_language!
@@ -411,6 +423,7 @@ RSpec.describe User, type: :model do
perform_enqueued_jobs do
new_user = user_from_authorization_service(:twitter, nil, "navbar_basic")
new_user.estimate_default_language!
+ expect(user.reload.estimated_default_language).to eq(nil)
end
end
@@ -419,11 +432,23 @@ RSpec.describe User, type: :model do
user.update_column(:email, "ben@hello.jp")
user.estimate_default_language!
end
- expect(user.reload.decorate.preferred_languages_array).to include("ja")
+ expect(user.reload.preferred_languages_array).to include("ja")
end
end
end
+ describe "#preferred_languages_array" do
+ it "returns a correct array when language settings are in a new format" do
+ user.update_columns(language_settings: { estimated_default_language: "en", preferred_languages: %w[en ru it] })
+ expect(user.preferred_languages_array).to eq(%w[en ru it])
+ end
+
+ it "returns a correct array when language settings are in the old format" do
+ user.update_columns(language_settings: { estimated_default_language: "en", prefer_language_en: true, prefer_language_ja: false, prefer_language_es: true })
+ expect(user.preferred_languages_array).to eq(%w[en es])
+ end
+ end
+
it "follows users" do
user2 = create(:user)
user3 = create(:user)
diff --git a/spec/requests/user_settings_spec.rb b/spec/requests/user_settings_spec.rb
index aa1a1dcd9..c2187bc02 100644
--- a/spec/requests/user_settings_spec.rb
+++ b/spec/requests/user_settings_spec.rb
@@ -112,6 +112,30 @@ RSpec.describe "UserSettings", type: :request do
end
end
+ describe "POST /users/update_language_settings" do
+ before { login_as user }
+
+ it "updates language settings" do
+ post "/users/update_language_settings", params: { user: { preferred_languages: %w[ja es] } }
+ user.reload
+ expect(user.language_settings["preferred_languages"]).to eq(%w[ja es])
+ end
+
+ it "keeps the estimated_default_language" do
+ user.update_column(:language_settings, estimated_default_language: "ru", preferred_languages: %w[en es])
+ post "/users/update_language_settings", params: { user: { preferred_languages: %w[it en] } }
+ user.reload
+ expect(user.language_settings["estimated_default_language"]).to eq("ru")
+ end
+
+ it "doesn't set non-existent languages" do
+ user.update_column(:language_settings, estimated_default_language: "ru", preferred_languages: %w[en es])
+ post "/users/update_language_settings", params: { user: { preferred_languages: %w[it en blah] } }
+ user.reload
+ expect(user.language_settings["preferred_languages"].sort).to eq(%w[en it])
+ end
+ end
+
describe "DELETE /users/remove_association" do
context "when user has two identities" do
let(:user) { create(:user, :two_identities) }
diff --git a/spec/services/users/estimate_default_language_spec.rb b/spec/services/users/estimate_default_language_spec.rb
index c040b40df..7d1a92eaf 100644
--- a/spec/services/users/estimate_default_language_spec.rb
+++ b/spec/services/users/estimate_default_language_spec.rb
@@ -12,6 +12,13 @@ RSpec.describe Users::EstimateDefaultLanguage, type: :service do
user = create(:user)
described_class.call(user)
expect(user.estimated_default_language).to eq(nil)
+ expect(user.decorate.preferred_languages_array).to eq(%w[en])
+ end
+
+ it "estimates sets preferred languages to [en] when no lang data" do
+ user = create(:user)
+ described_class.call(user)
+ expect(user.decorate.preferred_languages_array).to eq(%w[en])
end
it "estimates default language to be japan with jp email" do
@@ -34,4 +41,39 @@ RSpec.describe Users::EstimateDefaultLanguage, type: :service do
user.reload
expect(user.decorate.preferred_languages_array).to include("ja")
end
+
+ it "sets correct language_settings for jp" do
+ user = create(:user, email: "annabu@example.jp")
+ described_class.call(user)
+ user.reload
+ expect(user.language_settings).to eq("preferred_languages" => %w[en ja], "estimated_default_language" => "ja")
+ end
+
+ it "sets correct language_settings for pt" do
+ user = create(:user)
+ create(:identity, provider: :twitter, user: user, auth_data_dump: { "extra" => { "raw_info" => { "lang" => "pt" } } })
+ described_class.call(user)
+ user.reload
+ expect(user.language_settings).to eq("preferred_languages" => %w[en pt], "estimated_default_language" => "pt")
+ end
+
+ it "sets correct language_settings for no lang" do
+ user = create(:user, email: nil)
+ described_class.call(user)
+ expect(user.language_settings).to eq("preferred_languages" => %w[en], "estimated_default_language" => nil)
+ end
+
+ it "doesn't set incorrect language settings" do
+ user = create(:user)
+ create(:identity, provider: :twitter, user: user, auth_data_dump: { "extra" => { "raw_info" => { "lang" => "supermario" } } })
+ described_class.call(user)
+ expect(user.language_settings).to eq("preferred_languages" => %w[en], "estimated_default_language" => nil)
+ end
+
+ it "sets language settings when language is in twitter format (en-gb)" do
+ user = create(:user)
+ create(:identity, provider: :twitter, user: user, auth_data_dump: { "extra" => { "raw_info" => { "lang" => "en-gb" } } })
+ described_class.call(user)
+ expect(user.language_settings).to eq("preferred_languages" => %w[en], "estimated_default_language" => "en")
+ end
end