Skip to main content

Extract fluent keys from python code and organize them in .ftl files

Project description

FTL-Extract

Description

FTL-Extract is a Python package that extracts Fluent keys from .py files and generates .ftl file with extracted keys.

The ftl CLI is implemented in Rust and ships as a native binary inside the Python wheel.


Installation

Use the package manager pip to install FTL-Extract.

$ pip install FTL-Extract

Or use modern tool like UV to install FTL-Extract.

$ uv add --dev FTL-Extract

Usage

First of all, you should create locales directory in your project.

$ mkdir project_path/locales

Then, you can use the following command to extract keys from your code.

$ ftl extract project_path/code_path project_path/locales

By default, FTL-Extract will create a directory named en and put all keys into _default.ftl file.

In some cases, you may want to extract keys to specific .ftl files. So, there is new keyword argument _path in i18n.get and i18n.<key>.

# Before
i18n.get("key-1", arg1="value1", arg2="value2")

# After
i18n.get("key-1", arg1="value1", arg2="value2", _path="dir/ftl_file.ftl")

# Also
i18n.key_1(arg1="value1", arg2="value2", _path="dir/ftl_file.ftl")

# Or
i18n.some.key_1(arg1="value1", arg2="value2", _path="dir/ftl_file.ftl")

💁‍♂️ Explanation of the ftl extract command

$ ftl extract project_path/code_path project_path/locales
  • project_path/code_path - path to the project directory where the code is located.
  • project_path/locales - path to the project directory where the .ftl files will be located.

📚 Additional arguments

  • -l or --language - add a new language to the project.
  • -k or --i18n-keys - add additional i18n keys to the extractor.
  • -K or --i18n-keys-append - add additional i18n keys to the extractor and append them to the default list.
  • -p or --i18n-keys-prefix - add a prefix to the i18n keys. For example, self.i18n.<key>().
  • -e or --exclude-dirs - exclude specific directories from the extraction process.
  • -E or --exclude-dirs-append - add more directories to exclude from the extraction process.
  • -i or --ignore-attributes - ignore specific attributes of the i18n.* like i18n.set_locale.
  • -I or --append-ignore-attributes - add more attributes to ignore to the default list.
  • --ignore-kwargs - ignore specific kwargs of the i18n_keys like when=... in aiogram_dialog.I18nFormat(..., when=...).
  • --comment-junks - comments errored translations in the .ftl file.
  • --default-ftl-file - specify the default .ftl file name.
  • --comment-keys-mode - specify the comment keys mode. It will comment keys that are not used in the code or print warnings about them. Available modes: comment, warn.
  • -v or --verbose - print additional information about the process.
  • --dry-run - run the command without making any changes to the files.
  • --cache - cache extracted Python keys between runs and reuse them when source file metadata and extractor options are unchanged. By default, the cache is stored in .ftl-extract-cache/extract-<package-version>-v<schema-version>.bin.
  • --cache-path - custom cache directory or file path. Directory paths store the cache as extract-<package-version>-v<schema-version>.bin. Passing this option enables the cache.
  • --clear-cache - delete the existing extraction cache before running.

💁‍♂️ Explanation of the ftl stub command

$ ftl stub 'project_path/locales/<locale>' 'project_path/code_path'
  • project_path/locales/<locale> - path to the locales directory where the <locale> directory (e.g. en) contains .ftl files located.
  • project_path/code_path - path to the directory where the stub.pyi will be located.

💁‍♂️ Explanation of the ftl untranslated command

$ ftl untranslated project_path/locales
  • project_path/locales - path to the locales root directory that contains locale folders like en, uk, etc.

📚 Additional arguments

  • -l or --language - check only selected locales. Can be passed multiple times.
  • --suggest-from - locale(s) used to suggest non-placeholder translations for missing items. Can be passed multiple times.
  • --fail-on-untranslated - return exit code 1 if untranslated keys are found.
  • --output - optional output file path for batch processing reports. If no extension is provided, .txt or .json is appended automatically based on --output-format.
  • --output-format - report file format: txt or json (default: txt).

🙈 Ignore marker for intentional placeholders

If a key is intentionally the same as its message id (for example, brand or domain terms like balance = balance), add a message comment marker above it:

# ftl-extract: ignore-untranslated
balance = balance

This key will be skipped by ftl untranslated.

FAQ

❓ - How to add more languages to the project ?

# Here we add 3 languages: English, Ukrainian and Polish
$ ftl extract project_path/code_path project_path/locales -l en -l uk -l pl

❓ - How to detect another i18n keys like LazyProxy or L ?

# Here we extract ftl keys from i18n-keys like `LF`, `LazyProxy` and `L`
$ ftl extract project_path/code_path project_path/locales -K LF -K LazyProxy -K L

How I use FTL-Extract in most of my projects

$ ftl extract \
  'app/bot' \
  'app/bot/locales' \
  -l 'en' \
  -l 'uk' \
  -K 'LF' \
  -I 'core' \
  -E './tests/*' \
  --ignore-kwargs 'when' \
  --comment-junks \
  --comment-keys-mode 'comment' \
  --verbose

Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

Please make sure to update tests as appropriate.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ftl_extract-0.11.0a2.tar.gz (43.5 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

ftl_extract-0.11.0a2-py3-none-win_amd64.whl (2.0 MB view details)

Uploaded Python 3Windows x86-64

ftl_extract-0.11.0a2-py3-none-musllinux_1_2_x86_64.whl (2.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ftl_extract-0.11.0a2-py3-none-musllinux_1_2_aarch64.whl (1.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ftl_extract-0.11.0a2-py3-none-manylinux_2_28_x86_64.whl (2.0 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

ftl_extract-0.11.0a2-py3-none-manylinux_2_28_aarch64.whl (1.9 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

ftl_extract-0.11.0a2-py3-none-macosx_11_0_arm64.whl (1.8 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

File details

Details for the file ftl_extract-0.11.0a2.tar.gz.

File metadata

  • Download URL: ftl_extract-0.11.0a2.tar.gz
  • Upload date:
  • Size: 43.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ftl_extract-0.11.0a2.tar.gz
Algorithm Hash digest
SHA256 5e89d659f20935ef642dd4980ce36e4e430e666247add5b26e035e8dd26cd70b
MD5 b4c93a7f6eaba34b8a65fa55a4182f10
BLAKE2b-256 472eb72b2ba47bff2509fb13045e89b46811a93ee637e7612e5d23f79ef55845

See more details on using hashes here.

Provenance

The following attestation bundles were made for ftl_extract-0.11.0a2.tar.gz:

Publisher: pypi-release.yml on andrew000/FTL-Extract

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ftl_extract-0.11.0a2-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for ftl_extract-0.11.0a2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 3faa903584d00a07df9209ffc1749b5c7c270cd803feb3649397ba4b12467c41
MD5 d1b737c9049ea9c9edf28cb58e569038
BLAKE2b-256 28d8429d19573175f3a46983b148a8f4fa1724f9c4fdc1671c3fa3fbae3ee68d

See more details on using hashes here.

Provenance

The following attestation bundles were made for ftl_extract-0.11.0a2-py3-none-win_amd64.whl:

Publisher: pypi-release.yml on andrew000/FTL-Extract

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ftl_extract-0.11.0a2-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ftl_extract-0.11.0a2-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 60d9073fa2e975f6bd9ce8499c54e15d07b41a1270c3c2ad8ddc66ea15c38a5e
MD5 e26bf30000d3e71dbe3e9038eeafd512
BLAKE2b-256 fadadbd8d8560be000b99b74493b7e3a395a2eb7c7bc735e5cdf93fca544bdf2

See more details on using hashes here.

Provenance

The following attestation bundles were made for ftl_extract-0.11.0a2-py3-none-musllinux_1_2_x86_64.whl:

Publisher: pypi-release.yml on andrew000/FTL-Extract

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ftl_extract-0.11.0a2-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for ftl_extract-0.11.0a2-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 a56e974ef8b9b150f75d963bd442a9f542d3c86bb39575c9a5ca4aaa97236b2b
MD5 76bd2094975d4a950196e61aceff8ae0
BLAKE2b-256 03bca26eaefe2809c031780b39780672d422b9fe56f6a3c507886e1267ca528f

See more details on using hashes here.

Provenance

The following attestation bundles were made for ftl_extract-0.11.0a2-py3-none-musllinux_1_2_aarch64.whl:

Publisher: pypi-release.yml on andrew000/FTL-Extract

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ftl_extract-0.11.0a2-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ftl_extract-0.11.0a2-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c35076428666cb50fe0171a6554cbe26fd51c03389f4c978ad97537eec63180a
MD5 c4323dc2d373fc3565f7204db4429647
BLAKE2b-256 3c7c706234abcf54dfa20689c9d2db6140488ac16ac073bf846b0c62b49b79f8

See more details on using hashes here.

Provenance

The following attestation bundles were made for ftl_extract-0.11.0a2-py3-none-manylinux_2_28_x86_64.whl:

Publisher: pypi-release.yml on andrew000/FTL-Extract

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ftl_extract-0.11.0a2-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for ftl_extract-0.11.0a2-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 07cc29bdbbab95713d0f5c39122dc731008db862199d7752f1248a4f15debbca
MD5 551b3402ba31aaa6cbc457c292fb27c9
BLAKE2b-256 35d9700ebcfe35e389904d0be590a42350394c84380669f576c657b74c2ea85f

See more details on using hashes here.

Provenance

The following attestation bundles were made for ftl_extract-0.11.0a2-py3-none-manylinux_2_28_aarch64.whl:

Publisher: pypi-release.yml on andrew000/FTL-Extract

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ftl_extract-0.11.0a2-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ftl_extract-0.11.0a2-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 43d926df2c57ad1c4709dcb5922557b5bd215ecb28ba4b28610eacbe1af149a4
MD5 21c3e07aa52ee6fe10696e9728ea80cd
BLAKE2b-256 4450d59c0c4801d57cf33cc5c1d0d16e4eb53770b2ca101be96f4f5faf092347

See more details on using hashes here.

Provenance

The following attestation bundles were made for ftl_extract-0.11.0a2-py3-none-macosx_11_0_arm64.whl:

Publisher: pypi-release.yml on andrew000/FTL-Extract

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page