PGR21.com
- 자유 주제로 사용할 수 있는 게시판입니다.
- 토론 게시판의 용도를 겸합니다.
Date 2018/03/18 17:11:57
Name 시드마이어
Link #1 https://brunch.co.kr/@skykamja24/130
Subject [일반] Node.js로 다중 언어 번역기 만들기 (수정됨)
저는 현재 6개국어가 지원되는 앱을 만들고 있습니다.
아직까지 하나씩 번역해서 추가해도 크게 무리가 되지 않았는데,
이번에 9개국어로 늘리게 되니 노가다로는 답이 없었습니다.
그래서 다중 언어 번역기를 만들어보았습니다.

Ha193uyvr_O-9kH5-3LiCGh6Zf8.jpg
먼저 node.js(이하 노드)가 필요합니다. 저는 노드가 이미 설치된 c9 IDE를 이용해서 작업했습니다. c9에서 Create a new workspace를 눌러주고, 템플렛은 Node.js가 아니라 Blank를 사용합니다. Node.js를 선택하시면, 채팅 웹사이트를 만들어주기 때문에 일이 많아집니다. Blank를 선택해도 기본적인 노드와 npm은 다 설치되어있기 때문에 가장 빠르게 만들 수 있습니다.

생성하시면 아래와 같이 빈 화면이 나오게 됩니다.
ucjmKJdEp7SuKBc5SKblXG3e_fU.jpg
npm을 통해서 모듈을 설치해봅니다. 제가 사용한 모듈은 google-translate-api 입니다. 그럼 설치해봅시다.



모듈 설치하기
[$ npm install --save google-translate-api ]

위의 코드를 입력해 설치해줍니다. 그러면 알아서 필요한 다른 모듈들도 설치가 완료됩니다.
설치가 끝났으면 이제 번역을 위한 코드를 써봅니다. translator.js라는 파일을 만들어보겠습니다.
z2xaws8e-x4hIqaYTSPXiIxtIJk.jpg
위의 코드를 입력하고 파일을 저장합니다.



코드 설명
맨 윗 줄은 모듈을 참조하는 명령입니다. translate에 첫번째 인자에는 '안녕하세요!'를 넣었습니다. 예측하셨겠지만 번역할 '문장'을 넣어줍니다. 두번째 인자에는 {from: 'ko', to: 'en'} 이 들어갔습니다. 한국어(ko)에서 영어(en)로 바꾸겠다는 의미입니다. 'ko'나 'en'을 locale이라고 부릅니다. locale을 검색해보시면 여러 국가 코드를 찾으실 수 있습니다. 이후 번역이 끝난 문장는 .then() 안의 명령을 받아 작동합니다. 'RUN' 버튼을 눌러 코드를 실행시켜보겠습니다.
Z86qk8i2TvbkNJg2bvTbArQZq5Q.jpg
"안녕하세요!"를 제 번역기는 "Good morning!"으로 번역했습니다. 구글 번역기와 동일한지 확인해봅시다.
bhCwupk4jyx_ecyx5uB2Em96ejc.jpg
동일하게 작동함을 확인할 수 있습니다.




여러 언어로 동시 번역하기

이제 다중 언어 번역기로 발전시켜봅니다. 번역할 대상 언어를 배열로 만듭니다.

[let langAry = ['en', 'ko', 'ja', 'es']; ]

예에서 번역할 언어는 영어, 한국어, 일본어, 스페인어 입니다. 4개만 넣었지만 locale만 추가로 넣어주시면 동시에 수 십개의 언어도 번역할 수 있습니다.

다중 번역을 위한 함수를 만듭니다.

[let multipleTranslator = (sentence) => { };]

multipleTranslator함수 안에 아래의 코드를 넣어줍니다.
VrvD2u6X9Sd9WF8s36V-tk2Goeg.jpg
저는 번역한 언어를 순서대로 넣어서 보고 싶기 때문에 wordObj라는 객체를 만들었습니다. for문을 통해서 각각의 언어에 해당하는 번역을 순차적으로 진행시킵니다.

gc6R_naXTFDhXL4OzNdiYVha_iM.jpg
이와는 별개로 널체크를 위한 함수를 하나 만들었습니다. 이렇게 널체크하는 이유는 여러 언어의 번역이 비동기로 진행되기 때문입니다. hasNull함수를 통해 "다 완성되면 가지고 오라"는 명령을 내립니다.

다시 multipleTranslator함수에 아래의 코드를 넣어줍니다.
_L-ilX66vr4C7ro225WAh2M0mZ0.jpg"1초마다 번역이 끝났는지 확인해서 완료되면 찍어서 보내"라는 의미를 담고 있습니다.
준비는 끝났으니 코드 맨 아래에 번역할 문장을 넣어 명령을 내립니다.

[multipleTranslator('반갑습니다!');]

결과를 보면 아래와 같이 정상적으로 작동합니다.
L7KXJUDKwkqyXFi3GSCudaqOe0w.jpg텍스트 파일로 만들기
동시에 여러 언어로 번역되는 번역기를 만드는건 성공했습니다. 그런데 저는 문장을 파일에 담아두고 싶습니다. 결과로 나타나는 문장을 파일에 추가만 하면 됩니다.

저는 구현을 위해 log-to-file모듈을 사용했습니다.

[$ npm install --save log-to-file]

이 모듈을 사용하면 간편하게 console.log로 찍히는 텍스트를 파일에 넣어줄 수 있습니다. 먼저 파일 맨 위에 아래의 코드를 추가합니다.

[const log = require('log-to-file');]
코드 중간 부분을 아래와 같이 수정합니다.

2euAgbr0Y2xaofJI2NDEsr42okU.jpg
주의해서 보실 부분은 console.log를 log로 바꾼 점과 쉼표 이후에 파일 이름이 들어갔습니다. '파일 이름'은 생성하거나 텍스트를 추가할 이미 있는 파일명을 넣어주시면 됩니다.

ITa7JT6AJc03kIeYfN7WN2WO8RA.jpg
코드를 실행해보면 이번엔 console.log에 찍히지 않고, 파일이 생성됩니다. 파일을 열어봅니다.

dhwZZjOn4xFFOiql-XJwonYjodQ.jpg
파일에 정상적으로 추가되는걸 확인할 수 있습니다.



통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
도롱롱롱롱롱이
18/03/18 17:48
수정 아이콘
구글 번역 상용 api를 사용하시는 건가요?
시드마이어
18/03/18 18:19
수정 아이콘
저는 npm에서 찾아서 쓴거라서 확인은 안해봤습니다. google-translate-api를 npm에서 검색해보니 자세한 내용은 나와있지 않은것 같구요. 제가 잠깐 검색해본 바로는 구글에서 바로 API를 가져왔다면 인증키가 필요했을텐데 위의 내용에선 인증키가 딱히 필요없습니다. 그런 의미에서 구글에서 제공하는 API를 쓴것 같진 않습니다.
일각여삼추
18/03/18 18:32
수정 아이콘
아마 웹 크롤링을 이용하는 비공식 api일 겁니다
이유진
18/03/18 18:42
수정 아이콘
궁금할땐 github에서 까보면 됩니다.

일반적으로 사용하는 구글 웹 번역기의 내부 api를 그대로 조립해서 사용하는군요.
https://translate.google.co.kr/translate_a/single?client=t&sl=en&tl=ko&hl=ko&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&otf=2&ssel=0&tsel=0&kc=1&tk=789661.687700&q=goods
이 링크를 입력해보시면 goods라는 단어를 번역한 결과값이 파일로 받아집니다
도롱롱롱롱롱이
18/03/18 21:46
수정 아이콘
아 그렇군요 확인 감사합니다. 상용 api 쓰기에는 부담이 되지 않을까 했는데 다른 방식이었군요
18/03/18 18:52
수정 아이콘
일단 번역기로는 아직 퀄리티가 답이 없다는게 문제일것 같네요..

괜히 언어팩 노가다를 하는게 아닌.. ㅠㅠ
시드마이어
18/03/18 21:02
수정 아이콘
무슨 의미로 댓글을 다신건지 모르겠네요. 만든게 형편없다는 뜻인가요? ㅠㅠ
18/03/18 21:34
수정 아이콘
아닙니다. ㅠㅠ 활용하기 어렵다는 이야기얐습미다. 수고하셨습니다
-안군-
18/03/18 20:11
수정 아이콘
구글번역기의 성능이 엄청 좋아진건 맞는데, 그래도 문맥에 맞지 않는 경우가 많고, 특히 한국어 특유의 주어가 생략된(?) 문장의 경우엔 엉뚱한 결과를 내는 경우가 많더군요... ㅠㅠ
그래도 구글은 계속해서 좋은 도구들을 제공해줘서 그저 고마울 뿐... 구글신 차냥해!!
arq.Gstar
18/03/18 21:05
수정 아이콘
구글번역기도 샘플이 어마어마한 언어들에 한해서 체감이 되는것 같더라구요
(한<->영, 한<->일 같은거)
다만 다른 언어에 대해서도 시간문제이니, 시간이 해결해줄....
18/03/18 21:31
수정 아이콘
니코니코동화 영상 코멘트를 실시간으로 번역해주는 걸 만들고 싶은데 어떻게 해야할까요?
시드마이어
18/03/19 20:59
수정 아이콘
코멘트 텍스트를 받아올수만 있으면 빠르게 될 것 같습니다.
영상을 제공하는 서비스에서 해당 데이터를 API로 제공하면 서비스를 쉽게 만들 수 있을겁니다.
18/03/18 22:43
수정 아이콘
예전에 구글 토큰가지고 채팅봇에 번역기능 붙여봤는데 하루 쓰니까 0.01달러 결제되는거보고 바로 떼버렸던 기억이 나네요.
좋은 글 잘 봤습니다.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회 추천
76216 [일반] 소시민으로 살아가기란 [25] 난될거다10154 18/03/20 10154 4
76215 [일반] MBC. SBS 거 너무하는거 아니오? [40] Jun91118624 18/03/20 18624 10
76214 [일반] 도종환 장관의 주례가 고은이었다는건 허위사실이라고 도종환 장관이 밝혔습니다. [110] 원시제18053 18/03/19 18053 24
76213 [일반] 검찰, MB구속영장에 ‘다스는 MB 것’ 적시···MB 소유 판단” [72] 시린비15674 18/03/19 15674 38
76212 [일반] 이 모든 원인은 '절대적 저임금 구조'라구? [375] 웃다.20150 18/03/19 20150 18
76211 [일반] 판타지 롤링스톤즈 리그 리뷰 및 MLB리그 모집 (수정 리그 셋팅 추가)(마감) [21] 능숙한문제해결사6106 18/03/19 6106 0
76210 [일반] 이영도 작가님 신작 [오버 더 초이스] 연재 시작 [48] 렌야12369 18/03/19 12369 2
76209 [일반] 이번 올림픽이 나에게 남긴 것 [36] 11611 18/03/19 11611 25
76208 [일반] [단편] 초식남 월드 [24] 마스터충달9772 18/03/19 9772 25
76207 [일반] 배달앱은 악덕기업일까? [266] 맹독충20084 18/03/19 20084 13
76206 [일반] AI로 만든 음악. [7] 뀨뀨9267 18/03/19 9267 4
76205 [일반] [뉴스 모음] 평창에서 숙식한 김정숙 여사 이야기 외 [18] The xian13697 18/03/19 13697 58
76204 [일반] 알바하다 진상들 만나면 하루종일 기분 더럽고 화나네요 크크 [45] 받아들이기11216 18/03/18 11216 3
76203 [일반] 고환의 비밀과 거세의 역사 (고환의 원리에 얽힌 인터섹슈얼의 비밀) [26] 카랑카25590 18/03/18 25590 68
76202 [일반] 부산 음식점 이야기2 [3] 하심군7616 18/03/18 7616 4
76201 [일반] 美 '철강 관세' 한국산 면제 가능성 [61] 안초비12020 18/03/18 12020 1
76200 [일반] e아동행복지원시스템이 내일부터 가동합니다. [18] 落花7181 18/03/18 7181 3
76199 [일반] 치킨 프랜차이즈 "아··· 카카오 쿠폰 결제요? 배달 안 됩니다" [184] 자전거도둑23238 18/03/18 23238 0
76198 [일반] Node.js로 다중 언어 번역기 만들기 [13] 시드마이어9399 18/03/18 9399 9
76197 [일반] 지금까지의 마블 개봉 영화 정리 및 개인적으로 뽑는 BEST 3 [91] swear13632 18/03/18 13632 11
76196 [일반] 청년 실업 해결과 노동 양극화 해소를 위한 급진적인 생각 [118] 삭제됨12603 18/03/18 12603 0
76195 [일반] 어느 옵션 트레이더의 하루 일과 [49] Elvenblood17143 18/03/18 17143 33
76194 [일반] 좋았던 시절의 음악: 80s 일본의 시티팝 [48] KOZE26461 18/03/18 26461 19
목록 이전 다음
댓글

+ : 최근 1시간내에 달린 댓글
+ : 최근 2시간내에 달린 댓글
맨 위로