# generaltranslation: General Translation Core SDK: uploadTranslations URL: https://generaltranslation.com/en-US/docs/core/class/methods/translation/upload-translations.mdx --- title: uploadTranslations description: API reference for the uploadTranslations method to upload pre-existing translation files --- ## Overview The `uploadTranslations` method uploads translation files that correspond to previously uploaded source files. This is useful when you have pre-existing translations that you want to upload directly rather than generating them through the translation service. ```typescript const gt = new GT({ apiKey: 'your-api-key', projectId: 'your-project-id' }); const result = await gt.uploadTranslations(files, { sourceLocale: 'en' }); ``` You must have previously uploaded the source files using [`uploadSourceFiles`](/docs/core/class/methods/translation/upload-source-files) before uploading translations. ## Reference ### Parameters | Name | Type | Description | |------|------|-------------| | `files` | `TranslationUpload[]` | Array of source file references with their translations | | `options` | `UploadFilesOptions` | Configuration options for the upload | #### TranslationUpload Structure ```typescript type TranslationUpload = { source: FileUpload; // Reference to existing source file (no content needed) translations: FileUpload[]; // Array of translated files with content } ``` #### FileUpload Structure (for source reference) | Name | Type | Description | |------|------|-------------| | `fileName` | `string` | File name matching the previously uploaded source file | | `fileFormat` | `FileFormat` | Format of the file (JSON, MDX, MD, XML, etc.) | | `fileId?` | `string` | Optional file ID of the source file | | `versionId?` | `string` | Optional version ID of the source file | #### FileUpload Structure (for translations) | Name | Type | Description | |------|------|-------------| | `content` | `string` | Raw translated file content as a string | | `fileName` | `string` | File name for the translation | | `fileFormat` | `FileFormat` | Format of the file (JSON, MDX, MD, XML, etc.) | | `locale` | `string` | Target locale of the translation | | `fileId?` | `string` | Optional file ID | | `versionId?` | `string` | Optional version ID | #### UploadFilesOptions | Name | Type | Description | |------|------|-------------| | `sourceLocale` | `string` | The source locale for the files | | `branchId?` | `string` | Optional branch ID to upload to | | `timeout?` | `number` | Request timeout in milliseconds | ### Returns `Promise` - Contains upload results and file references. ```typescript type UploadFilesResponse = { uploadedFiles: FileReference[]; count: number; message: string; } ``` | Property | Type | Description | |----------|------|-------------| | `uploadedFiles` | `FileReference[]` | Array of uploaded file references | | `count` | `number` | Number of files successfully uploaded | | `message` | `string` | Status message from the API | --- ## Examples ### Basic usage Upload translations for previously uploaded source files: ```typescript copy import { GT } from 'generaltranslation'; import fs from 'fs'; const gt = new GT({ apiKey: 'your-api-key', projectId: 'your-project-id' }); // Assume source file was previously uploaded const files = [ { source: { fileName: 'common.json', fileFormat: 'JSON' as const, fileId: 'source-file-id', versionId: 'source-version-id' }, translations: [ { content: fs.readFileSync('./locales/es/common.json', 'utf8'), fileName: 'common.json', fileFormat: 'JSON' as const, locale: 'es' }, { content: fs.readFileSync('./locales/fr/common.json', 'utf8'), fileName: 'common.json', fileFormat: 'JSON' as const, locale: 'fr' } ] } ]; const result = await gt.uploadTranslations(files, { sourceLocale: 'en' }); console.log(`Uploaded ${result.count} translation files`); ``` ### Upload after source upload Complete workflow uploading source files then translations: ```typescript copy import { GT } from 'generaltranslation'; import fs from 'fs'; const gt = new GT({ apiKey: 'your-api-key', projectId: 'your-project-id' }); // Step 1: Upload source files const sourceFiles = [ { source: { content: fs.readFileSync('./locales/en/messages.json', 'utf8'), fileName: 'messages.json', fileFormat: 'JSON' as const, locale: 'en' } } ]; const { uploadedFiles } = await gt.uploadSourceFiles(sourceFiles, { sourceLocale: 'en' }); // Step 2: Upload existing translations const translationFiles = [ { source: { fileName: uploadedFiles[0].fileName, fileFormat: uploadedFiles[0].fileFormat, fileId: uploadedFiles[0].fileId, versionId: uploadedFiles[0].versionId }, translations: [ { content: fs.readFileSync('./locales/es/messages.json', 'utf8'), fileName: 'messages.json', fileFormat: 'JSON' as const, locale: 'es' }, { content: fs.readFileSync('./locales/de/messages.json', 'utf8'), fileName: 'messages.json', fileFormat: 'JSON' as const, locale: 'de' } ] } ]; const translationResult = await gt.uploadTranslations(translationFiles, { sourceLocale: 'en' }); console.log(`Uploaded ${translationResult.count} translations`); ``` ### Batch upload multiple files Upload translations for multiple source files: ```typescript copy import { glob } from 'glob'; import path from 'path'; async function uploadAllTranslations( sourceRefs: FileReference[], targetLocales: string[] ) { const files = sourceRefs.map(sourceRef => ({ source: { fileName: sourceRef.fileName, fileFormat: sourceRef.fileFormat, fileId: sourceRef.fileId, versionId: sourceRef.versionId }, translations: targetLocales .map(locale => { const translationPath = `./locales/${locale}/${sourceRef.fileName}`; try { return { content: fs.readFileSync(translationPath, 'utf8'), fileName: sourceRef.fileName, fileFormat: sourceRef.fileFormat, locale }; } catch { // Translation file doesn't exist for this locale return null; } }) .filter(Boolean) })); const result = await gt.uploadTranslations(files, { sourceLocale: 'en', timeout: 60000 }); return result; } ``` --- ## Notes * Source files must be uploaded first using [`uploadSourceFiles`](/docs/core/class/methods/translation/upload-source-files) * The `source` object in each file entry is a reference to an existing source file (content is not needed) * Each translation in the `translations` array must include content and a target locale * This method is useful for migrating existing translations or uploading human-reviewed translations * File references include `branchId` for proper versioning with branching support ## Next steps * See [`uploadSourceFiles`](/docs/core/class/methods/translation/upload-source-files) to upload source files first * See [`enqueueFiles`](/docs/core/class/methods/translation/enqueue-files) to generate translations automatically * See [`downloadFile`](/docs/core/class/methods/translation/download-file) to download translations * See [`queryFileData`](/docs/core/class/methods/translation/query-file-data) to check translation status