Official Node interface for the Lokalise API.
This library requires Node 10 and above. Install it with NPM:
npm install @lokalise/node-api
In order to perform API requests, you require a special token that can be obtained in your personal profile (API tokens section). Note that the owner of the token must have admin access rights.
After you've obtained the token, initialize the client:
const { LokaliseApi } = require('@lokalise/node-api');
const lokaliseApi = new LokaliseApi({ apiKey: '<apiKey>'});
Now you may perform API requests, for example:
const projects = lokaliseApi.projects.list();
projects[0].name;
All object attributes may be found in the interfaces.
Please not that Lokalise API locks parallel requests which means you should call methods in a synchronous manner.
If you are using project branching feature, simply add branch name separated by semicolon to your project ID in any endpoint to access the branch. For example, in order to access new-feature
branch for the project with an id 123abcdef.01
:
lokaliseApi.files.list({project_id: '123abcdef.01:new-feature'});
Bulk fetches support pagination. There are two common parameters available:
limit
(defaults to100
, maximum is5000
) - number of records to display per pagepage
(defaults to1
) - page to fetch
For instance:
lokaliseApi.translationProviders.list({team_id: team_id, page: 2, limit: 10});
The response pagination data can be fetched in the following way:
lokaliseApi.projects.totalResults;
lokaliseApi.projects.totalPages;
lokaliseApi.projects.resultsPerPage;
lokaliseApi.projects.currentPage;
Every request returns a promise with a corresponding object (or array of objects) as the result.
lokaliseApi.branches.list({project_id: project_id});
lokaliseApi.branches.get(branch_id, {project_id: project_id});
lokaliseApi.branches.create(
{"name": "hotfix/really-important"},
{ project_id: project_id}
);
lokaliseApi.branches.update(branch_id,
{"name": "hotfix/not-really-important"},
{project_id: project_id}
);
lokaliseApi.branches.delete(branch_id, {project_id: project_id});
lokaliseApi.branches.merge(branch_id_to_merge,
{project_id: project_id},
{"force_conflict_resolve_using": "master"}
)
lokaliseApi.comments.list_project_comments({ project_id: project_id });
lokaliseApi.comments.list({project_id: project_id, key_id: key_id})
lokaliseApi.comments.get(comment_id, {project_id: project_id, key_id: key_id});
lokaliseApi.comments.create({
'comments': [
{ comment: "Project comment 1" },
{ comment: "Project comment 2" }
]
}, { project_id: project_id, key_id: key_id});
lokaliseApi.comments.delete(comment_id, {project_id: project_id, key_id: key_id});
lokaliseApi.contributors.list({project_id: project_id});
lokaliseApi.contributors.get(user_id, {project_id: project_id});
lokaliseApi.contributors.create([
{
"email": "translator2@mycompany.com",
"fullname": "Mr. Translator",
"is_admin": false,
"is_reviewer": true,
"languages": [
{
"lang_iso": "en",
"is_writable": false
}
]
}
], {project_id: project_id});
lokaliseApi.contributors.update(
user_id,
{is_admin: true},
{project_id: project_id}
);
lokaliseApi.contributors.delete(user_id, {project_id: project_id});
lokaliseApi.files.list({project_id: project_id});
Background uploading is the only method of importing files since July 2020.
process = await lokaliseApi.files.upload(project_id,
{data: data_base64, filename: 'test1.json', lang_iso: 'en'})
process.status // => 'queued'
Asynchronous upload will return a QueuedProcess
containing process ID, status of the process (queued
, finished
, failed
etc) and some other info. You may periodically check the status of the process by using get()
method:
// You'll obtain `process_id` after calling `upload()`
process = await lokaliseApi.queuedProcesses.get(process.process_id, { project_id: project_id })
process.status // => 'finished'
lokaliseApi.files.download(project_id, {format: 'json', "original_filenames": true});
lokaliseApi.keys.list({project_id: project_id});
lokaliseApi.keys.get(key_id, {project_id: project_id});
lokaliseApi.keys.create([
{
"key_name": "welcome_web",
"description": "Index app welcome",
"platforms": ["web"],
"translations": [
{
"language_iso": "en",
"translation": "Welcome"
}
]
},
{
"key_name": "welcome_ios",
"description": "Welcome apple",
"platforms": ["ios"],
"is_plural": true,
"translations": [
{
"language_iso": "en",
"translation": {
"one": "I have one apple",
"other": "I have a lot of apples"
}
}
]
}
], {project_id: project_id});
lokaliseApi.keys.update(key_id, {
"platforms": ["web", "other"],
"description": "Node updated"
}, { project_id: project_id });
lokaliseApi.keys.bulk_update([
{
"key_id": key_id,
"description": "Bulk node",
"platforms": ["web"]
},
{
"key_id": second_key_id,
"description": "Second bulk",
}
], { project_id: project_id});
lokaliseApi.keys.delete(key_id, { project_id: project_id });
lokaliseApi.keys.bulk_delete([
key_id, second_key_id
], { project_id: project_id });
lokaliseApi.languages.system_languages();
lokaliseApi.languages.list({project_id: project_id});
lokaliseApi.languages.get(lang_id, {project_id: project_id});
lokaliseApi.languages.create([
{
"lang_iso": "ak"
}
], { project_id: project_id });
lokaliseApi.languages.update(lang_id, {
"lang_name": "Chinese Traditional Custom"
}, { project_id: project_id });
lokaliseApi.languages.delete(lang_id, { project_id: project_id });
lokaliseApi.orders.list({team_id: team_id})
lokaliseApi.orders.get(order_id, {team_id: team_id})
lokaliseApi.orders.create({
project_id: '803xyz145ba90b42abc.46800',
card_id: '1774',
briefing: 'My briefing',
source_language_iso: 'en',
target_language_isos: ['nl'],
keys: [12345],
provider_slug: 'gengo',
translation_tier: '1'
},
{team_id: team_id});
lokaliseApi.paymentCards.list();
lokaliseApi.paymentCards.get(card_id);
lokaliseApi.paymentCards.create({
number: '4242424242424242',
cvc: 123,
exp_month: 10,
exp_year: 2030
});
lokaliseApi.paymentCards.delete(card_id);
lokaliseApi.projects.list();
lokaliseApi.projects.get(project_id)
lokaliseApi.projects.create({ name: "Project name", description: "Project description" });
lokaliseApi.projects.update(project_id, { name: "New name", description: "New description"});
lokaliseApi.projects.empty(project_id)
lokaliseApi.projects.delete(project_id);
lokaliseApi.queuedProcesses.list({ project_id: project_id })
lokaliseApi.queuedProcesses.get(process_id, { project_id: project_id })
lokaliseApi.screenshots.list({project_id: project_id});
lokaliseApi.screenshots.get(screenshot_id, {project_id: project_id});
lokaliseApi.screenshots.create([
{
data: data,
"ocr": false,
"key_ids": [key_id],
"tags": ["onboarding"]
}
],{project_id: project_id});
lokaliseApi.screenshots.update(screenshot_id,
{title: 'node screen', description: 'node desc'},
{project_id: project_id}
);
lokaliseApi.screenshots.delete(screenshot_id, {project_id: project_id});
lokaliseApi.snapshots.list({project_id: project_id});
lokaliseApi.snapshots.create({"title": "API snapshot"}, {project_id: project_id});
lokaliseApi.snapshots.restore(snapshot_id, {project_id: project_id});
lokaliseApi.snapshots.delete(snapshot_id, {project_id: project_id});
lokaliseApi.tasks.list({project_id: project_id});
lokaliseApi.tasks.get(task_id, {project_id: project_id});
lokaliseApi.tasks.create({
title: 'node task',
keys: [key1, key2],
languages: [
{
"language_iso": "en",
"users": [user1, user2]
}
]
}, {project_id: project_id});
lokaliseApi.tasks.update(
task_id,
{title: 'node updated'},
{project_id: project_id}
);
lokaliseApi.tasks.delete(task_id, {project_id: project_id});
lokaliseApi.teams.list();
lokaliseApi.teamUsers.list({team_id: team_id});
lokaliseApi.teamUsers.get(user_id, {team_id: team_id});
lokaliseApi.teamUsers.update(
user_id,
{role: 'admin'},
{team_id: team_id}
);
lokaliseApi.teamUsers.delete(user_id, {team_id: team_id});
lokaliseApi.userGroups.list({team_id: team_id});
lokaliseApi.userGroups.get(group_id, {team_id: team_id});
lokaliseApi.userGroups.create(
{
name: 'Node',
is_reviewer: false,
is_admin: true,
admin_rights: ['upload']
},
{team_id: team_id}
);
lokaliseApi.userGroups.update(
group_id,
{
name: 'Node updated',
is_reviewer: false,
is_admin: true,
admin_rights: ['upload']
},
{team_id: team_id}
);
lokaliseApi.userGroups.add_projects_to_group(
team_id,
group_id,
[project_id]
);
lokaliseApi.userGroups.remove_projects_from_group(
team_id,
group_id,
[project_id]
);
lokaliseApi.userGroups.add_members_to_group(
team_id,
group_id,
[user_id]
);
lokaliseApi.userGroups.remove_members_from_group(
team_id,
group_id,
[user_id]
);
lokaliseApi.userGroups.delete(new_group_id, {team_id: team_id});
lokaliseApi.translations.list({project_id: project_id});
lokaliseApi.translations.get(translation_id, {project_id: project_id});
lokaliseApi.translations.update(
translation_id,
{translation: 'updated'},
{project_id: project_id}
);
lokaliseApi.translationProviders.list({team_id: team_id})
lokaliseApi.translationProviders.get(translation_provider_id, {team_id: team_id});
lokaliseApi.translationStatuses.list({project_id: project_id});
lokaliseApi.translationStatuses.get(status_id, {project_id: project_id});
lokaliseApi.translationStatuses.create(
{title: 'my status', color: '#344563'},
{project_id: project_id}
);
lokaliseApi.translationStatuses.update(
status_id,
{title: 'my status updated', color: '#f2d600'},
{project_id: project_id}
);
lokaliseApi.translationStatuses.delete(status_id, {project_id: project_id});
lokaliseApi.translationStatuses.available_colors({project_id: project_id});
lokaliseApi.webhooks.list({project_id: project_id});
lokaliseApi.webhooks.get(webhook_id, {project_id: project_id});
lokaliseApi.webhooks.create(
{url: 'https://example.com', events: ['project.exported']},
{project_id: project_id}
);
lokaliseApi.webhooks.update(
webhook_id,
{url: 'http://example.com', events: ['project.snapshot']},
{project_id: project_id}
);
lokaliseApi.webhooks.delete(
webhook_id,
{project_id: project_id}
);
lokaliseApi.webhooks.regenerate_secret(
webhook_id,
{project_id: project_id}
);
To handle request errors, you may use the following approach:
lokaliseApi.projects.list().catch(
(e) => {
console.log(e);
}
);
Error codes are listed in the API docs.
Lokalise does not rate-limit API requests, however retain a right to decline the service in case of excessive use. Only one concurrent request per token is allowed. To ensure data consistency, it is not recommended to access the same project simultaneously using multiple tokens.
This library is tested with Node 10+. To test it locally:
- Copypaste
.env.example
file as.env
. Put your API token inside. The.env
file is excluded from version control so your token is safe. All in all, we use pre-recorded cassettes, so the actual API requests won't be sent. However, providing at least some token is required. - Run
npm test
. Observe test results and coverage.
- Run
npm run-script build
- Browse
dist/
folder
This library is licensed under the MIT License.
Copyright (c) Lokalise team, Roman Kutanov, Ilya Bodrov