본문 바로가기
안드로이드 자바

[Java][Android] 번역어플 빨리 만들기

by teamnova 2021. 3. 6.

이번 예제에서는 파파고 번역 api 를 이용해 번역어플을 만들어 볼 예정입니다.

 

스틱코드라는 플러그인을 이용해서 빠르게 개발을 해볼 건데요

 

이번에 참고한 스틱코드입니다.

 

* setText, getText

stickode.com/detail.html?no=1172

 

스틱코드

 

stickode.com

* onClick

stickode.com/detail.html?no=737

 

스틱코드

 

stickode.com

============================================================================

파파고 번역 api 란??

 

Papago 번역은 Papago의 인공 신경망 기반 기계 번역 기술(NMT, Neural Machine Translation)로 텍스트를 번역한 결과를 반환하는 RESTful API입니다.

 

Papago 번역은 비로그인 방식 오픈 API입니다.

비로그인 방식 오픈 API는 네이버 오픈API를 호출할 때 HTTP 요청 헤더에 클라이언트 아이디와 클라이언트 시크릿 값만 전송해 사용할 수 있는 오픈 API입니다. 클라이언트 아이디와 클라이언트 시크릿은 네이버 오픈API에서 인증된 사용자인지 확인하는 수단입니다. 네이버 개발자 센터에서 애플리케이션을 등록하면 클라이언트 아이디와 클라이언트 시크릿이 발급됩니다.

 

Papago 번역으로 한 번에 번역할 수 있는 분량은 최대 5,000자이며, 하루 번역 처리 한도는 10,000자입니다.

 

출처 : 네이버 Developers developers.naver.com/docs/papago/papago-nmt-overview.md

============================================================================

 

파파고 번역 api를 이용한 번역어플 만들기

 

1. 먼저 파파고 번역 api를 사용하기 위해서는 네이버 Developer 에서 어플리케이션을 등록해야합니다. 

developers.naver.com/main/

 

NAVER Developers

네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음

developers.naver.com

2. 애플리케이션 등록이 끝났다면 [내 어플리케이션] -> [어플리케이션 정보]에 Client ID와 Client Secret를 복사해 놓습니다.

 

3. 파파고 번역 자바 코드 작성

- 복사해놓은 Client ID와 Client Secret를 넣습니다.

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;


public class Papago {
    public String getTranslation(String word, String source, String target) {

        String clientId = "애플리케이션 클라이언트 아이디값";
        String clientSecret = "애플리케이션 클라이언트 시크릿값";

        try {
            String wordSource, wordTarget;
            String text = URLEncoder.encode(word, "UTF-8");             //word
            wordSource = URLEncoder.encode(source, "UTF-8");
            wordTarget = URLEncoder.encode(target, "UTF-8");

            String apiURL = "https://openapi.naver.com/v1/papago/n2mt";
            URL url = new URL(apiURL);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("POST");
            con.setRequestProperty("X-Naver-Client-Id", clientId);
            con.setRequestProperty("X-Naver-Client-Secret", clientSecret);
            // post request
            String postParams = "source="+wordSource+"&target="+wordTarget+"&text=" + text;
            con.setDoOutput(true);
            DataOutputStream wr = new DataOutputStream(con.getOutputStream());
            wr.writeBytes(postParams);
            wr.flush();
            wr.close();
            int responseCode = con.getResponseCode();
            BufferedReader br;
            if (responseCode == 200) { // 정상 호출
                br = new BufferedReader(new InputStreamReader(con.getInputStream()));
            } else {  // 에러 발생
                br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
            }
            String inputLine;
            StringBuffer response = new StringBuffer();
            while ((inputLine = br.readLine()) != null) {
                response.append(inputLine);
            }
            br.close();
            //System.out.println(response.toString());
            String s = response.toString();
            s = s.split("\"")[27];
            return s;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "0";
    }
}

 

4. 레이아웃 제작

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".Activity.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="3"
        android:orientation="horizontal"
        android:layout_gravity="center">

        <TextView
            android:id="@+id/toLanguageTV"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:textSize="22sp"
            android:fontFamily="@font/pay_booc_bold"
            android:gravity="right|center_vertical"
            android:text="@string/korean" />

        <ImageButton
            android:id="@+id/languageChangeIB"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@android:color/transparent"
            app:srcCompat="@drawable/change"/>

        <TextView
            android:id="@+id/fromLanguageTV"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:textSize="22sp"
            android:fontFamily="@font/pay_booc_bold"
            android:gravity="left|center_vertical"
            android:text="@string/english" />

    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#D3D3D3" />

    <EditText
        android:id="@+id/whatTranslateET"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="15"
        android:hint="@string/please_enter_translate"
        android:fontFamily="@font/pay_booc_bold"
        android:textSize="23sp"
        android:ems="10"
        android:gravity="start|top"
        android:padding="12dp"
        android:inputType="textMultiLine"
        android:background="@android:color/transparent"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#D3D3D3" />

    <TextView
        android:id="@+id/changedTextTV"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="15"
        android:fontFamily="@font/pay_booc_bold"
        android:textSize="23sp"
        android:ems="10"
        android:gravity="start|top"
        android:padding="12dp"
        android:inputType="textMultiLine"
        android:background="@android:color/transparent"/>

</LinearLayout>

 

5. MainActivity 코드 작성

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;

import com.example.translationapp.Etc.Papago;
import com.example.translationapp.R;

public class MainActivity extends AppCompatActivity {

    TextView toLanguageTV;
    TextView fromLanguageTV;
    TextView changedTextTV;

    ImageButton languageChangeIB;

    EditText whatTranslateET;

	// 기본 언어 한글
    String language = "Korean";

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

		// 초기화
        init();
        buttonClickListenr();

	
        whatTranslateET.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                Log.d(TAG, "beforeTextChanged");
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                Log.d(TAG, "onTextChanged");
            }

            @Override
            public void afterTextChanged(Editable editable) {

                new Thread(){
                    @Override
                    public void run() {
                        String word = whatTranslateET.getText().toString();
                        // Papago는 3번에서 만든 자바 코드이다.
                        Papago papago = new Papago();
                        String resultWord;
						
                        if(language.equals("Korean")){
                            resultWord= papago.getTranslation(word,"ko","en");
                        }else{
                            resultWord= papago.getTranslation(word,"en","ko");
                        }

                        Bundle papagoBundle = new Bundle();
                        papagoBundle.putString("resultWord",resultWord);

                        Log.d(TAG, "resultWord" + resultWord);

                        Message msg = papago_handler.obtainMessage();
                        msg.setData(papagoBundle);
                        papago_handler.sendMessage(msg);

                        Log.d(TAG, "msg" + msg);
                    }
                }.start();

            }
        });
    }

    private void init(){
        toLanguageTV = findViewById(R.id.toLanguageTV);
        fromLanguageTV = findViewById(R.id.fromLanguageTV);
        languageChangeIB = findViewById(R.id.languageChangeIB);
        whatTranslateET = findViewById(R.id.whatTranslateET);
        changedTextTV = findViewById(R.id.changedTextTV);
    }

    @SuppressLint("HandlerLeak")
    Handler papago_handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            Bundle bundle = msg.getData();
            String resultWord = bundle.getString("resultWord");
            changedTextTV.setText(resultWord);
        }
    };

    private void buttonClickListenr(){

        languageChangeIB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Log.d(TAG, "languageChangeIB onClick");

                if(language.equals("Korean")){
                    language= "English";

                    toLanguageTV.setText("영어");
                    fromLanguageTV.setText("한국어");

                }else{
                    language= "Korean";

                    toLanguageTV.setText("한국어");
                    fromLanguageTV.setText("영어");
                }
            }
        });
    }
}

 

6. AndroidManifest.xml 수정

    <uses-permission android:name="android.permission.INTERNET" />

위의 코드를 추가해준다.

 

============================================================================

위의 코드를 잘 따라하셨다면 아래와 같은 결과물을 얻을 수 있습니다.

 

결과물