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달러 결제되는거보고 바로 떼버렸던 기억이 나네요.
좋은 글 잘 봤습니다.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회 추천
76207 [일반] 배달앱은 악덕기업일까? [266] 맹독충20104 18/03/19 20104 13
76206 [일반] AI로 만든 음악. [7] 뀨뀨9292 18/03/19 9292 4
76205 [일반] [뉴스 모음] 평창에서 숙식한 김정숙 여사 이야기 외 [18] The xian13742 18/03/19 13742 58
76204 [일반] 알바하다 진상들 만나면 하루종일 기분 더럽고 화나네요 크크 [45] 받아들이기11239 18/03/18 11239 3
76203 [일반] 고환의 비밀과 거세의 역사 (고환의 원리에 얽힌 인터섹슈얼의 비밀) [26] 카랑카25614 18/03/18 25614 68
76202 [일반] 부산 음식점 이야기2 [3] 하심군7644 18/03/18 7644 4
76201 [일반] 美 '철강 관세' 한국산 면제 가능성 [61] 안초비12033 18/03/18 12033 1
76200 [일반] e아동행복지원시스템이 내일부터 가동합니다. [18] 落花7192 18/03/18 7192 3
76199 [일반] 치킨 프랜차이즈 "아··· 카카오 쿠폰 결제요? 배달 안 됩니다" [184] 자전거도둑23273 18/03/18 23273 0
76198 [일반] Node.js로 다중 언어 번역기 만들기 [13] 시드마이어9415 18/03/18 9415 9
76197 [일반] 지금까지의 마블 개봉 영화 정리 및 개인적으로 뽑는 BEST 3 [91] swear13655 18/03/18 13655 11
76196 [일반] 청년 실업 해결과 노동 양극화 해소를 위한 급진적인 생각 [118] 삭제됨12615 18/03/18 12615 0
76195 [일반] 어느 옵션 트레이더의 하루 일과 [49] Elvenblood17164 18/03/18 17164 33
76194 [일반] 좋았던 시절의 음악: 80s 일본의 시티팝 [48] KOZE26477 18/03/18 26477 19
76193 [일반] 분권형? 이원집정부? 내각제 해봤습니다. [79] 소주꼬뿌11314 18/03/18 11314 15
76192 [일반] [뉴스 모음] 청와대. 강원랜드 채용비리 부정합격자 226명 직권면직 결정 외 [20] The xian13888 18/03/18 13888 47
76191 [일반] 무한도전이 끝나가는 것에 대한 짧지만 슬픈 한탄. [11] 그룬가스트! 참!8198 18/03/18 8198 6
76190 [일반] 국제결혼 유감 [67] foreign worker15022 18/03/17 15022 75
76189 [일반] 정봉주 미투 사건 관련 진중권 동양대 교수의 글 [263] MES19847 18/03/17 19847 12
76188 댓글잠금 [일반] 대한민국내 국제결혼의 탈을 쓴 매매혼의 실태 [318] TTPP28506 18/03/17 28506 19
76187 [일반] 혐오가 일상화된 세상 - 노인에 대한 혐오보고서 [58] 홍승식12874 18/03/17 12874 2
76186 [일반] 청년실업률 저의 주관적 입장을 생각해봤습니다. [127] 삭제됨11371 18/03/17 11371 9
76185 [일반] 여성을 피하는 펜스룰은 스스로를 잠재적 성폭력 가해자로 인정하는 셈 [167] 러블리맨20454 18/03/17 20454 20
목록 이전 다음
댓글

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