2016-03-20 2 views
0

У меня есть приложение, которое должно быть интернационализировано. В настоящее время почти все строки назначаются клавише трансляции с использованием t('.whatever').Извлечь все нетранслируемые ключи в приложении Rails

Я хочу, чтобы все ключи были переведены на определенный язык, прежде чем мы их выпустим. В среде разработки/тестирования я могу включить config.action_view.raise_on_missing_translations = true.

Но некоторые части, такие как devise и некоторые другие, сгенерированные с помощью драгоценного камня, не рассматриваются в тестах, и нет грантополучателя, который действительно проверяет все страницы перед выпуском.

Я бы предпочел решение, которое извлекает все ключи и добавляет их в locales/xxx.yml, желательно с некоторой логикой для сортировки и добавления недостающих ключей.

Я имел взгляд на следующие драгоценные камни/проекты, которые не отвечают моим требованиям:

  • LocaleApp - перепутались мои локалей полностью :(
  • i18n-missing_translations не показывать недостающие ключи перевода из язык по умолчанию

Дополнительная информация

Наши ключи являются английский, наш язык по умолчанию :de, но нам нужно перевести все, чтобы [:de, :en, :fr, :it]

+0

Вы посмотрели [I18n-tasks] (https://github.com/glebm/i18n-tasks)? Вы можете использовать их тест RSpec, чтобы убедиться, что все ключи переведены на все языки перед выпуском. –

ответ

0

Вот как я бы об этом:

Во-первых, решить, какая локаль ссылка/полн один, скажем, это :de

Затем запустите консоль рельсы (или создать задачу рек) и инициализировать I18n бэкенд следующим образом:

I18n.backend.send(:init_translations)

I18n.backend.send(:translations)

дает вам доступ ко всем переводам для всех языков, то есть что-то вроде

{ 
    en: { 
    hello: 'Hello World' 
    }, 
    de: { 
    hello: 'Hallo Welt' 
    } 
} 

Теперь выберите ссылочный локаль, то есть I18n.backend.send(:translations)[:de], а затем перебора всех ключей перевода в :de хэш и проверить, является ли они существуют в других местах, используя I18n.backend.exists?(locale, translation_key)

Пример:

I18n.backend.exists?(:en, [:errors, :messages, :improbable_phone]) I18n.backend.exists?(:en, 'errors.messages.improbable_phone')

Если ключ не существует, я бы добавить его в хэш с заглушкой, как «## ПЕРЕВОД ОТСУТСТВУЕТ ##», и, наконец, записать хеш как YAML файл на диск.

+0

Спасибо, это мне помогает! – Mark

Смежные вопросы