Use custom code to import and export your multilingual proprietary file format.
This app allows you to import and export proprietary or uncommon (multilingual) file formats into Crowdin. It ensures that your file's structure, metadata and contextual information are preserved throughout the translation process.
Check the Crowdin Store for the custom file app format if you need to translate a single language file.
Important: The app must be properly configured for it to function as expected. If the configuration is missing, it won’t be able to process files. The app may cause errors during import/export if used without the appropriate configuration.
To use this app, you will need to provide two code snippets: one for importing your file format into Crowdin and another for exporting translations back into the original format. You can use this GPT to generate the necessary code, tailored specifically to your file format. If you need assistance, the Crowdin Support team is available to help you create these code snippets, ensuring a smooth integration process.
This is the importer and exporter for a JSON file like the following:
{
"en": {
"key1": "string",
"key2": "string 2",
"key3": "string 3"
},
"de": {
"key1": "Zeichenkette",
"key2": "Zeichenkette 2",
"key3": "Zeichenkette 3"
},
"fr": {
"key1": "string",
"key2": "string 2",
"key3": "string 3"
}
}
const languagesMapping = {
en: 'en',
de: 'de',
fr: 'fr'
};
try {
const contentJson = JSON.parse(content);
for (const key in contentJson.en) {
let stringObject = {
identifier: key,
text: contentJson.en[key],
translations: {}
};
for (const langCode in contentJson) {
if (langCode !== 'en' && contentJson[langCode][key]) {
const crowdinLangCode = languagesMapping[langCode];
stringObject.translations[crowdinLangCode] = {
text: contentJson[langCode][key],
status: 'translated'
};
}
}
strings.push(stringObject);
}
} catch (e) {
error = `Failed to parse content: ${e.message}`;
}
const languagesMapping = {
en: 'en',
de: 'de',
fr: 'fr'
};
try {
let contentJson = JSON.parse(content);
for (const stringObj of strings) {
const key = stringObj.identifier;
// Update source text in the "en" section
if (!contentJson.en) contentJson.en = {};
contentJson.en[key] = stringObj.text;
// Update translations
for (const [langCode, translation] of Object.entries(stringObj.translations)) {
const fileLangCode = Object.keys(languagesMapping).find(k => languagesMapping[k] === langCode);
if (!contentJson[fileLangCode]) contentJson[fileLangCode] = {};
contentJson[fileLangCode][key] = translation.text;
}
}
content = JSON.stringify(contentJson, null, 4);
} catch (e) {
error = `Failed to process strings: ${e.message}`;
}
Your importer code should convert the file content into an array of Crowdin string objects. Here’s an example structure:
[
{
"identifier": "string-key-1",
"context": "Some context", // optional
"maxLength": 10, // optional, default null
"isHidden": false, // optional, default null
"labels": ["label-one", "label-two"], // optional, default []
"text": "String source text", // required
"translations": {
"uk": {
"text": "Переклад стрічки", // required
"status": "untranslated | translated | approved" // optional, default "translated"
}
}
}
]
strings
array.The exporter code should convert Crowdin string objects back into the original file format, with translations included. You will need to:
content
variable with the new translated content before the code exits.Crowdin is a platform that helps you manage and translate content into different languages. Integrate Crowdin with your repo, CMS, or other systems. Source content is always up to date for your translators, and translated content is returned automatically.
Learn MoreReleased on Aug 11, 2024
Updated on Oct 24, 2024
Published by Awesome Crowdin
Identifier:cmff