Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.9.0] - 2026-02-26¶
Added¶
- Added support for
djangojs.pofiles, enabling translation of JavaScript catalog strings alongside standarddjango.pofiles. - PO file extracted comments are now passed to the LLM as translation context, giving the model access to developer hints and notes from source code (e.g.,
# Translators:markers).
Fixed¶
- Fixed DeepL mangling
{placeholder}style brace placeholders and%(name)sformat strings during translation. Placeholders are now wrapped in XML ignore tags before sending to DeepL and restored afterward.
[0.8.1] - 2026-02-25¶
Added¶
- LiteLLM is now fully optional. DeepL-only users can uninstall
litellmto reduce dependency footprint. Attempting to use an LLM provider without litellm installed raises a clear error with install instructions.
Fixed¶
- Fixed plural forms (
msgid_plural/msgstr[n]) being silently ignored during translation. Plural entries are now properly translated and already-translated plurals are correctly skipped. - Fixed DeepL occasionally appending a trailing period to translated strings when the source string does not end with one.
Changed¶
- Updated litellm from 1.81.14 to 1.81.15
[0.8.0] - 2026-02-23¶
Added¶
- Added DeepL translation provider as an alternative to LiteLLM. Configure via
TRANSLATEBOT_PROVIDER = 'deepl'setting. Supports language code mapping, batching respecting DeepL limits, and comprehensive error handling. - Introduced
TranslationProviderABC for extensible provider architecture - Added
deeploptional dependency group (pip install translatebot-django[deepl])
Changed¶
- Refactored translation command to use provider abstraction for extensibility
- Extracted
batch_by_tokens()as a reusable utility function - Updated litellm from 1.81.13 to 1.81.14
[0.7.1] - 2026-02-21¶
Fixed¶
- Fixed batching off-by-one error in PO file and model translation paths where the overflowing item was incorrectly included in the current batch instead of starting a new one
Changed¶
- Enabled branch coverage measurement
- Updated ruff
[0.7.0] - 2026-02-19¶
Added¶
- Added
check_translationsmanagement command for CI pipelines. Checks all.pofiles for missing or fuzzy translations, exiting with code 1 on failure. Includes an optional--makemessagesflag to runmakemessagesbefore checking.
Changed¶
- Refactored locale directory discovery into a shared
_iter_locale_dirs()helper used by bothget_all_po_files()andget_all_po_paths() - Default locale fallback now uses
settings.BASE_DIRinstead of a relative path
[0.6.1] - 2026-02-18¶
Added¶
- Added
CONTRIBUTING.mdwith development setup, testing, and contribution guidelines - Added pepy.tech downloads badge to README
Changed¶
- Repositioned README messaging to differentiate from AI assistants and SaaS platforms
- Updated installation instructions to recommend installing as a dev dependency
- Updated project description
- Updated litellm from 1.81.11 to 1.81.13
- Updated pytest-django from 4.11.1 to 4.12.0
[0.6.0] - 2026-02-16¶
Added¶
- Added per-app
TRANSLATING.mdsupport. Individual Django apps can now provide their ownTRANSLATING.mdfiles with domain-specific translation context (e.g., medical vs legal terminology). App-level context is combined with the project-level context and passed to the LLM.
Changed¶
- Updated litellm from 1.81.9 to 1.81.11
- Updated ruff from 0.15.0 to 0.15.1
[0.5.0] - 2026-02-09¶
Added¶
- Added
--appflag to filter translation by Django app
Changed¶
- Updated litellm from 1.81.4 to 1.81.9
- Updated Django from 5.2.10 to 5.2.11
[0.4.0] - 2026-01-28¶
Added¶
- Added support for
TRANSLATING.mdfiles to provide project-specific translation context. When present in your project root, the content is included in the LLM prompt to guide translations with terminology, tone, and style preferences.
Changed¶
- Updated litellm from 1.81.1 to 1.81.4
[0.3.10] - 2026-01-23¶
Added¶
- Added automatic retry with exponential backoff for rate limit errors (429). Retries up to 5 times with delays of 60s, 120s, 240s, 480s.
Fixed¶
- Fixed translation count mismatch where LLM would occasionally return fewer translations than expected. The prompt now explicitly instructs the model to return exactly the same number of translations as input strings.
[0.3.9] - 2026-01-23¶
Added¶
- Added graceful handling for insufficient API credits with user-friendly error messages
Changed¶
- Refactored API error handling into a reusable context manager
[0.3.8] - 2026-01-23¶
Fixed¶
- Fixed fuzzy entries not being re-translated. Entries marked as fuzzy in PO files are now correctly identified and re-translated, with the fuzzy flag cleared afterward.
[0.3.7] - 2026-01-23¶
Changed¶
- Updated litellm from 1.80.13 to 1.81.1
Fixed¶
- Fixed language code to locale directory conversion for zh-hans (Simplified Chinese)
[0.3.6] - 2026-01-10¶
Fixed¶
- Fixed JSON parsing when LLM adds preamble text before the JSON array (e.g., "Here is the translation:")
[0.3.5] - 2026-01-10¶
Fixed¶
- Fixed JSON parsing errors when LLM models return responses wrapped in markdown code blocks (e.g., ```json ... ```)
[0.3.4] - 2026-01-10¶
Changed¶
- Updated PyPI homepage link to point to GitHub repository
- Updated documentation link to use translatebot.dev/docs/
- Updated changelog link to point to GitHub CHANGELOG.md
- Added documentation link to top of README
[0.3.3] - 2026-01-10¶
Changed¶
- Updated PyPI links to use docs subdomain
[0.3.2] - 2026-01-10¶
Changed¶
- Improved README documentation
- Added Documentation link to PyPI page
[0.3.1] - 2026-01-10¶
Changed¶
- Updated litellm from 1.80.12 to 1.80.13
- Improved README documentation
[0.3.0] - 2026-01-09¶
Changed¶
- Dropped Python 3.9 support to fix filelock security vulnerability
- Simplified README and added links to documentation at translatebot.dev/docs
- Updated litellm from 1.80.11 to 1.80.12
- Updated ruff from 0.14.10 to 0.14.11
Security¶
- Updated filelock to 3.20.1+ to fix Time-of-Check-Time-of-Use (TOCTOU) race condition vulnerability that allowed local attackers to corrupt or truncate arbitrary user files through symlink attacks
Infrastructure¶
- Bumped actions/checkout from 4 to 6
- Bumped actions/setup-python from 5 to 6
[0.2.2] - 2026-01-06¶
Changed¶
- Updated Django 5.2.9 to 5.2.10
- Updated Django 6.0 to 6.0.1
[0.2.1] - 2026-01-04¶
Changed¶
- Updated author metadata formatting in package configuration
[0.2.0] - 2026-01-03¶
Added¶
- Added proper error handling for authentication failures with helpful error messages
- Added support for translating django-modeltranslation model fields with
--modelsflag - Added intelligent batching for large translation jobs to handle token limits
Changed¶
TRANSLATEBOT_MODELsetting now defaults togpt-4o-miniwhen not configured (previously required)- Improved token limit handling for model field translations with intelligent batching
- Updated README to use
uv addinstead ofpip installfor installation instructions - Removed unused
source_langparameter fromModeltranslationBackend - Improved CLI output for dry-run mode to be cleaner and more informative
- Enhanced dry-run output to show accurate counts of entries that would be translated
- Improved modeltranslation integration to properly detect source content in language-specific fields
Fixed¶
- Fixed
--dry-runflag to properly skip LLM API calls instead of contacting the provider - Fixed dry-run mode showing incorrect entry counts (was always showing 0)
- Fixed dry-run mode for model field translation showing 0 fields when records exist
- Fixed dry-run output showing excessive separator lines when no translations needed
- Fixed incorrect model names in README (updated to current Claude 4.5, Gemini 2.5/3, etc.)
- Corrected misleading README claims about source language auto-detection
- Added missing link to django-modeltranslation project in README features
- Fixed queryset filtering to check language-specific fields instead of base field
- Fixed source text extraction to use populated language fields instead of relying on fallback
Infrastructure¶
- Achieved 100% test coverage across entire codebase
- Added comprehensive test suite for authentication error handling
- Added tests for dry-run mode edge cases
- Added tests for batching logic with large datasets
[0.1.4] - 2025-12-31¶
Changed¶
- Improved CLI output with emojis to match the landing page demo
[0.1.3] - 2025-12-29¶
Changed¶
- Added PyPI badge to README
- Grouped badges in README
[0.1.2] - 2025-12-28¶
Added¶
- Added Changelog and a link to it on the PyPI page
[0.1.1] - 2025-12-28¶
Changed¶
- Added project URLs to PyPI page (Homepage, Repository, Issues)
- Added Poetry installation instructions to README
Infrastructure¶
- Added Codecov integration for test coverage reporting
[0.1.0] - 2025-12-28¶
Added¶
- Initial release
- Django management command
translatebotfor translating .po files - Support for OpenAI-compatible LLM providers via LiteLLM
- Automatic detection of untranslated and fuzzy entries
- Preserves existing translations by default
- Configurable via Django settings or command-line arguments
- Support for Django 4.2, 5.0, 5.1, 5.2, and 6.0
- Support for Python 3.9 through 3.14