2009年10月25日

[程式]C#.NET Chinese Word Translate 繁簡中文轉換

最近剛好遇到有人需要做大量的繁簡轉換,於是就找了一些資料
弄了一個 C#.NET 的繁簡轉換程式,方便大量批次作業使用的
我還沒學會應該要怎樣貼出漂亮的程式碼,還請多包涵 ...

基本的功能是採用 MS-Office WORD 開放的功能來做轉換
所以不管是開發的機器,還是安裝好要執行的機器上
都必須要有安裝 MS-Office WORD 才能執行

不囉唆,首先,要先加入 Word 的參考,
這邊是使用 Word 2003 的版本,所以是要找
Microsoft.Office.Interop.Word 的 11.0 版本

加入後,先新增一個類別(Class)用來翻譯,名稱就叫做 WordTranslateClass 吧
在類別中先加入下列內部變數:
    private _Application m_objWord = null; // Word App
    private Document m_objDocument = null; // Word Doc
另外,準備一些承接用變數:
    private object m_t = Missing.Value;
    private object m_nt = Missing.Value;
    private object m_dt = Missing.Value;
    private object m_v = true;
    private object m_sc = 0;
    private object m_of = Missing.Value;
    private object m_rd = Missing.Value;
接下來,先產生一個初始化物件的函式,就叫做 Initial() 好了
    // 產生新的 Word 物件
    m_objWord = new Microsoft.Office.Interop.Word.Application();
    // 使用 Word 物件 -> 開啟新文件
    m_objDocument = m_objWord.Documents.Add(ref m_t, ref m_nt, ref m_dt, ref m_v);
有了初始化,當然也要有釋放資源用的函式,就叫做 Release() 吧
    // 關閉 Word 物件
    if (m_objWord != null)
    {
        m_objWord.Quit(ref m_sc, ref m_of, ref m_rd);
    }
    // 釋放文件
    if (m_objDocument != null)
    {
        m_objDocument = null;
    }
    // 釋放 Word 物件
    m_objWord = null;
這樣,只要在程式的開始與結束加入 Initail() 與 Release() 就能正常使用了
接下來,要準備來源字串與目標字串:
    private string m_strSource;
    private string m_strResult;
當然,設定與取得字串的 SetWord() 以及 GetWord() 也要加上
這邊應該就不用貼程式碼了吧?XD 自己試著加看看 ~
(Hint : Set to Source String, and Get from Target String)

都準備好了以後,就是最核心的轉換工作了
轉換時,必須要依序傳入三個變數 - WdTCSCConverterDirection, bool, bool
第一個是決定繁轉簡還是簡轉繁
第二個是決定是否使用完整轉換通用運算式,如果不是則會逐字轉換
最後一個則是只有將簡體中文轉譯成繁體中文時,才可以使用

依照上述規則,可以產生底下的轉換函式 TransWords()
// 繁體轉簡體
public void TransWords(WdTCSCConverterDirection theType, bool theCommonTerms, bool theUseVariants)
{
    if (m_objWord == null)
    {
        Console.WriteLine("m_objWord == null");
        return;
    }

    if (m_objDocument == null)
    {
        Console.WriteLine("m_objDocument == null");
        return;
    }

    // 將輸入字串複製進去文件
    m_objWord.Selection.TypeText(m_strSource);

    // 將文件中的字串轉換
    m_objWord.Selection.Range.TCSCConverter(theType, theCommonTerms, theUseVariants);

    // 選擇目前文件
    m_objWord.ActiveDocument.Select();

    // 將轉換好的字串複製出來
    m_strResult = m_objWord.Selection.Text;

    // 清除文件內文
    m_objWord.Selection.Text = "";
}
怎樣,很簡單吧 XD

回到原本要工作用的 Form 內,先加上內部變數,並且 new 出來
就叫做 WTC 吧 XD
    WordTranslateClass WTC = new WordTranslateClass();
然後在 Form_Load 的事件中加上 Initial()
為了避免意外發生,使用了 try ... catch 保障一下 :P
    try
    {
        WTC.Initial();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
這樣物件就可以正常使用了,噢,當然別忘了 Release()
建議放在 Form 的 Closing 事件中
    WTC.Release();
如果忘記釋放掉,會一直在記憶體中殘留 Word 的執行緒
佔用的記憶體就不會自動釋放,一定要小心喔!!

現在,要做繁簡轉換,只要依照下列三步驟就可以了:
    WTC.SetWords( "你想要翻譯的字串" );
    WTC.TransWords(WdTCSCConverterDirection.wdTCSCConverterDirectionTCSC, true, true);
    string 翻譯好的字串 = WTC.GetWords();
你可以嘗試放在某按鈕上,或是放到迴圈中測試也行
如果有需要,也可以與 ADO.NET 的物件作互動
大量批次的翻譯某 A 欄位的內容到 B 欄位這樣
假使真的太大量的批次,更可以配合多執行緒的方式
或是 BackgroundWorker 之類的方式製作背景作業
這方面的技巧就不在這多說了,不然會講不完(笑)

啊,如果到這邊還是有無法編譯過的問題,或許是因為忘了加入某些 namespace
檢查看看是否都有 using 以下的 namespace :
// add using namespace
using Microsoft.Office.Interop.Word;
using System.Reflection;
都加上了,裡論上應該就能順利執行了 ^_^

就醬 ノシ

沒有留言: