Í fyrra þegar ég var að vinna PeoManager verkefninu hjá Peocon þá bjó ég til lítið forrit sem notaði BabelFish vefþjónustuna hjá AltaVista til að þýða kerfið. Þetta var meira gert til að leika sér og sjá hvernig þetta virkaði.
Ég var einmitt að útvega mér þetta litla sniðuga forrit og fór þá að prófa að þýða heimasíður barnanna, þ.e. öll orðin sem eru í þýðingarkerfinu eins og Nafn, Netfang, Heimasíða, Skilaboð osfrv. Það hafa komið nokkrar fyrirspurnir til okkar þar sem spurt er hvort hlutar af síðunni geti verið á öðru tungumáli, meirað segja rússnesku :) en margir notendur eiga ættingja erlendis og þeir eiga t.d. í vandræðum þegar síðan biður um lykilorð.
BabelFish er mjög sniðugur fyrir keyword. Byrjum á því að sækja WSDL skránna og búa til kóðan. Slóðin er http://www.xmethods.net/sd/BabelFishService.wsdl
Næst er að búa til console forritið, fyrst með smá útskýringu.
[STAThread]
public static void Main(string[] Args) {
if (Args.Length != 2) {
Console.WriteLine("\n\nUsage: Translator pathToTmxFile language");
Console.WriteLine("Example:");
Console.WriteLine(@" Translator c:\temp\lang.tmx en_fr");
Console.WriteLine("\n\nTranslation translationmode");
Console.WriteLine("----------- ----------------");
Console.WriteLine("English -> French \"en_fr\"");
Console.WriteLine("English -> German \"en_de\"");
Console.WriteLine("English -> Italian \"en_it\"");
Console.WriteLine("English -> Portugese \"en_pt\"");
Console.WriteLine("English -> Spanish \"en_es\"");
} else {
new Translator(Args[0], Args[1]);
}
}
Þetta lýsir því hvaða parametra maður á að senda inn í forritið.
Næst er það kóðin til að þýða. Þeir sem vita ekki hvernig TMX skrá lítur út þá geturðu fundið
það hérna til að skilja eitthvað í kóðanum.
public Translator(string path, string lang) {
XmlDocument doc = new XmlDocument();
doc.Load(path);
XmlNodeList tuList = doc.GetElementsByTagName("tu");
Console.WriteLine("Total keywords:" + tuList.Count);
string englishText = "";
ArrayList keywords = new ArrayList();
for (int i=0;i< tuvList.Count;b++) {
XmlNode tuv = tuvList[b];
if (tuv.Attributes["xml:lang"].Value == "en") {
englishText = tuv.FirstChild.InnerText;
} else if (tuv.Attributes["xml:lang"].Value == lang.Replace("en_", "")) {
langExists = true;
}
}
if (!langExists)
keywords.Add(new String[] {keyword, englishText});
}
BabelFishService bf = new BabelFishService();
for (int i=0;i<30 && i < keywords.Count;i++) {
string[] ble = (string[]) keywords[i];
Console.Write(ble[0] + ": English:" + ble[1]);
string trans = bf.BabelFish(lang, ble[1]);
if (Char.IsUpper(ble[1], 0)) {
trans = trans.Substring(0, 1).ToUpper() + trans.Substring(1, trans.Length-1);
}
Console.WriteLine(" DestLang:" + trans);
for (int b=0;b < tuList.Count;b++) {
XmlNode tu = tuList[b];
if (tu.Attributes["tuid"].Value == ble[0]) {
XmlNode newTuv = doc.CreateElement("tuv");
XmlAttribute attr = doc.CreateAttribute("xml", "lang", "http://www.w3.org/2000/xml/");
attr.Prefix = "xml";
attr.Value = lang.Replace("en_", "");
newTuv.Attributes.Append(attr);
XmlNode newSeg = doc.CreateElement("seg");
newSeg.InnerText = trans.Trim();
newTuv.AppendChild(newSeg);
tu.AppendChild(newTuv);
b++;
}
}
}
doc.Save(path);
}
Ástæðan fyrir því að ég læt kerfið bara þýða 30 orð í einu er að BabelFish segir að maður megi ekki nota þetta of mikið(annars verður þetta lokað) og þegar maður er kannski með 1.000 þýðingar þá er betra að taka því rólega.
Svona leit TMX skráin út fyrir þýðingu
<tu tuid="Message">
<tuv xml:lang="is">
<seg>Skilaboð</seg>
</tuv>
<tuv xml:lang="en">
<seg>Message</seg>
</tuv>
</tu>
<tu tuid="RequestAccess">
<tuv xml:lang="is">
<seg>Óska eftir aðgangi</seg>
</tuv>
<tuv xml:lang="en">
<seg>Request access</seg>
</tuv>
</tu>
<tu tuid="EmailSentToUserWhichDesides">
<tuv xml:lang="is">
<seg>Póstur er sendur til eiganda síðunnar sem ákveður það sjálfur hvort gefa eigi aðgang að síðunni.</seg>
</tuv>
<tuv xml:lang="en">
<seg>Email is sent to the owner of the website which then desides if he grants access.</seg>
</tuv>
</tu>
Eftir þýðingu leit hún svona út
<tu tuid="Message">
<tuv xml:lang="is">
<seg>Skilaboð</seg>
</tuv>
<tuv xml:lang="en">
<seg>Message</seg>
</tuv>
<tuv xml:lang="fr">
<seg>Message</seg>
</tuv>
<tuv xml:lang="de">
<seg>Anzeige</seg>
</tuv>
</tu>
<tu tuid="RequestAccess">
<tuv xml:lang="is">
<seg>Óska eftir aðgangi</seg>
</tuv>
<tuv xml:lang="en">
<seg>Request access</seg>
</tuv>
<tuv xml:lang="fr">
<seg>Accs de demande</seg>
</tuv>
<tuv xml:lang="de">
<seg>Antragzugang</seg>
</tuv>
</tu>
<tu tuid="EmailSentToUserWhichDesides">
<tuv xml:lang="is">
<seg>Póstur er sendur til eiganda síðunnar sem ákveður það sjálfur hvort gefa eigi aðgang að síðunni.</seg>
</tuv>
<tuv xml:lang="en">
<seg>Email is sent to the owner of the website which then desides if he grants access.</seg>
</tuv>
<tuv xml:lang="fr">
<seg>L'email est envoy au propritaire du site Web qui puis des
desides s'il accorde l'accs</seg>
</tuv>
<tuv xml:lang="de">
<seg>Dem Inhaber der Web site email wird die dann desides geschickt,
wenn er Zugang bewilligt</seg>
</tuv>
</tu>
Því miður þá virkar þetta eiginlega bara fyrir stutt orð, ég gæti trúað því að einhverjir brosa útí annað við að lesa setningarnar á frönsku og þýsku þar sem líklegast er málfræðin sjálfsagt eitthvað vitlaus(án þess að ég hafi hugmynd um það en ég svaf of mikið í þýskutímum :).
En gefum okkur það að allar þýðingarnar eru réttar þá er hægt að búa til vef á fjölda tungumálum á nokkrum sekúndum. Algjör snilld.
Niðurstaðan geturðu prófað svo hérna:
http://dyraland.is/dyr/22721 - (default íslenska)
http://dyraland.is/dyr/22721/en - (enska)
http://dyraland.is/dyr/22721/fr - (franska)
http://dyraland.is/dyr/22721/de - (þýska)
Ef þú ferð í Vefdagbókina eða Gestabókina þá er notandinn spurður um lykilorð. Þarna reynir á þýðingarnar því textinn er langur. Sjálfsagt eitthvað skrítinn þar sem ég hef ekki fengið þýðanda til að lesa þetta yfir.
Lykilorðið á síðuna er: 12
Þetta kemur sérstaklega vel út í gestabókinni þar sem mikið af litlum orðum er.