Mailman 3 is now setup for continuous internationalization. We are using Hosted Weblate, which is the hosted service for the Weblate project. It is actually quite nice and I've been learning how to properly document a Django project from it's documentation.
Which brings me to it's documentation. Weblate has great documentation for translators. The UI pretty simple and should be easy to navigate around.
We have setup the workflow in a way that each commit in Gitlab generates a webhook and updates Weblate. Weblate is then able to pull all the changes in real time. To pull translations back into Gitlab, I have a custom script running every night that pulls translations (as commits) and generates pull requests against the upstream repos.
Weblate has the ability to automatically push the translations back, but for security reasons, I didn't want to give a 3rd party service direct push access to our repos. I've been working on a Patch to Weblate, which would allow it to send translations as Merge Requests (as compared to direct-push). After it is merged and deployed at hosted.weblate.org, I hope I can retire my custom script.
We have setup the following projects:
- Mailman Core (https://hosted.weblate.org/projects/gnu-mailman/mailman/) - Postorius* (https://hosted.weblate.org/projects/gnu-mailman/translations/) - Hyperkitty (https://hosted.weblate.org/projects/gnu-mailman/hyperkitty/) - Django-mailman3 (https://hosted.weblate.org/projects/gnu-mailman/django-mailman3/)
There should be empty .po files generated for most languages supported by Django and Mailman Core. If there are any questions or bugs related to source strings, please send out an email to email@example.com.
The current translation %age is pretty low, hopefully we'll be ale to get it close to Mailman 2 sometime soon :)
[*] Yeah, the URL for Postorius is a bit weird, because it was called "translations" before. At the time, I didn't know the difference between a project and a translation component in Weblate terminologies. And they don't give out permissions to change the URL, so we're maybe stuck with it.