mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 16:21:18 +08:00
FIX: Customizing missing pluralized translations didn't work
This commit is contained in:
@ -27,13 +27,9 @@ class Admin::SiteTextsController < Admin::AdminController
|
||||
extras[:recommended] = true
|
||||
results = self.class.preferred_keys.map { |k| record_for(k) }
|
||||
else
|
||||
results = []
|
||||
translations = I18n.search(query, overridden: overridden)
|
||||
translations.each do |k, v|
|
||||
results << record_for(k, v)
|
||||
end
|
||||
results = find_translations(query, overridden)
|
||||
|
||||
unless translations.empty?
|
||||
if results.any?
|
||||
extras[:regex] = I18n::Backend::DiscourseI18n.create_search_regexp(query, as_string: true)
|
||||
end
|
||||
|
||||
@ -110,20 +106,70 @@ class Admin::SiteTextsController < Admin::AdminController
|
||||
|
||||
protected
|
||||
|
||||
def record_for(k, value = nil)
|
||||
if k.ends_with?("_MF")
|
||||
ovr = TranslationOverride.where(translation_key: k, locale: I18n.locale).pluck(:value)
|
||||
value = ovr[0] if ovr.present?
|
||||
def record_for(key, value = nil)
|
||||
if key.ends_with?("_MF")
|
||||
override = TranslationOverride.where(translation_key: key, locale: I18n.locale).pluck(:value)
|
||||
value = override&.first
|
||||
end
|
||||
|
||||
value ||= I18n.t(k)
|
||||
{ id: k, value: value }
|
||||
value ||= I18n.t(key)
|
||||
{ id: key, value: value }
|
||||
end
|
||||
|
||||
PLURALIZED_REGEX = /(.*)\.(zero|one|two|few|many|other)$/
|
||||
|
||||
def find_site_text
|
||||
raise Discourse::NotFound unless I18n.exists?(params[:id])
|
||||
raise Discourse::InvalidAccess.new(nil, nil, custom_message: 'email_template_cant_be_modified') if self.class.restricted_keys.include?(params[:id])
|
||||
record_for(params[:id])
|
||||
if self.class.restricted_keys.include?(params[:id])
|
||||
raise Discourse::InvalidAccess.new(nil, nil, custom_message: 'email_template_cant_be_modified')
|
||||
end
|
||||
|
||||
if I18n.exists?(params[:id]) || TranslationOverride.exists?(locale: I18n.locale, translation_key: params[:id])
|
||||
return record_for(params[:id])
|
||||
end
|
||||
|
||||
if PLURALIZED_REGEX.match(params[:id])
|
||||
value = fix_plural_keys($1, {}).fetch($2.to_sym)
|
||||
return record_for(params[:id], value) if value
|
||||
end
|
||||
|
||||
raise Discourse::NotFound
|
||||
end
|
||||
|
||||
def find_translations(query, overridden)
|
||||
translations = Hash.new { |hash, key| hash[key] = {} }
|
||||
|
||||
I18n.search(query, overridden: overridden).each do |key, value|
|
||||
if PLURALIZED_REGEX.match(key)
|
||||
translations[$1][$2] = value
|
||||
else
|
||||
translations[key] = value
|
||||
end
|
||||
end
|
||||
|
||||
results = []
|
||||
|
||||
translations.each do |key, value|
|
||||
if value&.is_a?(Hash)
|
||||
value = fix_plural_keys(key, value)
|
||||
value.each do |plural_key, plural_value|
|
||||
results << record_for("#{key}.#{plural_key}", plural_value)
|
||||
end
|
||||
else
|
||||
results << record_for(key, value)
|
||||
end
|
||||
end
|
||||
|
||||
results
|
||||
end
|
||||
|
||||
def fix_plural_keys(key, value)
|
||||
value = value.with_indifferent_access
|
||||
plural_keys = I18n.t('i18n.plural.keys')
|
||||
return value if value.keys.size == plural_keys.size && plural_keys.all? { |k| value.key?(k) }
|
||||
|
||||
fallback_value = I18n.t(key, locale: :en)
|
||||
plural_keys.map do |k|
|
||||
[k, value[k] || fallback_value[k] || fallback_value[:other]]
|
||||
end.to_h
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user