This repository was initially created as an handout for my presentation at the Wir sind Ohana 2024 event in 2024. I would love to see this repository grow and become a valuable resource for everyone who is working with the Salesforce (Translation) Metadata API.
In this file you can find different examples of how to use the package.xml
file to retrieve metadata from Salesforce especiall in relation to translations.
You can copy the examples and adjust them to your needs.
Additionally, you can find the corresponding commands to retrieve the metadata using the Salesforce CLI.
Feel free to clone this repository and/or contribute to it. If you have any questions, feel free to reach out to me.
sf project retrieve start --manifest package.xml
sf project deploy start --manifest package.xml
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<version>60.0</version>
</Package>
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>Payment__c-de</members>
<name>CustomObjectTranslation</name>
</types>
<version>60.0</version>
</Package>
sf project retrieve start -m "CustomObjectTranslation:Payment__c-de"
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>Payment__c-de</members>
<name>CustomObjectTranslation</name>
</types>
<types>
<members>Payment__c.From__c</members>
<name>CustomField</name>
</types>
<version>60.0</version>
</Package>
sf project retrieve start -m "CustomObjectTranslation:Payment__c-de" -m "CustomField:Payment__c.From__c"
sf project retrieve start -m "CustomObjectTranslation:Payment__c-de,CustomField:Payment__c.*"
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>Industry-de</members>
<name>StandardValueSetTranslation</name>
</types>
<version>60.0</version>
</Package>
# Get a specific Standard Picklist Translations for German
sf project retrieve start -m "StandardValueSetTranslation:Industry-de"
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>*</members>
<name>StandardValueSetTranslation</name>
</types>
<version>60.0</version>
</Package>
# Get all Standard Picklist Translations for German
sf project retrieve start -m "StandardValueSetTranslation:*-de"
Custom Picklists are handled like Custom Fields.
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>Payment__c-de</members>
<name>CustomObjectTranslation</name>
</types>
<types>
<members>Payment__c.Status__c</members>
<name>CustomField</name>
</types>
<version>60.0</version>
</Package>
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<fullName>Payment__c-de</fullName>
<name>CustomFieldTranslation</name>
</types>
<version>60.0</version>
</Package>
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>*</members>
<name>GlobalValueSetTranslation</name>
</types>
<version>60.0</version>
</Package>
# Get all Global Picklist Value Translations for German
sf project retrieve start -m "GlobalValueSetTranslation:*-de"
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>Numbers-fr</members>
<name>GlobalValueSetTranslation</name>
</types>
<version>60.0</version>
</Package>
# Get all Global Picklist Value Translations for French
sf project retrieve start -m "GlobalValueSetTranslation:Nubmers-fr"
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>PaymentMethod</members> <!-- Custom Label Name -->
<name>CustomLabel</name> <!-- Metadata Type for Custom Labels -->
</types>
<types>
<members>de</members> <!-- German Language Code -->
<name>Translations</name> <!-- Metadata Type for Translations -->
</types>
<version>60.0</version>
</Package>
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>FlowOne</members> <!-- Custom Label Name -->
<name>Flow</name> <!-- Metadata Type for Custom Labels -->
</types>
<types>
<members>de</members> <!-- German Language Code -->
<name>Translations</name> <!-- Metadata Type for Translations -->
</types>
<version>60.0</version>
</Package>
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>New_Record</members>
<name>QuickAction</name>
</types>
<types>
<members>de</members>
<name>Translations</name>
</types>
<version>60.0</version>
</Package>
sf project retrieve start -m "QuickAction:New_Record" -m "Translations:de"
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>Web_Tab_Example</members>
<name>CustomTab</name>
</types>
<types>
<members>de</members>
<name>Translations</name>
</types>
<version>60.0</version>
</Package>
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>*</members>
<name>CustomTab</name>
</types>
<types>
<members>de</members>
<name>Translations</name>
</types>
<version>60.0</version>
</Package>
sf project retrieve start -m "CustomTab:Web_Tab_Example" -m "Translations:de"
sf project retrieve start -m "CustomTab:*" -m "Translations:de"
sf org list metadata --json --metadata-type Translations | jq -r '.result[].fullName'
sf org list metadata --json --metadata-type CustomObjectTranslation | jq -r '.result[].fullName' | sort
#!/bin/bash
# Extract fullName attributes from JSON output
fullNames=$(sf org list metadata --json --metadata-type CustomObjectTranslation | jq -r '.result[].fullName' | sort)
# Create or overwrite package.xml
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<Package xmlns=\"http://soap.sforce.com/2006/04/metadata\">
<types>" > package.xml
# Loop through fullNames and insert them into package.xml
for fullName in $fullNames; do
echo " <members>$fullName</members>" >> package.xml
done
# Append the rest of the package.xml
echo " <name>CustomObjectTranslation</name>
</types>
<types>
<members>*</members>
<name>CustomField</name>
</types>
<version>60.0</version>
</Package>" >> package.xml
This is not working as expected!!!
Package.xml
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<version>60.0</version>
</Package>
DestructiveChanges.xml
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>PaymentMethod</members> <!-- Custom Label Name -->
<name>CustomLabel</name> <!-- Metadata Type for Custom Labels -->
</types>
<types>
<members>de</members>
<name>Translations</name>
</types>
<version>60.0</version>
</Package>
sf project deploy start --manifest package.xml --pre-destructive-changes destructiveChanges.xml