mirror of
https://github.com/discourse/discourse.git
synced 2025-05-24 00:41:16 +08:00
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 `_`
This commit is contained in:
@ -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
|
||||
|
20
spec/lib/http_language_parser_spec.rb
Normal file
20
spec/lib/http_language_parser_spec.rb
Normal file
@ -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
|
Reference in New Issue
Block a user