Как отладить поиск Rails I18N?

#ruby-on-rails #ruby-on-rails-3 #internationalization #ruby-on-rails-3.1 #ruby-on-rails-2

#ruby-on-rails #ruby-on-rails-3 #интернационализация #ruby-on-rails-3.1 #ruby-on-rails-2

Вопрос:

В документах Rails, похоже, существуют разные местоположения по умолчанию для строк I18N, в зависимости от того, был ли инициирован поиск I18N из представления, модели / проверки, контроллера, помощника, …, если это метка и т.д…

Как я могу увидеть, где Rails пытается выполнить поиск по умолчанию, например, когда я просто использую t(‘.something’) ?

Ответ №1:

Вы можете обезьянничать с серверной частью I18N в режиме разработки, чтобы распечатать ключи I18n, которые просматриваются в серверной части.

Проверьте здесь:

http://www.unixgods.org/Rails/where_is_Rails_trying_to_lookup_L10N_strings.html

Комментарии:

1. Работает для меня. Используя RubyMine, вы можете открыть gem и вставить эти puts в код и запустить сервер в RM. очистить. Тем не менее, я бы предпочел config.i18n.lookup_debug = true

2. Извините, это было желание. Его там нет AFAIK. У вас есть ссылка на инструкцию Sven Fuchs?

3. У меня был с ним разговор в Твиттере — найдите «@svenfuchs config.i18n.lookup_debug» и нажмите «развернуть»

4. к сожалению config.i18n.lookup_debug , не существует.

5. Ссылка, похоже, сейчас 404.

Ответ №2:

автономный I18n.t не имеет никакого префикса к вашему ключу перевода, вот вспомогательные методы / модули, которые отвечают за магию rails:

(нажмите на ссылку «источник» под описанием методов, чтобы увидеть, что происходит внутри)

ActionView:

http://api.rubyonrails.org/classes/ActionView/Helpers/TranslationHelper.html#method-i-t

scope_key_by_partial

ActiveModel:

http://api.rubyonrails.org/classes/ActiveModel/Translation.html#method-i-i18n_scope

AbstractController

http://api.rubyonrails.org/classes/AbstractController/Translation.html

Ответ №3:

Приведенное выше решение не помогает определить, в каком файле выполняется поиск ключа. Я не нашел никакого элегантного решения для этого, ниже приведен лучший метод, который я придумал. Инструкции должны быть адаптированы для производственного блока.

  1. Откройте консоль rails bundle exec rails c
  2. Запустите I18n.load_path.join("n") и скопируйте это в свой буфер обмена. Если вы используете pry с некоторыми помощниками буфера обмена, просто запустите copy в консоли
  3. Откройте новое окно терминала и запустите pbpaste | ack 'en.yml$' | xargs ack 'key:' его, чтобы распечатать список файлов, содержащих ключ, к которому I18n пытается получить доступ

Комментарии:

1. Например I18n.load_path.join("n") , когда несколько файлов определяют один и тот же ключ, в зависимости от порядка load_paths какое определение файла I18n в конечном итоге будет использоваться?

Ответ №4:

В rails 3.2 (возможно, также в более низких версиях) t -helper в представлениях создает span, который показывает, какой ключ был найден для перевода. Это не решение для всех случаев (от контроллера и так далее), Но я думаю, что это может быть ответом для многих людей, которые ищут этот вопрос, где полный патч monkey сверху будет сверху (патч monkey также работает для меня в i18n 0.7.0 и даетподробнее)

 title="translation missing: de.<path to key>"
  

Ответ №5:

Если перевод, который вы пытаетесь отладить, устанавливается в контроллере, есть простое решение:

Установите переменную в контроллере в тег, который не существует, и прочитайте путь, возвращаемый предупреждением о пропущенном переводе.

Например, в контроллере

 @test =  t('.choco_pizza')
  

На ваш взгляд:

 <%= @test %>
  

Вернет:

translation missing: fr.unexpected_namespace.controller_name.action_name.choco_pizza