eggmyproject provides a tailored workflow to translate Python documentation in minutes. This approach delivers numerous automated steps, offering faster iterations than slow, fully manual work, enhancing accuracy while simplifying the human review process, providing a clear path from source to target files. By focusing on essential terms and clear glossaries, you save time compared with ad hoc translations and maintain consistency across several modules.
The pipeline relies on babel to extract strings from Python sources, then maps them to translation units in the file myapplicationlocaleeslc_messagesmyapplicationpo. This files path structure keeps translations next to code, enabling seamless deployment into your application locale settings and making review manageable through human checks. Providing a single source of truth reduces drift during change across releases.
Adopt a glossary-driven approach with a base of 900 terms and a living glossary updated weekly. With numerous domain terms, you can enhance consistency, while a human reviewer handles edge cases in several sentences per file. This reduces back-and-forth and maintains technical accuracy across languages.
To accelerate adoption, configure a minimal pipeline: extract strings, run automated translation, review, and publish. Use a simple CI check that flags untranslated segments and runtime placeholders, ensuring providing translations align with code references. This approach supports multiple locales in one pass, allowing teams to ship updates faster and maintain necessary consistency.
Track metrics: average translation time per file, percent of reviewed units, and post-translation QA passes. Typical teams report 2–4 minutes per page for standard docs, with files count in the dozens for a mid-size project. For larger sets, scale by processing batches of 15–25 files in parallel and applying a change rate threshold to catch regressions early.
Practical steps to translate Python docs and build a message catalog
Audit existing translations across modules and centralize them in a single catalog. Extract strings from Python code, templates, and documentation, and log how you are obtaining them, then build a baseline of messages with a focus on user-facing text and error messages. Limit the initial pass to a practical set (about 500–800 entries) to help manage changes and keep the project measurable.
Create a minimal, properly structured 2config file to map each source string to a stable ID, record the default English value, and add optional context fields such as names, module, and information. The file should be configured so new strings can be added without breaking existing mappings. Treat this as a step in your global localization workflow.
Establish a real-time workflow by feeding strings through a translation memory tool like wordfast, and keep the catalog in sync with a simply executed merge. Ensure the workflow supports message IDs and works across environments and invoked paths where gettext is called.
Handle plural forms by adding separate entries for pluralization rules and a pluralize helper in code. This avoids complex merges and keeps value selections simple. Use clear names for contexts and include examples to reduce false positives during reviews.
Store message entries with minimal information: id, default value, context, and source location. Use a robust format such as PO or JSON, and provide a per-locale catalog. Ensure multiple modules reference the same entry to maintain consistency across the project.
In a Pyramid project, load the catalog at startup via 2config, expose a single message lookup function, and cache results for performance. Run a lightweight test harness to verify real-time lookups, measure translations across templates and views, and track value coverage and feedback from user-facing tests.
Identify translatable strings in Python docs, docstrings, and Sphinx sources
Create a reproducible pipeline using a venv, install the provided requirements, and run a single pass to collect translatable strings across code, docs, and Sphinx sources in minutes.
- Prepare the environment and requirements
- Set up a virtual environment:
python3 -m venv venvand activate it. - Install the necessary packages from requirements:
pip install -r requirements.txt. - Lock dependencies to ensure consistent versions for apis, Django projects, and tooling.
- Set up a virtual environment:
- Identify translatable strings in Python code
- Scan existing source files for translatable patterns such as translationstringadd calls and wrappers like _() or gettext().
- Capture strings appearing in function and class docstrings (docstrings) and in module attributes that expose user-visible text.
- Record the location (file, line, attribute) of each string to enable precise updates and later review.
- Process Python docs and docstrings
- Leverage a parser to traverse modules and extract __doc__ strings, including class, method, and attribute docstrings.
- Group strings by source type (docs vs. code) and mark those that appear in existing APIs versus new additions.
- Handle Sphinx sources and localization
- Configure Sphinx settings for gettext output in the provided project, enabling the gettext builder and locale_dirs.
- Run a gettext build (for example,
sphinx-build -b gettext . _build/gettext) to generate .pot catalogs from .rst sources. - Optionally use a workflow like sphinx-intl to update translations automatically, or a parser-based pass to supplement the catalogs.
- Convert to and manage translation catalogs
- Use msginit to create new language PO files from the provided POT:
msginit --locale.--input messages.pot --output-file locale/ /LC_MESSAGES/messages.po - Fill or verify translations; use msgmerge to incorporate updates from newer POTs when sources change.
- For project demos or free-time experiments, consider a demo with a single language to validate the flow before scaling to multiple versions.
- Use msginit to create new language PO files from the provided POT:
- Link catalogs to the codebase and tests
- Ensure the translationstringadd entries, when present, appear in the catalogs and map to equivalent strings in the target language.
- Validate that the translation strings render correctly in the Django admin or other APIs that display text, and that attributes exposing user-visible messages are covered.
- Include a parser pass in the CI pipeline to verify no new translatable strings are left behind in existing files.
- Maintenance and workflow integration
- Embed the collection into a CI pass so every new release or version update triggers a fresh pot extraction and PO update.
- Keep the demo environment synchronized with the given project settings and Django integration points to ensure consistency across versions.
- Document the process in the installation and development guide to help engineers align on requirements and expectations.
What to look for during the pass
- Translatable strings that appear in Python docs, docstrings, and Sphinx sources must map to a translationstringadd event or a standard gettext pattern.
- Equivalence checks validate that translations convey the same meaning across languages and that no context is lost when strings move from code to catalogs.
- Attributes exposing user messages should be scanned, including API surfaces (apis) and Django templates if used in the project.
- Keep a record of existing strings and newly discovered ones, tagging them with a status such as provided, missing, or updated.
Practical notes for a smooth run
- Use a minimal demo repository to verify the pipeline before applying it to large codebases.
- Ensure the parser can handle multiple file types: .py for code, .rst/.md for docs, and any custom extension used in Sphinx sources.
- Configure a stable locale path (e.g., locales/) and a clear output layout for .pot and .po files to simplify review and merging.
- Keep your settings aligned with the project’s versioning strategy; you may manage translations alongside versions and release notes.
- For calendar-based text within docs, ical2po can be used to bridge specific translation flows if such content exists in the project.
Resulting artifacts and next steps
- PO and POT files with all translatable strings collected from docs, docstrings, and Sphinx sources.
- A mapping between original strings and their equivalents for each supported language, enabling quick verification during reviews.
- A repeatable process that you can reuse for Django projects, API docs, and other Python-based ecosystems, reducing manual copy-paste effort to a few clicks.
- A clear path to keep translations current as code evolves, with msginit acting as the initial cradle for new languages and a simple update path for ongoing work.
Extract strings into a portable catalog (.pot) using a reliable toolchain
Extract the supplied eggmyproject source into a portable catalog (.pot) to support internationalization. Capture strings from Python calls and template attributes with gettext keywords, and keep UTF-8 encoding. The pot represents everything already represented in code and templates and becomes the right starting point for translations across languages.
To create the pot and seed translations, run: xgettext --language=Python --from-code=UTF-8 --keyword=_ --keyword=ngettext:1,2 -o eggmyproject.pot eggmyproject/**/*.py eggmyproject/templates/**/*.html. Then for each language, run: msginit --input=eggmyproject.pot --locale=es_ES --output=eggmyproject/locale/es_ES/LC_MESSAGES/eggmyproject.po --no-translator. For additional locales, simply swap in the new --locale value and path; this is the easiest way to grow your translation set.
Keep the pot fresh by tying the process to your configurator so that changes in source trigger a re-run of xgettext and an update of eggmyproject.pot. A lightweight converter can merge new strings into the pot while preserving existing translations, reducing manual edits and keeping workflows smooth.
Use aviewrequest channels to exchange strings with translators and teams, and maintain a single template that covers all languages. When strings appear in attributes or in templates, ensure the converter recognizes them for accurate extraction. This approach makes translations accessible and consistent across every language you support.
Manage per-language.po files: contexts, placeholders, and plural forms
Reload per-language.po changes automatically to avoid startup delays. Use a lightweight parser to scan your sources, then feed updates to the current session with your renderers. This keeps multilingual content fresh without restarting the app and reduces turnaround time for translators, boosting performance during active sessions.
Contexts help disambiguate strings. Use msgctxt for each usage and adopt a clear naming convention such as "menu.file.open" or "button.submit". Usually, contexts reflect real UI paths, improving clarity across multilingual UIs where the same message appears in various places.
Placeholders must survive translation unchanged. Keep the same tokens in msgid and msgstr (for example %(name)s or %s). A parser can validate placeholders and warn about missing or reordered tokens. Always preserve markup around placeholders and test rendering in a multilingual session to confirm returns are correct.
Plural forms require careful header configuration. Set Plural-Forms with correct nplurals and a language-specific plural expression. Most languages use two forms, while some require three or more. Test with numbers like 0, 1, 2, 5, and adjust the formula as needed. When exporting to xliff or re-importing, keep the same semantics to avoid drift.
Workflow tips: keep per-language.po files in a consistent packaging layout; installed translation data should be loaded lazily to minimize startup overhead; use a small set of tools to validate; for example you can run an automated session to check placeholders, contexts, and plural forms. For simple teams, apply changes 1from a single base locale, then propagate to others via automation. Saved changes should be versioned and errors surfaced clearly, and integrate with CI so most builds catch issues before packaging. Offering translators a straightforward, reliable workflow reduces time spent on corrections and improves overall quality.
Compile catalogs into runtime formats (gettext.mo, JSON, or Django/.po integrations)
Run a single automated pipeline to convert your localization catalogs into runtime formats: gettext.mo, JSON, and Django/.po integrations. This keeps the same translations aligned across targets and makes updates a change that saves you time. Use a demo project to verify the flow before applying to a production app. The steps below explain how to perform this in a venv and how to map translations to runtime formats.
- Подготовьте среду
Create a virtual environment with python -m venv venv and activate it (source venv/bin/activate on Unix, venv\Scripts\activate on Windows). Install Babel, polib, Django, and Pyramid as needed. These installations save you from conflicts across applications and should be kept isolated inside the venv.
- Extract catalogs from templates
Run the commands to generate a pot from your templates and localization-related sources. Example: pybabel extract -F babel.cfg -o messages.pot templates/ docs/ locales/ and ensure the extraction accepts the right paths. A single request can collect strings from multiple template formats, and these commands support replacement tokens for placeholders.
- Initialize and update translations
Initialize for a locale: pybabel init -i messages.pot -d translations -l mappingnumber1. For existing locales, use pybabel update -i messages.pot -d translations. These steps create or refresh the Po files and keep the domain structure consistent.
- Compile to gettext MO and create JSON
Compile to MO with pybabel compile -d translations. The result is translations/
/LC_MESSAGES/ .mo, which the runtime loaders accept. To provide JSON for API clients, run a lightweight snippet or a small script that reads each .po and writes a locale-map.json in translations/ /mapping.json. This approach lets applications that accept JSON read replacements efficiently. - Integrate with Django/.po workflows
For Django, run python manage.py makemessages -l mappingnumber1 and python manage.py compilemessages. These steps prepare Django/.po integrations and ensure your Django templates and views can load translations at runtime. In projects that use multiple apps, repeat for each locale and domain as needed.
- Configure runtime loading for Pyramid or other frameworks
In Pyramid projects, wire the catalogs by adding the translation dirs and, when needed, call pyramidconfigconfiguratoradd_translation_dirs('/path/to/translations'). While this config runs, ensure that the same catalogs are loaded by all applications that share domains. This setup supports several apps with a shared translation strategy.
- Test and validate
After deployment, perform a quick demo request to verify the loaded strings. Use a simple page to confirm that the translations are retrieved correctly for the given locale and that the JSON mapping aligns with the MO output.
Validate translations with automated checks, previews, and CI integration
Enable automated checks, previews, and CI integration to catch translation issues early and keep content consistent across languages.
Define a scheme that uses gettext catalogs and a central translatable object model. Use a parser configured in pyramidconfig to extract strings from Python code, templates, and JavaScript where translatable text appears. Ensure these sources present a complete set of keys and that the default language remains intact across the repository.
Add extra automated tests that cover missing translations, placeholder integrity, and plural rules. These tests often rely on the gettext workflow and verify that strings render correctly in each locale. They should confirm that translations align with the information in catalogs and that the last update is tracked for each language. These checks across languages help you maintain accuracy as you translate new content.
For previews, generate staging previews in a virtual environment and render strings with JavaScript to confirm layout, typography, and accessibility attributes. This helps ensure translatable content appears correctly and accessible labels and alt text remain intact across locales.
Integrate into CI so every commit triggers tests and previews. Configure workflows to run on push and pull requests, produce a clear report, and fail the build if any check drops below the default threshold. Across teams, these steps reduce friction and keep translating services aligned with the current information scheme. In practice, youd benefit from a shared, repeatable pipeline based on pyramidconfig and gettext across projects.
| Step | Action | Инструменты/Заметки |
| 1. String collection | Run a parser to extract translatable strings from pyramidconfig, code, templates, and JavaScript; build a master POT/PO set | pybabel, gettext, babel parser; ensure default language is present in source |
| 2. Quality checks | Validate missing translations, placeholder integrity, and plural forms; compare with last release | gettext, msgfmt, tests, information, scheme |
| 3. Preview generation | Render previews in a staging view; verify layout, typography, and accessibility across locales | virtual previews, JavaScript rendering, accessibility checks |
| 4. CI integration | Attach to CI pipeline; fail on issues; emit cross-language reports | GitHub Actions, CI services, pyramidconfig, tests |




