Перейти к основному содержимому

Как пользоваться Translate API в Yandex.Cloud

· 3 мин. чтения

Пара примеров использования АПИ из Python

Для начала нам понадобится получить API-ключ, для авторизации запросов. Я не буду повторяться, процесс со скриншотами подробно описан в моем посте про SpeechKit. Прочитайте и возвращайтесь.

Перевод массива текстов

Тексты для перевода должны лежать в in.csv. В колонке с именем соответствующим исходного языка, в примере это ru.

20 текстов для примера взяты из корпуса https://rus-ltc.org/static/html/about.html

Ниже приведен код на Python 3 с довольно подробными комментариями.

import csv
import os
from typing import List

import requests

API_KEY = os.environ["API_KEY"]


# В примере я использую только 2 языка.
# Полный список языков можно получить по инструкции https://cloud.yandex.ru/docs/translate/operations/list
class Lang:
RU = "ru"
EN = "en"


class Format:
PLAIN_TEXT = "PLAIN_TEXT"
HTML = "HTML"


def translate(texts: List[str], source: str, target: str) -> List[str]:
# Сформируем заголовок запроса с ключем авторизации
headers = {
"Authorization": f"Api-Key {API_KEY}",
}

# Отправим запрос
res = requests.post(
"https://translate.api.cloud.yandex.net/translate/v2/translate",
json={
"sourceLanguageCode": source,
"targetLanguageCode": target,
"format": Format.PLAIN_TEXT,
"texts": texts,
},
headers=headers)

return [t["text"] for t in res.json()["translations"]]


# Переводить будем с русского на английский
# Задаем соответствующие значения переменным
source = Lang.RU
target = Lang.EN


def main():
# Открываем на чтени исходный файл
with open('in.csv') as input_csv, \
open('out.csv', 'w', newline='') as result_csv: # и на запись файл с результатами
# Задаем названия колонок в файле с переводами
fieldnames = [source, target]
# Инициализируем объект-писатель, передав в него названия колонок
writer = csv.DictWriter(result_csv, fieldnames=fieldnames)
# Так же инициализируем читателя
reader = csv.DictReader(input_csv)
# Запишем в файл заголовки колонок
writer.writeheader()
# А теперь построчно будем читать наш исходный файл
for row in reader:
text = row[source]
# Переводить значение
results = translate([text], source=source, target=target)
# И записывать результат
writer.writerow({source: text, target: results[0]})


if __name__ == '__main__':
main()

В итоге мы получим файл out.csv в котором напротив каждого исходного текста будет указан его перевод на целевой язык, в примере это английский — en.

Перевод шаблонов

Тут я бы хотел скорее не приводить код, потому что он будет очень похож по сути на тот что выше, а обсудить подход к подготовке текстов.

И так пример:

У нас есть строковые шаблоны в нашем приложении и мы хотим их перевести.

"Корзина пуста"
"В корзине **{{count}}** покупок"

Если мы попробуем в лоб скормить эти строки переводчику, то получим следующее:

ru "Корзина пуста"
en "The shopping cart is empty"
ru "В корзине {{count}} покупок"
en "In the shopping cart {{count}} "

Текст без токенов подстановки переведен нормально, а вот фраза с {{count}} переведена довольно странно.

Ну что ж, в этот момент мы вспоминаем про то, что у Translate API есть режим работы не с простым текстом, а с HTML-разметкой. Попробуем ее и посмотрим, что получится.

ru "В корзине <span name="count">count</span> покупок"
en "In <span name="count">the count</span> shopping cart"

Все равно бред какой-то. А что если подставить вместо {{count}} его значение.

ru "В корзине 10 покупок"
en "There are 10 purchases in your cart"

Отлично, а теперь сохранив разметку мы получим отличный переиспользуемый шаблон!

ru "В корзине <span name="count">10</span> покупок"
en "<span name="count">There are 10</span> purchases in your cart"

НЕТ))

В общем у меня не получилось сделать готовое решение для i18n приложений. В любом случае понадобится пройтись по результатам руками и редактировать их. Возможно у вас будут какие-то идеи и предложения на этот счет и может вы поделитесь ими.