DEV: Use core's locale normalizer (#1509)

We've moved the class to core here discourse/discourse#33702 so following up a deletion in this repo.
This commit is contained in:
Natalie Tay 2025-07-22 10:09:03 +08:00 committed by GitHub
parent 6059b6e111
commit 1d88ca44f0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 4 additions and 95 deletions

View File

@ -1,3 +1,4 @@
< 3.5.0.beta8-dev: 5d80a34589d63e381d80273828072badc18955b1
< 3.5.0.beta7-dev: cd14b0c0bee0cf63c59b64b6f7213e31a37f11a7 < 3.5.0.beta7-dev: cd14b0c0bee0cf63c59b64b6f7213e31a37f11a7
< 3.5.0.beta6-dev: 3e74eea1e5e3143888d67a8d8a11206df214dc24 < 3.5.0.beta6-dev: 3e74eea1e5e3143888d67a8d8a11206df214dc24
< 3.5.0.beta3-dev: 09a68414804a1447f52e5d60691ba59742cda9ec < 3.5.0.beta3-dev: 09a68414804a1447f52e5d60691ba59742cda9ec

View File

@ -40,7 +40,7 @@ module Jobs
return if locales.blank? return if locales.blank?
locales.each do |locale| locales.each do |locale|
next if DiscourseAi::Translation::LocaleNormalizer.is_same?(locale, detected_locale) next if LocaleNormalizer.is_same?(locale, detected_locale)
regionless_locale = locale.split("_").first regionless_locale = locale.split("_").first
next if post.post_localizations.where("locale LIKE ?", "#{regionless_locale}%").exists? next if post.post_localizations.where("locale LIKE ?", "#{regionless_locale}%").exists?

View File

@ -38,7 +38,7 @@ module Jobs
return if locales.blank? return if locales.blank?
locales.each do |locale| locales.each do |locale|
next if DiscourseAi::Translation::LocaleNormalizer.is_same?(locale, detected_locale) next if LocaleNormalizer.is_same?(locale, detected_locale)
regionless_locale = locale.split("_").first regionless_locale = locale.split("_").first
next if topic.topic_localizations.where("locale LIKE ?", "#{regionless_locale}%").exists? next if topic.topic_localizations.where("locale LIKE ?", "#{regionless_locale}%").exists?

View File

@ -29,7 +29,7 @@ module Jobs
missing_locales = locales - existing_locales - [category.locale] missing_locales = locales - existing_locales - [category.locale]
missing_locales.each do |locale| missing_locales.each do |locale|
break if remaining_limit <= 0 break if remaining_limit <= 0
next if DiscourseAi::Translation::LocaleNormalizer.is_same?(locale, category.locale) next if LocaleNormalizer.is_same?(locale, category.locale)
begin begin
DiscourseAi::Translation::CategoryLocalizer.localize(category, locale) DiscourseAi::Translation::CategoryLocalizer.localize(category, locale)

View File

@ -1,50 +0,0 @@
# frozen_string_literal: true
module DiscourseAi
module Translation
class LocaleNormalizer
# Normalizes locale string, matching the list of I18n.locales where possible
# @param locale [String,Symbol] the locale to normalize
# @return [String] the normalized locale
def self.normalize_to_i18n(locale)
return nil if locale.blank?
locale = locale.to_s.gsub("-", "_")
i18n_pairs.each { |downcased, value| return value if locale.downcase == downcased }
locale
end
def self.is_same?(locale1, locale2)
return true if locale1 == locale2
locale1 = locale1.gsub("-", "_").downcase
locale2 = locale2.gsub("-", "_").downcase
locale1.split("_").first == locale2.split("_").first
end
private
def self.i18n_pairs
# they should look like this for the input to match against:
# {
# "lowercased" => "actual",
# "en" => "en",
# "zh_cn" => "zh_CN",
# "zh" => "zh_CN",
# }
@locale_map ||=
I18n
.available_locales
.reduce({}) do |output, sym|
locale = sym.to_s
output[locale.downcase] = locale
if locale.include?("_")
short = locale.split("_").first
output[short] = locale if output[short].blank?
end
output
end
end
end
end
end

View File

@ -1,42 +0,0 @@
# frozen_string_literal: true
describe DiscourseAi::Translation::LocaleNormalizer do
describe ".normalize_to_i18n" do
it "matches input locales to i18n locales" do
expect(described_class.normalize_to_i18n("en-GB")).to eq("en_GB")
expect(described_class.normalize_to_i18n("en")).to eq("en")
expect(described_class.normalize_to_i18n("zh")).to eq("zh_CN")
expect(described_class.normalize_to_i18n("tr")).to eq("tr_TR")
end
it "converts dashes to underscores" do
expect(described_class.normalize_to_i18n("a-b")).to eq("a_b")
end
end
describe "#is_same?" do
it "returns true for the same locale" do
expect(described_class.is_same?("en", "en")).to be true
end
it "returns true for locales with different cases" do
expect(described_class.is_same?("en", "EN")).to be true
end
it "returns true for locales with different separators" do
expect(described_class.is_same?("en-US", "en_US")).to be true
end
it "returns false for different locales" do
expect(described_class.is_same?("en", "ja")).to be false
end
it "returns true for locales with the same base language" do
expect(described_class.is_same?("zh-CN", "zh_TW")).to be true
end
it "returns false for completely different locales" do
expect(described_class.is_same?("en", "ja")).to be false
end
end
end