WP7 App Resources Translator using Bing services






4.92/5 (5 votes)
To translate App Resources
I have to translate my AppResources from english to the other 4 languages available at the moment in WP7. So I decided to create a snippet to translate it, Of course simply change the TargetLanguage to get the translated section.
What you have to do is:
1.- Create the AppResources.es-ES.resx,AppResources.it-IT.resx and else in your WP7 app.
2.- Have an AppID for Bing Services.
3.- Add the following code to a WPF/SL app with the Bing Service reference.
4.- Copy from the first to the last from the resx.file like:
</data lang="xml">data name="alanguage" xml:space="preserve"> <value>Answer Language</value> </data> <data name="animage" xml:space="preserve"> <value>An image!</value> </data> <data name="bonus" xml:space="preserve"> <value>BONUS </value> </data>The Code:
String source; List<String> words; String TargetLanguage = "it"; private void button1_Click(object sender, RoutedEventArgs e) { source = textBox1.Text; List<String> input = (from prod in source.Split(new string[] { "<data ", "</data>" }, StringSplitOptions.None).ToList() where prod.Contains("name") select prod).ToList(); words = new List<string>(); Int32 odx, fdx = -1; input.ForEach(inp => { odx = inp.IndexOf("<value>") + "<value>".Length; fdx = inp.IndexOf("</value>"); words.Add(inp.Substring(odx, fdx - odx)); }); StringBuilder sb = new StringBuilder(" "); words.ForEach(s => sb.Append(String.Concat("| ", s, " "))); TranslateWord(sb.ToString(),"en",TargetLanguage,ProcessTranslated); } public static void TranslateWord(string source,string SourceL,string TargetL,Func<List<String>,bool> ProcessTranslated) { List<string> ret = new List<string>(); SearchRequest request = new SearchRequest(); request.Sources = new SourceType[] { SourceType.Translation }; request.AppId = "YOURAPPID"; request.Query = source; TranslationRequest tr = new TranslationRequest(); tr.SourceLanguage = SourceL; tr.TargetLanguage = TargetL; request.Translation = tr; BingPortTypeClient client = new BingPortTypeClient(); client.SearchCompleted += (s, e) => { String result = e.Result.Translation.Results[0].TranslatedTerm; ret = result.Split('|').ToList(); ret.ForEach(s2 => { if (s2.Length > 0 && s2[0] == ' ') s2 = s2.Trim(); }); ret.RemoveAt(0); ProcessTranslated(ret); }; client.SearchAsync(request); } public bool ProcessTranslated(List<string> input) { if(input.Count == words.Count) { words.ForEach(w => source = source.Replace("<value>"+w, "<value>"+input[words.IndexOf(w)].Substring(1))); } textBox2.Text = source.Replace(" </value>","</value>"); return true; }And that's all, replace textBox2.Text the result in the .it-IT.resx and else. It may work in WPF and SL too.