码迷,mamicode.com
首页 > 其他好文 > 详细

翻译软件开发(do it yourself)

时间:2015-10-28 12:54:01      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:

    技术分享

想要做一个翻译软件的话,本文只是一个入门参考,这里面只给出一个简单的功能,即把一个纯英文的文件 翻译成相应的中文文件,并另外保存成一个新的文件。

作者不想花费时间去写华丽的界面,只是简单地弹出一些输入框,有兴趣的朋友可以自己去美化或完善一下该软件。

编程语言可以是Python,Delphi,这里以Java语言为基础开发,全是Java代码。如下:

package cn.ling.TestTranslate;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;

/**
 * 
 * 模拟文本翻译软件
 * 注意:操作的源文件必须只由英文单词构成,否则会得到意想不到的结果 
 * @author lingyibin
 *
 */
public class TestTranslate {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		translate();
	}
	
	/**
	 * 翻译的主要实现函数
	 */
	public static void translate(){
		//得到源文件路径
		String srcFileName = "";
		srcFileName = javax.swing.JOptionPane.showInputDialog("请您 输入源文件路径!");
		
		File srcFile = new File(srcFileName);
		//源文件路径不合法
		if(!srcFile.exists() || !srcFile.isFile()){
			javax.swing.JOptionPane.showMessageDialog(null, "对不起,你输入的源文件路径不合法!");
		}
		
		//翻译后的文件名,首先得到新文件名,即在原文件名的后面加上"_translated",保留后缀名
		int index = srcFileName.lastIndexOf(".");
		String newFileName = srcFileName.substring(0,index) + "_translated" + srcFileName.substring(index);
		
		//得到词库文件路径
		String cikuFileName = "";
		cikuFileName = javax.swing.JOptionPane.showInputDialog("请您 输入词库文件路径!");
		
		File cikuFile = new File(cikuFileName);
		//词库文件路径不合法
		if(!cikuFile.exists() || !cikuFile.isFile()){
			javax.swing.JOptionPane.showMessageDialog(null, "对不起,你输入的词库文件路径不合法!");
		}
		
		try {
			String tmpStr = null;
			String[] strs;
			
			//新建一个缓冲流来读取词库文件
			BufferedReader br = new BufferedReader(
					new InputStreamReader(
							new FileInputStream(cikuFile)));
			
			//用一个MAP来存放键值对
			Map<String, String> mapTrn = new HashMap<String, String>();
			
			while((tmpStr = br.readLine()) != null){	//如果未到末尾 且 读到的不是空行
				if(!tmpStr.equals("")){					
					strs = tmpStr.split("="); 
					mapTrn.put(strs[0].toLowerCase(), strs[1]); 
				}
			}
			
			//新建一个字节流来读取源文件
			FileInputStream fis = new FileInputStream(srcFile);

			//新建一个Writer来写入翻译后的字符
			OutputStreamWriter osw = new OutputStreamWriter(
					new FileOutputStream(newFileName));
			
			int c;
			tmpStr = "";
			while((c = fis.read()) != -1){
				if(!((c>=‘a‘ && c<=‘z‘) || (c>=‘A‘ && c<=‘Z‘))){
					if(mapTrn.get(tmpStr.toLowerCase()) != null){
						osw.write(mapTrn.get(tmpStr.toLowerCase()).toCharArray());
						tmpStr = "";
					}
					if(c != 32) osw.write(c);
				}
				else{
					tmpStr += (char)c;
				}
			}
			if(mapTrn.get(tmpStr.toLowerCase()) != null){
				osw.write(mapTrn.get(tmpStr.toLowerCase()).toCharArray());
				tmpStr = "";
			}
			
			osw.flush();
			osw.close();
		} catch (Exception e) {
			//e.printStackTrace();
			javax.swing.JOptionPane.showMessageDialog(null, "对不起,源文件读取时出错!");
		}
		
	}
}

?

?然后得自己建一个词库,格式如下:

Love=爱
I=我
China=中国

?

可以运行一下程序。

也可以使用Java jui实现简单的翻译功能。

主要用到的技巧包括界面嵌套布局(包括BorderLayout, FlowLayout, GridLayout),匿名类,以及java.util.Map<K,V>泛型类的使用。share it !

代码:

[java]  view plain copy
  1. import javax.swing.*;  
  2. import java.util.HashMap;  
  3. import java.util.Map;  
  4. import java.awt.BorderLayout;  
  5. import java.awt.Container;  
  6. import java.awt.GridLayout;  
  7. import java.awt.event.ActionEvent;  
  8. import java.awt.event.ActionListener;  
  9.   
  10. public class TranslateDemo {  
  11.     public static void main( String[] args ) {  
  12.         new MyWin( "Translator" );  
  13.     }  
  14. }  
  15.   
  16. class MyWin extends JFrame {  
  17.   
  18.     private static final long serialVersionUID = 4965728863455140660L;  
  19.       
  20.     private JTextField txtEn = new JTextField( 30 );  
  21.     private JTextField txtCN = new JTextField( 30 );  
  22.       
  23.     private JLabel lblInfo = new JLabel( "Translation Demo", JLabel.CENTER );  
  24.       
  25.     private JLabel lblEn = new JLabel( "English", JLabel.LEFT );  
  26.     private JLabel lblCN = new JLabel( "Chinese", JLabel.LEFT );      
  27.       
  28.     private JButton btnTrans = new JButton( "Translate" );  
  29.       
  30.     private Map<String, String> dict = new HashMap<String, String>();  
  31.           
  32.     MyWin( String title ) {  
  33.         super( title );  
  34.         Container cp = getContentPane();  
  35.         cp.add( lblInfo, BorderLayout.NORTH );  
  36.           
  37.         JPanel enPanel = new JPanel();  
  38.         enPanel.add( lblEn );  
  39.         enPanel.add( txtEn );  
  40.           
  41.         JPanel lblPanel = new JPanel( new GridLayout( 21 ) );  
  42.         lblPanel.add( lblEn );  
  43.         lblPanel.add( lblCN );  
  44.           
  45.         txtEn.setAutoscrolls( true );  
  46.         txtCN.setAutoscrolls( true );  
  47.           
  48.         JPanel txtPanel = new JPanel( new GridLayout( 21 ) );  
  49.         txtPanel.add( txtEn );  
  50.         txtPanel.add( txtCN );  
  51.           
  52.         txtEn.requestFocus();  
  53.                   
  54.         JPanel panel = new JPanel( new BorderLayout() );  
  55.         panel.add( lblPanel, BorderLayout.WEST );  
  56.         panel.add( txtPanel, BorderLayout.CENTER );  
  57.           
  58.         cp.add( panel, BorderLayout.CENTER );  
  59.           
  60.         JPanel btnPane = new JPanel();  
  61.         btnPane.add( btnTrans );  
  62.           
  63.         cp.add( btnPane, BorderLayout.SOUTH );  
  64.           
  65.         dict.put( "Hello, Java!""你好,JAVA!");  
  66.         dict.put( "good morning""早上好" );  
  67.           
  68.         btnTrans.addActionListener( new ActionListener() {  
  69.             @Override  
  70.             public void actionPerformed(ActionEvent e) {  
  71.                 txtCN.setText( dict.get( txtEn.getText() ) );  
  72.             }  
  73.         });  
  74.           
  75.         setSize( 200100 );  
  76.         setLocation( 450200 );  
  77.         setVisible( true );  
  78.         setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );  
  79.         pack();  
  80.     }  
  81. }  

软件效果图:技术分享

要实现更复杂的翻译功能,需耗时

翻译软件开发(do it yourself)

标签:

原文地址:http://my.oschina.net/bigfool007139/blog/523009

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!