Les tâches i18n vous aident à trouver et à gérer les traductions manquantes et inutilisées.
Ce gemme analyse le code statiquement pour les usages clés, tels que I18n.t('some.key') , afin de:
S'adressant ainsi aux deux principaux problèmes de la conception de gemmes i18n:
Les tâches I18N peuvent être utilisées avec n'importe quel projet utilisant le GEM Ruby I18n (par défaut en rails).
Ajoutez des tâches i18n au gemfile:
gem 'i18n-tasks' , '~> 1.0.14' , group : :developmentCopiez le fichier de configuration par défaut:
$ cp $( i18n-tasks gem-path ) /templates/config/i18n-tasks.yml config/Copiez le test RSPEC pour tester les traductions manquantes et inutilisées dans le cadre de la suite (facultative):
$ cp $( i18n-tasks gem-path ) /templates/rspec/i18n_spec.rb spec/Ou pour Mingest:
$ cp $( i18n-tasks gem-path ) /templates/minitest/i18n_test.rb test/ Exécutez bundle exec i18n-tasks pour obtenir la liste de toutes les tâches avec de courtes descriptions.
i18n-tasks health Si des clés sont manquantes ou non utilisées, que les variables d'interpolations sont cohérentes dans les lieux et que tous les fichiers régionaux sont normalisés (format automatique):
$ i18n-tasks healthAjouter des clés manquantes avec des espaces réservés (valeur de base ou clé humanisée):
$ i18n-tasks add-missingLes tâches et d'autres acceptent les arguments:
$ i18n-tasks add-missing -v ' TRME %{value} ' fr Passer --help pour plus d'informations:
$ 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.Traduire les touches manquantes à l'aide d'un service backend de votre choix.
$ i18n-tasks translate-missing
# accepts backend, from and locales options
$ i18n-tasks translate-missing --from=base es fr --backend=googleBackends disponibles:
google - Google Translatedeepl - Deepl Proyandex - yandex traduitopenai - Openaiwatsonx - Watsonx Voyez où les touches sont utilisées avec 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 Ces tâches peuvent déduire des clés dynamiques telles que t("category.#{category.name}") Si vous définissez search.strict sur false, ou passez --no-strict sur la ligne de commande.
Si vous souhaitez conserver la commande à partir du fichier de langue d'origine lorsque vous utilisez la suppression de Sup-Usused, PASS -k ou --keep-order .
Triez les clés:
$ i18n-tasks normalize Triez les touches et déplacez-les vers les fichiers respectifs tels que définis par config.write :
$ i18n-tasks normalize -p i18n-tasks mv <pattern> <target> est une tâche polyvalente pour déplacer ou supprimer les touches correspondant au modèle donné.
Tous les nœuds (feuilles ou sous-arbres) correspondant <pattern> sont fusionnés ensemble et déplacés vers <target> .
Renommez un nœud (feuille ou sous-arbre):
$ i18n-tasks mv user accountDéplacer un nœud:
$ i18n-tasks mv user_alerts user.alertsDéplacez les enfants à un niveau vers le haut:
$ i18n-tasks mv ' alerts.{:} ' ' 1 'Merge-move plusieurs nœuds:
$ i18n-tasks mv ' {user,profile} ' accountFusion (non-feuille) nœuds dans le parent:
$ i18n-tasks mv ' {pages}.{a,b} ' ' 1 ' Supprimez les touches en utilisant la tâche rm :
$ i18n-tasks rm ' user.{old_profile,old_title} ' another_key i18n-tasks fournit également des tâches composables pour la lecture, l'écriture et la manipulation des données locales. Exemples ci-dessous.
add-missing implémenté avec tree-set-value missing et data-merge :
$ i18n-tasks missing -f yaml fr | i18n-tasks tree-set-value ' TRME %{value} ' | i18n-tasks data-merge remove-unused mis en œuvre avec unused et data-remove (sans la confirmation):
$ i18n-tasks unused -f yaml | i18n-tasks data-remove Retirez toutes les clés de fr qui n'existent pas dans en . Ne changez pas en :
$ i18n-tasks missing -t diff -f yaml en | i18n-tasks tree-mv en fr | i18n-tasks data-remove Voir la liste complète des tâches avec i18n-tasks --help .
i18n-tasks utilise un scanner AST pour les fichiers .rb et .html.erb , et un scanner basé sur Regexp pour d'autres fichiers, tels que .haml .
i18n-tasks offre une prise en charge des clés relatives, telles que t '.title' .
✔ Les clés par rapport au chemin de fichier dans lequel elles sont utilisées (voir la configuration des racines relatives) sont prises en charge.
✔ Les clés relatives à controller.action_name dans les contrôleurs Rails sont prises en charge. Le nom def le plus proche est utilisé.
✔ Les clés plurielles, comme key.{one,many,other,...} sont entièrement pris en charge.
✔ Les clés de référence (touches avec :symbol ) sont entièrement prises en charge. Ces clés sont copiées telles quelles dans add/translate-missing , et peuvent être recherchées par référence ou valeur dans find .
t() Arguments de mots clés ✔ L'argument des mots clés scope est entièrement pris en charge par le scanner AST, ainsi que par le scanner Regexp mais uniquement lorsqu'il s'agit du premier argument.
✔ L'argument default peut être utilisé pour remplir les fichiers locaux (scanner AST uniquement).
Par défaut, les clés dynamiques telles que t "cats.#{cat}.name" ne sont pas reconnues. Je vous encourage à les marquer avec des conseils d'utilisation des tâches i18n.
Alternativement, vous pouvez activer l'inférence dynamique de la clé en définissant search.strict à false dans la configuration. Dans ce cas, toutes les parties dynamiques de la clé seront considérées comme utilisées, par exemple cats.tenderlove.name . Notez qu'une seule section de la clé est traitée comme un joker pour chaque interpolation de cordes; c'est-à-dire que dans cet exemple, cats.tenderlove.special.name ne seront pas utilisés comme inutilisés.
I18n.localize n'est pas pris en charge, utilisez des conseils d'utilisation des tâches i18n. En effet, la clé générée par I18n.localize dépend du type d'objet transmis et ne peut donc pas être déduit statiquement.
La configuration est lue à partir de config/i18n-tasks.yml ou config/i18n-tasks.yml.erb . Inspectez la configuration avec i18n-tasks config .
Installez le fichier de configuration par défaut avec:
$ cp $( i18n-tasks gem-path ) /templates/config/i18n-tasks.yml config/Les paramètres sont compatibles avec les rails par défaut.
Par défaut, base_locale est défini sur en et locales sont déduites des chemins vers les fichiers de données. Vous pouvez les remplacer dans la configuration.
L'adaptateur de données par défaut prend en charge les fichiers YAML et JSON.
I18n-tâches peut gérer plusieurs fichiers de traduction et lire les traductions à partir d'autres gemmes. Pour en savoir plus, consultez les options data dans la configuration. NB: Par défaut, seuls %{locale}.yml sont lus, pas namespace.%{locale}.yml . Assurez-vous de vérifier la configuration.
Pour écrire dans les fichiers locaux i18n-tâches offre 2 options.
Pattern Router organise des clés basées sur une liste de modèles de clés, comme dans l'exemple ci-dessous:
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'
Le routeur conservateur maintient les clés où ils se trouvent, ou dépentent le chemin des paramètres régionaux de base. Si la clé est entièrement nouvelle, le routeur conservateur reprendra le comportement du routeur de motif. Le routeur conservateur est le routeur par défaut .
data:
router: conservative_router
write:
- ['devise.*', 'config/locales/devise.%{locale}.yml']
- 'config/locales/%{locale}.yml'
Si vous souhaitez que les tâches I18N réorganisent vos clés existantes à l'aide data.write , définissez le routeur sur pattern_router comme ci-dessus, ou exécutez i18n-tasks normalize -p (forçant l'utilisation du routeur de motif pour cette exécution).
Le routeur d'isolement suppose que chaque fichier YAML est indépendant et peut contenir des clés similaires.
En conséquence, les traductions sont écrites dans un fichier cible alternatif pour chaque fichier source (seule la pièce %{locale} est modifiée pour correspondre aux paramètres cibles). Ainsi, il n'est pas nécessaire de spécifier une configuration write (en fait, il serait complètement ignoré).
Cela peut être utile par exemple lors de l'utilisation de sidecars ViewComponent (ViewComponent attribue une portée implicite à chaque fichier yaml sidecar mais i18n-tasks n'est pas consciente de cette logique, résultant en collisions):
app/components/movies_component.en.yml :
en :
title : Movies app/components/games_component.en.yml
en :
title : GamesCe routeur a une limitation, cependant: il ne prend pas en charge la détection des clés manquantes de l'utilisation du code (car elle n'est pas consciente de la logique de portée implicite).
Une syntaxe spéciale similaire aux modèles Glob File est utilisée dans des tâches i18n pour faire correspondre les touches de traduction:
| syntaxe | description |
|---|---|
* | correspond à tout |
: | correspond à une seule clé |
*: | correspond à une partie d'une seule clé |
{a, bc} | correspondre à n'importe quel ensemble, peut utiliser : et * , le match est capturé |
Exemple d'utilisation:
$ 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 vous stockez des données quelque part mais dans le système de fichiers, par exemple dans la base de données ou MongoDB, vous pouvez implémenter un adaptateur personnalisé. Si vous avez implémenté un adaptateur personnalisé, partagez-le sur le wiki.
I18n-tâches utilise un scanner AST pour les fichiers .rb et .html.erb et un scanner regexp pour tous les autres fichiers. De nouveaux scanners peuvent être ajoutés facilement: veuillez vous référer à cet exemple.
Voir la section search dans le fichier de configuration pour toutes les options de configuration disponibles. NB: Par défaut, seul l' app/ le répertoire est recherché.
Ajoutez des conseils à l'analyse statique avec des indices de commentaires magiques (lignes commençant par (#|/) i18n-tasks-use par défaut):
# i18n-tasks-use t('activerecord.models.user') # let i18n-tasks know the key is used
User . model_name . human Vous pouvez également ignorer explicitement les clés apparaissant dans les fichiers régionaux via les paramètres ignore* .
Si vous avez des méthodes d'assistance qui génèrent des touches de traduction, telles qu'une méthode page_title qui renvoie t '.page_title' , ou une méthode Spree.t(key) qui renvoie t "spree.#{key}" , utilisez le PatternMapper intégré pour les mapper.
Pour des cas plus complexes, vous pouvez implémenter un scanner personnalisé.
Voir le fichier de configuration pour en savoir plus.
i18n-tasks translate-missing nécessitent une clé API Google Translate, obtenez-le sur Google API Console.
Où cette clé est dépend de votre console Google API:
Dans les deux cas, vous devrez peut-être créer la clé si elle n'existe pas.
Mettez la clé dans la variable d'environnement GOOGLE_TRANSLATE_API_KEY ou dans le fichier de configuration.
# config/i18n-tasks.yml
translation :
backend : google
google_translate_api_key : <Google Translate API key>ou via l'environnement variable:
GOOGLE_TRANSLATE_API_KEY= < Google Translate API key > i18n-tasks translate-missing nécessitent une clé API Deepl Pro, obtenez-le chez Deepl. Vous pouvez spécifier des lieux d'alias si vous n'utilisez que les lieux simples en interne.
# 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-brou via des variables d'environnement:
DEEPL_API_KEY= < DeepL Pro API key >
DEEPL_HOST= < optional >
DEEPL_VERSION= < optional > i18n-tasks translate-missing nécessitent une clé API Yandex, obtenez-la chez Yandex.
# config/i18n-tasks.yml
translation :
backend : yandex
yandex_api_key : <Yandex API key>ou via l'environnement variable:
YANDEX_API_KEY= < Yandex API key > i18n-tasks translate-missing nécessitent une clé API OpenAI, obtenez-la à OpenAI.
# config/i18n-tasks.yml
translation :
backend : openai
openai_api_key : <OpenAI API key>
openai_model : <optional>ou via l'environnement variable:
OPENAI_API_KEY= < OpenAI API key >
OPENAI_MODEL= < optional > i18n-tasks translate-missing nécessitent un projet Watsonx et une clé API, obtenez-le chez IBM Watsonx.
# config/i18n-tasks.yml
translation :
backend : watsonx
watsonx_api_key : <watsonx API key>
watsonx_project_id : <watsonx project id>
watsonx_model : <optional>ou via l'environnement variable:
WATSONX_API_KEY= < watsonx API key >
WATSONX_PROJECT_ID= < watsonx project id >
WATSONX_MODEL= < optional > Il existe une caractéristique expérimentale pour analyser les rails avec plus de contexte. i18n-tasks soutiendront:
before_actionsModel.human_attribute_name AppelsModel.model_name.human appelle L'a activé en ajoutant le scanner dans votre config/i18n-tasks.yml :
<% I18n :: Tasks . add_scanner (
'I18n::Tasks::Scanners::PrismScanner' ,
only : %w( *.rb )
) %> Pour activer uniquement le scanning Ruby et non aucune prise en charge des rails, veuillez ajouter la configuration dans la section search :
search :
prism_visitor : " ruby " # default "rails" i18n-tasks irb démarre une session IRB dans le contexte i18n-tâches. Type guide pour plus d'informations.
Voir I18N Tâches Wiki: Tâches d'importation et d'exportation CSV.
Les tâches accompagnées de la gemme sont définies dans lib / i18n / tâches / commandes / commandes. Des tâches personnalisées peuvent être ajoutées facilement, voir les exemples du wiki.
bundle installbundle exec rspecovercommit --install SKIP=RuboCop git commitOVERCOMMIT_DISABLE=1 git commit