🖥

Google翻訳API ( #GCP ) が HTML翻訳でコードブロック内の改行やらインデントを壊しやがるので #python で泣く泣

2019/05/06に公開

concept

  • <pre></pre> の中身を URLエンコードしておく
  • Google翻訳にかける
  • <pre></pre> の中身を URLデコードする

以上。

python

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

import os, sys, requests, json, fileinput, re, uuid
import urllib.parse

resource_message = sys.stdin.read()

from_language = os.environ.get('FROM') if os.environ.get('FROM') else 'ja'
to_language = os.environ.get('TO') if os.environ.get('TO') else 'en'
translate_format = 'html'

def match_and_encode(match):
  return match.group(1) + urllib.parse.quote(match.group(2)) + match.group(3)

def convert_codeblocks(resource_message):
  resource_message = re.sub(r'(<pre>(?:<code>)?)(.+?)((?:</code>)?</pre>)', match_and_encode, resource_message, flags=re.DOTALL)

  return resource_message

def match_and_decode(match):
  return match.group(1) + urllib.parse.unquote(match.group(2)) + match.group(3)

def revert_codeblocks(resource_message):
  resource_message = re.sub(r'(<pre>(?:<code>)?)(.+?)((?:</code>)?</pre>)', match_and_decode, resource_message, flags=re.DOTALL)

  return resource_message

def google_translate(resource_message):
  data = {
    'q': resource_message,
    'source': from_language,
    'target': to_language,
    'format': translate_format
  }

  url = 'https://translation.googleapis.com/language/translate/v2'
  token = os.environ['TOKEN']

  headers = {
   'Authorization': 'Bearer {}'.format(token),
   'Content-Type': 'application/json',
  }

  res = requests.post(url, headers=headers, json=data)

  return(res.json()['data']['translations'][0]['translatedText'])

resource_message = convert_codeblocks(resource_message)
resource_message = google_translate(resource_message)
resource_message = revert_codeblocks(resource_message)

print(resource_message)

HTML

<h1>Title</h1>

plain text

<pre><code>
print('Not translate in codes')
print(1)
print(2)
</code></pre>

plain text

<pre><code>
def ex():
  print(4)
  print(5)
</code></pre>

exe

$ cat fixtures/english-codes.html | TOKEN=[GCP_TOKEN] FROM=en TO=ja ./translate-html-raw.py
<h1>タイトル</h1>平文<pre> <code>
print('Not translate in codes')
print(1)
print(2)
</code> </pre>平文<pre> <code>
def ex():
  print(4)
  print(5)
</code> </pre>

Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1660

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2019-05-06

Discussion