/* WTTranslation.java - high-level functions for translation by Wiktionary. * * Copyright (c) 2009 Andrew Krizhanovsky <andrew.krizhanovsky at gmail.com> * Distributed under GNU General Public License. */ package wikokit.base.wikt.api; import wikokit.base.wikt.sql.TTranslation; import wikokit.base.wikt.sql.TPage; import wikokit.base.wikt.sql.TLang; import wikokit.base.wikipedia.language.LanguageType; import wikokit.base.wikipedia.sql.Connect; import wikokit.base.wikipedia.util.StringUtil; import java.util.List; import java.util.ArrayList; /** High-level functions for translation by Wiktionary. * * @see wikt.word.WTranslation * @see wikt.sql.TTranslation */ public class WTTranslation { private final static String[] NULL_STRING_ARRAY = new String[0]; /** Translates the word from the native language to a target language. * Direct translation, i.e. get TranslationBox, get TranslationEntry from it. * Native language is a language of Wiktionary edition, e.g. Russian in Russian Wiktionary. */ public static String [] getDirectTranslation (Connect connect, LanguageType target_lang,String word) { TPage tpage = TPage.get(connect, word); if(null == tpage) return NULL_STRING_ARRAY; TLang source_tlang = TLang.get(connect.getNativeLanguage()); if(null == source_tlang) { System.out.println("Error (WTTranslation.getDirectTranslation()):: What about calling 'TLang.createFastMaps()' and 'TPOS.createFastMaps()' before?"); return NULL_STRING_ARRAY; } if(connect.getNativeLanguage() == target_lang) { System.out.println("Error (WTTranslation.getDirectTranslation()):: How to translate from "+target_lang+" to "+target_lang+"?"); return NULL_STRING_ARRAY; } TPage[] pages = TTranslation.fromPageToTranslations(connect, source_tlang, tpage, TLang.get(target_lang)); if(0 == pages.length) return NULL_STRING_ARRAY; List<String> translations = new ArrayList<String>(pages.length); for(TPage p : pages) { translations.add(p.getPageTitle()); } return((String[])(StringUtil.getUnique(translations)).toArray(NULL_STRING_ARRAY)); } /** Translates the word from a foreign language to the native language. * Backward translation, i.e. get title of page which has a TranslationBox with the given word. * Native language is a language of Wiktionary edition, e.g. Russian in Russian Wiktionary. */ public static String [] getBackwardTranslation (Connect connect, LanguageType foreign_lang,String word) { if(connect.getNativeLanguage() == foreign_lang) { System.out.println("Error (WTTranslation.getBackwardTranslation()):: How to translate from "+foreign_lang+" to "+foreign_lang+"?"); return NULL_STRING_ARRAY; } TPage tpage = TPage.get(connect, word); if(null == tpage) return NULL_STRING_ARRAY; TLang source_tlang = TLang.get(connect.getNativeLanguage()); if(null == source_tlang) { System.out.println("Error (WTTranslation.getBackwardTranslation()):: What about calling 'TLang.createFastMaps()' and 'TPOS.createFastMaps()' before?"); return NULL_STRING_ARRAY; } TPage[] pages = TTranslation.fromTranslationsToPage(connect, source_tlang, tpage, TLang.get(foreign_lang)); if(0 == pages.length) return NULL_STRING_ARRAY; List<String> translations = new ArrayList<String>(pages.length); for(TPage p : pages) { translations.add(p.getPageTitle()); } return((String[])(StringUtil.getUnique(translations)).toArray(NULL_STRING_ARRAY)); } /** Translates the word from a foreign language to the native language. */ private static String [] fromForeignIntoNative (Connect connect, LanguageType foreign_lang,String word) { String[] backward = getBackwardTranslation (connect, foreign_lang, word); String[] meanings = WTMeaning.getDefinitionsByPageLang(connect, word, foreign_lang); return StringUtil.addORCaseSensitive(backward, meanings); } /** Translates the word from the native language to a foreign language. * * @param native_words source words in the native language */ private static String [] fromNativeIntoForeign (Connect connect, LanguageType foreign_lang,String[] native_words) { List<String> trans_list = new ArrayList<String>(); for(String w : native_words) { String[] w_translations = getDirectTranslation (connect, foreign_lang, w); for(String t : w_translations) { if(!trans_list.contains(t)) trans_list.add(t); } } return (String[])trans_list.toArray(NULL_STRING_ARRAY); } /** Translates the word from source to target language. */ public static String [] translate (Connect connect, LanguageType source_lang,LanguageType target_lang,String word) { String [] translation = NULL_STRING_ARRAY; LanguageType native_lang = connect.getNativeLanguage(); // 1. from native language into foreign // only direct translation // 2. from foreign into native // backward translation + meaning's definition // 3. from foreign into another foreign // backward translation + meaning's definition boolean from_native = source_lang == native_lang; boolean into_native = target_lang == native_lang; if(from_native && !into_native) // 1. from native language into foreign translation = getDirectTranslation (connect, target_lang, word); else { if(!from_native && into_native) { // 2. from foreign into native translation = fromForeignIntoNative(connect, source_lang, word); } else { if(!from_native && !into_native) { // 3. from foreign into another foreign // A. from foreign to native //String [] native_words = fromForeignIntoNative(connect, source_lang, word); - bad idea, since definition can contain a lot of non-relevant words. String[] native_words = getBackwardTranslation (connect, source_lang, word); // B. from native to another foreign translation = fromNativeIntoForeign(connect, target_lang, native_words); } } } return translation; } /** Translates the word from source to target language. */ public static String [] translate (Connect connect, String source_lang,String target_lang,String word) { if(!LanguageType.has(source_lang)) { System.out.println("Error (common_wiki WTTranslation.translate(3 strings)):: uknown source language code:"+source_lang); return NULL_STRING_ARRAY; } if(!LanguageType.has(target_lang)) { System.out.println("Error (common_wiki WTTranslation.translate(3 strings)):: uknown target language code:"+target_lang); return NULL_STRING_ARRAY; } return translate(connect, LanguageType.get(source_lang), LanguageType.get(target_lang), word); } }