soma0sd

코딩 & 과학 & 교육

Python: 구글 번역사 도구로 JSON 번역하기

반응형

구글 번역사 도구로 JSON을 번역하기 위해 파이썬(Python)에서 제공하는 몇 가지 패키지를 사용했다는 이야기입니다. 특정 문제를 해결하는 이야기지만 일반적인 상황을 해결하기 위한 팁 모음 정도로 작성합니다.

발단: 이거 이대로는 힘들겠는데?

게임 테라리아의 토륨모드는 알려진 몇 가지 대형모드와 마찬가지로 DLC로 만들어 팔아도 될 정도의 방대한 컨텐츠를 자랑합니다. 그러다보니 현지화 지원 도구를 통해서 스크립트를 추려낸 결과물의 양이 상당했습니다. 혼자서 취미로 하는거라지만 번역하겠다고 예고만 해놓고 아무 소식이 없을 수는 없으니 아주 강력한 도구의 힘이 필요했습니다.

JSON

JSON은 데이터를 주고받을 때 쓰는 양식 중 하나입니다. 다양한 프로그램이 이 양식을 지원하고, 보기도 편한 방식이라 많이들 사용하고 있습니다.

["값1", "값2", "값3"]

값을 번호로 뽑아오는 리스트 형식과

{"키1": "값1", "키2": "값2"}

키를 이용해 값을 찾는 사전 형식, 그리고 둘을 혼합한 형식입니다. 제가 번역해야 할 JSON은 이렇게 생겼습니다.

[
  {
    "Name": "Abyssal Shadow",
    "ToolTip": "",
    "SetBonus": "",
    "ModifyTooltips": [],
    "TypeName": "AbyssalShadow",
    "Namespace": "ThoriumMod.Items.Abyssion"
  },
  {
    "Name": "Abyssal Shell",
    "ToolTip": "Pressing the 'Encase' key will place you in an impenetrable shell\nWhile encased, you can't use items or health potions, life regeneration is heavily reduced, and damage is nearly nullified\nLeaving the shell will greatly lower your speed, damage reduction and damage briefly\nLeaving the shell will prohibit the use of the shell again for 20 seconds",
    "SetBonus": "",
    "ModifyTooltips": [
      "-Hibernation Charm-"
    ],
    "TypeName": "AbyssalShell",
    "Namespace": "ThoriumMod.Items.Abyssion"
  }
]

사전 형식과 리스트 형식이 복잡하게 얽혀 있습니다. 보통 이런 경우에 사전 형식의 키는 프로그램에서 사용하기 때문에 번연하면 안됩니다. 또한 테라리아 모드의 경우 TypeName의 값과 Namespace은 역시 프로그램에서 그대로 사용하기 때문에 번역하면 안됩니다.

구글 번역사 도구

검색을 해보니, 시중에는 번역을 위한 여러 소프트웨어들이 나와있었습니다. 정말 좋아보였죠. 취미로 한두번 해보자고 구매하기엔 너무 많은 비용을 요구하는것만 빼고요. 검색하는 도중 구글에서도 온라인으로 번역도구를 제공한다는 것을 알게 되었습니다.

정말 무지막지한 도구입니다. 구글 기계번역으로 한번 번역 한 다음 손볼 곳들을 선택해 수정하는 방식입니다. 이미 한 번 번역했던 문장과 유사한 문장은 번역 메모리에 저장되어 다른 문서를 번역할 때도 자동으로 찾아서 번역에 반영합니다. 여기에 용어집을 등록하기까지 하면 게임 내의 요소들간 명칭을 통일 할 수 있습니다.

하지만 이 많은 번역지원 중 JSON을 지원하는 것은 크롬 확장 어플리케이션 양식 뿐입니다. 저도 처음에 JSON만 보고 감격을 하며 파일을 업로드 하려 했으나 실패했습니다.

차선책으로 HTML을 공략하기로 했습니다.

번역 프로세스

뭐 코딩 한 번 안하고 편안하게 번역할 수 있을 거라는 기대는 안했습니다. 번역 과정을 정하고 언제 어떻게 코딩이 필요할지 정했습니다.

  1. 게임에서 추출한 JSON 파일을 HTML로 변환한다.
  2. HTML 문서를 구글 번역사 도구로 번역한다.
  3. 번역이 끝난 HTML 문서를 JSON 파일로 되돌린다.

첫 단계와 마지막 단계에서 코딩이 필요합니다. 일일히 손으로 복붙하느니 그냥 번역하는게 나을거거든요.

파이썬으로 JSON -> HTML 변환할때의 규칙 정하기

JSON에 있는 모든 내용은 HTML문서 안에 들어가 있어야 합니다. 고민 끝에 각 데이터 원소를 세 종류로 나눴습니다.

  • string: 일반 문자열, 번역 대상
  • list: 리스트, 들어있는 문자열이 번역 대상
  • hide: 숨김, 번역 대상이 아님

hide를 굳이 분류한 이유가 있습니다. 구글 번역사 도구는 보이는 모든 텍스트에 기계번역을 한 번 돌려주는데 이거 되돌리는게 굉장히 귀찮은 일인데다가 틀리면 모드가 먹통이 되어버리거든요.

폴더:
    <body type="dir" data="{dir_name}"></body>
파일:
    <div type="file" data="{file_name}"></div>
요소:
    <ul index="{count}"></ul>
개별 항목:
    <li type="string" key="{key}">{value}</li>
    <li hidden type="hide" key="{key}" value="{value}"></li>
    <li type="list" key="{key}"><ul>
        <li>{value1}</li>
        <li>{value2}</li>
    </ul><li>

규칙은 이렇게 세웠습니다. 카테고리 별로 HTML 파일을 만들고 그 안에 여러 파일을 합칠 계획이니 이런 식으로 파일 이름과 폴더까지 기록해놔야 합니다.

본격적인 코딩

전체 코드는 너무 난잡하기도 하고 일반적인 해결책이 아니기 때문에 코딩하는 중에 얻은 몇 가지 팁만 나열하려고 합니다.

사용한 패키지

import os, fnmatch, json
from bs4 import BeautifulSoup

패키지는 이렇게 사용했습니다. osfnmatch는 저의 경우 92개의 번역 대상 JSON을 한 번에 찾아야 했기 때문에 불러왔습니다. bs4BeautifulSoup은 HTML파일을 다시 JSON으로 돌리기 위해 해석할 때, 그리고 HTML을 만드는 과정에서 줄바꿈과 들여쓰기를 적용하기 위해 사용했습니다. json이야 말할것도 없이 번역할 파일이 json이라 불러왔습니다.

키값별로 분류하기

key2type = {
        'Name': 'string',
        'Tip': 'string',
        'ToolTip': 'string',
        'SetBonus': 'string',
        'ShopButton1': 'string',
        'ShopButton2': 'string',
        'ModifyTooltips': 'list',
        'Contents': 'list',
        'ChatTexts': 'list',
        'TownNpcNames': 'list',
        'TypeName': 'hide',
        'Namespace': 'hide',
        'Method': 'hide'
        }

키값에 따라 데이터 처리 방식을 나눴습니다. if 문 여러개 쓰는 것보다 훨씬 깔끔합니다.

hide 속성 처리 방법

몇 가지 실험을 해봤는데, 구글 번역사 도구는 CSS로 숨겨도 찾아내서 번역하라고 알려줍니다. 아예 표시를 하지 않도록 처리해야 합니다. 그래서 제가 쓴 방법은 이겁니다.

if data_type == "hide":
  return '<li hidden type="hide" key="{key}" value="{val}"></li>'.format(key=key, val=val)

JSON 파일 열기 & 저장하기

with open(file_name, encoding='utf-8') as json_file:    
  data = json.load(json_file)

파이썬에도 리스트와 사전형이 있으니 불러온 후 사용하는데는 크게 문제가 없습니다.

with open(file_path, 'w', encoding="utf-8") as json_file:
  json.dump(data, json_file, ensure_ascii=False, indent=2)

데이터를 JSON으로 만들어 파일에 저장합니다. ensure_ascii=False는 다국어 지원을 위해 UTF-8로 저장하는 옵션입니다. indent=2는 들여쓰기를 지정합니다.

HTML 파일에서 원하는 요소 찾기

jQuery를 너무 많이 써와서 그런지 다른 방식은 답답하더군요. BeautifulSoup의 .select()를 주로 사용했습니다.

with open('TrKo.html', 'r', encoding="utf-8") as html_file:
  soup = BeautifulSoup(html_file.read(), 'html.parser')

for _file in soup.select('div[type=file]'):
  file_name = div_file['data']

이런 식으로 HTML 파일을 열고, 그 안에서 선택자 'div[type=file]'요소를 찾고, 그 요소에서 data값을 뽑아옵니다.

반응형
태그:

댓글

End of content

No more pages to load