{"id":13411922,"url":"https://github.com/glebm/i18n-tasks","last_synced_at":"2025-11-16T12:29:25.761Z","repository":{"id":421633,"uuid":"10893519","full_name":"glebm/i18n-tasks","owner":"glebm","description":"Manage translation and localization with static analysis, for Ruby i18n","archived":false,"fork":false,"pushed_at":"2025-03-22T12:17:20.000Z","size":2939,"stargazers_count":2103,"open_issues_count":69,"forks_count":268,"subscribers_count":32,"default_branch":"main","last_synced_at":"2025-04-22T04:47:24.488Z","etag":null,"topics":["i18n","ruby","static-analysis","static-code-analysis","translation-management"],"latest_commit_sha":null,"homepage":"http://glebm.github.io/i18n-tasks","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/glebm.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2013-06-23T22:44:34.000Z","updated_at":"2025-04-22T01:45:09.000Z","dependencies_parsed_at":"2023-12-09T22:24:24.783Z","dependency_job_id":"f45cf9bb-0733-4c12-918c-f15f59790407","html_url":"https://github.com/glebm/i18n-tasks","commit_stats":{"total_commits":1208,"total_committers":106,"mean_commits":11.39622641509434,"dds":0.1846026490066225,"last_synced_commit":"2cba1093e3c555b6664f62604a2e2f2dfe6f1a6e"},"previous_names":[],"tags_count":133,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glebm%2Fi18n-tasks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glebm%2Fi18n-tasks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glebm%2Fi18n-tasks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glebm%2Fi18n-tasks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/glebm","download_url":"https://codeload.github.com/glebm/i18n-tasks/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250278689,"owners_count":21404253,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["i18n","ruby","static-analysis","static-code-analysis","translation-management"],"created_at":"2024-07-30T20:01:18.559Z","updated_at":"2025-11-16T12:29:25.748Z","avatar_url":"https://github.com/glebm.png","language":"Ruby","funding_links":[],"categories":["Internationalization","Ruby","Time \u0026 Space","Uncategorized"],"sub_categories":["I18n","Uncategorized"],"readme":"# i18n-tasks [![Build Status][badge-ci]][ci] [![Coverage Status][badge-coverage]][coverage] [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/glebm/i18n-tasks?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n\n[![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://stand-with-ukraine.pp.ua/)\n\ni18n-tasks helps you find and manage missing and unused translations.\n\n\u003cimg width=\"539\" height=\"331\" src=\"https://i.imgur.com/XZBd8l7.png\"\u003e\n\nThis gem analyses code statically for key usages, such as `I18n.t('some.key')`, in order to:\n\n* Report keys that are missing or unused.\n* Pre-fill missing keys, optionally from Google Translate or DeepL Pro.\n* Remove unused keys.\n\nThus addressing the two main problems of [i18n gem][i18n-gem] design:\n\n* Missing keys only blow up at runtime.\n* Keys no longer in use may accumulate and introduce overhead, without you knowing it.\n\n## Installation\n\ni18n-tasks can be used with any project using the ruby [i18n gem][i18n-gem] (default in Rails).\n\nAdd i18n-tasks to the Gemfile:\n\n```ruby\ngem 'i18n-tasks', '~\u003e 1.1.0', group: :development\n```\n\nCopy the default [configuration file](#configuration):\n\n```console\n$ cp $(i18n-tasks gem-path)/templates/config/i18n-tasks.yml config/\n```\n\nCopy rspec test to test for missing and unused translations as part of the suite (optional):\n\n```console\n$ cp $(i18n-tasks gem-path)/templates/rspec/i18n_spec.rb spec/\n```\n\nOr for minitest:\n\n```console\n$ cp $(i18n-tasks gem-path)/templates/minitest/i18n_test.rb test/\n```\n\n## Usage\n\nRun `bundle exec i18n-tasks` to get the list of all the tasks with short descriptions.\n\n### Check health\n\n`i18n-tasks health` checks if any keys are missing or not used,\nthat interpolations variables are consistent across locales,\nand that all the locale files are normalized (auto-formatted):\n\n```console\n$ i18n-tasks health\n```\n\n### Add missing keys\n\nAdd missing keys with placeholders (base value or humanized key):\n\n```console\n$ i18n-tasks add-missing\n```\n\nThis and other tasks accept arguments:\n\n```console\n$ i18n-tasks add-missing -v 'TRME %{value}' fr\n```\n\nPass `--help` for more information:\n\n```console\n$ i18n-tasks add-missing --help\nUsage: i18n-tasks add-missing [options] [locale ...]\n    -l, --locales  Comma-separated list of locale(s) to process. Default: all. Special: base.\n    -f, --format   Output format: terminal-table, yaml, json, keys, inspect. Default: terminal-table.\n    -v, --value    Value. Interpolates: %{value}, %{human_key}, %{value_or_human_key}, %{key}. Default: %{value_or_human_key}.\n    -h, --help     Display this help message.\n```\n\n### Translate Missing Keys\n\nTranslate missing keys using a backend service of your choice.\n\n```console\n$ i18n-tasks translate-missing\n\n# accepts backend, from and locales options\n$ i18n-tasks translate-missing --from=base es fr --backend=google\n```\n\nAvailable backends:\n- `google` - [Google Translate](#google-translation-config)\n- `deepl` - [DeepL Pro](#deepl-translation-config)\n- `yandex` - [Yandex Translate](#yandex-translation-config)\n- `openai` - [OpenAI](#openai-translation-config)\n- `watsonx` - [watsonx](#watsonx-translation-config)\n\n### Find usages\n\nSee where the keys are used with `i18n-tasks find`:\n\n```bash\n$ i18n-tasks find common.help\n$ i18n-tasks find 'auth.*'\n$ i18n-tasks find '{number,currency}.format.*'\n```\n\n\u003cimg width=\"437\" height=\"129\" src=\"https://i.imgur.com/VxBrSfY.png\"\u003e\n\n### Remove unused keys\n\n```bash\n$ i18n-tasks unused\n$ i18n-tasks remove-unused\n```\n\nThese tasks can infer [dynamic keys](#dynamic-keys) such as `t(\"category.\\#{category.name}\")` if you set\n`search.strict` to false, or pass `--no-strict` on the command line.\n\nIf you want to keep the ordering from the original language file when using remove-unused, pass\n`-k` or `--keep-order`.\n\n### Normalize data\n\nSort the keys:\n\n```console\n$ i18n-tasks normalize\n```\n\nSort the keys, and move them to the respective files as defined by [`config.write`](#multiple-locale-files):\n\n```console\n$ i18n-tasks normalize -p\n```\n\n### Move / rename / merge keys\n\n`i18n-tasks mv \u003cpattern\u003e \u003ctarget\u003e` is a versatile task to move or delete keys matching the given pattern.\n\nAll nodes (leafs or subtrees) matching [`\u003cpattern\u003e`](#key-pattern-syntax) are merged together and moved to `\u003ctarget\u003e`.\n\nRename a node (leaf or subtree):\n\n``` console\n$ i18n-tasks mv user account\n```\n\nMove a node:\n\n``` console\n$ i18n-tasks mv user_alerts user.alerts\n```\n\nMove the children one level up:\n\n``` console\n$ i18n-tasks mv 'alerts.{:}' '\\1'\n```\n\nMerge-move multiple nodes:\n\n``` console\n$ i18n-tasks mv '{user,profile}' account\n```\n\nMerge (non-leaf) nodes into parent:\n\n``` console\n$ i18n-tasks mv '{pages}.{a,b}' '\\1'\n```\n\n### Delete keys\n\nDelete the keys by using the `rm` task:\n\n```console\n$ i18n-tasks rm 'user.{old_profile,old_title}' another_key\n```\n\n### Compose tasks\n\n`i18n-tasks` also provides composable tasks for reading, writing and manipulating locale data. Examples below.\n\n`add-missing` implemented with `missing`, `tree-set-value` and `data-merge`:\n```console\n$ i18n-tasks missing -f yaml fr | i18n-tasks tree-set-value 'TRME %{value}' | i18n-tasks data-merge\n```\n\n`remove-unused` implemented with `unused` and `data-remove` (sans the confirmation):\n```console\n$ i18n-tasks unused -f yaml | i18n-tasks data-remove\n```\n\nRemove all keys from `fr` that do not exist in `en`. Do not change `en`:\n```console\n$ i18n-tasks missing -t diff -f yaml en | i18n-tasks tree-mv en fr | i18n-tasks data-remove\n```\n\nSee the full list of tasks with `i18n-tasks --help`.\n\n### Features and limitations\n\n`i18n-tasks` uses an AST scanner for `.rb` and `.html.erb` files, and a regexp-based scanner for other files, such as `.haml`.\n\n#### Relative keys\n\n`i18n-tasks` offers support for relative keys, such as `t '.title'`.\n\n✔ Keys relative to the file path they are used in (see [relative roots configuration](#usage-search)) are supported.\n\n✔ Keys relative to `controller.action_name` in Rails controllers are supported. The closest `def` name is used.\n\n#### Plural keys\n\n✔ Plural keys, such as `key.{one,many,other,...}` are fully supported.\n\n#### Reference keys\n\n✔ Reference keys (keys with `:symbol` values) are fully supported. These keys are copied as-is in\n`add/translate-missing`, and can be looked up by reference or value in `find`.\n\n#### Unexpected normalization\n`i18n-tasks` uses a yaml parser and emitter called `Psych` under the hood. `Psych` has it's own heuristic on when\nto use `|`, `\u003e`, or `\"\"` for multi-line strings. This can have some unexpected consequences, eg when normalizing:\n```yaml\na: | \n  Lorem ipsum dolor sit amet, consectetur\n  Lorem ipsum dolor sit amet, consectetur\nb: | \n  Lorem ipsum dolor sit amet, consectetur \n  Lorem ipsum dolor sit amet, consectetur \n```\nwe get the result\n```yaml\na: |\n  Lorem ipsum dolor sit amet, consectetur\n  Lorem ipsum dolor sit amet, consectetur\nb: \"Lorem ipsum dolor sit amet, consectetur \\nLorem ipsum dolor sit amet, consectetur\\n\"\n```\nThe only difference between `a` and `b` is that `b` has an extra trailing space in each line.\nThis is an unfortunate side effect of `i18n-tasks` using `Psych`.\n\n#### `t()` keyword arguments\n\n✔ `scope` keyword argument is fully supported by the AST scanner, and also by the Regexp scanner but only when it is the first argument.\n\n✔ `default` argument can be used to pre-fill locale files (AST scanner only).\n\n#### Dynamic keys\n\nBy default, dynamic keys such as `t \"cats.#{cat}.name\"` are not recognized.\nI encourage you to mark these with [i18n-tasks-use hints](#fine-tuning).\n\nAlternatively, you can enable dynamic key inference by setting `search.strict` to `false` in the config. In this case,\nall the dynamic parts of the key will be considered used, e.g. `cats.tenderlove.name` would not be reported as unused.\nNote that only one section of the key is treated as a wildcard for each string interpolation; i.e. in this example,\n`cats.tenderlove.special.name` *will* be reported as unused.\n\n#### I18n.localize\n\n`I18n.localize` is not supported, use [i18n-tasks-use hints](#fine-tuning).\nThis is because the key generated by `I18n.localize` depends on the type of the object passed in and thus cannot be inferred statically.\n\n## Configuration\n\nConfiguration is read from `config/i18n-tasks.yml` or `config/i18n-tasks.yml.erb`.\nInspect the configuration with `i18n-tasks config`.\n\nInstall the [default config file][config] with:\n\n```console\n$ cp $(i18n-tasks gem-path)/templates/config/i18n-tasks.yml config/\n```\n\nSettings are compatible with Rails by default.\n\n### Locales\n\nBy default, `base_locale` is set to `en` and `locales` are inferred from the paths to data files.\nYou can override these in the [config][config].\n\n### Storage\n\nThe default data adapter supports YAML and JSON files.\n\n#### Multiple locale files\n\ni18n-tasks can manage multiple translation files and read translations from other gems.\nTo find out more see the `data` options in the [config][config].\nNB: By default, only `%{locale}.yml` files are read, not `namespace.%{locale}.yml`. Make sure to check the config.\n\nFor writing to locale files i18n-tasks provides 2 options.\n\n##### Pattern router\n\nPattern router organizes keys based on a list of key patterns, as in the example below:\n\n```\ndata:\n  router: pattern_router\n  # a list of {key pattern =\u003e file} routes, matched top to bottom\n  write:\n    # write models.* and views.* keys to the respective files\n    - ['{models,views}.*', 'config/locales/\\1.%{locale}.yml']\n    # or, write every top-level key namespace to its own file\n    - ['{:}.*', 'config/locales/\\1.%{locale}.yml']\n    # default, sugar for ['*', path]\n    - 'config/locales/%{locale}.yml'\n```\n\n##### Conservative router\n\nConservative router keeps the keys where they are found, or infers the path from base locale.\nIf the key is completely new, conservative router will fall back to pattern router behaviour.\nConservative router is the **default** router.\n\n```\ndata:\n  router: conservative_router\n  write:\n    - ['devise.*', 'config/locales/devise.%{locale}.yml']\n    - 'config/locales/%{locale}.yml'\n```\n\nIf you want to have i18n-tasks reorganize your existing keys using `data.write`, either set the router to\n`pattern_router` as above, or run `i18n-tasks normalize -p` (forcing the use of the pattern router for that run).\n\n##### Isolating router\n\nIsolating router assumes each YAML file is independent and can contain similar keys.\n\nAs a result, the translations are written to an alternate target file for each source file\n(only the `%{locale}` part is changed to match target locale). Thus, it is not necessary to\nspecify any `write` configuration (in fact, it would be completely ignored).\n\nThis can be useful for example when using [ViewComponent sidecars](https://viewcomponent.org/guide/translations.html)\n(ViewComponent assigns an implicit scope to each sidecar YAML file but `i18n-tasks` is not aware of\nthat logic, resulting in collisions):\n\n* `app/components/movies_component.en.yml`:\n   ```yaml\n   en:\n     title: Movies\n   ```\n\n* `app/components/games_component.en.yml`\n   ```yaml\n   en:\n     title: Games\n   ```\n\nThis router has a limitation, though: it does not support detecting missing keys from code usage\n(since it is not aware of the implicit scope logic).\n\n##### Key pattern syntax\n\nA special syntax similar to file glob patterns is used throughout i18n-tasks to match translation keys:\n\n| syntax       | description                                               |\n|:------------:|:----------------------------------------------------------|\n|      `*`     | matches everything                                        |\n|      `:`     | matches a single key                                      |\n|      `*:`    | matches part of a single key                              |\n|   `{a, b.c}` | match any in set, can use `:` and `*`, match is captured  |\n\nExample of usage:\n\n```sh\n$ bundle exec i18n-tasks mv \"{:}.contents.{*}_body\" \"\\1.attributes.\\2.body\"\n\ncar.contents.name_body ⮕ car.attributes.name.body\ncar.contents.description_body ⮕ car.attributes.description.body\ntruck.contents.name_body ⮕ truck.attributes.name.body\ntruck.contents.description_body ⮕ truck.attributes.description.body\n```\n\n#### Custom adapters\n\nIf you store data somewhere but in the filesystem, e.g. in the database or mongodb, you can implement a custom adapter.\nIf you have implemented a custom adapter please share it on [the wiki][wiki].\n\n#### Rails credentials\n\nIf you use Rails credentials and want to load e.g. credentials for translation backends, convert your `i18n-tasks.yml`to `i18n-tasks.yml.erb` and add\na `require \"./config/application\"` line to load Rails.\n\n```yaml\n# config/i18n-tasks.yml.erb\n\u003c% require \"./config/application\" %\u003e\n\n# ...\n\ntranslation:\n  backend: google\n  google_translate_api_key: \u003c%= Rails.application.credentials.google_translate_api_key %\u003e\n```\n\n### Usage search\n\ni18n-tasks uses an AST scanner for `.rb` and `.html.erb` files, and a regexp scanner for all other files.\nNew scanners can be added easily: please refer to [this example](https://github.com/glebm/i18n-tasks/wiki/A-custom-scanner-example).\n\nSee the `search` section in the [config file][config] for all available configuration options.\nNB: By default, only the `app/` directory is searched.\n\n### Fine-tuning\n\nAdd hints to static analysis with magic comment hints (lines starting with `(#|/) i18n-tasks-use` by default):\n\n```ruby\n# i18n-tasks-use t('activerecord.models.user') # let i18n-tasks know the key is used\nUser.model_name.human\n```\n\nYou can also explicitly ignore keys appearing in locale files via `ignore*` settings.\n\nIf you have helper methods that generate translation keys, such as a `page_title` method that returns `t '.page_title'`,\nor a `Spree.t(key)` method that returns `t \"spree.#{key}\"`, use the built-in `PatternMapper` to map these.\n\nFor more complex cases, you can implement a [custom scanner][custom-scanner-docs].\n\nSee the [config file][config] to find out more.\n\n### Environment Variables and Dotenv\n\ni18n-tasks supports loading environment variables from `.env` files using the [dotenv](https://github.com/bkeepers/dotenv) gem.\nThis is particularly useful for storing translation API keys and other sensitive configuration.\n\nIf you have `dotenv` in your Gemfile, i18n-tasks will automatically load environment variables from `.env` files\nbefore executing commands. This means you can store your API keys in a `.env` file:\n\n```bash\n# .env\nGOOGLE_TRANSLATE_API_KEY=your_google_api_key\nDEEPL_AUTH_KEY=your_deepl_api_key\nOPENAI_API_KEY=your_openai_api_key\n```\n\nThe dotenv integration works seamlessly - no additional configuration is required. If `dotenv` is not available,\ni18n-tasks will continue to work normally using system environment variables.\n\n\u003ca name=\"google-translation-config\"\u003e\u003c/a\u003e\n### Google Translate\n\n`i18n-tasks translate-missing` requires a Google Translate API key, get it at [Google API Console](https://code.google.com/apis/console).\n\nWhere this key is depends on your Google API console:\n\n* Old console: API Access -\u003e Simple API Access -\u003e Key for server apps.\n* New console: Nav Menu -\u003e APIs \u0026 Services -\u003e Credentials -\u003e Create Credentials -\u003e API Keys -\u003e Restrict Key -\u003e Cloud Translation API\n\nIn both cases, you may need to create the key if it doesn't exist.\n\nPut the key in `GOOGLE_TRANSLATE_API_KEY` environment variable or in the config file.\n\n```yaml\n# config/i18n-tasks.yml\ntranslation:\n  backend: google\n  google_translate_api_key: \u003cGoogle Translate API key\u003e\n```\n\nor via environment variable:\n\n```bash\nGOOGLE_TRANSLATE_API_KEY=\u003cGoogle Translate API key\u003e\n```\n\n\u003ca name=\"deepl-translation-config\"\u003e\u003c/a\u003e\n### DeepL Pro Translate\n\n`i18n-tasks translate-missing` requires a DeepL Pro API key, get it at [DeepL](https://www.deepl.com/pro). You can specify alias locales if you only use the simple locales internally.\n\n```yaml\n# config/i18n-tasks.yml\ntranslation:\n  backend: deepl\n  deepl_api_key: \u003cDeepL Pro API key\u003e\n  deepl_host: \u003coptional\u003e\n  deepl_version: \u003coptional\u003e\n  deepl_glossary_ids:\n    - f28106eb-0e06-489e-82c6-8215d6f95089\n    - 2c6415be-1852-4f54-9e1b-d800463496b4\n  deepl_options:\n    formality: prefer_less\n  deepl_locale_aliases:\n    en: en-us\n    pt: pt-br\n```\n\nor via environment variables:\n\n```bash\nDEEPL_AUTH_KEY=\u003cDeepL Pro API key\u003e\nDEEPL_HOST=\u003coptional\u003e\nDEEPL_VERSION=\u003coptional\u003e\n```\n\n\u003ca name=\"yandex-translation-config\"\u003e\u003c/a\u003e\n### Yandex Translate\n\n`i18n-tasks translate-missing` requires a Yandex API key, get it at [Yandex](https://tech.yandex.com/translate).\n\n```yaml\n# config/i18n-tasks.yml\ntranslation:\n  backend: yandex\n  yandex_api_key: \u003cYandex API key\u003e\n```\n\nor via environment variable:\n\n```bash\nYANDEX_API_KEY=\u003cYandex API key\u003e\n```\n\n\u003ca name=\"openai-translation-config\"\u003e\u003c/a\u003e\n### OpenAI Translate\n\n`i18n-tasks translate-missing` requires a OpenAI API key, get it at [OpenAI](https://openai.com/).\n\n```yaml\n# config/i18n-tasks.yml\ntranslation:\n  backend: openai\n  openai_api_key: \u003cOpenAI API key\u003e\n  openai_model: \u003coptional\u003e\n```\n\nor via environment variable:\n\n```bash\nOPENAI_API_KEY=\u003cOpenAI API key\u003e\nOPENAI_MODEL=\u003coptional\u003e\n```\n\n\u003ca name=\"watsonx-translation-config\"\u003e\u003c/a\u003e\n### watsonx Translate\n\n`i18n-tasks translate-missing` requires a watsonx project and api key, get it at [IBM watsonx](https://www.ibm.com/watsonx/).\n\n```yaml\n# config/i18n-tasks.yml\ntranslation:\n  backend: watsonx\n  watsonx_api_key: \u003cwatsonx API key\u003e\n  watsonx_project_id: \u003cwatsonx project id\u003e\n  watsonx_model: \u003coptional\u003e\n```\n\nor via environment variable:\n\n```bash\nWATSONX_API_KEY=\u003cwatsonx API key\u003e\nWATSONX_PROJECT_ID=\u003cwatsonx project id\u003e\nWATSONX_MODEL=\u003coptional\u003e\n```\n\n### Prism-based scanner for Ruby and ERB files\n\nThere is a scanner based on [Prism](https://github.com/ruby/prism) usable in two different modes.\n\n- `rails` mode parses Rails code and handles context such as controllers, before_actions, model translations and more.\n- `ruby` mode parses Ruby code only, and works similar to the existing whitequark/parser-implementation.\n- The parser is used for both ruby and ERB files.\n\n#### `rails` mode\n\nIt handles the following cases:\n- Translations called in `before_actions`\n- Translations called in nested methods\n- `Model.human_attribute_name` calls\n- `Model.model_name.human` calls\n\nEnabled it by adding:\n```yaml\nsearch:\n  prism: \"rails\"\n```\n\nto your `config/i18n-tasks.yml` file.\n\n#### `ruby` mode\n\nIt finds all `I18n.t`, `I18n.translate`, `t` and `translate` calls in Ruby code. Enabled it by adding:\n\n```yaml\nsearch:\n  prism: \"ruby\"\n```\n\nThe goal is to replace the whitequark/parser-based scanner with this one in the future.\n\n#### Help us out with testing\n\nPlease install the latest version of the gem and run `i18n-tasks check-prism` which will parse everything with the whitequark/parser-based scanner and then everything with the Prism-scanner and try to compare the results.\n\nOpen up issues with any parser crashes, missed translations or false positives.\n\n## Interactive console\n\n`i18n-tasks irb` starts an IRB session in i18n-tasks context. Type `guide` for more information.\n\n## Import / export to a CSV spreadsheet\n\nSee [i18n-tasks wiki: CSV import and export tasks](https://github.com/glebm/i18n-tasks/wiki/Custom-CSV-import-and-export-tasks).\n\n## Add new tasks\n\nTasks that come with the gem are defined in [lib/i18n/tasks/command/commands](lib/i18n/tasks/command/commands).\nCustom tasks can be added easily, see the examples [on the wiki](https://github.com/glebm/i18n-tasks/wiki#custom-tasks).\n\n# Development\n\n- Install dependencies using `bundle install`\n- Run tests using `bundle exec rspec`\n- Install [Overcommit](https://github.com/sds/overcommit) by running `overcommit --install`\n\n## Skip Overcommit-hooks\n\n- `SKIP=RuboCop git commit`\n- `OVERCOMMIT_DISABLE=1 git commit`\n\n\n[MIT license]: /LICENSE.txt\n[ci]: https://github.com/glebm/i18n-tasks/actions/workflows/tests.yml\n[badge-ci]: https://github.com/glebm/i18n-tasks/actions/workflows/tests.yml/badge.svg\n[coverage]: https://codeclimate.com/github/glebm/i18n-tasks\n[badge-coverage]: https://api.codeclimate.com/v1/badges/5d173e90ada8df07cedc/test_coverage\n[config]: https://github.com/glebm/i18n-tasks/blob/main/templates/config/i18n-tasks.yml\n[wiki]: https://github.com/glebm/i18n-tasks/wiki \"i18n-tasks wiki\"\n[i18n-gem]: https://github.com/svenfuchs/i18n \"svenfuchs/i18n on Github\"\n[screenshot-i18n-tasks]: https://i.imgur.com/XZBd8l7.png \"i18n-tasks screenshot\"\n[screenshot-find]: https://i.imgur.com/VxBrSfY.png \"i18n-tasks find output screenshot\"\n[adapter-example]: https://github.com/glebm/i18n-tasks/blob/main/lib/i18n/tasks/data/file_system_base.rb\n[custom-scanner-docs]: https://github.com/glebm/i18n-tasks/wiki/A-custom-scanner-example\n[overcommit]: https://github.com/sds/overcommit#installation\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fglebm%2Fi18n-tasks","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fglebm%2Fi18n-tasks","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fglebm%2Fi18n-tasks/lists"}