<div align="center">
<a href="https://github.com/activist-org/i18n-check"><img src="https://raw.githubusercontent.com/activist-org/i18n-check/main/.github/resources/i18nCheckGitHubBanner.png" width=1024 alt="i18n check logo"></a>
</div>
[](http://i18n-check.readthedocs.io/en/latest/)
[](https://github.com/activist-org/i18n-check/actions/workflows/pr_ci_backend.yaml)
[](https://github.com/activist-org/i18n-check/issues)
[](https://github.com/activist-org/i18n-check/blob/main/CONTRIBUTING.md)
[](https://pypi.org/project/i18n-check/)
[](https://pypi.org/project/i18n-check/)
[](https://github.com/activist-org/i18n-check/blob/main/LICENSE.txt)
[](https://github.com/activist-org/i18n-check/blob/main/.github/CODE_OF_CONDUCT.md)
[](https://matrix.to/#/#activist_community:matrix.org)
### Check i18n/L10n keys and values
`i18n-check` is a Python package to automate the validation of keys and values of your internationalization and localization processes.
Developed by the [activist community](https://github.com/activist-org), this process is meant to assure that development and i18n/L10n teams are in sync when using JSON based localization processes. The action can be expanded later to work for other file type processes as needed.
<a id="contents"></a>
# **Contents**
- [Conventions](#contentions-)
- [Installation](#installation-)
- [How it works](#how-it-works-)
- [Commands](#commands-)
- [Arguments](#arguments-)
- [Checks](#checks-)
- [Configuration](#configuration-)
- [YAML File](#yaml-file-)
- [Additional Arguments](#additional-arguments-)
- [pre-commit](#pre-commit-)
- [Contributing](#contributing)
- [Environment setup](#environment-setup)
- [Contributors](#contributors-)
<a id="conventions-"></a>
# Conventions [`⇧`](#contents)
[activist](https://github.com/activist-org/activist) i18n keys follow the following conventions that are enforced by `i18n-check`:
- All key base paths should be the file path where the key is used prepended with `i18n.`
- Starting i18n keys with a common identifier allows them to be found within checks
- If a key is used in more than one file, then the lowest common directory followed by `_global` is the base path
- Base paths should be followed by a minimally descriptive content reference
- Only the formatting of these content references is checked via `i18n-check`
- Separate base directory paths by periods (`.`)
- Separate all directory and file name components as well as content references by underscores (`_`)
- Repeat words in file paths for sub directory organization should not be repeated in the key
> [!NOTE]
> An example valid key is:
>
> File: `components/component/ComponentName.ext`
>
> Key: `"components.component_name.CONTENT_REFERENCE"`
<a id="installation-"></a>
# Installation [`⇧`](#contents)
`i18n-check` is available for installation via [pip](https://pypi.org/project/i18n-check/):
```bash
pip install i18n-check
```
The latest development version can further be installed via the source code in the repository:
```bash
git clone https://github.com/activist-org/i18n-check.git # or your fork
cd i18n-check
pip install -e .
```
<a id="how-it-works-"></a>
# How it works [`⇧`](#contents)
<a id="commands-"></a>
### Commands [`⇧`](#contents)
The following are example commands for `i18n-check`:
```bash
i18n-check -h # view the help
i18n-check -gcf # generate a configuration file
i18n-check -gtf # generate test frontends to experiment with
i18n-check -a # run all checks
# Available check IDs are ki, ik, uk, nsk, rk, rv and nk (see below).
i18n-check -CHECK_ID # run a specific check
```
<a id="arguments-"></a>
### Arguments [`⇧`](#contents)
You provide `i18n-check` with the following arguments:
- `src-dir`: The path to the directory that has source code to check
- `i18n-dir`: The directory path to your i18n files
- `i18n-src`: The name of the i18n source file
- `file-types-to-check`: The file types that the checks should be ran against
<a id="checks-"></a>
### Checks [`⇧`](#contents)
There the following checks can ran across your codebase:
- `key-identifiers` (`ki`): Does the source file have keys that don't match the above format or name conventions?
- Rename them so i18n key usage is consistent and their scope is communicated in their name.
- `invalid-keys` (`ik`): Does the codebase include i18n keys that are not within the source file?
- Check their validity and resolve if they should be added to the i18n files or replaced.
- `unused-keys` (`uk`): Does the source file have keys that are not used in the codebase?
- Remove them so the localization team isn't working on strings that aren't used.
- `non-source-keys` (`nsk`): Do the target locale files have keys that are not in the source file?
- Remove them as they won't be used in the application.
- `repeat-keys` (`rk`): Do any of localization files have repeat keys?
- Separate them so that the values are not mixed when they're in production.
- `repeat-values` (`rv`): Does the source file have repeat values that can be combined into a single key?
- Combine them so the localization team only needs to localize one of them.
- `nested-keys` (`nk`): Do the i18n files contain nested JSON structures?
- Flatten them to make replacing invalid keys easier with find-and-replace all.
Directions for how to fix the i18n files are provided when errors are raised. Checks can also be disabled in the workflow via options passed in the configuration YAML file.
<a id="configuration-"></a>
# Configuration [`⇧`](#contents)
<a id="yaml-file-"></a>
### YAML File [`⇧`](#contents)
The following details the `.18n-check.yaml` configuration file, with a further example being the [configuration file for this repository](/.i18n-check.yaml) that we use in testing.
```yaml
src-dir: frontend
i18n-dir: frontend/i18n
i18n-src: frontend/i18n/en.json
file-types-to-check: [.ts, .js]
checks:
# Global configurations are applied to all checks.
global:
active: true # enables all checks by default
directories-to-skip: [frontend/node_modules]
files-to-skip: []
key-identifiers:
active: true # can be used to override individual checks
directories-to-skip: []
files-to-skip: []
invalid-keys:
active: true
directories-to-skip: []
files-to-skip: []
unused-keys:
active: true
directories-to-skip: []
files-to-skip: []
non-source-keys:
active: true
repeat-keys:
active: true
repeat-values:
active: true
nested-keys:
active: true
```
> [!NOTE]
> When `global.active` is set to `true`, all checks are enabled by default. You can then explicitly disable specific checks by setting their `active` value to `false`. This allows for more concise configuration files. For example:
>
> ```yaml
> checks:
> global:
> active: true
> repeat-values:
> active: false # disabled even though global is active
> ```
<a id="additional-arguments-"></a>
### Additional Arguments [`⇧`](#contents)
Common additional arguments for using specific web frameworks can be found in the dropdowns below:
<details><summary>Vue.js</summary>
<p>
```yaml
file_types_to_check: [.vue]
checks:
global:
directories_to_skip: [frontend/.nuxt, frontend/.output, frontend/dist]
```
</p>
</details>
<a id="pre-commit-"></a>
### pre-commit [`⇧`](#contents)
The following is an example [pre-commit](https://github.com/pre-commit/pre-commit) hook:
```yaml
- repo: local
hooks:
- id: run-i18n-check
name: run i18n-check key-value checks
files: ^src-dir/
entry: i18n-check -a
language: python
```
<a id="contributing"></a>
# Contributing [`⇧`](#contents)
<a href="https://matrix.to/#/#activist_community:matrix.org"><img src="https://raw.githubusercontent.com/activist-org/Organization/main/resources/images/logos/MatrixLogoGrey.png" width="175" alt="Public Matrix Chat" align="right"></a>
activist uses [Matrix](https://matrix.org/) for internal communication. You're more than welcome to [join us in our public chat rooms](https://matrix.to/#/#activist_community:matrix.org) to share ideas, ask questions or just say hi to the team :) We'd suggest that you use the [Element](https://element.io/) client and [Element X](https://element.io/app) for a mobile app.
Please see the [contribution guidelines](CONTRIBUTING.md) if you are interested in contributing. Work that is in progress or could be implemented is tracked in the [issues](https://github.com/activist-org/i18n-check/issues) and [projects](https://github.com/activist-org/i18n-check/projects).
> [!NOTE]
> Just because an issue is assigned on GitHub doesn't mean the team isn't open to your contribution! Feel free to write [in the issues](https://github.com/activist-org/i18n-check/issues) and we can potentially reassign it to you.
Also check the [`-next release-`](https://github.com/activist-org/i18n-check/labels/-next%20release-) and [`-priority-`](https://github.com/activist-org/i18n-check/labels/-priority-) labels in the [issues](https://github.com/activist-org/i18n-check/issues) for those that are most important, as well as those marked [`good first issue`](https://github.com/activist-org/i18n-check/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) that are tailored for first-time contributors. For those new to coding or our tech stack, we've collected [links to helpful documentation pages](CONTRIBUTING.md#learning-the-tech-stack-) in the [contribution guidelines](CONTRIBUTING.md).
We would be happy to discuss granting you further rights as a contributor after your first pull requests, with a maintainer role then being possible after continued interest in the project. activist seeks to be an inclusive, diverse and supportive organization. We'd love to have you on the team!
<a id="how-you-can-help"></a>
## How you can help [`⇧`](#contents)
- [Reporting bugs](https://github.com/activist-org/i18n-check/issues/new?assignees=&labels=bug&template=bug_report.yml) as they're found 🐞
- Working with us on [new features](https://github.com/activist-org/i18n-check/issues?q=is%3Aissue+is%3Aopen+label%3Afeature) ✨
- [Documentation](https://github.com/activist-org/i18n-check/issues?q=is%3Aissue+is%3Aopen+label%3Adocumentation) for onboarding and project cohesion 📝
<a id="environment-setup"></a>
# Environment setup [`⇧`](#contents)
1. First and foremost, please see the suggested IDE setup in the dropdown below to make sure that your editor is ready for development.
> [!IMPORTANT]
>
> <details><summary>Suggested IDE setup</summary>
>
> <p>
>
> VS Code
>
> Install the following extensions:
>
> - [charliermarsh.ruff](https://marketplace.visualstudio.com/items?itemName=charliermarsh.ruff)
> - [streetsidesoftware.code-spell-checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker)
>
> </p>
> </details>
2. [Fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo) the [i18n-check repo](https://github.com/activist-org/i18n-check), clone your fork, and configure the remotes:
> [!NOTE]
>
> <details><summary>Consider using SSH</summary>
>
> <p>
>
> Alternatively to using HTTPS as in the instructions below, consider SSH to interact with GitHub from the terminal. SSH allows you to connect without a user-pass authentication flow.
>
> To run git commands with SSH, remember then to substitute the HTTPS URL, `https://github.com/...`, with the SSH one, `git@github.com:...`.
>
> - e.g. Cloning now becomes `git clone git@github.com:<your-username>/i18n-check.git`
>
> GitHub also has their documentation on how to [Generate a new SSH key](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent) 🔑
>
> </p>
> </details>
```bash
# Clone your fork of the repo into the current directory.
git clone https://github.com/<your-username>/i18n-check.git
# Navigate to the newly cloned directory.
cd i18n-check
# Assign the original repo to a remote called "upstream".
git remote add upstream https://github.com/activist-org/i18n-check.git
```
- Now, if you run `git remote -v` you should see two remote repositories named:
- `origin` (forked repository)
- `upstream` (i18n-check repository)
3. Create a virtual environment, activate it and install dependencies:
```bash
# Unix or MacOS:
python3 -m venv venv
source venv/bin/activate
# Windows:
python -m venv venv
venv\Scripts\activate.bat
# After activating venv:
pip install --upgrade pip
pip install -r requirements-dev.txt
# To install the CLI for local development:
pip install -e .
```
You're now ready to work on `i18n-check`!
> [!NOTE]
> Feel free to contact the team in the [Development room on Matrix](https://matrix.to/#/!CRgLpGeOBNwxYCtqmK:matrix.org?via=matrix.org&via=acter.global&via=chat.0x7cd.xyz) if you're having problems getting your environment setup!
<a id="contributors-"></a>
# Contributors [`⇧`](#contents)
Thanks to all our amazing [contributors](https://github.com/activist-org/i18n-check/graphs/contributors)! ❤️
<a href="https://github.com/activist-org/i18n-check/graphs/contributors">
<img src="https://contrib.rocks/image?repo=activist-org/i18n-check" />
</a>
Raw data
{
"_id": null,
"home_page": "https://github.com/activist-org/i18n-check",
"name": "i18n-check",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "i18n, l10n, internationalization, localization, ci, cli",
"author": "i18n-check developers",
"author_email": "team@activist.org",
"download_url": null,
"platform": null,
"description": "<div align=\"center\">\n <a href=\"https://github.com/activist-org/i18n-check\"><img src=\"https://raw.githubusercontent.com/activist-org/i18n-check/main/.github/resources/i18nCheckGitHubBanner.png\" width=1024 alt=\"i18n check logo\"></a>\n</div>\n\n[](http://i18n-check.readthedocs.io/en/latest/)\n[](https://github.com/activist-org/i18n-check/actions/workflows/pr_ci_backend.yaml)\n[](https://github.com/activist-org/i18n-check/issues)\n[](https://github.com/activist-org/i18n-check/blob/main/CONTRIBUTING.md)\n[](https://pypi.org/project/i18n-check/)\n[](https://pypi.org/project/i18n-check/)\n[](https://github.com/activist-org/i18n-check/blob/main/LICENSE.txt)\n[](https://github.com/activist-org/i18n-check/blob/main/.github/CODE_OF_CONDUCT.md)\n[](https://matrix.to/#/#activist_community:matrix.org)\n\n### Check i18n/L10n keys and values\n\n`i18n-check` is a Python package to automate the validation of keys and values of your internationalization and localization processes.\n\nDeveloped by the [activist community](https://github.com/activist-org), this process is meant to assure that development and i18n/L10n teams are in sync when using JSON based localization processes. The action can be expanded later to work for other file type processes as needed.\n\n<a id=\"contents\"></a>\n\n# **Contents**\n\n- [Conventions](#contentions-)\n- [Installation](#installation-)\n- [How it works](#how-it-works-)\n - [Commands](#commands-)\n - [Arguments](#arguments-)\n - [Checks](#checks-)\n- [Configuration](#configuration-)\n - [YAML File](#yaml-file-)\n - [Additional Arguments](#additional-arguments-)\n - [pre-commit](#pre-commit-)\n- [Contributing](#contributing)\n- [Environment setup](#environment-setup)\n- [Contributors](#contributors-)\n\n<a id=\"conventions-\"></a>\n\n# Conventions [`\u21e7`](#contents)\n\n[activist](https://github.com/activist-org/activist) i18n keys follow the following conventions that are enforced by `i18n-check`:\n\n- All key base paths should be the file path where the key is used prepended with `i18n.`\n - Starting i18n keys with a common identifier allows them to be found within checks\n- If a key is used in more than one file, then the lowest common directory followed by `_global` is the base path\n- Base paths should be followed by a minimally descriptive content reference\n - Only the formatting of these content references is checked via `i18n-check`\n- Separate base directory paths by periods (`.`)\n- Separate all directory and file name components as well as content references by underscores (`_`)\n- Repeat words in file paths for sub directory organization should not be repeated in the key\n\n> [!NOTE]\n> An example valid key is:\n>\n> File: `components/component/ComponentName.ext`\n>\n> Key: `\"components.component_name.CONTENT_REFERENCE\"`\n\n<a id=\"installation-\"></a>\n\n# Installation [`\u21e7`](#contents)\n\n`i18n-check` is available for installation via [pip](https://pypi.org/project/i18n-check/):\n\n```bash\npip install i18n-check\n```\n\nThe latest development version can further be installed via the source code in the repository:\n\n```bash\ngit clone https://github.com/activist-org/i18n-check.git # or your fork\ncd i18n-check\npip install -e .\n```\n\n<a id=\"how-it-works-\"></a>\n\n# How it works [`\u21e7`](#contents)\n\n<a id=\"commands-\"></a>\n\n### Commands [`\u21e7`](#contents)\n\nThe following are example commands for `i18n-check`:\n\n```bash\ni18n-check -h # view the help\ni18n-check -gcf # generate a configuration file\ni18n-check -gtf # generate test frontends to experiment with\ni18n-check -a # run all checks\n# Available check IDs are ki, ik, uk, nsk, rk, rv and nk (see below).\ni18n-check -CHECK_ID # run a specific check\n```\n\n<a id=\"arguments-\"></a>\n\n### Arguments [`\u21e7`](#contents)\n\nYou provide `i18n-check` with the following arguments:\n\n- `src-dir`: The path to the directory that has source code to check\n- `i18n-dir`: The directory path to your i18n files\n- `i18n-src`: The name of the i18n source file\n- `file-types-to-check`: The file types that the checks should be ran against\n\n<a id=\"checks-\"></a>\n\n### Checks [`\u21e7`](#contents)\n\nThere the following checks can ran across your codebase:\n\n- `key-identifiers` (`ki`): Does the source file have keys that don't match the above format or name conventions?\n - Rename them so i18n key usage is consistent and their scope is communicated in their name.\n- `invalid-keys` (`ik`): Does the codebase include i18n keys that are not within the source file?\n - Check their validity and resolve if they should be added to the i18n files or replaced.\n- `unused-keys` (`uk`): Does the source file have keys that are not used in the codebase?\n - Remove them so the localization team isn't working on strings that aren't used.\n- `non-source-keys` (`nsk`): Do the target locale files have keys that are not in the source file?\n - Remove them as they won't be used in the application.\n- `repeat-keys` (`rk`): Do any of localization files have repeat keys?\n - Separate them so that the values are not mixed when they're in production.\n- `repeat-values` (`rv`): Does the source file have repeat values that can be combined into a single key?\n - Combine them so the localization team only needs to localize one of them.\n- `nested-keys` (`nk`): Do the i18n files contain nested JSON structures?\n - Flatten them to make replacing invalid keys easier with find-and-replace all.\n\nDirections for how to fix the i18n files are provided when errors are raised. Checks can also be disabled in the workflow via options passed in the configuration YAML file.\n\n<a id=\"configuration-\"></a>\n\n# Configuration [`\u21e7`](#contents)\n\n<a id=\"yaml-file-\"></a>\n\n### YAML File [`\u21e7`](#contents)\n\nThe following details the `.18n-check.yaml` configuration file, with a further example being the [configuration file for this repository](/.i18n-check.yaml) that we use in testing.\n\n```yaml\nsrc-dir: frontend\ni18n-dir: frontend/i18n\ni18n-src: frontend/i18n/en.json\n\nfile-types-to-check: [.ts, .js]\n\nchecks:\n # Global configurations are applied to all checks.\n global:\n active: true # enables all checks by default\n directories-to-skip: [frontend/node_modules]\n files-to-skip: []\n key-identifiers:\n active: true # can be used to override individual checks\n directories-to-skip: []\n files-to-skip: []\n invalid-keys:\n active: true\n directories-to-skip: []\n files-to-skip: []\n unused-keys:\n active: true\n directories-to-skip: []\n files-to-skip: []\n non-source-keys:\n active: true\n repeat-keys:\n active: true\n repeat-values:\n active: true\n nested-keys:\n active: true\n```\n\n> [!NOTE]\n> When `global.active` is set to `true`, all checks are enabled by default. You can then explicitly disable specific checks by setting their `active` value to `false`. This allows for more concise configuration files. For example:\n>\n> ```yaml\n> checks:\n> global:\n> active: true\n> repeat-values:\n> active: false # disabled even though global is active\n> ```\n\n<a id=\"additional-arguments-\"></a>\n\n### Additional Arguments [`\u21e7`](#contents)\n\nCommon additional arguments for using specific web frameworks can be found in the dropdowns below:\n\n<details><summary>Vue.js</summary>\n<p>\n\n```yaml\nfile_types_to_check: [.vue]\n\nchecks:\n global:\n directories_to_skip: [frontend/.nuxt, frontend/.output, frontend/dist]\n```\n\n</p>\n</details>\n\n<a id=\"pre-commit-\"></a>\n\n### pre-commit [`\u21e7`](#contents)\n\nThe following is an example [pre-commit](https://github.com/pre-commit/pre-commit) hook:\n\n```yaml\n- repo: local\n hooks:\n - id: run-i18n-check\n name: run i18n-check key-value checks\n files: ^src-dir/\n entry: i18n-check -a\n language: python\n```\n\n<a id=\"contributing\"></a>\n\n# Contributing [`\u21e7`](#contents)\n\n<a href=\"https://matrix.to/#/#activist_community:matrix.org\"><img src=\"https://raw.githubusercontent.com/activist-org/Organization/main/resources/images/logos/MatrixLogoGrey.png\" width=\"175\" alt=\"Public Matrix Chat\" align=\"right\"></a>\n\nactivist uses [Matrix](https://matrix.org/) for internal communication. You're more than welcome to [join us in our public chat rooms](https://matrix.to/#/#activist_community:matrix.org) to share ideas, ask questions or just say hi to the team :) We'd suggest that you use the [Element](https://element.io/) client and [Element X](https://element.io/app) for a mobile app.\n\nPlease see the [contribution guidelines](CONTRIBUTING.md) if you are interested in contributing. Work that is in progress or could be implemented is tracked in the [issues](https://github.com/activist-org/i18n-check/issues) and [projects](https://github.com/activist-org/i18n-check/projects).\n\n> [!NOTE]\n> Just because an issue is assigned on GitHub doesn't mean the team isn't open to your contribution! Feel free to write [in the issues](https://github.com/activist-org/i18n-check/issues) and we can potentially reassign it to you.\n\nAlso check the [`-next release-`](https://github.com/activist-org/i18n-check/labels/-next%20release-) and [`-priority-`](https://github.com/activist-org/i18n-check/labels/-priority-) labels in the [issues](https://github.com/activist-org/i18n-check/issues) for those that are most important, as well as those marked [`good first issue`](https://github.com/activist-org/i18n-check/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) that are tailored for first-time contributors. For those new to coding or our tech stack, we've collected [links to helpful documentation pages](CONTRIBUTING.md#learning-the-tech-stack-) in the [contribution guidelines](CONTRIBUTING.md).\n\nWe would be happy to discuss granting you further rights as a contributor after your first pull requests, with a maintainer role then being possible after continued interest in the project. activist seeks to be an inclusive, diverse and supportive organization. We'd love to have you on the team!\n\n<a id=\"how-you-can-help\"></a>\n\n## How you can help [`\u21e7`](#contents)\n\n- [Reporting bugs](https://github.com/activist-org/i18n-check/issues/new?assignees=&labels=bug&template=bug_report.yml) as they're found \ud83d\udc1e\n- Working with us on [new features](https://github.com/activist-org/i18n-check/issues?q=is%3Aissue+is%3Aopen+label%3Afeature) \u2728\n- [Documentation](https://github.com/activist-org/i18n-check/issues?q=is%3Aissue+is%3Aopen+label%3Adocumentation) for onboarding and project cohesion \ud83d\udcdd\n\n<a id=\"environment-setup\"></a>\n\n# Environment setup [`\u21e7`](#contents)\n\n1. First and foremost, please see the suggested IDE setup in the dropdown below to make sure that your editor is ready for development.\n\n> [!IMPORTANT]\n>\n> <details><summary>Suggested IDE setup</summary>\n>\n> <p>\n>\n> VS Code\n>\n> Install the following extensions:\n>\n> - [charliermarsh.ruff](https://marketplace.visualstudio.com/items?itemName=charliermarsh.ruff)\n> - [streetsidesoftware.code-spell-checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker)\n>\n> </p>\n> </details>\n\n2. [Fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo) the [i18n-check repo](https://github.com/activist-org/i18n-check), clone your fork, and configure the remotes:\n\n> [!NOTE]\n>\n> <details><summary>Consider using SSH</summary>\n>\n> <p>\n>\n> Alternatively to using HTTPS as in the instructions below, consider SSH to interact with GitHub from the terminal. SSH allows you to connect without a user-pass authentication flow.\n>\n> To run git commands with SSH, remember then to substitute the HTTPS URL, `https://github.com/...`, with the SSH one, `git@github.com:...`.\n>\n> - e.g. Cloning now becomes `git clone git@github.com:<your-username>/i18n-check.git`\n>\n> GitHub also has their documentation on how to [Generate a new SSH key](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent) \ud83d\udd11\n>\n> </p>\n> </details>\n\n```bash\n# Clone your fork of the repo into the current directory.\ngit clone https://github.com/<your-username>/i18n-check.git\n# Navigate to the newly cloned directory.\ncd i18n-check\n# Assign the original repo to a remote called \"upstream\".\ngit remote add upstream https://github.com/activist-org/i18n-check.git\n```\n\n- Now, if you run `git remote -v` you should see two remote repositories named:\n - `origin` (forked repository)\n - `upstream` (i18n-check repository)\n\n3. Create a virtual environment, activate it and install dependencies:\n\n ```bash\n # Unix or MacOS:\n python3 -m venv venv\n source venv/bin/activate\n\n # Windows:\n python -m venv venv\n venv\\Scripts\\activate.bat\n\n # After activating venv:\n pip install --upgrade pip\n pip install -r requirements-dev.txt\n\n # To install the CLI for local development:\n pip install -e .\n ```\n\nYou're now ready to work on `i18n-check`!\n\n> [!NOTE]\n> Feel free to contact the team in the [Development room on Matrix](https://matrix.to/#/!CRgLpGeOBNwxYCtqmK:matrix.org?via=matrix.org&via=acter.global&via=chat.0x7cd.xyz) if you're having problems getting your environment setup!\n\n<a id=\"contributors-\"></a>\n\n# Contributors [`\u21e7`](#contents)\n\nThanks to all our amazing [contributors](https://github.com/activist-org/i18n-check/graphs/contributors)! \u2764\ufe0f\n\n<a href=\"https://github.com/activist-org/i18n-check/graphs/contributors\">\n <img src=\"https://contrib.rocks/image?repo=activist-org/i18n-check\" />\n</a>\n",
"bugtrack_url": null,
"license": ": OSI Approved :: GNU License",
"summary": "Check i18n/L10n keys and values",
"version": "1.7.1",
"project_urls": {
"Homepage": "https://github.com/activist-org/i18n-check"
},
"split_keywords": [
"i18n",
" l10n",
" internationalization",
" localization",
" ci",
" cli"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "943e2a3e7e2c84aeac88adcc1fd87cd885d6722c9397426fa625b9a854cf6f2c",
"md5": "6d51322b54204eb3ba5676457b706e5d",
"sha256": "438bc59f638e50a3754bdd8bed75de0fd23cf933a50dd62c3fdcd6461d249785"
},
"downloads": -1,
"filename": "i18n_check-1.7.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "6d51322b54204eb3ba5676457b706e5d",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 43377,
"upload_time": "2025-07-24T11:45:28",
"upload_time_iso_8601": "2025-07-24T11:45:28.527625Z",
"url": "https://files.pythonhosted.org/packages/94/3e/2a3e7e2c84aeac88adcc1fd87cd885d6722c9397426fa625b9a854cf6f2c/i18n_check-1.7.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-24 11:45:28",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "activist-org",
"github_project": "i18n-check",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "certifi",
"specs": [
[
">=",
"2025.7.9"
]
]
},
{
"name": "charset-normalizer",
"specs": [
[
">=",
"3.4.2"
]
]
},
{
"name": "idna",
"specs": [
[
">=",
"3.10"
]
]
},
{
"name": "markdown-it-py",
"specs": [
[
">=",
"3.0.0"
]
]
},
{
"name": "mdurl",
"specs": [
[
">=",
"0.1.2"
]
]
},
{
"name": "pygments",
"specs": [
[
">=",
"2.19.2"
]
]
},
{
"name": "pyyaml",
"specs": [
[
">=",
"6.0.2"
]
]
},
{
"name": "requests",
"specs": [
[
">=",
"2.32.4"
]
]
},
{
"name": "rich",
"specs": [
[
">=",
"14.0.0"
]
]
},
{
"name": "urllib3",
"specs": [
[
">=",
"2.5.0"
]
]
}
],
"lcname": "i18n-check"
}