`
longgangbai
  • 浏览: 7340535 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一个简单的中英文翻译词典学习(类似灵格斯)二

阅读更多

  在中英字典翻译的首界面简单:

一个简单的输入框一个查询按钮,实现功能如下用户输入一个字词,首先在 本地缓存(Map )中查询是否存在相关的的字词的信息。如果不存在,通过Httpclient请求一个远程连接,解析相关的结果。

在代码中重点注意的是进度条和使用:

  //创建一个进度条的信息
  pdialog = ProgressDialog.show(DetailActivity.this, "请稍等...", "正在请求数据...", true);
  //创建一个每一个单词的线程
  new Thread(){
   public void run() {
    //获取单词的相关的信息
    final DetailItem detailItem = getDetailItems(word);
    //使用手机开发中UI线程 用于更新界面的信息
    runOnUiThread(new Runnable() {
     @Override
     public void run() {
      
      wordTextView.setText(detailItem.getWord());
      
      if (detailItem.getYinbiao() != null){
       yinbiaoTextView.setText(Html.fromHtml("<span>[" + detailItem.getYinbiao() + "]</span><br>"));
      }
      if (detailItem.getDescription() != null){
       descTextView.setText(detailItem.getDescription() + "\n");
      }
      if (!detailItem.getSampleItems().isEmpty()){
       StringBuilder sb = new StringBuilder();
       int i=1;
       for(SampleItem item : detailItem.getSampleItems()){
        sb.append(i + ". " + item.getOrig() + "\n");
        sb.append("   " +  item.getTrans() + "\n\n");
        i++;
       }
       sampleTextView.setText(sb.toString());
      }
      
      if (detailItem.getAudioUrl() == null || detailItem.getAudioUrl().trim().length() == 0){
       speImageButton.setEnabled(false);
      }
      currentItem = detailItem;
     }
    });
    //进度条消失的进度条
    pdialog.dismiss();
   };
  }.start();

 

Andriod中xml的解析:

 /**
  * 获取解析Document文档
  * 使用Dom解析xml信息
  * @param result
  * @return
  * @throws SAXException
  * @throws IOException
  * @throws ParserConfigurationException
  */
 public Document getDocument(String result) throws SAXException, IOException, ParserConfigurationException{
  DocumentBuilderFactory docbuilderFactory = DocumentBuilderFactory.newInstance();
  DocumentBuilder documentBuilder = docbuilderFactory.newDocumentBuilder();
  Document doc = documentBuilder.parse(new InputSource(new StringReader(result)));
   return doc;
 }

 

远程访问:

	/**
	 * 获取查询单词相关的单词信息
	 * @param word
	 * @return
	 */
	private DetailItem getDetailItems(String word){
		//从缓存中查询如果查不到,发送请求服务
		DetailItem cacheData = cache.get(word);
		if (cacheData != null){
			return cacheData;
		}
		DetailItem rt = new DetailItem();
		rt.setWord(word);
		try {
			//构建请求路径的信息
			String urlString = "http://api.dict.cn/ws.php?utf8=true&q=" + URLEncoder.encode(word, "UTF-8");
			Map<String,String> paramsMap=getParamsMap();
			String result=HTTPClient.executeHttpClientByApache(urlString, paramsMap); 
			if (result!=null&&result.length()>0){
		        //解析xml的信息
		        parseDocument(rt, result);		        			        
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		if (cache.size()>100){
			cache.remove(cache.keySet().iterator().next());
		}
		cache.put(word, rt);
		return rt;
	}

 

 

源代码如下:

package com.easyway.android.xdict;

import java.io.IOException;
import java.io.StringReader;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.text.Html;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
/**
 * Android远程请求页面解析
 * @author longgangbai
 * @date 2010-5-28
 * @version 1.0
 * @since JDK6.0
 */
public class DetailActivity extends Activity{
	
	//声明一个进度条在查询显示
	private ProgressDialog pdialog;
	
	private static final String YINBIAO_PATTERN = "<pron>{%}</pron>";
	private static final String DESC_PATTERN = "<def>{%}</def>";
	/**
	 * 定义本地单词的缓存信息 key:String 表示单词  value:DetailItem单词相关()的信息
	 */
	private static Map<String, DetailItem> cache = new HashMap<String, DetailItem>();
	
	private static DetailItem currentItem = null;
	//缓存相关单词录音的路径
	private static Map<String, MediaPlayer> audioCache = new HashMap<String, MediaPlayer>();
	
	private  TextView wordTextView =null;
	private  TextView yinbiaoTextView=null;
	private  TextView descTextView =null;
	private  TextView sampleTextView =null;
	private  Button backButton =null;
	private  ImageButton speImageButton =null;
	
    /**
     * 界面创建调用
     * @param  savedInstanceState 上下文的信息
     */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//设置视图内容
		setContentView(R.layout.detail);
		Intent intent = getIntent();
		final String word = intent.getExtras().getString("word");
		//创建各种组件的方法
        createComponent(word);
        //绑定事件
        bindListener(word);
	}
    /**
     * 添加各种事件
     * @param word
     */	
	public void bindListener(final String word){
        
		/**
		 * 点击播放按钮的事件(如果存在对应的录音的信息直接播放,否则创建)
		 */
		speImageButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//缓存获取录音的信息
				MediaPlayer cache = audioCache.get(currentItem.getWord());
				if ( cache != null){
					cache.start();
					return ;
				}
				MediaPlayer mp = new MediaPlayer();
				try {
					mp.setDataSource(currentItem.getAudioUrl());
				    mp.prepare();
				    mp.start();
		        	if (audioCache.size() > 100){
		        		audioCache.remove(audioCache.keySet().iterator().next());
		        	}				    
				    audioCache.put(currentItem.getWord(), mp);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		/**
		 * 点击返回按钮的事件
		 */
		backButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				finish();
			}
		});
		//创建一个进度条的信息
		pdialog = ProgressDialog.show(DetailActivity.this, "请稍等...", "正在请求数据...", true);
		//创建一个每一个单词的线程
		new Thread(){
			public void run() {
				//获取单词的相关的信息
				final DetailItem detailItem = getDetailItems(word);
				//使用手机开发中UI线程 用于更新界面的信息
				runOnUiThread(new Runnable() {
					@Override
					public void run() {
						
						wordTextView.setText(detailItem.getWord());
						
						if (detailItem.getYinbiao() != null){
							yinbiaoTextView.setText(Html.fromHtml("<span>[" + detailItem.getYinbiao() + "]</span><br>"));
						}
						if (detailItem.getDescription() != null){
							descTextView.setText(detailItem.getDescription() + "\n");
						}
						if (!detailItem.getSampleItems().isEmpty()){
							StringBuilder sb = new StringBuilder();
							int i=1;
							for(SampleItem item : detailItem.getSampleItems()){
								sb.append(i + ". " + item.getOrig() + "\n");
								sb.append("   " +  item.getTrans() + "\n\n");
								i++;
							}
							sampleTextView.setText(sb.toString());
						}
						
						if (detailItem.getAudioUrl() == null || detailItem.getAudioUrl().trim().length() == 0){
							speImageButton.setEnabled(false);
						}
						currentItem = detailItem;
					}
				});
				//进度条消失的进度条
				pdialog.dismiss();
			};
		}.start();
	}
	/**
	 * 创建组件
	 * @param word
	 */
	public void createComponent(String word){
	    wordTextView = (TextView) findViewById(R.id.word_textview);
		wordTextView.setText(word);
		yinbiaoTextView = (TextView) findViewById(R.id.yinbiao_textview);
		descTextView = (TextView) findViewById(R.id.desc_textview);
		sampleTextView = (TextView) findViewById(R.id.sample_textview);
		backButton = (Button) findViewById(R.id.back_button);
		speImageButton = (ImageButton) findViewById(R.id.speak_img_button);
	}
	/**
	 * 获取查询单词相关的单词信息
	 * @param word
	 * @return
	 */
	private DetailItem getDetailItems(String word){
		//从缓存中查询如果查不到,发送请求服务
		DetailItem cacheData = cache.get(word);
		if (cacheData != null){
			return cacheData;
		}
		DetailItem rt = new DetailItem();
		rt.setWord(word);
		try {
			//构建请求路径的信息
			String urlString = "http://api.dict.cn/ws.php?utf8=true&q=" + URLEncoder.encode(word, "UTF-8");
			Map<String,String> paramsMap=getParamsMap();
			String result=HTTPClient.executeHttpClientByApache(urlString, paramsMap); 
			if (result!=null&&result.length()>0){
		        //解析xml的信息
		        parseDocument(rt, result);		        			        
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		if (cache.size()>100){
			cache.remove(cache.keySet().iterator().next());
		}
		cache.put(word, rt);
		return rt;
	}
	/**
	 * 设置查询需要的各种参数
	 * @return
	 */
	public Map<String,String> getParamsMap()
	{
		Map<String,String> paramsMap=new HashMap<String,String>();
		paramsMap.put("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6");
		paramsMap.put("Referer", "http://dict.cn/");
		return paramsMap;
	}
	/**
	 * 获取解析Document文档
	 * 使用Dom解析xml信息
	 * @param result
	 * @return
	 * @throws SAXException
	 * @throws IOException
	 * @throws ParserConfigurationException
	 */
	public Document getDocument(String result) throws SAXException, IOException, ParserConfigurationException{
		DocumentBuilderFactory docbuilderFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder documentBuilder = docbuilderFactory.newDocumentBuilder();
		Document doc = documentBuilder.parse(new InputSource(new StringReader(result)));
		 return doc;
	}
	/**
	 * 相关的xml信息
	 * @param rt
	 * @param result
	 * @throws FactoryConfigurationError
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 * @throws IOException
	 */
	private void parseDocument(DetailItem rt, String result)
			throws FactoryConfigurationError, ParserConfigurationException,
			SAXException, IOException {
		//获取解析Document文档
		Document doc=getDocument(result);
		if(doc==null)
		{
			 return ;
		}
		//获取单词录音的路径 
		NodeList audioNodes = doc.getElementsByTagName("audio");
		if (audioNodes != null && audioNodes.getLength() > 0){
			rt.setAudioUrl(audioNodes.item(0).getChildNodes().item(0).getNodeValue());
		}
		//获取音标的信息
		List<List<String>> list = Squirrel.extract(YINBIAO_PATTERN, result);
		if (!list.isEmpty()){
			rt.setYinbiao(list.get(0).get(0));
		}
		//获取匹配的描述
		List<List<String>> list2 = Squirrel.extract(DESC_PATTERN, result);
		if (!list2.isEmpty()){
			rt.setDescription(list2.get(0).get(0));
		}
		if (list2.get(0).get(0).indexOf("\n")> -1){
			System.out.print(true);
		}
		NodeList sentNodes = doc.getElementsByTagName("sent");
		if (sentNodes != null && sentNodes.getLength() > 0){
			for(int i=0;i<sentNodes.getLength();i++){
				
				Node item = sentNodes.item(i);
				NodeList nodeList = ((Element)item).getElementsByTagName("orig");
				String orig = nodeList.item(0).getChildNodes().item(0).getNodeValue();
				NodeList nodeList1 = ((Element)item).getElementsByTagName("trans");
				String trans = nodeList1.item(0).getChildNodes().item(0).getNodeValue();
				SampleItem si = new SampleItem(orig, trans);
				rt.getSampleItems().add(si);
			}
		}
	}
}

 

 

分享到:
评论

相关推荐

    灵格斯会计词典(2个)ld2格式&txt格式

    这种格式的词典文件可以直接在灵格斯辞典软件中使用,提供全功能的查词、发音、例句演示等功能,适合需要专业级翻译和学习的用户。使用ld2格式的优点在于可以充分利用灵格斯的高级功能,如词汇记忆、智能提示等,...

    灵格斯+牛津词典

    灵格斯+牛津词典 lingoes 和 牛津词典 开发工具

    利用jieba完成对年报可读性分析所需词典(2个灵格斯词典+会计科目+会计术语+连词词典)

    jieba,一个流行的中文分词库,是此类任务的理想工具。本主题主要关注如何利用jieba与特定词典,包括两个灵格斯词典、会计科目词典、会计术语词典以及连词词典,来提升年报分析的准确性与效率。 首先,jieba是...

    灵格斯安装程序+牛津高阶英汉双解词典

    灵格斯词霸 x64 - 简体中文版(.exe) + 牛津高阶英汉双解词典

    经典词典 翻译软件打包(有道,灵格斯..)

    经典词典 翻译软件打包(有道,灵格斯..) 正在使用 很好的

    利用jieba完成对年报可读性分析所需5个词典(预处理后)(2个灵格斯词典、会计科目、会计术语、连词词典)

    jieba是一个广泛使用的中文分词库,它支持自定义词典,因此我们可以将这五个词典整合进jieba,提升分词效果,尤其对于处理年报中复杂的会计语言和专业术语。 总的来说,这些词典为年报可读性分析提供了强大的支持,...

    英语单词翻译_灵格斯词霸2.5.3 绿色便携版.rar

    综上所述,灵格斯词霸2.5.3绿色便携版不仅仅是一款翻译软件,它更是一个全方位的语言学习伴侣。它具备强大的词典资源,丰富多样的功能,以及极为方便的携带性,这些都是现代翻译软件中难得一见的特点。无论是商务...

    灵格斯计算机实用词典

    很好的实用的词典可以进行各种计算语言的翻译描述的行了吧 老大

    简单的中英文词典(java编写)

    总的来说,这个简单的中英文词典项目为初学者提供了一个全面实践Java基础知识的机会,涵盖了从编程基础到数据库交互,再到GUI设计和数据结构等多个重要领域,是提升编程技能的好教材。通过实际操作,学习者不仅能...

    Pyqt5实现英文学习词典

    程序读取源文件路径下的txt格式词典文件,若没有就创建一个。词典文件存储方式为“英文单词 中文单词”,每行仅有一对中英释义。程序会根据用户的选择进入相应的功能模块,并显示相应的操作提示。当添加的单词已存在...

    中英文词典数据库 mdb数据库文件 36672个词汇

    这是网络上搜集整理的一个中英文翻译词典的数据库。一共有36672条中英文词语对照表。可以用来做中英文翻译软件。有这方面需要的。可以下载。

    灵格斯词霸(Lingoes) v2.9.2 官方安装版.zip

    Lingoes 灵格斯词霸 2.9.0 是一个历时一年全新重构的版本,我们从底层开始重写了所有代码,优化的架构,64位代码的支持,令软件运行更快、更稳、更兼容。灵格斯也是唯一支持最新版本的 IE10, Chrome 25、firefox 19...

    lingoes_2.9.2_x64_cn灵格斯词霸 2.9.2 x64 (简体中文版)64位.rar

    综上所述,灵格斯词霸2.9.2 x64 简体中文版是一个功能全面且强大的翻译工具,特别适合需要在64位环境下进行多语种学习和工作的用户。其丰富的词典资源、高效的翻译功能以及便捷的同步服务,为用户提供了高效的语言...

    中英文切换,自定义翻译词典

    本项目涉及的主题是“中英文切换”与“自定义翻译词典”,这是一个典型的本地化(Localization)和文本处理任务,对于创建多语言支持的应用程序至关重要。下面将详细解释这些知识点。 首先,**中英文切换**是为用户...

    lingoes_2.9.2_cn灵格斯词霸 - 简体中文版.rar

    灵格斯词霸是一款强大的翻译和词典软件,专为学习者和专业人士设计。这款2.9.2简体中文版提供了丰富的语言资源和便捷的翻译功能,旨在帮助用户快速理解并掌握各种词汇。在这款软件中,我们可以找到以下几个关键知识...

    基于Java的简单中英文词典查询基于Java的简单中英文词典查询.zip

    它提供了一个简单的中英文词典查询应用程序的基础框架。它展示了如何使用Java编程语言和Swing库来创建图形用户界面,并利用MySQL数据库来存储和查询数据。具体来说,这段代码的开发意义包括:学习如何创建基本的图形...

    知网hownet中英文情感词典

    4. **机器翻译**:在翻译过程中,情感词典能帮助保留原文的情感色彩,提高翻译的准确性和自然度。 5. **文本生成**:在生成有情感色彩的文本时,如故事或评论,情感词典可以指导选择恰当的词汇来表达特定情感。 6....

    中英文词典.zip

    【标题】"中英文词典.zip"所包含的项目是一个实现了中英文互译功能的代码库,这在学习、教学和日常使用中非常实用。它可能是由一系列编程语言(如Python、JavaScript或Java)编写的,旨在帮助用户查找并理解词汇的...

    SAP 中英文词典 英汉对照

    SAP中英文词典,SAP术语英汉对照表 中英文对照参考 ERP英文学习参考

    灵格斯俄汉语言包

    灵格斯俄汉语言包,方便俄语和汉语之间词典互相查找。对俄语专业的人提供便利。

Global site tag (gtag.js) - Google Analytics