Rails I18n помещает интервал вокруг переведенного текста, если использовался запасной вариант

#ruby-on-rails #ruby-on-rails-3 #internationalization #translation

#ruby-на-рельсах #ruby-on-rails-3 #интернационализация #перевод

Вопрос:

Я использую Rails, встроенные в I18n (простой сервер). Я установил языковой стандарт по умолчанию на: en и включил резервные варианты. Допустим, у меня есть переводы определенного товара на английский и испанский языки. Теперь посетитель из Германии заходит на мой сайт, и он возвращается к английскому языку. Как бы я мог обнаружить этот запасной вариант и обернуть его в промежуток времени?

<span class="fallback">Hello</span> вместо того, чтобы просто Hello

Таким образом, я мог бы использовать машинные переводы на стороне клиента.

Я надеюсь избежать написания собственного бэкэнда вместо «Простого».

Ответ №1:

Пришлось прибегнуть к переопределению функции перевода в I18n ::Backend::FallBacks https://github.com/svenfuchs/i18n/blob/master/lib/i18n/backend/fallbacks.rb

 module I18n
  module Backend
    module Fallbacks
      def translate(locale, key, options = {})
        return super if options[:fallback]
        default = extract_non_symbol_default!(options) if options[:default]

        options[:fallback] = true
        I18n.fallbacks[locale].each do |fallback|
          catch(:exception) do
            result = super(fallback, key, options)
            if locale != fallback
              return "<span class="translation_fallback">#{result}</span>".html_safe unless result.nil?
            else
              return result unless result.nil?
            end
          end
        end
        options.delete(:fallback)

        return super(locale, nil, options.merge(:default => default)) if default
        throw(:exception, I18n::MissingTranslation.new(locale, key, options))
      end
    end
  end
end
 

Я просто вставил этот код в инициализатор.

Мне кажется, что это очень грязно… Я бы все равно хотел отметить чей-то лучший ответ как правильный.

Ответ №2:

Лучшее решение — использовать модуль метаданных из I18n. Также регистрируется в частном файле журнала, чтобы помочь обнаружить пропущенные переводы. Вы можете заменить вызовы Rails.регистратор или удалите их.

 I18n::Backend::Simple.include(I18n::Backend::Metadata)

# This work with <%= t %>,but  not with <%= I18n.t %>
module ActionView
  module Helpers
    module TranslationHelper
      alias_method :translate_basic, :translate
      mattr_accessor :i18n_logger

      def translate(key, options = {})
        @i18n_logger ||= Logger.new("#{Rails.root}/log/I18n.log")
        @i18n_logger.info "Translate key '#{key}' with options #{options.inspect}"
        options.merge!(:rescue_format => :html) unless options.key?(:rescue_format)
        options.merge!(:locale => I18n.locale)  unless options.key?(:locale)
        reqested_locale = options[:locale].to_sym
        s = translate_basic(key, options)
        if s.translation_metadata[:locale] != reqested_locale amp;amp;
           options[:rescue_format] == :html amp;amp; Rails.env.development?

           @i18n_logger.error "* Translate missing for key '#{key}' with options #{options.inspect}"
           missing_key = I18n.normalize_keys(reqested_locale, key, options[:scope])
           @i18n_logger.error "* Add key #{missing_key.join(".")}n"

          %(<span class="translation_fallback" title="translation fallback #{reqested_locale}->#{s.translation_metadata[:locale]} for '#{key}'">#{s}</span>).html_safe
        else
          s
        end
      end
      alias :t :translate

    end
  end
end
 

Затем стилизуйте с помощью CSS

 .translation_fallback {
  background-color: yellow;
}

.translation_missing {
  background-color: red;
}