From 143a824449e86e603ef0ccfdbfc705d349dc6b16 Mon Sep 17 00:00:00 2001 From: Natalie Tay Date: Wed, 19 Feb 2025 11:55:14 +0800 Subject: [PATCH] FIX: Language parser matches with dashes or underscores (#31381) Our language parser now incorrectly matches underscored locales: ``` [1] pry(main)> HttpLanguageParser.parse("zh-CN") => "zh_CN" [2] pry(main)> HttpLanguageParser.parse("zh_CN") => "en_GB" ``` This commit makes sure the input can be agnostic of `-` or `_` --- lib/http_language_parser.rb | 2 +- spec/lib/http_language_parser_spec.rb | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 spec/lib/http_language_parser_spec.rb diff --git a/lib/http_language_parser.rb b/lib/http_language_parser.rb index a2e24ca0aae..cf83236ce67 100644 --- a/lib/http_language_parser.rb +++ b/lib/http_language_parser.rb @@ -6,7 +6,7 @@ module HttpLanguageParser # headers use hyphens. require "http_accept_language" unless defined?(HttpAcceptLanguage) available_locales = I18n.available_locales.map { |locale| locale.to_s.tr("_", "-") } - parser = HttpAcceptLanguage::Parser.new(header) + parser = HttpAcceptLanguage::Parser.new(header&.tr("_", "-")) matched = parser.language_region_compatible_from(available_locales)&.tr("-", "_") matched || SiteSetting.default_locale end diff --git a/spec/lib/http_language_parser_spec.rb b/spec/lib/http_language_parser_spec.rb new file mode 100644 index 00000000000..ba75fc6ba55 --- /dev/null +++ b/spec/lib/http_language_parser_spec.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +describe HttpLanguageParser do + it "returns the default locale when no language is matched" do + expect(HttpLanguageParser.parse("")).to eq(SiteSetting.default_locale) + end + + it "returns the matched locale when a language is matched" do + expect(HttpLanguageParser.parse("en")).to eq("en") + end + + it "returns the matched locale when a language and region are matched" do + expect(HttpLanguageParser.parse("en-US")).to eq("en") + end + + it "returns the matched locale regardless of dash or underscore usage" do + expect(HttpLanguageParser.parse("zh-CN")).to eq("zh_CN") + expect(HttpLanguageParser.parse("zh_CN")).to eq("zh_CN") + end +end