We’ve made several improvements to how XCStrings files are handled in Transifex, focusing on closer alignment with Xcode behavior, cleaner output, and more accurate downloads.
Below is a summary of what’s available, along with examples you can reference.
Support for non-translatable entries (shouldTranslate: false)
XCStrings entries marked with shouldTranslate: false are fully supported.
-
These entries do not appear in the Transifex Editor
-
They are excluded from the translation workflow
-
They are preserved and included when XCStrings files are downloaded
This matches Apple’s Xcode String Catalog behavior, where non-translatable entries (sometimes including empty keys) are valid and expected.
Example string with the characteristics described above:
Consistent XCStrings output formatting
Downloaded XCStrings files now follow Xcode’s formatting conventions more closely.
-
No unnecessary spacing differences (e.g. extra spaces before colons)
-
More consistent output across downloads
-
Significantly reduced noise in version control diffs
This helps keep pull requests clean and avoids formatting-only changes when files are regenerated.
Improved onlytranslated download mode behavior
The onlytranslated download mode now includes only strings that are:
-
Translated
-
Reviewed
-
Proofread
Untranslated strings—including their variations and substitutions—are not included in the downloaded file.
This ensures that compiled XCStrings files accurately reflect the actual translation state, instead of marking all entries as translated.
Example of this download mode
Assume you have a resource with four strings: one proofread, one reviewed, one translated, and one untranslated:
When downloading this resource using the onlytranslated mode, the resulting file will include only the first three strings with their French translations. For the untranslated string, only the source text will be included. Below is an example of the output:
{
"sourceLanguage" : "en",
"strings" : {
"welcome_message" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Welcome to the app"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bienvenue dans l'application"
}
}
}
},
"login_button_title" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Log In"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "log En"
}
}
}
},
"logout_confirmation" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Are you sure you want to log out?"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Êtes-vous sûr de vouloir log?"
}
}
}
},
"settings_title" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Settings"
}
}
}
}
},
"version" : "1.0"
}
These updates improve XCStrings interoperability with Xcode by:
-
Respecting non-translatable entries
-
Producing cleaner, more stable output files
-
Ensuring filtered downloads accurately reflect translation status
For more details, refer to the complete XCSTRINGS parser documentation here
As always, we’d love to hear your feedback or answer any questions in the comments below.

