Repository navigation
Translations
OpenVitals uses Android XML resources for app UI translations. Codeberg Translate is the preferred place for community translation work.
Translate the Android app here:
translate.codeberg.org/projects/openvitals/android-app
Create one Weblate component for the Android app UI:
- Project:
OpenVitals - Component:
Android app - Repository: the GitHub
Hale-MTU/OpenVitalsrepository - VCS mode:
GitHub pull request - File format:
Android String Resource - File mask:
app/src/main/res/values-*/strings.xml - Monolingual base language file:
app/src/main/res/values/strings.xml - Source language: English
- Edit base file: disabled
- License:
AGPL-3.0-or-later
Add the GitHub repository webhook target:
https://translate.codeberg.org/hooks/github
The first component intentionally excludes debug, nightly, Fastlane
metadata, release notes, and docs. Add separate components later if those need
community translation.
Shipping app languages are English, Czech, Spanish, French, Galician, German, Italian, Japanese, Estonian, Finnish, Polish, Portuguese, Russian, and Simplified Chinese. Every locale file is fully translated, so new keys go to all of them.
New languages can be collected in Codeberg Translate before they are ready to
ship. A new values-<lang>/strings.xml file can be merged once it is more than
70% translated, reviewed, and passes CI. Languages above that threshold
are generated into the in-app language picker automatically.
A merged language that is still below the threshold fails verifyTranslations
until it catches up — see the translation gate in
development.md, which records the current state.
Android's MissingTranslation lint check is disabled because partial Weblate
languages are allowed. The repository validator replaces that check by enforcing
the greater-than-70% coverage threshold, placeholder safety, plural shape, and
translatable="false" handling.
- Preserve placeholders exactly, including numbered placeholders like
%1$sand percent values like%1$d%%. - Preserve escaped newlines such as
\nwhen they are part of the source text. - Keep product names and platform names unchanged unless the language normally
localizes them:
OpenVitals,Health Connect,Google Play,Codeberg,Zulip, package names, URLs, and measurement unit symbols. - Prefer short labels. Many strings appear in compact cards, buttons, tabs, and dashboard widgets.
- Do not translate resources marked
translatable="false"in the base file.
Weblate keeps its own clone of main and pushes its commits to the
weblate-translations branch; the weblate-pr.yml workflow opens the pull
request. Merge that pull request with a merge commit. A squash or a
rebase-merge rewrites Weblate's commits, so on its next update Weblate cannot
rebase its branch onto main, the component locks, and the alerts page shows
"could not merge the repository".
When that has happened, the translations Weblate holds are only in its clone, so do not press Reset first. Recover them like this:
git remote add weblate https://translate.codeberg.org/git/openvitals/mobile-app/
git fetch weblate main
git checkout -b weblate-recovery origin/main
git merge --no-ff weblate/mainResolve values-*/strings.xml by keeping both sides (both usually append at
the end of the file), run python3 scripts/verify-translations.py, commit,
open a pull request and merge it with a merge commit. Weblate's commits are then
ancestors of main, and Manage → Repository maintenance → Update on
translate.codeberg.org fast-forwards and unlocks the component. If it still
reports a conflict after that, Reset is now safe: everything it held is on
main.
Run the translation validator before merging Weblate pull requests:
./gradlew verifyTranslationsThe validator reports locale files at or below 70% coverage, stale extra keys,
translated translatable="false" resources, plural shape mismatches, and
placeholder mismatches. It is also part of ./gradlew verifyCi.
Plural shape follows each language's CLDR categories, listed in
CLDR_LANGUAGE_QUANTITIES in scripts/verify-translations.py. Japanese and
Chinese have only other, so they may drop the one branch English carries.
A new language not yet in that table is held to every quantity the base file
has, so add its CLDR categories when Weblate adds the language.
Generated from docs/engineering/translations.md. Edit it there; changes made here are overwritten.
This wiki mirrors the Markdown in Hale-MTU/OpenVitals on every push to main.
Features
- Features
- Achievements
- Activity And Training Plans
- Activity Metrics
- Apple Health Import
- Beverage Logging And Caffeine
- Bluetooth LE Sensors
- Body Energy
- Body Metrics
- CoMaps Navigation Context
- CSV Import
- Cycle Tracking
- Daily Readiness
- Elevation Correction
- Feature Map
- FIT Files Import
- Food Logging
- GPX/KML/KMZ/TCX Route Import
- Health Connect Metrics Dashboard
- Health Report Export
- Heart And Vitals
- Heart Rate Recovery
- Home Screen Widgets
- Hydration
- Manual Entry Of Metrics
- Medical Records
- Metric Detail Customization
- Mindfulness
- Non Health Connect Metrics Dashboard
- Nutrition
- Offline Maps Support
- Onboarding And Permissions
- Preloaded Beverage Nutrition Reference
- Privacy, Support, And Diagnostics
- Recording Of Activity
- Reminders
- Settings And Preferences
- Sleep Score And Recovery
- Sleep Tracking
- Statistics
- Sync With Another Phone
How-to
App
- App Guide
- FAQ
- Getting Started
- Health Connect
- Install
- Local And Connected Editions
- Permissions
- Privacy
- Screenshots
- Support
Reference
- Design Reference
- Reference
- Design Guidelines for Offline & Sync
- OpenVitals UI Notes
- Reference: Data Capture
- Reference: Data Display
- Reference: Health Connect Matchmaking
- Reference: Health Connect Onboarding
- Reference: Health Connect Permissions
- Reference: Health Connect UX
- Reference: Promoting Health Connect
Engineering
- Code Analysis
- Engineering
- Flutter ↔ Kotlin test-parity matrix
- apple-health-import
- Architecture
- body-cycle-recovery
- Design system conformance
- Development
- Feature Playbook
- Flutter -> Kotlin test parity: domain/data/core/contract/state/navigation/di/bootstrap/l10n/widget_test
- Flutter → Kotlin test-parity matrix: features section
- Flutter → Kotlin test-parity matrix: ui / goldens / integration / fixtures
- Flutter-to-Kotlin test-parity matrix — dashboard + devicesync
- manual-entry
- Translations
Proposals
- Proposals
- Activity Start Flow Analysis
- Activity Start Flow Simplification Proposals
- Caffeine Detail And Future Sleep Insights
- Cycle Tracking: Design and Status
- Medical Records Through Health Connect
- Medical Records: What Is Left
Releases
- OpenVitals 2.16.0
- OpenVitals 2.15.2
- OpenVitals 2.15.1
- OpenVitals 2.15.0
- OpenVitals 2.14.5
- OpenVitals 2.14.4
- OpenVitals 2.14.3
- OpenVitals 2.14.2
- OpenVitals 2.14.1
- OpenVitals 2.14.0
- OpenVitals 2.13.0
- OpenVitals 2.12.0
- OpenVitals 2.11.2
- OpenVitals 2.11.1
- OpenVitals 2.11.0
- OpenVitals 2.10.1
- OpenVitals 2.10.0
- OpenVitals 2.9.1
- OpenVitals 2.9.0
- OpenVitals 2.8.0
- OpenVitals 2.7.3
- OpenVitals 2.7.2
- OpenVitals 2.7.1
- OpenVitals 2.7.0
- OpenVitals 2.6.6
- OpenVitals 2.6.5
- OpenVitals 2.6.4
- OpenVitals 2.6.3
- OpenVitals 2.6.2
- OpenVitals 2.6.1
- OpenVitals 2.6.0
- OpenVitals 2.5.0
- OpenVitals 2.4.1
- OpenVitals 2.4.0
- OpenVitals 2.3.2
- OpenVitals 2.3.1
- OpenVitals 2.3.0
- OpenVitals 2.2.8
- OpenVitals 2.2.7
- OpenVitals 2.2.6
- OpenVitals 2.2.5
- OpenVitals 2.2.4
- OpenVitals 2.2.3
- OpenVitals 2.2.2
- OpenVitals 2.2.1
- OpenVitals 2.2.0
- OpenVitals 2.1.0
- OpenVitals 2.0.4
- OpenVitals 2.0.3
- OpenVitals 2.0.2
- OpenVitals 2.0.1
- OpenVitals 1.9.0
- OpenVitals 1.8.0
- OpenVitals 1.7.7
- OpenVitals 1.7.6
- OpenVitals 1.7.5
- OpenVitals 1.7.4
- OpenVitals 1.7.3
- OpenVitals 1.7.2
- OpenVitals 1.7.1
- OpenVitals 1.7.0
- OpenVitals 1.6.3
- OpenVitals 1.6.2
- OpenVitals 1.6.1
- OpenVitals 1.6.0
- OpenVitals 1.5.1
- OpenVitals 1.5.0
Project