I18N-задачи помогают вам найти и управлять отсутствующими и неиспользованными переводами.
Этот GEM анализирует код статически для ключевых использования, таких как I18n.t('some.key') , чтобы:
Таким образом, решая две основные проблемы дизайна GEM I18N:
Задачи I18N могут использоваться с любым проектом, используя драгоценный камень Ruby I18N (по умолчанию в рельсах).
Добавьте i18n-задачи в Gemfile:
gem 'i18n-tasks' , '~> 1.0.14' , group : :developmentСкопируйте файл конфигурации по умолчанию:
$ cp $( i18n-tasks gem-path ) /templates/config/i18n-tasks.yml config/Скопируйте тест RSPEC для теста на отсутствующие и неиспользованные переводы как часть пакета (необязательно):
$ cp $( i18n-tasks gem-path ) /templates/rspec/i18n_spec.rb spec/Или для Minitest:
$ cp $( i18n-tasks gem-path ) /templates/minitest/i18n_test.rb test/ Запустите bundle exec i18n-tasks чтобы получить список всех задач с короткими описаниями.
i18n-tasks health если какие-либо клавиши отсутствуют или не используются, что переменные интерполяции согласованы по локалам, и что все файлы локали нормализованы (автоматическая форматированная):
$ i18n-tasks healthДобавьте недостающие клавиши с заполнителями (базовая стоимость или гуманизированный ключ):
$ i18n-tasks add-missingЭти и другие задачи принимают аргументы:
$ i18n-tasks add-missing -v ' TRME %{value} ' fr Пропустите --help для получения дополнительной информации:
$ i18n-tasks add-missing --help
Usage: i18n-tasks add-missing [options] [locale ...]
-l, --locales Comma-separated list of locale(s) to process. Default: all. Special: base.
-f, --format Output format: terminal-table, yaml, json, keys, inspect. Default: terminal-table.
-v, --value Value. Interpolates: %{value}, %{human_key}, %{value_or_human_key}, %{key}. Default: %{value_or_human_key}.
-h, --help Display this help message.Перевести недостающие ключи, используя сервисную службу по вашему выбору.
$ i18n-tasks translate-missing
# accepts backend, from and locales options
$ i18n-tasks translate-missing --from=base es fr --backend=googleДоступные бэкэнды:
google - Google Translatedeepl - Deepl Proyandex - Яндекс Переводopenai - Openaiwatsonx - Watsonx Посмотрите, где клавиши используются с i18n-tasks find :
$ i18n-tasks find common.help
$ i18n-tasks find ' auth.* '
$ i18n-tasks find ' {number,currency}.format.* '$ i18n-tasks unused
$ i18n-tasks remove-unused Эти задачи могут вывести динамические клавиши, такие как t("category.#{category.name}") если вы установите search.strict to false или пройти --no-strict в командной строке.
Если вы хотите сохранить заказ из исходного языкового файла при использовании remove-ul-ul-ul-ul, пропустите -k или --keep-order .
Сортировать ключи:
$ i18n-tasks normalize Сортируйте ключи и переместите их в соответствующие файлы, как определено config.write :
$ i18n-tasks normalize -p i18n-tasks mv <pattern> <target> -универсальная задача по перемещению или удалению клавиш, соответствующих данному шаблону.
Все узлы (листья или подделки) сопоставление <pattern> объединяется вместе и перемещается в <target> .
Переименовать узел (лист или поддерево):
$ i18n-tasks mv user accountПереместите узел:
$ i18n-tasks mv user_alerts user.alertsПодвиньте детей на один уровень вверх:
$ i18n-tasks mv ' alerts.{:} ' ' 1 'Многочисленные узлы Merge-Move:
$ i18n-tasks mv ' {user,profile} ' accountСлияние (не листовые) узлы в родителей:
$ i18n-tasks mv ' {pages}.{a,b} ' ' 1 ' Удалить клавиши, используя задачу rm :
$ i18n-tasks rm ' user.{old_profile,old_title} ' another_key i18n-tasks также предоставляют композиционные задачи для чтения, написания и манипулирования данными локали. Примеры ниже.
add-missing реализованную с missing , tree-set-value и data-merge :
$ i18n-tasks missing -f yaml fr | i18n-tasks tree-set-value ' TRME %{value} ' | i18n-tasks data-merge remove-unused внедрить с помощью unused и data-remove (без подтверждения):
$ i18n-tasks unused -f yaml | i18n-tasks data-remove Удалите все ключи от fr , которые не существуют в en . Не меняйте en :
$ i18n-tasks missing -t diff -f yaml en | i18n-tasks tree-mv en fr | i18n-tasks data-remove Смотрите полный список задач с i18n-tasks --help .
i18n-tasks использует сканер AST для файлов .rb и .html.erb , а также сканер на основе Regexp для других файлов, таких как .haml .
i18n-tasks предлагает поддержку относительных ключей, таких как t '.title' .
✔ Клавиши относительно пути файла, в котором они используются (см. Конфигурацию относительных корней).
✔ Ключи относительно controller.action_name в контроллерах Rails поддерживаются. Самое близкое название def используется.
✔ Клавиши множественного числа, такие как key.{one,many,other,...} полностью поддерживаются.
✔ Справочные клавиши (клавиши с :symbol ) полностью поддерживаются. Эти ключи копируются как есть в add/translate-missing , и могут быть рассмотрены с помощью ссылки или значения в find .
t() аргументы ключевого слова ✔ Аргумент ключевого слова scope полностью поддерживается сканером AST, а также сканером REGEXP, но только тогда, когда это первый аргумент.
✔ Аргумент default может использоваться для предварительного заполнения файлов локали (только сканера AST).
По умолчанию динамические ключи, такие как t "cats.#{cat}.name" не распознаются. Я призываю вас отметить это с помощью подсказок I18N-задач.
В качестве альтернативы, вы можете включить динамический вывод ключа, установив search.strict для false в конфигурации. В этом случае будут считаться все динамические части ключа, например, cats.tenderlove.name не будет сообщать как неиспользованные. Обратите внимание, что только один раздел ключа рассматривается как подстановочный знак для каждой интерполяции строки; т.е. в этом примере, cats.tenderlove.special.name будет сообщать как неиспользованный.
I18n.localize не поддерживается, используйте подсказки I18N-задачи. Это связано с тем, что ключ, сгенерированный I18n.localize , зависит от типа передаваемого объекта и, следовательно, не может быть выведен статически.
Конфигурация считывается из config/i18n-tasks.yml или config/i18n-tasks.yml.erb . Осмотрите конфигурацию с помощью i18n-tasks config .
Установите файл конфигурации по умолчанию:
$ cp $( i18n-tasks gem-path ) /templates/config/i18n-tasks.yml config/Настройки совместимы с рельсами по умолчанию.
По умолчанию base_locale установлен на en , а locales выводятся из путей к файлам данных. Вы можете переопределить их в конфигурации.
Адаптер данных по умолчанию поддерживает файлы YAML и JSON.
Задачи I18N могут управлять несколькими файлами перевода и читать переводы из других драгоценных камней. Чтобы узнать больше о параметрах data в конфигурации. NB: По умолчанию только %{locale}.yml файлы читаются, а не namespace.%{locale}.yml . Обязательно проверьте конфигурацию.
Для написания в файлах Locale i18n задачи предоставляют 2 варианта.
Маршрутизатор шаблона организует ключи на основе списка ключевых шаблонов, как в примере ниже:
data:
router: pattern_router
# a list of {key pattern => file} routes, matched top to bottom
write:
# write models.* and views.* keys to the respective files
- ['{models,views}.*', 'config/locales/1.%{locale}.yml']
# or, write every top-level key namespace to its own file
- ['{:}.*', 'config/locales/1.%{locale}.yml']
# default, sugar for ['*', path]
- 'config/locales/%{locale}.yml'
Консервативный маршрутизатор сохраняет ключи, где они находятся, или проводят путь от базовой локали. Если ключ совершенно новый, консервативный маршрутизатор вернется к поведению маршрутизатора. Консервативный маршрутизатор - это маршрутизатор по умолчанию .
data:
router: conservative_router
write:
- ['devise.*', 'config/locales/devise.%{locale}.yml']
- 'config/locales/%{locale}.yml'
Если вы хотите, чтобы задачи i18N реорганизовывали свои существующие ключи с помощью data.write , либо установите маршрутизатор на pattern_router , как указано выше, либо запустите i18n-tasks normalize -p .
Изолирующий маршрутизатор предполагает, что каждый файл YAML независим и может содержать похожие ключи.
В результате переводы записываются в альтернативный целевой файл для каждого исходного файла (только часть %{locale} изменяется в соответствии с целевым локалем). Таким образом, нет необходимости указывать какую -либо конфигурацию write (на самом деле, она будет полностью игнорирована).
Это может быть полезно, например, при использовании Sidecars ViewComponent (ViewComponent присваивает неявную область каждые сфере файла SideCar YAML, но i18n-tasks не знают об этой логике, что приводит к столкновениям):
app/components/movies_component.en.yml :
en :
title : Movies app/components/games_component.en.yml
en :
title : GamesОднако этот маршрутизатор имеет ограничение: он не поддерживает обнаружение пропущенных клавиш из использования кода (поскольку он не знает о неявной логике охвата).
Специальный синтаксис, похожий на шаблоны, используется во всех задачах I18N в соответствии с клавишами перевода:
| синтаксис | описание |
|---|---|
* | все соответствует |
: | соответствует одному ключу |
*: | соответствует часть одного ключа |
{a, bc} | Сопоставьте любой в наборе, может использовать : и * , совпадение захвачено |
Пример использования:
$ bundle exec i18n-tasks mv " {:}.contents.{*}_body " " 1.attributes.2.body "
car.contents.name_body ⮕ car.attributes.name.body
car.contents.description_body ⮕ car.attributes.description.body
truck.contents.name_body ⮕ truck.attributes.name.body
truck.contents.description_body ⮕ truck.attributes.description.bodyЕсли вы храните данные где -то, но в файловой системе, например, в базе данных или MongoDB, вы можете реализовать пользовательский адаптер. Если вы внедрили пользовательский адаптер, пожалуйста, поделитесь им на вики.
I18N Tasks использует сканер AST для файлов .rb и .html.erb , а также сканер Regexp для всех других файлов. Новые сканеры можно легко добавить: пожалуйста, обратитесь к этому примеру.
См. Раздел search в файле конфигурации для всех доступных параметров конфигурации. NB: По умолчанию выполняется только app/ каталог.
Добавьте подсказки к статическому анализу с подсказками Magic Comments (строки, начиная с (#|/) i18n-tasks-use по умолчанию):
# i18n-tasks-use t('activerecord.models.user') # let i18n-tasks know the key is used
User . model_name . human Вы также можете явно игнорировать ключи, появляющиеся в файлах локали через настройки ignore* .
Если у вас есть вспомогательные методы, которые генерируют клавиши перевода, такие как метод page_title , который возвращает t '.page_title' , или метод Spree.t(key) , который возвращает t "spree.#{key}" , используйте встроенный PatternMapper для их карты.
Для более сложных случаев вы можете реализовать пользовательский сканер.
Смотрите файл конфигурации, чтобы узнать больше.
i18n-tasks translate-missing требует ключа API Google Translate, получите его на консоли Google API.
Где этот ключ зависит от вашей консоли Google API:
В обоих случаях вам может потребоваться создать ключ, если его не существует.
Поместите ключ в GOOGLE_TRANSLATE_API_KEY Variable Enviration или в файле конфигурации.
# config/i18n-tasks.yml
translation :
backend : google
google_translate_api_key : <Google Translate API key>или через переменную среды:
GOOGLE_TRANSLATE_API_KEY= < Google Translate API key > i18n-tasks translate-missing требует ключа Deepl Pro API, получите его в Deepl. Вы можете указать локали псевдоним, если вы используете только простые локалы.
# config/i18n-tasks.yml
translation :
backend : deepl
deepl_api_key : <DeepL Pro API key>
deepl_host : <optional>
deepl_version : <optional>
deepl_glossary_ids :
- f28106eb-0e06-489e-82c6-8215d6f95089
- 2c6415be-1852-4f54-9e1b-d800463496b4
deepl_options :
formality : prefer_less
deepl_locale_aliases :
en : en-us
pt : pt-brили через переменные среды:
DEEPL_API_KEY= < DeepL Pro API key >
DEEPL_HOST= < optional >
DEEPL_VERSION= < optional > i18n-tasks translate-missing требует ключа API Yandex, получите его на Yandex.
# config/i18n-tasks.yml
translation :
backend : yandex
yandex_api_key : <Yandex API key>или через переменную среды:
YANDEX_API_KEY= < Yandex API key > i18n-tasks translate-missing требует ключа API OpenAI, получите его на OpenAI.
# config/i18n-tasks.yml
translation :
backend : openai
openai_api_key : <OpenAI API key>
openai_model : <optional>или через переменную среды:
OPENAI_API_KEY= < OpenAI API key >
OPENAI_MODEL= < optional > i18n-tasks translate-missing требует проекта Watsonx и ключа API, получить его в IBM Watsonx.
# config/i18n-tasks.yml
translation :
backend : watsonx
watsonx_api_key : <watsonx API key>
watsonx_project_id : <watsonx project id>
watsonx_model : <optional>или через переменную среды:
WATSONX_API_KEY= < watsonx API key >
WATSONX_PROJECT_ID= < watsonx project id >
WATSONX_MODEL= < optional > Существует экспериментальная особенность, чтобы проанализировать рельсы с большим контекстом. i18n-tasks поддержат:
before_actionsModel.human_attribute_name вызовыModel.model_name.human вызовы Включил его, добавив сканер в свой config/i18n-tasks.yml :
<% I18n :: Tasks . add_scanner (
'I18n::Tasks::Scanners::PrismScanner' ,
only : %w( *.rb )
) %> Чтобы включить только Ruby-Scanning, а не какую-либо поддержку Rails, добавьте конфигурацию в раздел search :
search :
prism_visitor : " ruby " # default "rails" i18n-tasks irb начинает сеанс IRB в контексте задач I18N. guide для получения дополнительной информации.
См. I18N Задачи WIKI: CSV-импортные задачи и экспортные задачи.
Задачи, которые поставляются с драгоценным камнем, определены в Lib/i18n/Tasks/Command/Commands. Пользовательские задачи можно легко добавить, см. Примеры на вики.
bundle installbundle exec rspecovercommit --install SKIP=RuboCop git commitOVERCOMMIT_DISABLE=1 git commit