Glad you want to contribute. This repo contains two components, a GitHub Action written in Python and a WordPress plugin in PHP. Depending on what you want to change, the workflow is slightly different.
- What you can contribute
- Repository setup
- Action development (Python)
- Plugin development (PHP)
- Documentation
- Pull request process
- Adapting for other locales
- Acknowledgments
- Code of conduct
| Type | How | Examples |
|---|---|---|
| Bug report | Open an issue with the bug template | Plugin shows wrong layout, action throws an error |
| Feature request | Open an issue with the feature template | "Filter by issue assignee", new shortcode parameter |
| Code change | Pull request | Bug fix, small improvement, new inventory source |
| Translation | Pull request with a .po file |
de_DE, de_CH, en_US for UI strings |
| Documentation | Pull request with README or docs changes | Typo fixes, clearer explanations, examples |
git clone https://github.com/rfluethi/Training-Translation-Tracker.git
cd Training-Translation-TrackerThe repository contains:
action/, Python code for the GitHub Actionwp-plugin/, WordPress plugin.github/workflows/, build and release workflowsbuild-plugin-zip.sh, builds the plugin ZIP locally
Documentation suite (covers both components):
- docs/Architecture.md, system architecture and design decisions
- docs/Developer.md, code setup, tests, extensions
- docs/Operations.md, releases, token maintenance, failure recovery
- docs/User-Guide.md, plugin usage and issue maintenance
- action/README.md, short action-specific notes
cd action
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtcd action
python -m pytest tests/ -vTests should always be green before every commit.
cd action
python -m src.build --skip-issues # builds tracker.json from inventory-cache.json, no issuesThis produces tracker.json, last-run.md, and data-hygiene.md locally. All three files are in .gitignore and are never committed.
When you add new URLs to scope.yml, you must refresh the inventory cache locally (the action itself does not, since GitHub runner IPs are rate-limited too aggressively):
cd action
python -m src.build --refresh-cache # only fetches missing URLs
git add scope.yml inventory-cache.json
git commit -m "Scope: new URLs"- Python 3.10+
- Ruff for linting (
ruff check src tests) - Use type hints wherever possible
- Place tests next to the code (
tests/test_<module>.py)
# Symlink into the WordPress plugin directory (for a local WP installation)
ln -s "$(pwd)/wp-plugin" /path/to/wp-content/plugins/training-translation-trackerOr build a ZIP for every test:
./build-plugin-zip.sh
# → ~/Desktop/training-translation-tracker.zip- WordPress Coding Standards (see the WordPress.org Handbook)
- All user-visible strings via
__(),_e(), oresc_html__()for i18n - Inline comments in English, consistent across files
- Vendor code (e.g. JS libraries) always with a clear note on origin
For every change that justifies a release, keep three places in sync:
wp-plugin/training-translation-tracker.php,Version:in the headerwp-plugin/training-translation-tracker.php,TTT_VERSIONconstantwp-plugin/readme.txt,Stable tag:
Plus an entry in the changelog (wp-plugin/readme.txt).
git tag v0.4.2 # beta scheme: 0.x.y
git push --tagsThe release workflow automatically builds the ZIP and publishes a GitHub release.
The documentation lives at the top level under docs/:
Architecture.md, system architecture, data model, decisionsDeveloper.md, code setup, modules, tests, extension pointsOperations.md, releases, token, failure recoveryUser-Guide.md, plugin settings, shortcodes, frontend usage, issue maintenanceIssue-Templates-DACH.md, templates for creating translation issues (lesson, handbook text, handbook video)
Documentation contributions are welcome: typo fixes, clearer explanations, examples.
- Fork the repo on GitHub.
- Branch off
mainwith a descriptive name:fix/popover-positioningfeat/csv-exportdocs/contributing-guide
- Commits with clear, short, imperative messages:
- "Fix: popover gets clipped at the right viewport edge"
- "Add: CSV export for tracker items"
- Run tests (action:
pytest, plugin: manual smoke test). - Open a pull request against
mainwith a description covering:- What changes?
- Why?
- How was it tested?
- Iterate on review feedback. No force pushes on the PR branch once review has started.
Other language teams can use this tracker for their own locale:
- Fork the repository.
action/scope.yml: setlocale: French(or whichever Project V2 locale applies).action/scope.yml: enter your pathway and URL list.- Populate
inventory-cache.jsonlocally with--refresh-cache. - Set the GitHub secret
GH_PAT_PROJECT_READto your own PAT (Project V2 read scope). - Update the plugin header in
wp-plugin/training-translation-tracker.php(your plugin name, author, project URI). - Translate text in
docs/and all locale-specific strings. - Build the plugin ZIP and install it on your own site.
Pull requests that contribute generic improvements back upstream (e.g. new inventory sources, new shortcode options) are welcome. Please keep locale-specific changes in your fork.
Frontend UI design concept: Andy Rudorfer (@Bigod). Card layout, status pills, component icons and filter bar interaction follow Andy's design. The implementation in PHP, CSS and JavaScript turns that concept into a WordPress plugin.
We follow the WordPress Community Code of Conduct. Short version: respectful, helpful, constructive. Anyone who insults, excludes, or spreads hate speech will be excluded.