Попался мне недавно один очень интересный запрос. Нужно переводить большое количество html-страниц, массово, каким-то скриптом. Основная проблема, что кроме контента некоторые данные для перевода находятся внутри тегов. Пожелание было в том, чтобы не использовать google api.
Много проверил модулей, без google api сложно. Либо сами библиотеки завязаны на нем, либо переводит часть. Поэтому использовал апи от гугл. Сам скрипт несложный, но подготовка занимает время и вызывает вопросы.
Настройка google cloud translation api
Как я писал, больше всего проблем вызывает подготовка. Нужно на сайте гугл создать проект, разрешить перевод по апи, сохранить файл с правами доступа. Инструкция есть на сайте https://cloud.google.com/translate/docs/setup , опишу свои действия пошагово.
Создаем проект в google cloud
- Переходим в Google Cloud Platform. Нажимаем Создать проект (Create project). Кстати, русский язык в некоторых разделах больше не будет поддерживаться гуглом.
- Пишем Название, только английские буквы, цифры, одинарные кавычки, дефисы, пробелы и восклицательные знаки.
- Ждем создания… Дальше переходим в проект и копируем Номер проекта. Он нам понадобится потом.
Включаем Cloud Translation API для проекта
- Переходим в Api и сервисы, нажимаем Включить API и Сервисы.
- В поле для поиска вставляем Cloud Translation API.
- Нажимаем Включить. Может потребовать «Необходимо включить оплату». Переходим, дальше нужно создать платежный аккаунт. Это очень выходить за тему статьи, проблем вызвать не должно.
Если привязать карту для Вашего региона обязательно, привяжите с лимитом оплаты. Карта не проверяется, дают 300 баксов от гугла на 90 дней для теста. При использовании мною скрипта (около 500 запросов сделал) на счету ничего не изменилось.
Создание учетных записей для Cloud
- Заходим Учетные данные (раздел тот же, API и сервисы).
- Выбираем Cloud Translation API, ниже я выбрал что не использую API для App Engine или Compute Engine.
- Создаем Сервисный аккаунт. Вводим название, выбираем роль Администратор Cloud Translation API. Продолжить. Готово.
- Далее переходим по вновь созданному аккаунту, и в разделе Сведения нажимаем Добавить ключ, выбираем json.
- Если все правильно, будет скачан файл. Мы уже близко, подготовка готова на 80%. Держитесь.
Установка google cloud SDK
Дальше нам нужно установить google cloud SDK на Ваш компьютер.
- Откройте Powershell и выполните следующую команду:123(New-Object Net.WebClient).DownloadFile("https://dl.google.com/dl/cloudsdk/channels/rapid/GoogleCloudSDKInstaller.exe", "$env:Temp\GoogleCloudSDKInstaller.exe")& $env:Temp\GoogleCloudSDKInstaller.exe
Буден скачан и запустится Установщик Google Cloud SDK. - Логинимся с того гугл аккаунта, где создавали проект в Google Cloud Platform.
- Выбираем созданный проект в консоли.
Обычно тут не возникает уже никаких проблем. Конечно, такой путь, можно и запутаться. Я пользовался исключительно документацией от гугл.
Дальше в ход идет сам скрипт на python.
Скрипт на python для перевода html файлов
Особенностью запроса было еще то, что переводить нужно на не обычный язык (английский или русский). Нужно было переводить файлы с русского на казахстанский. Хотя, в принципе, гугл поддерживает очень много языков, а найти код страны не так и трудно.
Установка необходимых компонентов
Ставим через pip google-cloud-translate (для скрипта перевода) и google-cloud-storage (для доступа к cloud translation api).
1 2 | pip install --upgrade google-cloud-translate pip install --upgrade google-cloud-storage |
И пример кода. Комментарии на английском сохранил с документации, добавил свои на русском.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | from google.cloud import translate # Подключаем модуль def translate_text(text, project_id): """Translating Text.""" client = translate.TranslationServiceClient.from_service_account_json( 'C:/Users/admino/Downloads/htmlpbdseo-2633gfb0f8.json') # Путь к ключу доступа google cloud api location = "global" parent = f"projects/{project_id}/locations/{location}" # Detail on supported types can be found here: # https://cloud.google.com/translate/docs/supported-formats response = client.translate_text( request={ "parent": parent, "contents": [text], "mime_type": "text/html", # mime types: text/plain, text/html "source_language_code": "ru-RU", # Язык с какого переводим, в примере русский "target_language_code": "kk", # Язык на какой переводим, в примере казахстанский } ) # Display the translation for each input text provided for translation in response.translations: # print("Translated text: {}".format(translation.translated_text)) # Если нужно вывести переведенный текст with open(file2trans+'_res.htm', 'a', encoding='utf-8') as ff: # Сохранение файла с переводом ff.write(translation.translated_text) file2trans = r'C:\Users\admin\Desktop\bdseo_translate.htm' # Файл для перевода with open(file2trans, 'r', encoding='utf-8') as fg: datas = fg.read() translate_text(datas, 93544427523) # Функция для перевода, datas - контент, 93544427523 - номер Вашего проекта |
Протестировал скрипт 13.02.2021, работает. Пользуетесь — поблагодарите меня через форму справа «На развитие блога bdseo.ru«. Мне будет очень приятно.
Особенности скрипта для перевода файлов
Главный плюс такого решения — оно решало мои задачи (и запрос). Переводило контент, переводило данные в тегах (title=, alt=). Но было несколько нюансов. Не переводило некоторые тексты в meta тегах в head-блоке; а также часть html-комментариев, например:
1 | <!--Текст, который иногда не переводило--> |
Возможно, это зависит от языков перевода. Бывают нюансы, как же без них, дополнительная проверка файлов не помешает.
Что касается перевода текстов подобным образом. Если это небольшие части контента, есть другие решения. Это контент html страницы — все зависит от размера текста. Когда текста на тысячи или десятки тысяч символов, то гугл может возвращать ошибку что слишком большой объем. С текстом («mime_type»: «text/plain») такое часто, а с html-файлами ошибку по лимиту не встречал.
При большом количестве файлов используем цикл. Есть вопросы — пишем в комментарии.
0 Comments