Android 翻译程序

一、核心功能

  1. 翻译
  2. 单词卡

二、翻译功能

  1. 测试

http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i=item

  1. 返回数据
{
    "type": "EN2ZH_CN",
    "errorCode": 0,
    "elapsedTime": 1,
    "translateResult": [
        [
            {
                "src": "item",
                "tgt": "项"
            }
        ]
    ]
}
  1. 效果
  • 翻译结果弹出对话框
    翻译结果弹出提示框
  • 单词列表
    单词列表
  • 单词卡
    单词本

三、主要代码实现

  1. AndroidManifest.xml
    需要给予网络和储存卡读写权限
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  1. 翻译
  • 功能实现类
public class Translator {
    // 调用翻译链接
    String tranUrl = "http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i=";

    public Translator() {}
    public String tran(String req) {
        HttpURLConnection conn = null;
        BufferedReader buf = null;
        StringBuilder getRes = new StringBuilder();
        String res = "NULL";
        try {
            // 翻译
            URL url = new URL(tranUrl + req);
            conn = (HttpURLConnection) url.openConnection();
            if (conn.getResponseCode() == 200) {
                buf = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                for (String s = buf.readLine(); s != null; s = buf.readLine()) {
                    getRes.append(s);
                }
                String temp = getRes.toString();
                // json解析
                JSONObject obj = new JSONObject(temp);
                JSONArray jsonArray = obj.getJSONArray("translateResult");
                JSONArray jsonArray2 = jsonArray.getJSONArray(0);
                JSONObject tgt = jsonArray2.getJSONObject(0);
                Log.e("item", tgt.getString("tgt"));
                res = tgt.getString("tgt");
                buf.close();
            }
        } catch (Exception e) {}
        return res;
    }
}
组件id
Butttonsubmit
EditTextcontent
    /** 线程策略 */
    public void waitForRes() {
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().penaltyLog().build());
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().penaltyLog().build());
    }
    /**
     *  翻译界面操作:
     *  submitContent()监听翻译按键submit 及 输入框内容content
     */
    public void translation() {
        submit = findViewById(R.id.submit);
        content = findViewById(R.id.content);
        waitForRes();
        submit.setOnClickListener(new SubmitContent());
    }
    /**
     *  翻译按键事件:
     *  1. 从Translator类中tran方法获取res
     *  2. 弹出结果对话框
     */
    class SubmitContent implements View.OnClickListener {
        @Override
        public void onClick(View view) {
            String req = content.getText().toString();
            // 如果无输入内容,返回空
            if (req.length() == 0) {
                Toast.makeText(HelperActivity.this,"请输入内容",Toast.LENGTH_SHORT).show();
                return;
            }
            // 获得翻译结果
            Translator translator = new Translator();
            String res = translator.tran(req);
            // 弹出翻译结果对话框
            AlertDialog.Builder dialog = new AlertDialog.Builder(HelperActivity.this);
            dialog.setTitle(req + "翻译结果");
            dialog.setMessage(res);
            dialog.setNegativeButton("确定", new OkClick());
            dialog.setPositiveButton("收藏", new CollectClick(req, res));
            dialog.create();
            dialog.show();
        }
    }
    /**
     *  翻译结果确认键事件:
     *  关闭对话框
     */
    class OkClick implements DialogInterface.OnClickListener {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            dialogInterface.cancel();
        }
    }
    /**
     *  翻译结果收藏键事件:
     *  1. 写入words文件
     *  2. 关闭对话框
     *  3. 显示收藏成功提示
     */
    class CollectClick implements DialogInterface.OnClickListener {
        String txt1, txt2;
        // 收藏内容
        public CollectClick(String req, String res) {
            txt1 = req;
            txt2 = res;
        }
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            // 写入words.txt文件
            if (!"NULL".equals(txt2)) {
                wordsCollector("words.txt", txt1+"&&&"+txt2+"---");
            }
            dialogInterface.cancel();
            // 返回收藏成功的提示
            Toast.makeText(HelperActivity.this,
                    txt1 + "&" + txt2 + " 收藏成功",
                    Toast.LENGTH_SHORT).show();
        }
    }
  1. 单词列表
组件id
ListViewwordsList
SwitchclearSwitch
	String[] words;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_collection);

        wordsList = findViewById(R.id.wordsList);
        words = readFile(fn.wordsFileName).split("---");
        wordsList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, words));
        wordsList.setOnItemClickListener(new WordsChoice());

        collectionActivity = findViewById(R.id.collectionActivity);
        collectionActivity.setOnTouchListener(new OnTouch());

        clearSwitch = findViewById(R.id.clearSwitch);
        clearSwitch.setOnCheckedChangeListener(new ClearAllWords());
    }
    /** 读取文件 */
    public String readFile(String fileName) {
        String res = "";
        try {
            FileInputStream fis = openFileInput(fileName);
            InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
            char[] in = new char[fis.available()];
            isr.read(in);
            isr.close();
            fis.close();
            res = new String(in);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return res;
    }
    /** 覆盖写入文件 */
    public void overwriteFile(String fileName, String content) {
        try {
            FileOutputStream fos = openFileOutput(fileName, Context.MODE_PRIVATE);
            OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");

            osw.write(content);
            //flush是为了输出缓冲区中所有的内容
            osw.flush();
            fos.flush();
            //写入完成后,将两个输出关闭
            osw.close();
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /** 单词点击打开预览界面 */
    class WordsChoice implements AdapterView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Intent intent = new Intent(CollectionActivity.this, WordsViewActivity.class);
            bundle.putString("index",String.valueOf(i));
            bundle.putStringArray("wordsList",words);
            intent.putExtras(bundle);
            startActivity(intent);
        }
    }
    /**
     *  清除所有收藏
     * */
    class ClearAllWords implements CompoundButton.OnCheckedChangeListener {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
            if (!compoundButton.isPressed()) {
                return;
            }
            if (b) {
                overwriteFile(fn.wordsFileName, "");
                Toast.makeText(CollectionActivity.this,
                        "清除成功", Toast.LENGTH_SHORT).show();
                startActivity(new Intent(CollectionActivity.this, HelperActivity.class));
            }
        }
    }
  1. 单词卡
组件id
TestViewwordIndex
TestViewwordView
ConstraintLayoutwordsViewActivity
  • 翻页音效可在res目录下自创raw目录添加音频
    ConstraintLayout wordsViewActivity;
    // 触摸事件坐标,阈值
    int oldY, newY, oldX, newX, thresholdX = 400, thresholdY = 700;
    // 单词指针
    int index;
    // 单词指针,单词
    TextView wordIndex, wordView;
    // 单词列表
    String[] wordsList;
    // 实例化 MediaPlayer
    MediaPlayer player;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_words_view);
        Toast.makeText(WordsViewActivity.this,
                "左划下一个单词\n右划上一个单词\n上划退出", Toast.LENGTH_LONG).show();

        player = new MediaPlayer();
        player = MediaPlayer.create(WordsViewActivity.this, R.raw.turnpage);
        wordsViewActivity = findViewById(R.id.wordsViewAtivity);
        wordsViewActivity.setOnTouchListener(new OnTouch());
        Bundle getMusicInfo = this.getIntent().getExtras();
        index = Integer.parseInt(getMusicInfo.getString("index"));
        wordsList = getMusicInfo.getStringArray("wordsList");
        wordIndex = findViewById(R.id.wordIndex);
        wordView = findViewById(R.id.wordView);
        setWordView();
    }
    /** 显示单词 */
    public void setWordView() {
        turnPage();
        wordIndex.setText(String.valueOf(index+1)+
                " / "+String.valueOf(wordsList.length-1));
        String str = wordsList[index];
        wordView.setText(str.substring(0,str.indexOf("&&&"))+
                "\n\n"+str.substring(str.indexOf("&&&")+3));
    }
    /** 下一个单词 */
    public void nextWord() {
        index = (index + 1) % (wordsList.length - 1);
        setWordView();
    }
    /** 上一个单词 */
    public void prevWord() {
        index = (index - 2 + wordsList.length) % (wordsList.length - 1);
        setWordView();
    }
    /** 翻页音效 */
    public void turnPage() {
        try {
            player.start();
        } catch (Exception e) {}
    }

    class OnTouch implements View.OnTouchListener {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                oldY = (int) motionEvent.getY();
                oldX = (int) motionEvent.getX();
                return true;
            }
            if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                newY = (int) motionEvent.getY();
                newX = (int) motionEvent.getX();
                // 上划退出
                if (oldY - newY > thresholdY) {
                    startActivity(new Intent(WordsViewActivity.this, CollectionActivity.class));
                    return true;
                }
                // 切换下一个单词
                if (oldX - newX > thresholdX) {
                    nextWord();
                    return true;
                }
                // 切换上一个单词
                if (newX - oldX > thresholdX) {
                    prevWord();
                    return true;
                }
                return true;
            }
            return false;
        }
    }
  1. 云词库效果
  • 使用框架,让用户可上传单词本中数据至服务器处理后,录入数据库
    上传云词库
    数据库
  • 后台代码
<?php
include("conn.php");

$json = file_get_contents("php://input");
$jsonData = json_decode($json, true);

$user = $jsonData['user'];
$words = explode('---', $jsonData['words']);

foreach ($words as $word) {
	$tmp = explode('&&&', $word);
	// 以首字母判断中英文
	$test = ord(substr($word, 0, 1))."<br>";
	if (65 <= $test && $test <= 90 || 97 <= $test && $test <= 122) {
		$en = $tmp[0];
		$cn = $tmp[1];
	} else {
		$cn = $tmp[0];
		$en = $tmp[1];
	}
	$sql = 'insert into '.$user.' values("'.$cn.'","'.$en.'")';
	@mysqli_query($link, $sql);	
}
mysqli_close($link);
echo '{"res":"'.$user.'","target":"'.$words[0].'"}';
?>
  • Android端呈现
    云词库单词

四、不足

不能对单词本进行删改操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值