String API
The String API is composed of 5 endpoints:
- List String — list strings
- Show String — show a string
- Create String — create a string
- Update String — update a string
- Delete String — delete a string
🔗Anatomy of a String
A String is a data structure representing a segment on which several translations in different languages are aligned. A String has many Translation (in different languages). A Translation belongs to a String. A String is composed of:
id
: ID number of a String. This ID is attributed by WebTranslateIt.comkey
: Key name of a String. The Key name is unique within a same file and attributed by the user.status
: Status of a String. Can be one ofcurrent
(not hidden nor obsolete),hidden
orobsolete
.category
: Category of a Stringlabel
: Label name of a Stringcontext
: Context of a String (used by XLIFF files)file
: File ID in which a String can be located. Can be left blank if you want to host your Strings only in database.type
: If not blank, can be one ofstring
,plural
,array
,boolean
. Will filters segments querying these attributes.
🔗List String
This endpoint is accessible by the read-only and read-write Project API key and is used to list strings.
/api/projects/:project_token/strings.format [GET]
Where format
is one of xml
, json
, or yaml
.
🔗Pagination
This resource is paginated and serves 250 String
s per page (this amount of items per page can change at any time). You can specify further page using the ?page
parameter. Note that page numbering is 1-based and that omitting the ?page
parameter will return the first page.
🔗Link Header
The pagination information is included in the Link header. You can use the Link Header in order to know which page is next and which page is the last one, instead of constructing your own URLs.
For instance, let’s make a curl request to the String API:
$ curl -I "https://webtranslateit.com/api/projects/api_token/strings.json"
The -I
parameter indicates that we only care about the headers, not the actual content. In examining the result, you’ll notice some information in the Link header that looks like this:
Link: <https://webtranslateit.com/api/projects/api_key/strings.json?page=2>; rel="next",
<https://webtranslateit.com/api/projects/api_key/strings.json?page=20>; rel="last"
The possible rel
values are:
next
: Shows the URL of the immediate next page of results.last
: Shows the URL of the last page of results.first
: Shows the URL of the first page of results.prev
: Shows the URL of the immediate previous page of results.
Here’s another example of the Link Header when browsing the 3rd page:
$ curl -I "https://webtranslateit.com/api/projects/api_token/strings.json?page=3"
Link: <https://webtranslateit.com/api/projects/api_key/strings.json?page=4>; rel="next",
<https://webtranslateit.com/api/projects/api_key/strings.json?page=9>; rel="last",
<https://webtranslateit.com/api/projects/api_key/strings.json?page=1>; rel="first",
<https://webtranslateit.com/api/projects/api_key/strings.json?page=2>; rel="prev"
🔗Parameters
filters
:
key
: Name of the keys to fetchoriginal_key
(use instead ofkey
): Name of the original_key to fetch (Used whenresname
is set in XLIFF files).regex
: (optional) if set to true, perform a regex searchignore_case
: (optional) if set to true andregex
is also set to true, perform a non case sensitive regex searchstatus
: Fetch String having a specific status. This filter is case insensitive and can be one of:- option left blank: fetch strings independently of status,
current
: fetch strings that are not hidden or obsolete,hidden
: fetch hidden strings,obsolete
: fetch obsolete strings.to_translate
: fetch untranslated segments for a language. Must be used withfilters[locale]=xx
filter.to_verify
: fetch unverified segments for a language. Must be used withfilters[locale]=xx
filter.to_proofread
: fetch unproofread segments for a language. Must be used withfilters[locale]=xx
filter.done
: fetch proofread segments for a language. Must be used withfilters[locale]=xx
filter.
category
: Category name of a String. If set tonone
will return all segments with no categories.label
: Label name of a String. If set tonone
will return all segments with no labels.context
: Context of a String, only used by XLIFF files.created_at
: List String added at of after dateinstructions
: Can be one ofyes
orno
or left blank. Will list segment containing instructions or segments not containing any instructions.file
: File ID of a String. If you don’t have the File ID you can optionally pass thefile_name
parameter instead.no_follow_redirects
: Set it to anything to not use language inheritance.
page
: Page number.
locale
(optional): The locale code (or language code) in which the segments translations will be displayed. Example: locale=ru
. You can also pass several locales, for instance: locale=en,de,fr
or use a wildcard to get all locales at once: locale=*
. The API will return an array of translations instead of a translation object.
🔗Example query:
https://webtranslateit.com/api/projects/api_key/strings?filters[key]=date&filters[status]=current
🔗Example response with JSON:
[
{
"id": 1234,
"key": "activerecord.errors.models.invitation.attributes.email.user_already_invited",
"plural": false,
"type": "String",
"dev_comment" :null,
"status": "Current",
"labels": "",
"word_count": 6,
"character_count": 24,
"attachments": [{"id":9391,"created_at":"2015-12-15T10:12:04Z","url":"https://s3.amazonaws.com/users0-webtranslateit/production/file_attachments/original/389283928327.png?1450174324"}],
"created_at": "2010-02-09T23:23:45Z",
"updated_at": "2011-10-28T13:54:13Z",
"project": {
"id": 406,
},
"file": {
"id": 1943
},
"has_discussions": false
},
{
"id": 1235,
"key": "activerecord.errors.models.invitation.attributes.email.user",
"plural": false,
"type": "String",
"dev_comment" :null,
"status": "Current",
"labels": "",
"word_count": 6,
"character_count": 24,
"attachments": []
"created_at": "2010-02-09T23:23:45Z",
"updated_at": "2011-10-28T13:54:13Z",
"project": {
"id": 406,
},
"file": {
"id": 1943
},
"has_discussions": true
}
]
Example response in JSON with locale
parameter:
[
{
"id": 140067,
"key": "activerecord.errors.models.invitation.attributes.email.user_already_invited",
"project": {
"id": 406
},
"file": {
"id": 1943
},
"plural": false,
"type": "String",
"dev_comment": "",
"status": "Current",
"labels": "",
"categories": "",
"word_count": 6,
"character_count": 34,
"attachments": [],
"created_at": "2010-02-09T23:23:45Z",
"updated_at": "2014-03-13T08:18:10Z",
"translations": {
"id": 564959,
"locale": "fr",
"text": "Cet utilisateur a déjà été invité",
"status": "status_proofread",
"created_at": "2010-02-11T21:14:19Z",
"updated_at": "2012-02-10T19:24:33Z",
"version": 17
},
"has_discussions": false
},
{
"id": 140068,
"key": "activerecord.errors.models.invitation.attributes.email.user_already_member",
"project": {
"id": 406
},
"file": {
"id": 1943
},
"plural": false,
"type": "String",
"dev_comment": null,
"status": "Current",
"labels": "",
"categories": "",
"word_count": 6,
"character_count": 29,
"attachments": [],
"created_at": "2010-02-09T23:23:45Z",
"updated_at": "2014-03-13T08:18:10Z",
"translations": {
"id": 564960,
"locale": "fr",
"text": "Cet utilisateur est déjà membre",
"status": "status_proofread",
"created_at": "2010-02-11T21:14:40Z",
"updated_at": "2011-12-09T15:59:58Z",
"version": 7
},
"has_discussions": false
}
]
🔗Show String
This endpoint is accessible by the read-only and read-write Project API key and is used to show a string.
/api/projects/:project_token/strings/:string_id.format [GET]
Where format
is one of xml
, json
or yaml
.
You can optionally pass a locale
parameter (the locale code in which the segments translations will be displayed). You can also pass several locales, for instance: locale=en,de,fr
or use a wildcard to get all locales at once: locale=*
. The API will return an array of translations instead of a translation object.
You can optionally pass a no_follow_redirects
parameter: Set it to anything to bypass language inheritance.
Example response with JSON:
{
"key": "activerecord.errors.models.invitation.attributes.email.user_already_invited",
"plural": false,
"type": "String",
"dev_comment" :null,
"status": "Current",
"labels": "",
"categories": "",
"word_count": 6,
"character_count": 24,
"attachments": [],
"created_at": "2010-02-09T23:23:45Z",
"updated_at": "2011-10-28T13:54:13Z",
"project": {
"id": 406,
},
"file": {
"id": 1943
},
"has_discussions": false
}
key
: unique string identifier. The key name is unique within a file.plural
:true
if plural string, or elsefalse
(default:false
)type
: Type (or cast) or a string. Can beString
,Integer
,Array
,Symbol
. (default:String
)dev_comment
: Developer commentstatus
: String status. Can beCurrent
,Obsolete
,Hidden
labels
: Comma-delimited labels for a string.word_count
: Word count for the source translation.character_count
: Character count for the source translation.
🔗Example Implementation in Ruby
require 'net/http'
http = Net::HTTP.new('webtranslateit.com', 443)
request = Net::HTTP::Get.new('/api/projects/:api_token/strings/:string_id')
http.request(request)
🔗Example Implementation in PHP
<?php
$api_key = "sekret";
$string_id = "1234";
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, "https://webtranslateit.com/api/projects/" . $api_key . "/strings/". $string_id . ".json");
$response = curl_exec($ch);
$p = json_decode($response, true);
print_r($p);
curl_close($ch);
?>
🔗Create String
This endpoint is only accessible by the read-write Project API key and is used to create a new string.
/api/projects/:project_token/strings [POST]
🔗Parameters
A JSON object modelled after the following:
{
"key": "key_name",
"plural": false,
"type": "String",
"dev_comment" :null,
"status": "Current",
"labels": "",
"categories": "",
"word_count": 6,
"character_count": 24,
"file": {
"id": 1943
}
}
or:
{
"key": "key_name",
"plural": false,
"type": "String",
"dev_comment" :null,
"status": "Current",
"labels": "",
"categories": "",
"word_count": 6,
"character_count": 24,
"file": {
"file_name": "path/to_file.xml"
}
}
All fields are optional. If no key
is provided, WebTranslateIt will name the string using the current time.
If everything goes Well, WebTranslateIt will respond with 201 Created
in the header and a JSON representation of the string just created in the body.
You can also create one or several Translations while creating a String by passing an optional array of Translation:
{
"key": "key_name",
"plural": false,
"type": "String",
"dev_comment" :null,
"status": "Current",
"labels": "",
"categories": "",
"word_count": 6,
"character_count": 24,
"translations": [
{
"locale": "en",
"text": "Some text",
"status": "status_proofread"
},
{
"locale": "fr",
"text": "Du texte",
"validation": "false"
}
]
}
In this array of Translation, locale
and text
are mandatory. status
is optional.
🔗Example Implementation in Ruby
require 'net/http'
require 'json'
http = Net::HTTP.new('webtranslateit.com', 443)
http.use_ssl = true
request = Net::HTTP::Post.new('/api/projects/:api_token/strings', {'Content-Type' => 'application/json' })
request.body = {key: 'string_key', dev_comment: 'This is a comment' }.to_json
http.request(request)
# creating a plural segment
request.body = {key: 'string_key', plural: true, translations: [{locale: 'en', text: {'one' => '%{count} translation', 'other' => '%{count} translations'} }] }.to_json
http.request(request)
🔗Example Implementation in PHP
<?php
$api_key = "sekret";
$new_string = Array();
$new_string["key"] = "TESTSTRING";
$new_string["type"] = "String";
$new_string["dev_comment"] = "test";
$new_string["status"] = "Current";
$new_string["file"]["id"] = 116156;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://webtranslateit.com/api/projects/" . $api_key . "/strings");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($new_string));
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
$response = curl_exec($ch);
print_r($response);
curl_close($ch);
?>
🔗Update String
This endpoint is only accessible by the read-write Project API key and is used to update an existing string.
/api/projects/:project_token/strings/:string_id [PATCH]
🔗Parameters
A JSON object modelled after the following:
{
"key": "key_name",
"plural": false,
"type": "String",
"dev_comment" :null,
"status": "Current",
"labels": "",
"categories": "",
"word_count": 6,
"character_count": 24,
"file": {
"id": 1943
}
}
or:
{
"key": "key_name",
"plural": false,
"type": "String",
"dev_comment" :null,
"status": "Current",
"labels": "",
"categories": "",
"word_count": 6,
"character_count": 24,
"file": {
"file_name": "path/to_file.xml"
}
}
All fields are optional. Only provided fields will be modified. Don’t forget to pass a Content-Type: application/json
header in your request.
If everything goes Well, WebTranslateIt will respond with 202 Accepted
in the header and a JSON representation of the string just updated in the body.
🔗Example Implementation in Ruby
require 'net/http'
require 'json'
http = Net::HTTP.new('webtranslateit.com', 443)
http.use_ssl = true
request = Net::HTTP::Put.new('/api/projects/:api_token/strings/:string_id', {'Content-Type' => 'application/json' })
request.body = {key: 'string_key_updated', dev_comment: 'This is an updated comment' }.to_json
http.request(request)
🔗Example Implementation in PHP
<?php
$api_key = "sekret";
$string = array();
$string["key"] = "string_key";
$string["dev_comment"] = "A developer comment";
$string_id = "1234";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://webtranslateit.com/api/projects/" . $api_key . "/strings/" . $string_id);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PATCH");
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($string));
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
$response = curl_exec($ch);
print_r($response);
curl_close($ch);
?>
🔗Example Implementation in curl
$ curl -i -H "Content-Type: application/json" -X PATCH -d "{"dev_comment": "abc”}" https://webtranslateit.com/api/projects/sekret/strings/1234
🔗Delete String
This endpoint is only accessible by the read-write Project API key and is used to delete a string.
/api/projects/:project_token/strings/:string_id [DELETE]
🔗Example Implementation in Ruby
require 'net/http'
http = Net::HTTP.new('webtranslateit.com', 443)
request = Net::HTTP::Delete.new('/api/projects/:api_token/strings/:string_id')
http.request(request)
🔗Example Implementation in PHP
<?php
$api_key = "sekret";
$string_id = "1234";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://webtranslateit.com/api/projects/" . $api_key . "/strings/" . $string_id);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
$response = curl_exec($ch);
print_r($response);
curl_close($ch);
?>