I18N-Tasks te ayuda a encontrar y administrar traducciones faltantes y no utilizadas.
Esta gema analiza el código estáticamente para uso clave, como I18n.t('some.key') , para:
Abordando así los dos problemas principales del diseño de gemas i18n:
Las tareas I18N se pueden usar con cualquier proyecto utilizando la gema Ruby I18N (predeterminado en Rails).
Agregue I18N-Tasks a Gemfile:
gem 'i18n-tasks' , '~> 1.0.14' , group : :developmentCopie el archivo de configuración predeterminado:
$ cp $( i18n-tasks gem-path ) /templates/config/i18n-tasks.yml config/Copie la prueba RSPEC para probar las traducciones faltantes y no utilizadas como parte de la suite (opcional):
$ cp $( i18n-tasks gem-path ) /templates/rspec/i18n_spec.rb spec/O para Minitest:
$ cp $( i18n-tasks gem-path ) /templates/minitest/i18n_test.rb test/ Ejecute bundle exec i18n-tasks para obtener la lista de todas las tareas con descripciones breves.
Comprobaciones i18n-tasks health Si faltan las claves o no se usan, que las variables de interpolaciones son consistentes en todas las locales y que todos los archivos locales están normalizados (automáticamente formateados):
$ i18n-tasks healthAgregue las claves faltantes con los marcadores de posición (valor base o clave humanizada):
$ i18n-tasks add-missingEsta y otras tareas aceptan argumentos:
$ i18n-tasks add-missing -v ' TRME %{value} ' fr Pase --help para más información:
$ 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.Traducir las claves faltantes utilizando un servicio de backend de su elección.
$ i18n-tasks translate-missing
# accepts backend, from and locales options
$ i18n-tasks translate-missing --from=base es fr --backend=googleBackends disponibles:
google - Traducto de Googledeepl - Deepl Proyandex - Yandex traduciropenai - OpenAiwatsonx - Watsonx Vea dónde se usan las llaves con 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 Estas tareas pueden inferir claves dinámicas como t("category.#{category.name}") Si establece search.strict en falso o pase --no-strict en la línea de comandos.
Si desea mantener el pedido del archivo de idioma original cuando usa eliminar, pasar -k o --keep-order .
Ordene las teclas:
$ i18n-tasks normalize Ordene las claves y muévalas a los archivos respectivos según lo definido por config.write :
$ i18n-tasks normalize -p i18n-tasks mv <pattern> <target> es una tarea versátil para mover o eliminar las teclas que coinciden con el patrón dado.
Todos los nodos (Leafs o subtrotees) coinciden <pattern> se fusionan y se mueven a <target> .
Cambiar el nombre de un nodo (hoja o subárbol):
$ i18n-tasks mv user accountMover un nodo:
$ i18n-tasks mv user_alerts user.alertsMueva a los niños un nivel:
$ i18n-tasks mv ' alerts.{:} ' ' 1 'Fusion-MOVE múltiples nodos:
$ i18n-tasks mv ' {user,profile} ' accountFusionar nodos (no hojas) en los padres:
$ i18n-tasks mv ' {pages}.{a,b} ' ' 1 ' Elimine las claves usando la tarea rm :
$ i18n-tasks rm ' user.{old_profile,old_title} ' another_key i18n-tasks también proporciona tareas compuestas para leer, escribir y manipular datos locales. Ejemplos a continuación.
add-missing implementado con el valor missing , tree-set-value y data-merge :
$ i18n-tasks missing -f yaml fr | i18n-tasks tree-set-value ' TRME %{value} ' | i18n-tasks data-merge remove-unused implementado con unused y data-remove (sin la confirmación):
$ i18n-tasks unused -f yaml | i18n-tasks data-remove Elimine todas las teclas de fr que no existen en en . No cambie en :
$ i18n-tasks missing -t diff -f yaml en | i18n-tasks tree-mv en fr | i18n-tasks data-remove Vea la lista completa de tareas con i18n-tasks --help .
i18n-tasks utiliza un escáner AST para archivos .rb y .html.erb , y un escáner basado en regexp para otros archivos, como .haml .
i18n-tasks ofrece soporte para claves relativas, como t '.title' .
✔ son compatibles con las claves en relación con la ruta del archivo en la que se utilizan (ver configuración de raíces relativas).
✔ Se admiten claves en relación con controller.action_name in Rails. El nombre de def más cercano se usa.
✔ Las claves plurales, como key.{one,many,other,...} son totalmente compatibles.
✔ Las teclas de referencia (teclas con :symbol ) son totalmente compatibles. Estas claves se copian como está en add/translate-missing , y se pueden buscar por referencia o valor en find .
t() argumentos de palabras clave ✔ El argumento de palabras clave scope es totalmente compatible con el escáner AST, y también por el escáner regexp, pero solo cuando es el primer argumento.
✔ El argumento default se puede utilizar para llenar los archivos locales (solo el escáner AST).
Por defecto, no se reconocen claves dinámicas como t "cats.#{cat}.name" . Te animo a que marque estos con pistas de uso de Tasks I18N.
Alternativamente, puede habilitar la inferencia de clave dinámica configurando search.strict en false en la configuración. En este caso, todas las partes dinámicas de la clave se considerarán utilizadas, por ejemplo, cats.tenderlove.name no se informaría como no utilizado. Tenga en cuenta que solo una sección de la clave se trata como un comodín para cada interpolación de cadena; Es decir, en este ejemplo, cats.tenderlove.special.name se informará como no utilizado.
I18n.localize no es compatible, use sugerencias de uso I18N-Tasks. Esto se debe a que la clave generada por I18n.localize depende del tipo de objeto que se pasa y, por lo tanto, no se puede inferir estáticamente.
La configuración se lee desde config/i18n-tasks.yml o config/i18n-tasks.yml.erb . Inspeccione la configuración con i18n-tasks config .
Instale el archivo de configuración predeterminado con:
$ cp $( i18n-tasks gem-path ) /templates/config/i18n-tasks.yml config/La configuración es compatible con los rieles de forma predeterminada.
De forma predeterminada, base_locale se establece en en y locales se infieren de las rutas a los archivos de datos. Puede anularlos en la configuración.
El adaptador de datos predeterminado admite archivos YAML y JSON.
I18N-Tasks puede administrar múltiples archivos de traducción y leer traducciones de otras gemas. Para obtener más información, consulte las opciones data en la configuración. NB: por defecto, solo se leen los archivos %{locale}.yml , no namespace.%{locale}.yml . Asegúrese de verificar la configuración.
Para escribir en los archivos locales, I18N-Tasks proporciona 2 opciones.
El enrutador de patrones organiza claves basadas en una lista de patrones clave, como en el ejemplo a continuación:
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'
El enrutador conservador mantiene las llaves donde se encuentran o infiere el camino desde el lugar base. Si la clave es completamente nueva, el enrutador conservador recurrirá al comportamiento del enrutador de patrones. El enrutador conservador es el enrutador predeterminado .
data:
router: conservative_router
write:
- ['devise.*', 'config/locales/devise.%{locale}.yml']
- 'config/locales/%{locale}.yml'
Si desea que las tareas i18n reorganizaran sus claves existentes usando data.write , establezca el enrutador en pattern_router como se indicó anteriormente, o ejecuta i18n-tasks normalize -p (forzando el uso del enrutador de patrón para esa ejecución).
El enrutador de aislamiento supone que cada archivo YAML es independiente y puede contener claves similares.
Como resultado, las traducciones se escriben en un archivo de destino alternativo para cada archivo de origen (solo la parte %{locale} se cambia para que coincida con el objetivo de destino). Por lo tanto, no es necesario especificar ninguna configuración write (de hecho, se ignorará por completo).
Esto puede ser útil, por ejemplo, cuando se usa ViewComponent sidECARS (ViewComponent asigna un alcance implícito a cada archivo sidecar Yaml, pero i18n-tasks no son conscientes de esa lógica, lo que resulta en colisiones)::
app/components/movies_component.en.yml :
en :
title : Movies app/components/games_component.en.yml
en :
title : GamesSin embargo, este enrutador tiene una limitación: no es compatible con la detección de claves faltantes del uso del código (ya que no es consciente de la lógica de alcance implícito).
Se usa una sintaxis especial similar a los patrones de globas de archivo en las tareas de traducción de I18N para que coincida con las teclas de traducción:
| sintaxis | descripción |
|---|---|
* | coincide con todo |
: | coincide con una sola clave |
*: | coincide con parte de una sola clave |
{a, bc} | coincidir con cualquier set, puede usar : y * , el partido se captura |
Ejemplo de uso:
$ 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.bodySi almacena datos en algún lugar pero en el sistema de archivos, por ejemplo, en la base de datos o MongoDB, puede implementar un adaptador personalizado. Si ha implementado un adaptador personalizado, compártelo en el wiki.
I18N-Tasks utiliza un escáner AST para archivos .rb y .html.erb , y un escáner regexp para todos los demás archivos. Se pueden agregar nuevos escáneres fácilmente: consulte este ejemplo.
Consulte la sección search en el archivo de configuración para todas las opciones de configuración disponibles. NB: Por defecto, solo se busca la app/ directorio.
Agregue sugerencias al análisis estático con sugerencias de comentarios mágicos (líneas que comienzan con (#|/) i18n-tasks-use de forma predeterminada):
# i18n-tasks-use t('activerecord.models.user') # let i18n-tasks know the key is used
User . model_name . human También puede ignorar explícitamente las teclas que aparecen en archivos locales a través de la configuración ignore* .
Si tiene métodos auxiliares que generan claves de traducción, como un método page_title que devuelve t '.page_title' , o un método Spree.t(key) que devuelve t "spree.#{key}" , use el PatternMapper incorporado para asignarlos.
Para casos más complejos, puede implementar un escáner personalizado.
Consulte el archivo de configuración para obtener más información.
i18n-tasks translate-missing requiere una tecla API de traductor de Google, consíguela en la consola de la API de Google.
Donde está esta clave depende de su consola de Google API:
En ambos casos, es posible que deba crear la clave si no existe.
Coloque la clave en GOOGLE_TRANSLATE_API_KEY Variable de entorno o en el archivo de configuración.
# config/i18n-tasks.yml
translation :
backend : google
google_translate_api_key : <Google Translate API key>o a través de la variable de entorno:
GOOGLE_TRANSLATE_API_KEY= < Google Translate API key > i18n-tasks translate-missing requiere una tecla API DeepL Pro, consíguela en DeepL. Puede especificar locales de alias si solo usa los locales simples internamente.
# 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-bro a través de variables de entorno:
DEEPL_API_KEY= < DeepL Pro API key >
DEEPL_HOST= < optional >
DEEPL_VERSION= < optional > i18n-tasks translate-missing requiere una tecla API Yandex, consíguela en Yandex.
# config/i18n-tasks.yml
translation :
backend : yandex
yandex_api_key : <Yandex API key>o a través de la variable de entorno:
YANDEX_API_KEY= < Yandex API key > i18n-tasks translate-missing requiere una tecla API de OpenAI, consíguela en OpenAI.
# config/i18n-tasks.yml
translation :
backend : openai
openai_api_key : <OpenAI API key>
openai_model : <optional>o a través de la variable de entorno:
OPENAI_API_KEY= < OpenAI API key >
OPENAI_MODEL= < optional > i18n-tasks translate-missing requiere un proyecto Watsonx y una clave API, consíguelo en IBM Watsonx.
# config/i18n-tasks.yml
translation :
backend : watsonx
watsonx_api_key : <watsonx API key>
watsonx_project_id : <watsonx project id>
watsonx_model : <optional>o a través de la variable de entorno:
WATSONX_API_KEY= < watsonx API key >
WATSONX_PROJECT_ID= < watsonx project id >
WATSONX_MODEL= < optional > Hay una característica experimental para analizar rieles con más contexto. i18n-tasks admitirá:
before_actionsModel.human_attribute_name llamadasModel.model_name.human llamadas Habilitándolo agregando el escáner en su config/i18n-tasks.yml :
<% I18n :: Tasks . add_scanner (
'I18n::Tasks::Scanners::PrismScanner' ,
only : %w( *.rb )
) %> Para habilitar solo Ruby-scanning y no cualquier soporte de rieles, agregue la configuración en la sección search :
search :
prism_visitor : " ruby " # default "rails" i18n-tasks irb comienza una sesión IRB en el contexto I18N-Tasks. guide de tipo para más información.
Ver i18n-Tasks wiki: tareas de importación y exportación de CSV.
Las tareas que vienen con la gema se definen en lib/i18n/tareas/comandos/comandos. Las tareas personalizadas se pueden agregar fácilmente, vea los ejemplos en el wiki.
bundle installbundle exec rspecovercommit --install SKIP=RuboCop git commitOVERCOMMIT_DISABLE=1 git commit