
Översätt strukturerat innehåll från Ruby med PolyLingo-gem
By Robert M
Översätt strukturerat innehåll från Ruby med PolyLingo-gemet
PolyLingo Ruby-gemet finns nu tillgängligt på RubyGems. Den täcker hela PolyLingo API-ytan: synkron översättning, batchförfrågningar, asynkrona jobb med polling och alla hjälpfunktioner. Den har inga beroenden vid körning och kräver Ruby 2.7 eller senare.
Detta inlägg går igenom installation, klientinställning och varje metod som finns i gemet.
Installation
Lägg till i din Gemfile:
gem "polylingo"
Kör sedan:
bundle install
Eller installera direkt:
gem install polylingo
Inga beroenden vid körning. Gemet använder endast Rubys standardbibliotek för HTTP.
Ställa in klienten
require "polylingo"
client = PolyLingo.new(api_key: ENV.fetch("POLYLINGO_API_KEY"))
Två valfria inställningar finns:
client = PolyLingo.new(
api_key: ENV.fetch("POLYLINGO_API_KEY"),
base_url: "https://api.usepolylingo.com/v1", # standard, skriv över för självhostade instanser
timeout: 120, # sekunder (öppna + läs), standard 120
)
Håll din API-nyckel i en miljövariabel. Aldrig hårdkoda den och aldrig checka in den i versionskontroll.
Översätta innehåll
Enskild förfrågan
Skicka ditt innehåll, en array med målspråkskoder och ett valfritt format:
result = client.translate(
content: "# Hej\n\nDetta är **strukturerat** innehåll.",
targets: %w[es fr de],
format: "markdown"
)
puts result["translations"]["es"]
puts result["usage"]["total_tokens"]
Parametern format accepterar plain, markdown, json eller html. Om den utelämnas upptäcker API:et formatet automatiskt. Du kan också skicka source som en språktips och model som antingen "standard" (standard) eller "advanced".
Formatbevarande fungerar på samma sätt som resten av PolyLingo API. För json översätts endast strängvärden och nycklar, nästling och icke-strängtyper lämnas orörda. För markdown förblir rubriker rubriker och kodblock lämnas verbatim. För html bevaras taggar och attribut och endast textnoder översätts.
Översätta en JSON-lokalfil
require "json"
source = JSON.parse(File.read("config/locales/en.yml"))
result = client.translate(
content: source.to_json,
format: "json",
targets: %w[fr de ja]
)
%w[fr de ja].each do |locale|
translated = JSON.parse(result["translations"][locale])
File.write(
"config/locales/#{locale}.json",
JSON.pretty_generate(translated)
)
puts "Skriver config/locales/#{locale}.json"
end
En förfrågan hanterar alla tre lokaler. Nycklarna är identiska med källan i varje utdatafil.
Batchförfrågningar
Skicka upp till 100 innehållsobjekt i en enda förfrågan, varje med sitt eget id och valfritt format:
result = client.batch(
items: [
{ id: "hero_title", content: "Välkommen tillbaka", format: "plain" },
{ id: "hero_subtitle", content: "Här är vad som ändrats idag", format: "plain" },
{ id: "cta", content: "Kom igång", format: "plain" },
],
targets: %w[es fr de]
)
result["results"].each do |row|
puts "#{row["id"]}: #{row["translations"]["es"]}"
end
Alla objekt delar samma targets-array. Det id du skickar med bevaras i svaret så att du kan mappa resultaten tillbaka till din källdata utan att förlita dig på ordning.
Asynkrona jobb
För långvariga översättningar accepterar jobb-API:et förfrågan, returnerar ett job_id omedelbart och låter dig poll:a efter resultatet. Gemet hanterar detta på två sätt.
Köa och poll:a manuellt
accepted = client.jobs.create(
content: File.read("content/long-article.md"),
targets: %w[es fr de ja zh],
format: "markdown"
)
job_id = accepted["job_id"]
loop do
sleep 5
state = client.jobs.get(job_id)
break if %w[complete failed].include?(state["status"])
end
if state["status"] == "complete"
translations = state["translations"]
end
Ett anrop som poll:ar tills klart
done = client.jobs.translate(
content: File.read("content/long-article.md"),
targets: %w[es fr de],
format: "markdown",
# Valfria överskrivningar (standardvärden visas):
poll_interval: 5, # sekunder mellan pollar, standard 5
timeout: 1200, # total väntetid i sekunder, standard 1200 (20 minuter)
on_progress: ->(queue_position) { puts "Köposition: #{queue_position.inspect}" }
)
translations = done["translations"]
usage = done["usage"]
Alla tidsvärden i Ruby-gemet använder sekunder, i enlighet med Ruby-konventioner. Lambda-funktionen on_progress körs vid varje poll och får aktuell köposition som ett heltal, eller nil om API:et inte returnerar någon.
Hjälpändpunkter
health = client.health
# => { "status" => "ok", "timestamp" => "..." }
languages = client.languages
# => { "languages" => [{ "code" => "en", "name" => "English", "rtl" => false }, ...] }
usage = client.usage
# => { "usage" => { "tokens_used" => 12000, "tokens_remaining" => 38000, ... } }
health och languages kräver ingen API-nyckel. usage returnerar tokenförbrukning för innevarande kalendermånad för det autentiserade kontot.
Felhantering
Alla fel ärver från PolyLingo::PolyLingoError. Fånga de specifika underklasser du vill hantera:
begin
result = client.translate(
content: "# Hej",
targets: %w[es],
format: "markdown"
)
rescue PolyLingo::AuthError => e
# HTTP 401 — ogiltig, saknad eller återkallad API-nyckel
puts "Autentisering misslyckades: #{e.message}"
rescue PolyLingo::RateLimitError => e
# HTTP 429 — minutgräns nådd
retry_after = e.retry_after # heltal i sekunder eller nil
sleep retry_after if retry_after
retry
rescue PolyLingo::JobFailedError => e
# Asynkront jobb nådde ett misslyckat slutstatus, eller polling timeout
puts "Jobbet misslyckades: #{e.job_id}"
rescue PolyLingo::PolyLingoError => e
# Alla andra API-fel
puts "#{e.status}: #{e.error} — #{e.message}"
end
RateLimitError#retry_after returnerar ett heltal från antingen JSON-svarskroppen eller Retry-After-huvudet, vad som än finns, eller nil om inget av dem finns. JobFailedError#job_id ger dig ID för det misslyckade jobbet när det är känt.
Snabbreferens
| Metod | Endpoint | Kräver autentisering |
|---|---|---|
client.health | GET /health | Nej |
client.languages | GET /languages | Nej |
client.translate(...) | POST /translate | Ja |
client.batch(...) | POST /translate/batch | Ja |
client.usage | GET /usage | Ja |
client.jobs.create(...) | POST /jobs | Ja |
client.jobs.get(job_id) | GET /jobs/:id | Ja |
client.jobs.translate(...) | POST /jobs + polling | Ja |
Kom igång
Gemet finns på RubyGems på rubygems.org/gems/polylingo. Källkoden finns på github.com/UsePolyLingo/polylingo-ruby. Fullständig API-dokumentation finns på usepolylingo.com/docs.
Gratisnivån inkluderar 50 000 tokens per månad. Ingen kreditkort krävs.
gem install polylingo