Как пользоваться Translate API в Yandex.Cloud
Пара примеров использования АПИ из 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 приложений. В любом случае понадобится пройтись по результатам руками и редактировать их. Возможно у вас будут какие-то идеи и предложения на этот счет и может вы поделитесь ими.