Takaisin blogiin
Maven coordinates for the PolyLingo Java SDK alongside a short Java client setup snippet.

Käännä jäsennelty sisältö Javasta PolyLingo SDK:lla

By Robert

Käännä jäsennelty sisältö Javalla PolyLingo SDK:n avulla

PolyLingo Java SDK on nyt saatavilla Maven Centralissa. Se kattaa koko PolyLingo API:n: synkronisen käännöksen, eräpyynnöt, asynkroniset työt kyselyllä ja kaikki apupäätepisteet. Se vaatii Java 11:n tai uudemman, käyttää standardikirjaston HTTP-asiakasta ja sillä on tarkalleen yksi ajonaikainen riippuvuus: Jackson JSON:lle.


Asennus

Maven

<dependency>
  <groupId>com.usepolylingo</groupId>
  <artifactId>polylingo</artifactId>
  <version>0.1.0</version>
</dependency>

Gradle

implementation 'com.usepolylingo:polylingo:0.1.0'

Lisä-HTTP-asiakasriippuvuutta ei tarvita. SDK käyttää java.net.http.HttpClient Java 11:n standardikirjastosta.


Asiakkaan määrittäminen

import com.usepolylingo.polylingo.PolyLingo;

PolyLingo client = PolyLingo.builder()
    .apiKey(System.getenv("POLYLINGO_API_KEY"))
    .build();

Kaksi valinnaista rakentajaparametria on saatavilla:

PolyLingo client = PolyLingo.builder()
    .apiKey(System.getenv("POLYLINGO_API_KEY"))
    .baseUrl("https://api.usepolylingo.com/v1") // oletus, ylikirjoita itseisännöidyissä instansseissa
    .timeout(Duration.ofSeconds(30))            // oletus on 120 sekuntia
    .build();

Pidä API-avaimesi ympäristömuuttujassa. Älä koskaan kovakoodaa sitä tai tallenna versionhallintaan.

SDK käyttää rakentajamallia kauttaaltaan. Ei paikkaan sidottuja konstruktoreita, ei vaadittua kenttien järjestystä. Kaikilla valinnaisilla kentillä on järkevät oletusarvot, joten konfiguroit vain ne asiat, jotka todella haluat muuttaa.


Sisällön kääntäminen

Yksi pyyntö

import com.usepolylingo.polylingo.types.TranslateParams;
import com.usepolylingo.polylingo.types.TranslateResult;

TranslateResult result = client.translate(
    TranslateParams.builder()
        .content("Hello, world!")
        .targets(List.of("es", "fr", "de"))
        .build()
);

result.getTranslations().forEach((lang, text) ->
    System.out.println(lang + ": " + text)
);
// es: ¡Hola, mundo!
// fr: Bonjour le monde !
// de: Hallo Welt!

TranslateParams-rakentaja hyväksyy content ja targets vaadittuina kenttinä. Valinnaisia parametreja ovat format (plain, markdown, json tai html — automaattisesti tunnistettu jos jätetään pois), source kielivihjeenä ja model joko standard (oletus) tai advanced.

Muodon säilytys toimii kuten muuallakin PolyLingo API:ssa. json-sisällössä vain merkkijonoarvot käännetään, avaimet, sisäkkäisyys ja ei-merkkijonotyypit jätetään koskemattomiksi. markdown-sisällössä otsikot pysyvät otsikoina ja koodilohkot jätetään sellaisiksi kuin ovat. html-sisällössä tagit ja attribuutit säilytetään ja vain tekstisolmut käännetään.

JSON-lokalisointitiedoston kääntäminen

import com.fasterxml.jackson.databind.ObjectMapper;
import java.nio.file.Files;
import java.nio.file.Path;

ObjectMapper mapper = new ObjectMapper();
String sourceJson = Files.readString(Path.of("messages/en.json"));

TranslateResult result = client.translate(
    TranslateParams.builder()
        .content(sourceJson)
        .format("json")
        .targets(List.of("fr", "de", "ja"))
        .build()
);

result.getTranslations().forEach((locale, translated) -> {
    try {
        Object parsed = mapper.readValue(translated, Object.class);
        String pretty = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(parsed);
        Files.writeString(Path.of("messages/" + locale + ".json"), pretty);
        System.out.println("Wrote messages/" + locale + ".json");
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
});

Yksi pyyntö käsittelee kaikki kolme lokalisointia. Avaimet ovat identtiset lähteen kanssa kaikissa tulostiedostoissa.


Eräpyynnöt

Lähetä jopa 100 sisältöä yhdellä pyynnöllä, jokaisella oma id ja valinnainen format:

import com.usepolylingo.polylingo.types.BatchParams;
import com.usepolylingo.polylingo.types.BatchItem;
import com.usepolylingo.polylingo.types.BatchResult;

BatchResult result = client.batch(
    BatchParams.builder()
        .targets(List.of("es", "ja"))
        .addItem(BatchItem.builder().id("title").content("Welcome").build())
        .addItem(BatchItem.builder().id("body").content("Get started today.").build())
        .build()
);

for (BatchItemResult item : result.getResults()) {
    System.out.println(item.getId() + ": " + item.getTranslations());
}

Kaikilla kohteilla on sama targets-lista. Määrittämäsi id säilyy vastauksessa, joten voit yhdistää tulokset lähdetietoihisi ilman, että täytyy luottaa järjestykseen.


Asynkroniset työt

Pitkille dokumenteille tai suurille käännösmäärille jobs API hyväksyy pyynnön, palauttaa heti työn ID:n ja antaa sinun kysellä tulosta. SDK hoitaa tämän kahdella tavalla.

Yksi kutsu, joka kysyy kunnes valmis

import com.usepolylingo.polylingo.types.JobsTranslateParams;

TranslateResult result = client.jobs().translate(
    JobsTranslateParams.builder()
        .content(longArticleText)
        .targets(List.of("fr", "de", "ja", "zh"))
        .pollInterval(Duration.ofSeconds(3))
        .timeout(Duration.ofMinutes(10))
        .onProgress(queuePosition ->
            System.out.println("Queue position: " + queuePosition))
        .build()
);

result.getTranslations().forEach((lang, text) ->
    System.out.println(lang + ": " + text.substring(0, 100) + "...")
);

onProgress-takaisinkutsu laukeaa jokaisella kyselyllä nykyisellä jonopaikalla kokonaislukuna tai null jos API ei palauta sitä. Käytä sitä edistymisen kirjaamiseen tai käyttöliittymän päivittämiseen.

Jonoon laittaminen ja kysely manuaalisesti

import com.usepolylingo.polylingo.types.CreateJobParams;
import com.usepolylingo.polylingo.types.Job;

Job job = client.jobs().create(
    CreateJobParams.builder()
        .content("Translate this.")
        .targets(List.of("es"))
        .build()
);

// Kysy itse
Job status = client.jobs().get(job.getJobId());
System.out.println(status.getStatus()); // pending / processing / completed / failed

Apupäätepisteet

// Tarkista API:n tila (ei vaadi API-avainta)
HealthResponse health = client.health();
System.out.println(health.getStatus()); // "ok"

// Listaa tuetut kielet (ei vaadi API-avainta)
LanguagesResponse langs = client.languages();
langs.getLanguages().forEach(l ->
    System.out.println(l.getCode() + " — " + l.getName())
);

// Tarkista tokenien käyttö nykyiseltä laskutuskuukaudelta
UsageResponse usage = client.usage();
System.out.println("Tokens used: " + usage.getUsage().getTokensUsed());
System.out.println("Tokens remaining: " + usage.getUsage().getTokensRemaining());

Virheenkäsittely

Kaikki poikkeukset ovat tarkistamattomia. Ei pakollisia throws-määrityksiä, ei tarkistettavia poikkeusketjuja purkamaan:

import com.usepolylingo.polylingo.errors.*;

try {
    TranslateResult result = client.translate(
        TranslateParams.builder()
            .content("# Hello")
            .targets(List.of("es", "fr"))
            .format("markdown")
            .build()
    );
} catch (AuthException e) {
    // HTTP 401 — virheellinen, puuttuva tai peruutettu API-avain
    System.out.println("Auth failed: " + e.getError());
} catch (RateLimitException e) {
    // HTTP 429 — minuuttikohtainen raja saavutettu
    e.getRetryAfter().ifPresent(s ->
        System.out.println("Retry after: " + s + "s")
    );
} catch (JobFailedException e) {
    // Asynkroninen työ saavutti epäonnistuneen lopputilan tai kysely aikakatkaistiin
    System.out.println("Job " + e.getJobId() + " failed: " + e.getError());
} catch (PolyLingoException e) {
    // Kaikki muut API-virheet
    System.out.println(e.getStatus() + ": " + e.getMessage());
}

RateLimitException.getRetryAfter() palauttaa Optional<Integer> — läsnä oleva, jos API sisältää odotusajan sekunteina, muuten tyhjä. JobFailedException.getJobId() antaa epäonnistuneen työn ID:n lokitusta tai uudelleenyritystä varten.


Suunnittelumuistiinpanot

Muutama päätös, jotka on hyvä tietää SDK:ta arvioidessa:

Synkroninen API. Jokainen metodi estää ja palauttaa tuloksen suoraan. Ei Futurea, ei CompletableFuturea, ei reaktiovirtoja. Jobs-kysely on SDK:n asynkroninen ratkaisu raskaalle kuormalle — lähetä työ, SDK kysyy omalla säikeelläsi ja kutsuu onProgress-takaisinkutsua jonopaikan päivittyessä.

Rakentajamalli kauttaaltaan. Jokainen parametriobjekti käyttää rakentajaa. Ei paikkaan sidottuja konstruktoreita tarkoittaa, ettei tarvitse arvata argumenttien järjestystä, ei vahingossa vaihdu kenttiä ja koodi kutsupaikassa on selkeää.

Yksi ajonaikainen riippuvuus. Jackson JSON-sarjallistukseen. Kaikki muu on standardikirjastoa. Ei OkHttp:ta, ei Apache HttpClientiä, ei Guavaa.

Java 11+. Käyttää java.net.http.HttpClient-luokkaa, joka esiteltiin Javassa 11. Jos projektisi kohdekieli on Java 8 tai aiempi, SDK ei ole yhteensopiva.


Pikaviite

MetodiPäätepisteTarvitseeko autentikoinnin
client.health()GET /healthEi
client.languages()GET /languagesEi
client.translate(...)POST /translateKyllä
client.batch(...)POST /translate/batchKyllä
client.usage()GET /usageKyllä
client.jobs().create(...)POST /jobsKyllä
client.jobs().get(jobId)GET /jobs/:idKyllä
client.jobs().translate(...)POST /jobs + kyselyKyllä

Aloita

SDK on Maven Centralissa osoitteessa central.sonatype.com/artifact/com.usepolylingo/polylingo. Lähdekoodi ja Javadoc löytyvät osoitteesta github.com/UsePolyLingo/polylingo-Java. Täydellinen API-dokumentaatio on osoitteessa usepolylingo.com/docs/sdk/java.

Ilmainen taso sisältää 50 000 tokenia kuukaudessa. Ei luottokorttia vaadita.

<dependency>
  <groupId>com.usepolylingo</groupId>
  <artifactId>polylingo</artifactId>
  <version>0.1.0</version>
</dependency>

Hanki API-avaimesi