I18n: Как проверить, отсутствуют ли пары ключ / значение перевода? - PullRequest
17 голосов
/ 12 января 2012

Я использую Ruby on Rails 3.1.0 и I18n gem .Я (реализую плагин и) Я хотел бы проверить во время выполнения , если в I18n отсутствуют пары ключ / значение перевода и, если это так, использовать пользовательскую строку.То есть у меня есть:

validates :link_url,
  :format     => {
    :with => REGEX,
    :message  => I18n.t(
      'custom_invalid_format',
      :scope => 'activerecord.errors.messages'
  )
}

Если в файле .yml нет следующего кода

activerecord:
  errors:
    messages:
      custom_invalid_format: This is the test error message 1

Я бы хотел использовать This is the test error message 2. Возможно ли это?Если да, то как я могу это сделать?

КСТАТИ : Из соображений производительности рекомендуется проверять во время выполнения , если пары ключ / значение перевода переводятсяприсутствует?

Ответы [ 4 ]

23 голосов
/ 03 марта 2012

Вы можете передать параметр: default в I18n.t:

I18n.t :missing, :default => 'Not here'
# => 'Not here'

Подробнее об этом можно прочитать здесь .

20 голосов
/ 29 октября 2012

У меня просто был тот же вопрос, и я хочу вычислить автоматическую строку в случае, если перевод отсутствует. Если я использую опцию :default, мне придется вычислять автоматическую строку каждый раз, даже если перевод не пропущен. Поэтому я искал другое решение.

Вы можете добавить опцию :raise => true или использовать I18n.translate! вместо I18n.translate. Если перевод не найден, возникает исключение.

begin
  I18n.translate!('this.key.should.be.translated', :raise => true) 
rescue I18n::MissingTranslationData
  do_some_resource_eating_text_generation_here
end
16 голосов
/ 15 января 2012

Я не знаю, как это сделать во время выполнения, но вы можете использовать rake, чтобы выяснить это.Для этого вам придётся создать собственное задание на грабли.Вот один из них:

namespace :i18n do
  desc "Find and list translation keys that do not exist in all locales"
  task :missing_keys => :environment do

    def collect_keys(scope, translations)
      full_keys = []
      translations.to_a.each do |key, translations|
        new_scope = scope.dup << key
        if translations.is_a?(Hash)
          full_keys += collect_keys(new_scope, translations)
        else
          full_keys << new_scope.join('.')
        end
      end
      return full_keys
    end

    # Make sure we've loaded the translations
    I18n.backend.send(:init_translations)
    puts "#{I18n.available_locales.size} #{I18n.available_locales.size == 1 ? 'locale' : 'locales'} available: #{I18n.available_locales.to_sentence}"

    # Get all keys from all locales
    all_keys = I18n.backend.send(:translations).collect do |check_locale, translations|
      collect_keys([], translations).sort
    end.flatten.uniq
    puts "#{all_keys.size} #{all_keys.size == 1 ? 'unique key' : 'unique keys'} found."

    missing_keys = {}
    all_keys.each do |key|

      I18n.available_locales.each do |locale|
        I18n.locale = locale
        begin
          result = I18n.translate(key, :raise => true)
        rescue I18n::MissingInterpolationArgument
          # noop
        rescue I18n::MissingTranslationData
          if missing_keys[key]
            missing_keys[key] << locale
          else
            missing_keys[key] = [locale]
          end
        end
      end
    end
    puts "#{missing_keys.size} #{missing_keys.size == 1 ? 'key is missing' : 'keys are missing'} from one or more locales:"
    missing_keys.keys.sort.each do |key|
      puts "'#{key}': Missing from #{missing_keys[key].join(', ')}"
    end
  end
end

поместите данные в файл .rake в каталог lib / tasks и выполните:

rake i18n:missing_keys 

Источник информации: здесь и кодна github здесь .

0 голосов
/ 21 января 2012

Если вы хотите передать переменную в сообщение, например This is the test error message {variable}

Это возможно при использовании переменной в языковом файле, как показано ниже.

# app/views/home/index.html.erb
<%=t 'greet_username', :user => "Bill", :message => "Goodbye" %>

# config/locales/en.yml
  en:
     greet_username: "%{message}, %{user}!"

Более подробное описание вы можете найтиздесь .

...