Automation of project branching and/or cloning existent project into new one

My organization has projects that act sort of like git branches for versions: there is a main project and there are projects for older versions. Translations are heavily done in the main project, while the other projects receive translation memory fill-up due to great similarity in the source strings.

From time to time, a new version is released and I have to branch the main into a versioned branch, and by the I main I copy all translation resources from that main project into a new version project. Translations still being worked on in main project.

Currently, I have to manually create a versioned project, download the resources for each language from the main project into PO files, and then upload those PO files into the newly created version.

I’ve been trying to implement an automation via Python SDK but It still has to download from main project to then upload to the new versioned project.

Is it possible for my to automatize this somehow?
Is it possible to clone the project, and bu that I mean not having to download to later upload again the translation files?

Hello @rffontenelle,

I am Antonis from the Transifex Customer Success team.

As I understand your current workflow, you create different projects for different versions, if not, please correct me. Can you keep a single project and create new resources, or does this not match your workflow? This would allow you to use TM fill-up to copy any matching translations instead of doing this manually.

If you are on the premium plan and above, you could also create a Translation Memory group that could connect all your project’s Translation Memory so you could keep your current workflow.

Please let me know if any of the above was helpful, and if you have any further questions, I will be happy to assist you.

Kind regards,


Hi @Mylon

Each version (i.e. each Transifex project) contains more than 500 resources with a total of 24K source strings. Putting them all together would make harder to query strings, to filter what resource from which version I’m looking for.

The projects already have TM fill-up on and, unless I’m reading it wrong, the translations in project are replicated to previous version if there wasn’t a string change between versions. At least, whenever I translate a new string that was also backported to previous version, I see an entry in Suggestion from that previous version.

Hi @Mylon is it possible that the “old” translation memory propagation has been switched off? It previously worked across projects in Python documentation organization, and apparently (not sure for how long though) it now doesn’t work.

@m-aciek Currently we have Translation Memory Fill-up enabled for all projects. However, I just learned that sharing translation memory between projects of a organization requires creating a “translation memory group” which is requires a Premium subscription.

That means we have several projects available that are not making use of translations done in the newest project. Great disappointment.

1 Like

Yup, I tracked down that in October 2022 the old behavior stopped working.

Last translation with propagation (October 20th):

First translation that didn’t propagate (October 30th):

Hello @rffontenelle and @m-aciek,

While creating TM groups is a feature on our Premium plan and up, you can still export your TMX file from a project you have already worked on and import it to a new one to save you time on translations.

From what I gather, you’re working on localizing different versions of the Python docs, so a suggested workflow would be to complete translations either on the latest or earliest available version of the docs and work your way up or down, depending on what you think would save you the most time. Once you finish translations on a version/project, you can export your TMX file and use it on the next one. This can be repeated to update your TM when new languages finish localization.

I understand this workflow might be more manual than you would like compared to TM groups, but we do offer the option to download and upload TMX files via our API.

Regarding the propagation you mentioned, I’m unaware of any Transifex feature that would allow this on an open-source plan, but as I explained above, there are ways to work around this.

November 30th, 2022, was the date that we started phasing out APIv2/2.5 in favor of APIv3. Is there a chance that there was a workaround using our API or CLI in place to allow you some measure of translation propagation across projects that didn’t get implemented when you transitioned to APIv3? No features were removed from our API, CLI, or the open-source plan, so if there was something in place on your end and you could find it, you should be able to recreate it with the new versions of our API/CLI.

Please let me know if the above suggestions are helpful and if there’s anything else I can assist you with. I will be more than happy to do so.

Kind regards,


1 Like

@Mylon Thanks for the suggestion. You’ve got it right about our translation workflow, and we usually prefer latest version available indeed – one more reason for reusing the translations in older versions.

I was considering to use a (daily?) scheduled CI workflow run to use the API to export TMX from the latest project (its slug is ‘python-newest’) and then re-upload it into projects of previous versions (‘python-311’, ‘python-310’ etc.).

Would this work without breaking somehow the translations in these previous versions?

Also, is there a way for me to keep the credits when reusing the translations? I’d rather keeping the original translator instead of me (as the uploader) if possible.

Unfortunately it looks like in the new API/UI the TMX download is also a Premium feature. :frowning:

>>> transifex_api.TmxAsyncDownload.create(relationships={'language': {'data': {'id': 'l:pl', 'type': 'languages'}}, 'project': {'data': {'id': 'o:python-doc:p:python-newest', 'type': 'projects'}}})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "transifex/api/jsonapi/", line 527, in create
  File "transifex/api/jsonapi/", line 459, in _save_new
    response_body = self.API.request(
  File "transifex/api/jsonapi/", line 202, in request
    raise exc
transifex.api.jsonapi.exceptions.JsonApiException_403_permission_denied: (403, [{'status': '403', 'code': 'permission_denied', 'title': 'Permission denied', 'detail': 'You do not have permission to perform this action.'}], <Response [403]>)