Tilbage til bloggen
Maven coordinates for the PolyLingo Java SDK alongside a short Java client setup snippet.

Oversæt struktureret indhold fra Java med PolyLingo SDK

By Robert

Oversæt struktureret indhold fra Java med PolyLingo SDK

PolyLingo Java SDK er nu tilgængelig på Maven Central. Den dækker hele PolyLingo API: synkron oversættelse, batch-forespørgsler, asynkrone jobs med polling og alle hjælpeendepunkter. Den kræver Java 11 eller nyere, bruger standardbibliotekets HTTP-klient og har præcis én runtime-afhængighed: Jackson til JSON.


Installation

Maven

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

Gradle

implementation 'com.usepolylingo:polylingo:0.1.0'

Ingen yderligere HTTP-klientafhængighed kræves. SDK bruger java.net.http.HttpClient fra Java 11 standardbiblioteket.


Opsætning af klienten

import com.usepolylingo.polylingo.PolyLingo;

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

To valgfrie builder-parametre er tilgængelige:

PolyLingo client = PolyLingo.builder()
    .apiKey(System.getenv("POLYLINGO_API_KEY"))
    .baseUrl("https://api.usepolylingo.com/v1") // standard, overskriv for selvhostede instanser
    .timeout(Duration.ofSeconds(30))            // standard er 120 sekunder
    .build();

Opbevar din API-nøgle i en miljøvariabel. Hardcod den aldrig eller commit den til versionskontrol.

SDK bruger builder-mønsteret overalt. Ingen positionsbaserede konstruktører, ingen påkrævet feltorden. Alle valgfrie felter har fornuftige standardværdier, så du kun konfigurerer det, du faktisk har brug for at ændre.


Oversættelse af indhold

Enkelt forespørgsel

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-builderen accepterer content og targets som påkrævede felter. Valgfrie parametre inkluderer format (plain, markdown, json eller html — automatisk opdaget, hvis udeladt), source som et sproghint, og model som enten standard (standard) eller advanced.

Formatbevarelse fungerer på samme måde som resten af PolyLingo API. For json-indhold oversættes kun strengværdier, og nøgler, indlejring og ikke-streng-typer forbliver uberørte. For markdown forbliver overskrifter overskrifter, og kodeblokke efterlades uændrede. For html bevares tags og attributter, og kun tekstnoder oversættes.

Oversættelse af en JSON locale-fil

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);
    }
});

Én forespørgsel håndterer alle tre locales. Nøglerne er identiske med kilden i hver outputfil.


Batch-forespørgsler

Send op til 100 indholdselementer i en enkelt forespørgsel, hver med sit eget id og valgfrie 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());
}

Alle elementer deler den samme targets-liste. Det id, du tildeler, bevares i svaret, så du kan mappe resultater tilbage til dine kildedata uden at stole på rækkefølgen.


Asynkrone jobs

For lange dokumenter eller store oversættelsesarbejder accepterer jobs-API'en en forespørgsel, returnerer straks et job-ID og lader dig poll'e efter resultatet. SDK håndterer dette på to måder.

Ét kald, der poller indtil færdigt

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 callback kaldes ved hver polling med den aktuelle køposition som et heltal, eller null hvis API'et ikke returnerer en. Brug det til at logge fremdrift eller opdatere en brugergrænseflade.

Sæt i kø og poll manuelt

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()
);

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

Hjælpeendepunkter

// Tjek API sundhed (kræver ikke API-nøgle)
HealthResponse health = client.health();
System.out.println(health.getStatus()); // "ok"

// Liste over understøttede sprog (kræver ikke API-nøgle)
LanguagesResponse langs = client.languages();
langs.getLanguages().forEach(l ->
    System.out.println(l.getCode() + " — " + l.getName())
);

// Tjek tokenforbrug for den aktuelle faktureringsmåned
UsageResponse usage = client.usage();
System.out.println("Tokens used: " + usage.getUsage().getTokensUsed());
System.out.println("Tokens remaining: " + usage.getUsage().getTokensRemaining());

Fejlhåndtering

Alle undtagelser er unchecked. Ingen tvungne throws-deklarationer, ingen tjekkede undtagelseskæder at håndtere:

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 — ugyldig, manglende eller tilbagekaldt API-nøgle
    System.out.println("Auth failed: " + e.getError());
} catch (RateLimitException e) {
    // HTTP 429 — minutgrænse nået
    e.getRetryAfter().ifPresent(s ->
        System.out.println("Retry after: " + s + "s")
    );
} catch (JobFailedException e) {
    // Asynkront job nåede en fejlet terminal status eller polling timeout
    System.out.println("Job " + e.getJobId() + " failed: " + e.getError());
} catch (PolyLingoException e) {
    // Alle andre API-fejl
    System.out.println(e.getStatus() + ": " + e.getMessage());
}

RateLimitException.getRetryAfter() returnerer en Optional<Integer> — til stede med antal sekunder at vente, hvis API'et inkluderer denne værdi, ellers tom. JobFailedException.getJobId() giver dig ID'et på det fejlede job til logning eller retry-logik.


Designnoter

Nogle beslutninger værd at kende, hvis du evaluerer SDK'en:

Synkront API. Hver metode blokerer og returnerer et resultat direkte. Ingen Future, ingen CompletableFuture, ingen reaktive streams. Job-polling er SDK'ens asynkrone løsning til tunge arbejdsbelastninger — indsæt jobbet, SDK poller på din tråd og kalder din onProgress callback, når køpositionen opdateres.

Builder pattern overalt. Hvert parameterobjekt bruger en builder. Ingen positionsbaserede konstruktører betyder ingen gætteri om argumentrækkefølge, ingen utilsigtede feltbytter og klar kode ved kaldstedet.

Én runtime-afhængighed. Jackson til JSON-serialisering. Alt andet er standardbibliotek. Ingen OkHttp, ingen Apache HttpClient, ingen Guava.

Java 11+. Bruger java.net.http.HttpClient introduceret i Java 11. Hvis dit projekt sigter mod Java 8 eller tidligere, er SDK ikke kompatibel.


Hurtig reference

MetodeEndepunktKræver auth
client.health()GET /healthNej
client.languages()GET /languagesNej
client.translate(...)POST /translateJa
client.batch(...)POST /translate/batchJa
client.usage()GET /usageJa
client.jobs().create(...)POST /jobsJa
client.jobs().get(jobId)GET /jobs/:idJa
client.jobs().translate(...)POST /jobs + pollingJa

Kom godt i gang

SDK'en findes på Maven Central på central.sonatype.com/artifact/com.usepolylingo/polylingo. Kildekode og Javadoc findes på github.com/UsePolyLingo/polylingo-Java. Fuld API-dokumentation findes på usepolylingo.com/docs/sdk/java.

Gratis niveau inkluderer 50.000 tokens pr. måned. Ingen kreditkort kræves.

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

Få din API-nøgle

Oversæt struktureret indhold fra Java med PolyLingo SDK | PolyLingo