Integracije
Integracija povezuje projekat — ili ceo radni prostor — sa nečim izvan Ownlate-a. Svaka se sastoji od provajdera, podešavanja i akreditiva, koji se šifruju pre čuvanja i nikada se ne vraćaju iz API-ja.
| Kategorija | Provajderi |
|---|---|
| Kontrola verzija | GitHub, GitLab |
| Mašinsko prevođenje | OpenAI, Anthropic, Mistral, DeepL, Google, Azure — vidite AI prevođenje |
| Obaveštenja | Slack, Microsoft Teams, Discord, Mattermost, Matrix, Telegram |
| Webhook-ovi | Obični webhook |
Upravljanje integracijom
heading.anchorLabelIntegracije žive na kartici Integracije projekta, a one za ceo prostor pod Radni prostor → Integracije.
| Radnja | Šta radi |
|---|---|
| Testiraj pre čuvanja | Proverava unete akreditive bez čuvanja |
| Testiraj | Proverava sačuvanu integraciju |
| Pauziraj | Zadržava podešavanja, ali zaustavlja rad |
| Aktiviraj | Vraća pauziranu u pogon |
| Dnevnici sinhronizacije | Zapis svakog izvršavanja, red po red, sa ishodom |
Opseg određuje domet. Integracija sa opsegom project služi jednom projektu, ona sa workspace dostupna je svim projektima prostora. Za mašinsko prevođenje projekat bez sopstvene koristi onu prostora. Za webhook-ove, oni na nivou prostora okidaju samo kada projekat nema sopstveni. Obaveštenja se isporučuju iz integracija na nivou projekta.
Sve što integracija uradi upisuje se u njen dnevnik sinhronizacije, uključujući neuspehe — pa se webhook koji nije stigao razlikuje od onog koji nije ni poslat.
Git: GitHub i GitLab
heading.anchorLabelIntegracija sa kontrolom verzija prima adresu repozitorijuma, granu (podrazumevano main) i pristupni token.
Sinhronizacija
heading.anchorLabelPri sinhronizaciji Ownlate čita ownlate.yml — ili ownlate.yaml — iz korena grane. To je isti fajl koji koristi CLI:
project_id: 00000000-0000-0000-0000-000000000000
files: - source: locales/en.json translation: locales/{lang}.jsonZa svako mapiranje uzima izvorni fajl iz repozitorijuma i otprema ga, praveći i ažurirajući segmente tačno kao ručno otpremanje. Fajl naveden u konfiguraciji a odsutan iz repozitorijuma preskače se uz zabelešku u dnevniku; repozitorijum bez konfiguracije ne sinhronizuje ništa i to izričito kaže.
files[].translation mora sadržati {lang} — to je šablon po kom se prevedeni fajlovi upisuju nazad.
Sinhronizacija radi u pozadini. Pokrenite je ručno sa kartice integracija ili preko API-ja: PATCH /v1/workspaces/{workspaceId}/integrations/{id}/sync.
Pull request-ovi
heading.anchorLabelNapravi PR radi u suprotnom smeru: Ownlate izvozi odobrene prevode za jezike koje izaberete, upisuje ih na putanje iz ownlate.yml, gura novu granu i otvara pull request — na GitLab-u merge request. U odgovoru stiže adresa, pa je pipeline može pokupiti.
Tokenu trebaju prava da čita repozitorijum, gurne granu i otvori pull request.
Obaveštenja
heading.anchorLabelŠest odredišta u ćaskanju, svako oblikovano u stilu svoje platforme — Block Kit poruka na Slack-u, MessageCard na Teams-u i tako dalje.
| Provajder | Šta traži |
|---|---|
| Slack | Incoming webhook URL |
| Microsoft Teams | Connector URL |
| Discord | Webhook URL |
| Mattermost | Webhook URL |
| Telegram | Token bota, ID ćaskanja |
| Matrix | Adresa homeserver-a, ID sobe, pristupni token |
Poruke nose ključ, jezik, izvorni tekst i novi prevod, uz vezu pravo na segment u Ownlate-u.
Webhook-ovi
heading.anchorLabelWebhook integracija prima adresu i opcioni tajni ključ, i na nju šalje JSON:
{ "event": "translation.approved", "payload": { "segmentId": "…", "projectId": "…", "workspaceId": "…", "language": "de", "key": "home.title", "sourceText": "Hello", "translationText": "Hallo", "actorId": "…", "authorId": "…", "approvedAt": "2026-08-20T09:31:00Z" }, "timestamp": "1787654321000"}Svaka isporuka nosi ova zaglavlja:
| Zaglavlje | Sadržaj |
|---|---|
X-Ownlate-Event | Ime događaja |
X-Ownlate-Timestamp | Milisekunde od epohe, ista vrednost kao u telu |
X-Ownlate-Signature | sha256=…, prisutno samo kada je tajni ključ postavljen |
Provera potpisa
heading.anchorLabelPotpis je HMAC-SHA256 nad vremenskom oznakom, tačkom i sirovim telom zahteva, sa vašim tajnim ključem:
const expected = 'sha256=' + crypto .createHmac('sha256', secret) .update(`${req.headers['x-ownlate-timestamp']}.${rawBody}`) .digest('hex')Uporedite ga sa X-Ownlate-Signature poređenjem u konstantnom vremenu i odbacite vremensku oznaku koja je prestara da bi bila verodostojna.
Događaji
heading.anchorLabelObaveštenja i webhook-ovi reaguju na ovo:
| Događaj | Kada |
|---|---|
translation.submitted | Prevod je poslat na recenziju |
translation.reviewed | Recenzent je označio prevod pregledanim |
translation.approved | Prevod je odobren |
translation.rejected | Prevod je odbijen |
segment.created | U projekat je dodat novi segment |
Podrazumevano integracija prima sve. Postavite filter događaja da suzite izbor — Slack kanal koji želi samo odobrenja, webhook kome su važni samo novi ključevi.