Subscribe RSS Join our Facebook Group Follow us on Twitter!
in Search

Samsu's passion (.NET)

Blog mengenai kegiatan sebagai MSP, MIC, dan juga penyuka teknologi Microsoft

June 2010 - Posts

  • Translator Add-Ins pada Office Word 2010

    Menerjemahkan suatu tulisan dari satu bahasa ke bahasa yang lain bukan lagi hal yang sulit masa kini. Seseorang tinggal membuka http://www.microsofttranslator.com/ atau http://translate.google.com/ kita sudah dapat memperoleh terjemahan dari teks yang tidak kita mengerti. Bahkan saat ini sudah banyak ekstension atau add-ins pada web browser kita untuk keperluan penerjemahan bahasa. Namun, kali ini kita akan mencoba membuat add-ins untuk penterjemah bukan untuk web browser melainkan untuk Microsoft Office Word. Dan agar tidak ketinggalan, kita akan menggunakan Office 2010 yang masih belum lama ini dirilis versi finalnya. Kita akan mengkonsumsi web service dari Bing dan juga memanfaatkan Google Translator API.

    Pada kesempatan ini, kita akan mencoba membuat add-ins ini dengan VSTO (Visual Studio Tools for Office) dengan bahasa pemrograman C# dan IDE Visual Studio 2010.

    Langkah pertama tentu membuat proyek baru :

    1

    selanjutnya menambahkan sebuah user control, karena kita ingin add-ins kita ditampillkan sebagai task pane di Microsoft Office Word.

    2

    3

    selanjutnya membuat rancangan user interface dari add-ins kita :

    4.1

    image 

    Nah, setelah kita selesai membuat rancangan UI, saatnya memulai coding! Tetapi sebelumnya, mari kita menambahkan reference dulu :

    1. Service Reference untuk Bing Web Service

    Web service yang disediakan ada di : http://api.microsofttranslator.com/V1/SOAP.svc dan untuk menggunakannya kita membutuhkan appID yang kita dapatkan di http://www.bing.com/developers/appids.aspx.

    4  5

    2. Reference ke Google Translator API

    Google Translator API dapat didownload dari http://google-api-for-dotnet.googlecode.com/files/GoogleTranslateAPI_0.1.1.zip atau dari source code yang dilampirkan pada post ini.

    6

    It’s coding time…!

    Buka file ThisAddIn.cs dan ubah isinya menjadi seperti berikut:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml.Linq;
    using Word = Microsoft.Office.Interop.Word;
    using Office = Microsoft.Office.Core;
    using Microsoft.Office.Tools.Word;
     
    namespace translatorAddIns
    {
        public partial class ThisAddIn
        {
            PanelTranslator panelTranslator;
            private void ThisAddIn_Startup(object sender, System.EventArgs e)
            {
                panelTranslator = new PanelTranslator();
                CustomTaskPanes.Add(panelTranslator,"Bing Translator");
                CustomTaskPanes[0].Visible = true;
            }
     
            private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
            {
            }
     
            #region VSTO generated code
     
            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InternalStartup()
            {
                this.Startup += new System.EventHandler(ThisAddIn_Startup);
                this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
            }
            
            #endregion
        }
    }

    bagian yang ditambahkan hanya pada event startup.

    Selanjutnya buka file PanelTranslator.cs dan ubah isinya menjadi seperti berikut :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    using Google.API;
     
    namespace translatorAddIns
    {
        public partial class PanelTranslator : UserControl
        {
            string appID = "5491084F42C447543403B9FCC7C379A25F8612D4";
            
            List<string> srcTypeBing, destTypeBing;
            List<string> srcTypeBingName, destTypeBingName;
            List<string> srcTypeGoogle, destTypeGoogle;
            TranslatorService.LanguageServiceClient translatorServ;
     
            public PanelTranslator()
            {
                InitializeComponent();
             }
     
            /// <summary>
            /// menyiapkan pilihan bahasa yang disediakan oleh Bing maupun Google dan menyimpannya dalam memori
            /// sehingga tidak perlu merequest pilihan bahasa setiap kali pengguna berpindah layanan penerjemah
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void panelTranslator_Load(object sender, EventArgs e)
            {
                translatorServ = new TranslatorService.LanguageServiceClient();
                srcTypeGoogle = Google.API.Translate.LanguageUtility.LanguageCollection.Select(a => a.ToString()).ToList();
                destTypeGoogle = Google.API.Translate.LanguageUtility.LanguageCollection.Select(a => a.ToString()).ToList();
                
                srcTypeBing = translatorServ.GetLanguages(appID).ToList();
                destTypeBing = translatorServ.GetLanguages(appID).ToList();
     
                srcTypeBingName = translatorServ.GetLanguageNames(appID, "en").ToList();
                destTypeBingName = translatorServ.GetLanguageNames(appID, "en").ToList();
                updateBing();
            }
     
            /// <summary>
            /// menterjemahkan teks pada dokumen yang sedang aktif
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void buttonTerjemahkan_Click(object sender, EventArgs e)
            {
                String teks,src,dest;
                //cara mendapatkan teks yang ada pada dokumen aktif
                teks = Globals.ThisAddIn.Application.ActiveDocument.Content.Text;
     
                //menggunakan try-catch agar jika terjadi error aplikasi tidak langsung not responding
                try
                {
                    if (rbBing.Checked)         //pengguna memilih Bing
                    {
                        src = srcTypeBing[cbSrcLang.SelectedIndex];
                        dest = destTypeBing[cbDestLang.SelectedIndex];
                        txtDest.Text = translatorServ.Translate(appID, teks, src, dest);
                    }
                    else if (rbGoogle.Checked)  //pengguna memilih Google
                    {
                        src = srcTypeGoogle[cbSrcLang.SelectedIndex];
                        dest = destTypeGoogle[cbDestLang.SelectedIndex];
                        txtDest.Text = Google.API.Translate.Translator.Translate(teks, GetLang(src), GetLang(dest));
                    }
                }
                catch (Exception ex) 
                {
                    MessageBox.Show("Oops.. Sorry, " + ex.Message);
                }
            }
     
            /// <summary>
            /// mendeteksi bahasa dari teks yang ingin diterjemahkan
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void buttonDeteksi_Click(object sender, EventArgs e)
            {
                String teks = Globals.ThisAddIn.Application.ActiveDocument.Content.Text;
                if (rbBing.Checked) MessageBox.Show(translatorServ.Detect(appID, teks));
                else if (rbGoogle.Checked) 
                {
                    bool reliable;
                    double confidence;
                    MessageBox.Show(Google.API.Translate.Translator.Detect(teks,out reliable,out confidence).ToString());
                }
            }
     
            /// <summary>
            /// pengguna melakukan perubahan pilihan layanan penerjemah
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void rbBing_CheckedChanged(object sender, EventArgs e)
            {
                if (rbBing.Checked) updateBing();
                else if (rbGoogle.Checked) updateGoogle();
            }
     
            private void rbGoogle_CheckedChanged(object sender, EventArgs e)
            {
                if (rbBing.Checked) updateBing();
                else if (rbGoogle.Checked) updateGoogle();
            }
     
            /// <summary>
            /// mengisikan pilihan bahasa yang didukung Bing
            /// </summary>
            void updateBing()
            {
                cbSrcLang.Items.Clear();
                cbSrcLang.Items.AddRange(srcTypeBingName.ToArray());
                cbSrcLang.SelectedIndex = 0;
                cbDestLang.Items.Clear();
                cbDestLang.Items.AddRange(destTypeBingName.ToArray());
                cbDestLang.SelectedIndex = 0;
            }
     
            /// <summary>
            /// mengisikan pilihan bahasa yang didukung Google
            /// </summary>
            void updateGoogle()
            {
                cbSrcLang.Items.Clear();
                cbSrcLang.Items.AddRange(srcTypeGoogle.ToArray());
                cbSrcLang.SelectedIndex = 0;
                cbDestLang.Items.Clear();
                cbDestLang.Items.AddRange(destTypeGoogle.ToArray());
                cbDestLang.SelectedIndex = 0;
            }
     
            /// <summary>
            /// mendapatkan objek Language dari language yang sedang aktif, hanya dipakai untuk translate dengan Google
            /// </summary>
            /// <param name="lang"></param>
            /// <returns></returns>
            public static Language GetLang(string lang)
            {
                foreach (Language lgg in Google.API.Translate.LanguageUtility.TranslatableCollection)
                {
                    if (lgg.ToString().Equals(lang)) return lgg;
                }
                return Language.English;
            }
        }
    }

    Beberapa potong kode VSTO yang ingin saya garis bawahi :

    1. Kode untuk menambahkan task pane (user control kita) saat program dirun

       1: PanelTranslator panelTranslator;
       2: private void ThisAddIn_Startup(object sender, System.EventArgs e)
       3: {
       4:     panelTranslator = new PanelTranslator();
       5:     CustomTaskPanes.Add(panelTranslator,"Bing Translator");
       6:     CustomTaskPanes[0].Visible = true;
       7: }

    2. Kode untuk mengambil teks (saja) yang ada di dokument aktif (gambar, formatting, tabel, dsb selain teks tidak ikut terambil)

       1: String teks = Globals.ThisAddIn.Application.ActiveDocument.Content.Text;

    Untuk mengambil teks dalam kondisi terformat dapat menggunakan

       1: String teks = Globals.ThisAddIn.Application.ActiveDocument.Content.FormattedText;

    namun, yang didapatkan adalah data bertipe Range yang perlu diproses lagi sendiri (tidak bisa langsung toString() hehehe)

    Word juga menyediakan fungsi Globals.ThisAddIn.Application.ActiveDocument.Content. get_XML() untuk mendapatkan XML dari dokumen yang sedang aktif tersebut. Nah, jika anda cukup cerdik untuk memanipulasi XML tersebut banyak hal yang dapat anda lakukan. Misalnya, membuat isi dokumen dan formatnya bahkan gambar dan segala atributnya dienkripsi!

    Oiya, jikalau ada pembaca yang ingin menambahkan add-in berupa ribbon dapat menambahkan new file:

    image

    image

    Terdapat 2 pilihan yaitu visual designer atau xml. Saya cenderung memilih visual designer karena untuk mengedit tampilan ribbon langsung dengan xml tampaknya akan cukup merepotkan. hehehe…

    Voiiila… selesai! Selanjutnya tinggal kita coba programnya! Tekan F5 atau Run dari IDE Visual Studiomu dan Microsoft Word akan dijalankan dengan Add-Ins yang telah kita buat :

    7

    Tampilan saat kita mencoba mendeteksi bahasa dari teks.

    8 9

    Nah, ini masih versi betanya beta dari addins ini (harap maklum jika pembaca menemukan kekurangan-kekurangan di dalamnya, saya pun masih perlu banyak belajar). Untuk memudahkan pembaca mengerti cara kerjanya maka saya tidak ditambahkan fitur-fitur yang terlalu rumit dan juga penanganan error masih minimalis. Namun diharapkan dengan membaca post ini pengguna dapat mengerti :

    1. cara membuat add-ins untuk microsoft office dengan VSTO
    2. cara menggunakan Bing web service
    3. cara menggunakan Google API

    Banyak sekali yang dapat kita buat dengan VSTO, tidak hanya di Word, namun juga di Excel, Outlook, dan keluarga Office lainnya.

    Oyah, kalau ada pembaca yang tertarik untuk mempelajari source codenya, saya upload juga bersama post ini. Saya buatkan juga setupnya, jadi bagi yang ingin mencoba add-innya langsung tanpa harus membuka visual studio silakan langsung jalankan ..\translatorAddIns\translatorAddIns\setup.exe.

     

    2,325 Views, 0 Comment(s), Published on: 06-24-2010 1:24 by samsu.sempena to Samsu's passion (.NET)
    | More
    Filed under: ,