How does Crowdin choose which translations to use on upload sources?

Hi @rabbdroid

Here are the direct answers:

  1. How does Crowdin determine the “MASTER” string when running crowdin upload sources (without --branch)?

The first string uploaded into the project is considered a master, regardless of whether it’s a development or master branch. If it is deleted, then 2nd uploaded will become the master and so on.

When you run crowdin upload sources without specifying a branch, Crowdin will upload source strings as it is written in your source path (CLI configuration) into root/master.

  1. If the same string is modified in two different branches, how does Crowdin decide which version is “current” and which translations to download?

Crowdin handles strings in different branches as separate entities tied to their respective branches. There isn’t an automatic “conflict resolution” that merges translations across branches into the main branch.

If a string is updated in feature/X and translated there, those translations belong to feature/X in Crowdin. When you merge feature/X into your local main and then crowdin upload sources to Crowdin’s main branch, the new source string appears in Crowdin’s main branch.

Working with duplicates in Crowdin can help here. Just enable duplicate management in your Crowdin project settings (look under “Import”).

Choosing “Show within a version branch (regular detection)” or “Hide (regular detection)” is key. Combined with a good Translation Memory (if needed), it is highly effective for your branching workflow, preventing those “empty string” issues.