curl "https://api.phrase.com/v2/projects/:project_id/uploads" \
-u USERNAME_OR_ACCESS_TOKEN \
-X POST \
-F branch=my-feature-branch \
-F file=@/path/to/my/file.json \
-F file_format=json \
-F locale_id=abcd1234cdef1234abcd1234cdef1234 \
-F tags=awesome-feature,needs-proofreading \
-F locale_mapping[en]=2 \
-F format_options[foo]=barphrase uploads create \
--project_id <project_id> \
--branch my-feature-branch \
--file /path/to/my/file.json \
--file_format json \
--locale_id abcd1234cdef1234abcd1234cdef1234 \
--tags awesome-feature,needs-proofreading \
--locale_mapping '{"en": "2"}' \
--format_options '{"foo": "bar"}' \
--access_token <token>import requests
url = "https://api.phrase.com/v2/projects/{project_id}/uploads"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"file_format": "json",
"locale_id": "abcd1234cdef1234abcd1234cdef1234",
"branch": "my-feature-branch",
"tags": "awesome-feature,needs-proofreading",
"update_translations": "true",
"update_custom_metadata": "true",
"update_translation_keys": "true",
"update_translations_on_source_match": "true",
"source_locale_id": "abcd1234cdef1234abcd1234cdef1234",
"update_descriptions": "true",
"convert_emoji": "true",
"skip_upload_tags": "true",
"skip_unverification": "true",
"file_encoding": "UTF-8",
"locale_mapping": "{\"en\": \"2\"}",
"format_options": "{\"foo\": \"bar\"}",
"autotranslate": "true",
"verify_mentioned_translations": "true",
"mark_reviewed": "true",
"tag_only_affected_keys": "true",
"translation_key_prefix": "prefix_",
"skip_automated_job_creation": "false"
}
headers = {"Authorization": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '/path/to/my/file.json');
form.append('file_format', 'json');
form.append('locale_id', 'abcd1234cdef1234abcd1234cdef1234');
form.append('branch', 'my-feature-branch');
form.append('tags', 'awesome-feature,needs-proofreading');
form.append('update_translations', 'true');
form.append('update_custom_metadata', 'true');
form.append('update_translation_keys', 'true');
form.append('update_translations_on_source_match', 'true');
form.append('source_locale_id', 'abcd1234cdef1234abcd1234cdef1234');
form.append('update_descriptions', 'true');
form.append('convert_emoji', 'true');
form.append('skip_upload_tags', 'true');
form.append('skip_unverification', 'true');
form.append('file_encoding', 'UTF-8');
form.append('locale_mapping', '{"en": "2"}');
form.append('format_options', '{"foo": "bar"}');
form.append('autotranslate', 'true');
form.append('verify_mentioned_translations', 'true');
form.append('mark_reviewed', 'true');
form.append('tag_only_affected_keys', 'true');
form.append('translation_key_prefix', 'prefix_');
form.append('skip_automated_job_creation', 'false');
const options = {method: 'POST', headers: {Authorization: '<api-key>'}};
options.body = form;
fetch('https://api.phrase.com/v2/projects/{project_id}/uploads', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.phrase.com/v2/projects/{project_id}/uploads",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n/path/to/my/file.json\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_format\"\r\n\r\njson\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"branch\"\r\n\r\nmy-feature-branch\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nawesome-feature,needs-proofreading\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_custom_metadata\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translation_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations_on_source_match\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_descriptions\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"convert_emoji\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_upload_tags\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_unverification\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_encoding\"\r\n\r\nUTF-8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_mapping\"\r\n\r\n{\"en\": \"2\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format_options\"\r\n\r\n{\"foo\": \"bar\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"autotranslate\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"verify_mentioned_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mark_reviewed\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag_only_affected_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"translation_key_prefix\"\r\n\r\nprefix_\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_automated_job_creation\"\r\n\r\nfalse\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: multipart/form-data; boundary=---011000010111000001101001"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.phrase.com/v2/projects/{project_id}/uploads"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n/path/to/my/file.json\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_format\"\r\n\r\njson\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"branch\"\r\n\r\nmy-feature-branch\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nawesome-feature,needs-proofreading\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_custom_metadata\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translation_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations_on_source_match\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_descriptions\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"convert_emoji\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_upload_tags\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_unverification\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_encoding\"\r\n\r\nUTF-8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_mapping\"\r\n\r\n{\"en\": \"2\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format_options\"\r\n\r\n{\"foo\": \"bar\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"autotranslate\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"verify_mentioned_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mark_reviewed\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag_only_affected_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"translation_key_prefix\"\r\n\r\nprefix_\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_automated_job_creation\"\r\n\r\nfalse\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.phrase.com/v2/projects/{project_id}/uploads")
.header("Authorization", "<api-key>")
.header("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n/path/to/my/file.json\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_format\"\r\n\r\njson\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"branch\"\r\n\r\nmy-feature-branch\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nawesome-feature,needs-proofreading\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_custom_metadata\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translation_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations_on_source_match\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_descriptions\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"convert_emoji\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_upload_tags\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_unverification\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_encoding\"\r\n\r\nUTF-8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_mapping\"\r\n\r\n{\"en\": \"2\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format_options\"\r\n\r\n{\"foo\": \"bar\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"autotranslate\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"verify_mentioned_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mark_reviewed\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag_only_affected_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"translation_key_prefix\"\r\n\r\nprefix_\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_automated_job_creation\"\r\n\r\nfalse\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.phrase.com/v2/projects/{project_id}/uploads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'multipart/form-data; boundary=---011000010111000001101001'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n/path/to/my/file.json\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_format\"\r\n\r\njson\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"branch\"\r\n\r\nmy-feature-branch\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nawesome-feature,needs-proofreading\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_custom_metadata\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translation_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations_on_source_match\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_descriptions\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"convert_emoji\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_upload_tags\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_unverification\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_encoding\"\r\n\r\nUTF-8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_mapping\"\r\n\r\n{\"en\": \"2\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format_options\"\r\n\r\n{\"foo\": \"bar\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"autotranslate\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"verify_mentioned_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mark_reviewed\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag_only_affected_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"translation_key_prefix\"\r\n\r\nprefix_\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_automated_job_creation\"\r\n\r\nfalse\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"id": "abcd1234cdef1234abcd1234cdef1234",
"filename": "example.json",
"format": "json",
"state": "success",
"tag": "tag",
"summary": {
"locales_created": 2,
"translation_keys_created": 162,
"translation_keys_updated": 10,
"translation_keys_unmentioned": 0,
"translations_created": 291,
"translations_updated": 3,
"tags_created": 2,
"translation_keys_ignored": 0
},
"user": {
"id": "abcd1234cdef1234abcd1234cdef1234",
"username": "johndoe",
"name": "John Doe",
"gravatar_uid": "205e460b479e2e5b48aec07710c08d50"
},
"created_at": "2015-01-28T09:52:53Z",
"updated_at": "2015-01-28T09:52:53Z"
}{
"message": "Validation Failed",
"errors": [
{
"resource": "Resource",
"field": "name",
"message": "can't be blank"
}
]
}Upload a new file
Upload a new language file. Creates necessary resources in your project.
Note: be aware of upload limits.
curl "https://api.phrase.com/v2/projects/:project_id/uploads" \
-u USERNAME_OR_ACCESS_TOKEN \
-X POST \
-F branch=my-feature-branch \
-F file=@/path/to/my/file.json \
-F file_format=json \
-F locale_id=abcd1234cdef1234abcd1234cdef1234 \
-F tags=awesome-feature,needs-proofreading \
-F locale_mapping[en]=2 \
-F format_options[foo]=barphrase uploads create \
--project_id <project_id> \
--branch my-feature-branch \
--file /path/to/my/file.json \
--file_format json \
--locale_id abcd1234cdef1234abcd1234cdef1234 \
--tags awesome-feature,needs-proofreading \
--locale_mapping '{"en": "2"}' \
--format_options '{"foo": "bar"}' \
--access_token <token>import requests
url = "https://api.phrase.com/v2/projects/{project_id}/uploads"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"file_format": "json",
"locale_id": "abcd1234cdef1234abcd1234cdef1234",
"branch": "my-feature-branch",
"tags": "awesome-feature,needs-proofreading",
"update_translations": "true",
"update_custom_metadata": "true",
"update_translation_keys": "true",
"update_translations_on_source_match": "true",
"source_locale_id": "abcd1234cdef1234abcd1234cdef1234",
"update_descriptions": "true",
"convert_emoji": "true",
"skip_upload_tags": "true",
"skip_unverification": "true",
"file_encoding": "UTF-8",
"locale_mapping": "{\"en\": \"2\"}",
"format_options": "{\"foo\": \"bar\"}",
"autotranslate": "true",
"verify_mentioned_translations": "true",
"mark_reviewed": "true",
"tag_only_affected_keys": "true",
"translation_key_prefix": "prefix_",
"skip_automated_job_creation": "false"
}
headers = {"Authorization": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '/path/to/my/file.json');
form.append('file_format', 'json');
form.append('locale_id', 'abcd1234cdef1234abcd1234cdef1234');
form.append('branch', 'my-feature-branch');
form.append('tags', 'awesome-feature,needs-proofreading');
form.append('update_translations', 'true');
form.append('update_custom_metadata', 'true');
form.append('update_translation_keys', 'true');
form.append('update_translations_on_source_match', 'true');
form.append('source_locale_id', 'abcd1234cdef1234abcd1234cdef1234');
form.append('update_descriptions', 'true');
form.append('convert_emoji', 'true');
form.append('skip_upload_tags', 'true');
form.append('skip_unverification', 'true');
form.append('file_encoding', 'UTF-8');
form.append('locale_mapping', '{"en": "2"}');
form.append('format_options', '{"foo": "bar"}');
form.append('autotranslate', 'true');
form.append('verify_mentioned_translations', 'true');
form.append('mark_reviewed', 'true');
form.append('tag_only_affected_keys', 'true');
form.append('translation_key_prefix', 'prefix_');
form.append('skip_automated_job_creation', 'false');
const options = {method: 'POST', headers: {Authorization: '<api-key>'}};
options.body = form;
fetch('https://api.phrase.com/v2/projects/{project_id}/uploads', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.phrase.com/v2/projects/{project_id}/uploads",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n/path/to/my/file.json\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_format\"\r\n\r\njson\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"branch\"\r\n\r\nmy-feature-branch\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nawesome-feature,needs-proofreading\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_custom_metadata\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translation_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations_on_source_match\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_descriptions\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"convert_emoji\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_upload_tags\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_unverification\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_encoding\"\r\n\r\nUTF-8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_mapping\"\r\n\r\n{\"en\": \"2\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format_options\"\r\n\r\n{\"foo\": \"bar\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"autotranslate\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"verify_mentioned_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mark_reviewed\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag_only_affected_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"translation_key_prefix\"\r\n\r\nprefix_\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_automated_job_creation\"\r\n\r\nfalse\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: multipart/form-data; boundary=---011000010111000001101001"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.phrase.com/v2/projects/{project_id}/uploads"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n/path/to/my/file.json\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_format\"\r\n\r\njson\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"branch\"\r\n\r\nmy-feature-branch\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nawesome-feature,needs-proofreading\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_custom_metadata\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translation_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations_on_source_match\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_descriptions\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"convert_emoji\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_upload_tags\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_unverification\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_encoding\"\r\n\r\nUTF-8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_mapping\"\r\n\r\n{\"en\": \"2\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format_options\"\r\n\r\n{\"foo\": \"bar\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"autotranslate\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"verify_mentioned_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mark_reviewed\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag_only_affected_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"translation_key_prefix\"\r\n\r\nprefix_\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_automated_job_creation\"\r\n\r\nfalse\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.phrase.com/v2/projects/{project_id}/uploads")
.header("Authorization", "<api-key>")
.header("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n/path/to/my/file.json\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_format\"\r\n\r\njson\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"branch\"\r\n\r\nmy-feature-branch\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nawesome-feature,needs-proofreading\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_custom_metadata\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translation_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations_on_source_match\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_descriptions\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"convert_emoji\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_upload_tags\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_unverification\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_encoding\"\r\n\r\nUTF-8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_mapping\"\r\n\r\n{\"en\": \"2\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format_options\"\r\n\r\n{\"foo\": \"bar\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"autotranslate\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"verify_mentioned_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mark_reviewed\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag_only_affected_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"translation_key_prefix\"\r\n\r\nprefix_\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_automated_job_creation\"\r\n\r\nfalse\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.phrase.com/v2/projects/{project_id}/uploads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'multipart/form-data; boundary=---011000010111000001101001'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n/path/to/my/file.json\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_format\"\r\n\r\njson\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"branch\"\r\n\r\nmy-feature-branch\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nawesome-feature,needs-proofreading\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_custom_metadata\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translation_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations_on_source_match\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_descriptions\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"convert_emoji\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_upload_tags\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_unverification\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_encoding\"\r\n\r\nUTF-8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_mapping\"\r\n\r\n{\"en\": \"2\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format_options\"\r\n\r\n{\"foo\": \"bar\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"autotranslate\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"verify_mentioned_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mark_reviewed\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag_only_affected_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"translation_key_prefix\"\r\n\r\nprefix_\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_automated_job_creation\"\r\n\r\nfalse\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"id": "abcd1234cdef1234abcd1234cdef1234",
"filename": "example.json",
"format": "json",
"state": "success",
"tag": "tag",
"summary": {
"locales_created": 2,
"translation_keys_created": 162,
"translation_keys_updated": 10,
"translation_keys_unmentioned": 0,
"translations_created": 291,
"translations_updated": 3,
"tags_created": 2,
"translation_keys_ignored": 0
},
"user": {
"id": "abcd1234cdef1234abcd1234cdef1234",
"username": "johndoe",
"name": "John Doe",
"gravatar_uid": "205e460b479e2e5b48aec07710c08d50"
},
"created_at": "2015-01-28T09:52:53Z",
"updated_at": "2015-01-28T09:52:53Z"
}{
"message": "Validation Failed",
"errors": [
{
"resource": "Resource",
"field": "name",
"message": "can't be blank"
}
]
}Authorizations
Enter your token in the format token TOKEN
Headers
Two-Factor-Authentication token (optional)
Path Parameters
Project ID
Body
File to be imported
File format. Auto-detected when possible and not specified.
"json"
Locale of the file's content. Can be the name or id of the locale. Preferred is id.
"abcd1234cdef1234abcd1234cdef1234"
specify the branch to use
"my-feature-branch"
List of tags separated by comma to be associated with the new keys contained in the upload.
"awesome-feature,needs-proofreading"
Indicates whether existing translations should be updated with the file content.
true
Determines whether to update custom metadata values when uploading a file. If set to true, existing metadata can be changed or removed. Passing an empty value deletes the corresponding metadata property.
true
Pass false here to prevent new keys from being created and existing keys updated.
true
Update target translations only if the source translations of the uploaded multilingual file match the stored translations.
true
Specifies the source locale for multilingual files. Can be the name or id of the locale. Preferred is id.
"abcd1234cdef1234abcd1234cdef1234"
Existing key descriptions will be updated with the file content. Empty descriptions overwrite existing descriptions.
true
This option is obsolete. Providing the option will cause a bad request error.
true
Indicates whether the upload should not create upload tags.
true
Indicates whether the upload should unverify updated translations.
true
Enforces a specific encoding on the file contents. Valid options are "UTF-8", "UTF-16" and "ISO-8859-1".
"UTF-8"
Mapping between locale names and translation columns. Required in some formats like CSV or XLSX.
"{\"en\": \"2\"}"
Additional options available for specific formats. See our format guide for the complete list.
"{\"foo\": \"bar\"}"
If set, translations for the uploaded language will be fetched automatically.
true
Indicates whether all translations mentioned in the upload should be verified.
true
Indicated whether the imported translations should be marked as reviewed. This setting is available if the review workflow is enabled for the project.
true
Indicates whether only keys affected (created or updated) by the upload should be tagged. The default is false
true
This prefix will be added to all uploaded translation key names to prevent collisions. Use a meaningful prefix related to your project or file to keep key names organized.
"prefix_"
When true, the automation rules for the project will not fire for this upload, so no jobs are created as a side effect of importing this file. Defaults to false.
false
Response
Created
Unique tag of the upload
List of tags that were assigned to the uploaded keys
The URL to the upload in Phrase Strings app.
Show child attributes
Show child attributes
{
"id": "abcd1234cdef1234abcd1234cdef1234",
"username": "johndoe",
"name": "John Doe",
"gravatar_uid": "205e460b479e2e5b48aec07710c08d50"
}
Show child attributes
Show child attributes
Was this page helpful?