태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

Google Translate API를 이용한 간단 번역기 만들기

2010.01.15 16:12

이번 강좌에서는 구글번역(Google Translate) API를 이용하여 간단한 번역기를 만드는 것에 대해 알아보도록 하겠습니다.
Google Translate API를 사용하기 위해서는 우선 외부 라이브러리를 추가해주어야 합니다. 이곳을 방문하여 해당 라이브러리 파일을 받도록 합니다.

라이브러리 파일을 받은 후, 새 프로젝트를 생성합니다.

[어플리케이션 정보]

액티비티
  • SimpleTranslate (SimpleTranslate.java)

레이아웃
  • main.xml (SimpleTranslate)

권한 (uses-permission)
  • android.permission.INTERNET

외부 라이브러리 (uses-library)
  • 메니페스트 파일에는 선언하지 않음

API Level
  • 7 : Android 2.1

어플리케이션 소스 :
프로젝트를 생성한 후, 프로젝트 속성을 클릭하여 사용할 라이브러리에 Google Translate 라이브러리를 추가하여야 합니다. 프로젝트를 선택 후 오른쪽 버튼 - Properties 버튼을 눌러 프로젝트 속성 창을 엽니다.

주의 : 위의 소스 파일을 다운로드하여 실습을 진행하시는 분들은 라이브러리 파일의 위치를 변경해주셔야 합니다.


Java Build Path 항목을 선택한 후, Libraries 탭을 선택하고 Add External JARs... 버튼을 클릭합니다.


다운로드한 라이브러리 파일을 선택합니다.


위와 같이 라이브러리가 추가된 것을 확인할 수 있습니다. 이것으로 구글번역 API를 쓰기 위한 준비가 모두 끝났습니다.
그럼 본격적으로 어플리케이션을 구성해보도록 하겠습니다. 우리가 만들어볼 어플리케이션의 모습은 아래와 같습니다.



[main.xml]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
	<TextView  
	    android:layout_width="fill_parent" 
	    android:layout_height="wrap_content" 
	    android:text="Text to translate :"/>
	    
	<EditText android:layout_height="wrap_content" 
		android:id="@+id/input_text" 
		android:layout_width="fill_parent" 
		android:hint="Enter text to translate"/>
	<Button android:layout_width="wrap_content" 
		android:layout_height="wrap_content" 
		android:layout_gravity="right" 
		android:text="Translate to Korean" 
		android:id="@+id/translateButton"/>
	
	<TextView android:layout_width="fill_parent" 
		android:layout_height="fill_parent" 
		android:id="@+id/translated_text"/>
</LinearLayout>

[SimpleTranslate.java]
package com.androidhuman.SimpleTranslate;

import com.google.api.translate.Language;
import com.google.api.translate.Translate;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class SimpleTranslate extends Activity {
        
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        final EditText inputText = (EditText)findViewById(R.id.input_text);
        final TextView translatedTextView = (TextView)findViewById(R.id.translated_text);
                
        Translate.setHttpReferrer("http://androidhuman.tistory.com");
        Button translateButton = (Button)findViewById(R.id.translateButton);       
        translateButton.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				String from = inputText.getText().toString();
				String after = new String();
				
				try{
					after = Translate.execute(from, Language.AUTO_DETECT, Language.KOREAN);
				
				}catch(Exception e){
					e.printStackTrace();
				}
				translatedTextView.setText(after);
			}
        	
        });
        }
}

기본적인 동작 방식은 EditText에 번역할 텍스트를 입력 받고, 번역 버튼을 누르면 번역된 텍스트가 아래의 TextView에 표시되는 방식입니다. 번역 수행은, 입력받은 문장의 언어가 어떤 것이든간에 구글 번역에서 번역 가능한 언어라면 모두 한국어로 번역을 수행합니다. 

기본적으로 EditText에서 텍스트를 받아오는 과정과 버튼의 리스너를 등록하는 방법에 대해서는 잘 알고 계시리라 믿고, 실제로 구글 번역 API를 사용하는 부분에 대해서만 알아보도록 하겠습니다.

Translate.setHttpReferrer("http://androidhuman.tistory.com");

onCreate() 메소드의 중간 쯤에 위와 같은 코드가 있습니다. 번역 API를 사용하기 전에 꼭 적어주어야 하는 메소드입니다. 아마 API Key와 비슷한 역할을 하는 것으로 추정됩니다 -_- (이 코드를 빼먹으면 번역이 수행되지 않습니다)

다음, 실제로 번역을 수행하는 부분을 보도록 하죠.

	String from = inputText.getText().toString();
	String after = new String();
	
	try{
		after = Translate.execute(from, Language.AUTO_DETECT, Language.KOREAN);
	
	}catch(Exception e){
		e.printStackTrace();
	}
	translatedTextView.setText(after);

위의 코드는 버튼 이벤트를 처리하는 onClick() 메소드의 내부에 구현되어 있는 코드입니다. EditText 위젯에 입력된 문장을 받아오고, 그 문장을 바탕으로 하여 번역을 수행하고 있습니다.

문장을 번역하려면 execute() 메소드를 사용하면 됩니다.

API
public String execute(String text, Language from, Language to)

from 언어로 작성된 text 문자열을 to 언어로 번역합니다. 번역된 텍스트를 반환합니다.
번역할 문장의 언어가 정해져 있지 않을 경우 자동 감지 (Language.AUTO_DETECT)를 사용할 수 있습니다.

위의 코드에서는 입력된 문장에 대해 한국어로 번역을 수행합니다. 입력된 언어에 대해 언어를 지정하지 않고 자동 자동으로 감지하도록 구현하였습니다.

입력받은 문장을 구글 서버로 보낸 후 그 결과를 다시 받아와 표시하게 되므로 인터넷 접속이 필요합니다. 따라서 메니페스트에 인터넷 사용 권한 (android.permission.INTERNET) 을 필히 추가해주어야 합니다.

마지막으로, 구글 번역을 통해 받아온 결과를 TextView에 표시해주도록 해주었습니다.
그럼, 어플리케이션을 실행시켜 확인해볼까요? 아래에서는 automat(독일어)에 대한 번역 결과를 확인해 보았습니다.




저작자 표시 비영리 변경 금지
신고

커니 인터넷/통신 , , ,

  1. 이전 댓글 더보기
  2. Blog Icon
    metLife

    @Override
    onClick()

    이부분에서 오버라이드를 지우라고 에러가 뜨네요. 지웠는데 실행은 되네요?? 왜 그런가요??

  3. 저도 정확한 이유를 잘 모르겠어요.

    가끔 프로젝트 import 했을 때 그런 문제가 발생하곤 하는데....
    저도 그때마다 지우고 합니다 ㅠㅠ

  4. eclipse의 버그 인지 모르겠지만 프로젝트를 import하는 과정에서 프로젝트의 Property가 정삭적으로 로드 되지 않는 경우가 있더군요~ 저 같은 경우도 이런 일이 있었는데요 이유는 프로젝트 설정의 java compiler 항목에 컴파일러가 1.5로 변해있더라고요~ Notation이 java 1.6부터 적용 가능한 문법 요소이기때문에 @Override에서 에러가 발생했었던 기억이 나네요~ 혹시 해서 글 남겨 봤습니다^^ 아참 블로그 글 정말 많은 도움이 되고 있습니다~ 감사합니다~ ㅋ

  5. 아 그렇군요!!!!
    주옥같은 정보 감사합니다 :)

  6. Blog Icon
    metLife

    api 찾아보니까 없어야 되는것같은데요.
    Class Overview

    Button represents a push-button widget. Push-buttons can be pressed, or clicked, by the user to perform an action. A typical use of a push-button in an activity would be the following:

    public class MyActivity extends Activity {
    protected void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    setContentView(R.layout.content_layout_id);

    final Button button = (Button) findViewById(R.id.button_id);
    button.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
    // Perform action on click
    }
    });
    }
    }

    이런식으로 쓰라고 나와있던디요.. ㅋㅋ

  7. 오버라이드의 의미가 무엇인지 찾아보세요.
    저 Notation은 오버라이드 하는 메소드가 적법한지를 확인해 주는 Notation입니다.

    즉 상위 클래스에는 onClick 메소드가 정의되어 있고,
    이 메소드를 오버라이드 할 때는 상관없지만 실수로 onClic 이런 식으로 적게 되면 onClic 메소드는 상위 메소드의 메소드가 아니고 그 클래스의 새로운 메소드로 선언되며, 이는 에러를 유발시키는 원인이 됩니다.

    @Override Notation은 이를 방지해주는 역할을 합니다.

  8. Blog Icon

    비밀댓글입니다

  9. 어플리케이션이 제데로 설치된 것이 맞나요??
    다시 한번 확인해보세요~

  10. 커니님, 안녕하세요. 항상 좋은 자료 감사드립니다.^^

    위 예제를 따라하다보니 다음과 같은 에러가 발생하는데 혹시 원인을 좀 알 수 있을까요?
    Build path에서 jar파일을 추가시키는 것까지는 진행하여 Eclipse에서는 에러가 없는데,
    실행시 Runtime Error가 발생하네요.
    혹시 에뮬레이터쪽으로 jar파일을 복사해둬야 하나요? 그럼 수고하세요.^^

    java.lang.NoClassDefFoundError: com.google.api.translate.Translate
    at com.androidhuman.SimpleTranslate.SimpleTranslate.onCreate(SimpleTranslate.java:24)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
    at android.app.ActivityThread.access$2200(ActivityThread.java:119)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:4363)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    at dalvik.system.NativeStart.main(Native Method)

  11. Blog Icon
    안드로이드 늅

    좋은 정보 감사합니다..ㅠ 저는 이클립스에서 External add ... 이런 버튼이 없습니다;;
    이클립스 버젼이 틀린건가요? 그냥 add jar 을 해서 추가 시키긴 했는데;;

    임포트 부분에서 에러가 나네요;;ㅠㅠ

    너무 초보라서 이런 단순한거에 막히네요..ㅠ

    해결방법이 없을까요?

    이클립스 인터페이스가 제꺼랑 이상하게 틀리네요...;;

    그리고 라이브러리 추가할때 구글api 파일을 어디에 두어야 하나요? 아무대나 두어도 상관없는건가요?

  12. 일반적으로 프로젝트 디렉터리의 /libs 에 넣어줍니다.
    import 에러라면 빌드패스 설정이 제대로 안되어있을 가능성이 높습니다. 그 부분을 다시한번 확인해보시는 것이 좋을 것 같습니다.

  13. Blog Icon
    안드로이드 늅

    위에 문제 해결했습니다..;;

    님께서 주신 예제 파일 그대로 실행해보았는데

    the application simple Translate(process com.androidhuman.simpleTranslate) has stopped unexpectedly Pleas

    Try again

    이라는 오류가 뜨는데 이건 무슨 오류인가요..ㅠㅠ 꼭 만들어 보고 싶습니다.


    12-02 07:06:00.271: ERROR/AndroidRuntime(225): Uncaught handler: thread main exiting due to uncaught exception
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): java.lang.NoClassDefFoundError: com.google.api.translate.Translate
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at com.androidhuman.SimpleTranslate.SimpleTranslate.onCreate(SimpleTranslate.java:24)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at android.os.Handler.dispatchMessage(Handler.java:99)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at android.os.Looper.loop(Looper.java:123)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at android.app.ActivityThread.main(ActivityThread.java:4363)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at java.lang.reflect.Method.invokeNative(Native Method)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at java.lang.reflect.Method.invoke(Method.java:521)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at dalvik.system.NativeStart.main(Native Method)

  14. 로그를 확인해보세요.

    http://androidhuman.tistory.com/notice/386

  15. Blog Icon
    안드로이드 늅

    로그입니다..

    the application simple Translate(process com.androidhuman.simpleTranslate) has stopped unexpectedly Pleas

    Try again

    이라는 오류가 뜨는데 이건 무슨 오류인가요..ㅠㅠ 꼭 만들어 보고 싶습니다.


    12-02 07:06:00.271: ERROR/AndroidRuntime(225): Uncaught handler: thread main exiting due to uncaught exception
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): java.lang.NoClassDefFoundError: com.google.api.translate.Translate
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at com.androidhuman.SimpleTranslate.SimpleTranslate.onCreate(SimpleTranslate.java:24)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at android.os.Handler.dispatchMessage(Handler.java:99)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at android.os.Looper.loop(Looper.java:123)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at android.app.ActivityThread.main(ActivityThread.java:4363)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at java.lang.reflect.Method.invokeNative(Native Method)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at java.lang.reflect.Method.invoke(Method.java:521)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    12-02 07:06:00.291: ERROR/AndroidRuntime(225): at dalvik.system.NativeStart.main(Native Method)

  16. Blog Icon
    안드로이드 늅

    저기 위에 님 설명 주신 부분에서 Translate.setHttpReferrer("http://androidhuman.tistory.com";);

    여기에 아무 주소나 넣어도 상관없는건가요?

  17. Blog Icon
    안드로이드 늅

    만들었습니다....감사합니다..ㅠㅠ

  18. Blog Icon
    안드롭

    예전에는 잘됬었는데 번역기가 잘 안되네요 구글 서버가 문제인가요?ㅠ

  19. 구글에서 번역 API를 닫아서 그렇습니다... 'ㅁ' 얼마 전부터 닫혔을거에요.

  20. Blog Icon
    열공하는이

    왜 갑자기 안되죵,,,,,ㅜㅜ

  21. 번역 API 서비스 종료때문에 그렇습니다 ㅠㅠ

  22. Blog Icon
    barkhasbadi

    제가 한국어 몽골어 문장 번역기를 만들려구 하는데요. . .어떤 프로그램 쓰면 정확하고, 복잡하지 않을까요?

  23. 일단 번역 솔루션이 우선일텐데, 그것만 해결된다면야 나머지는 프로그램 짜기 나름 아닐까요?!

  24. Blog Icon
    초보자

    Translate.setHttpReferrer("http://androidhuman.tistory.com";); ,
    after = Translate.execute(from, Language.ENGLISH, Language.KOREAN);
    여기서 자꾸 에러가 나요ㅠㅠ어떻게 해야되나요?

  25. 지금은 Google Translate API 자체가 폐기되어서, 위의 라이브러리를 사용할 수 없습니다 :(

  26. Blog Icon
    초보자

    그럼 지금은 어떻게 할 수 없나요??안드로이드 번역어플을 못하는거에요??다른 방법으로 대처하는 방법좀알려주세요~~

  27. 다른 번역 API를 사용해야겠지요?
    근데 다른 번역 API 가 있는지는 모르겠네요...

  28. Blog Icon
    초보자

    혹시라도 알게되면 알려주세요~~부탁드립니다..~~!

  29. 사전이나 번역 관련 공개 API는 이젠 대부분 없다 보시면 됩니다. 저도 도움 드리기는 어렵네요.

  30. Blog Icon
    초보자

    android-translate-api-1[1].1.jar 를 발견했는데 혹시 이거 어떻게 사용하는 건가요??이거도 막혔는지 한번 물어보고 싶습니다..

  31. 구글 번역 API라면 라이브러리 파일 여부랑 관계없이 서버에서 서비스를 중단한 것이므로 일체 사용 불가능합니다.

  32. Blog Icon
    초보자

    logcat에서 caused by: java.lang.nullPointException 이게 무슨 에러인가요???

  33. NullPointerException은 말 그대로

    NullPointer, 객체가 생성되지 않아서 객체 안의 변수들을 참고할 수 없어 발생하는 오류입니다.

    http://lmgtfy.com/?q=NullPointerException

  34. Blog Icon
    안드로가자

    현재 번역 api를 구입해 안드로이드에서 구현중인데요.. avd에서는 실행이 되는데 디바이스에서는 작동이안됩니다..

    괘씸해 보일수도있지만 제가 질문한 글이

    http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040104&docId=162704339

    여기서 했는데 보시고 뭐가문제인지 혹시 아시면 답변좀 부탁드려요 ㅠㅠ

    ps. 주소에 추가해서 메인쓰레드에서는 네트워크를 사용할수 없다고해서 쓰레드로도 구현해보고 Strictmode로도 구현해보았는데 안되네요 ㅠㅠ

  35. 좋은글 출처를 표시하고 블로그에 담아갑니다. ^^

  36. Blog Icon
    spock

    Translate.set~부분에서 에러가 나는데 뭐가 문제일까요?

  37. Blog Icon
    spock

    undefined 에러가 뜨네여;;

  38. Blog Icon
    spock

    그리고.... Translate 객체가 생성되는 과정이 안보이는데... ㅜㅜ 설명부탁드릴게여~

  39. 구글 번역 API 서비스는 종료되어서 더 이상 위 예제를 사용할 수 없습니다~