PageRenderTime 204ms CodeModel.GetById 191ms RepoModel.GetById 0ms app.codeStats 0ms

/iBlue.ResxHelper/Src/Program.fs

http://github.com/fahadsuhaib/FSharpTools
F# | 151 lines | 134 code | 14 blank | 3 comment | 17 complexity | 992e93b291ff5364fd6993c4d0a0fecd MD5 | raw file
  1. // Learn more about F# at http://fsharp.net
  2. open System
  3. open System.Net
  4. open System.IO
  5. open Microsoft.FSharp.Control.WebExtensions
  6. #if INTERACTIVE
  7. #load @"AsyncHelpers.fs"
  8. #endif
  9. open FSharp.Tutorial
  10. open System.Collections.Generic
  11. open System.Linq
  12. let myAppId = "B3CFD35A9EB3995659BAC3E9B6456CE8008AD59B"
  13. let translateUri = "http://api.microsofttranslator.com/V1/Http.svc/Translate?appId=" + myAppId + "&"
  14. let languageUri = "http://api.microsofttranslator.com/V1/Http.svc/GetLanguages?appId=" + myAppId
  15. let languageNameUri = "http://api.microsofttranslator.com/V1/Http.svc/GetLanguageNames?appId=" + myAppId
  16. let run x = Async.RunSynchronously x
  17. let httpLines (uri:string) =
  18. async {
  19. let request = WebRequest.Create uri
  20. use! response = request.AsyncGetResponse()
  21. use stream = response.GetResponseStream()
  22. use reader = new StreamReader(stream)
  23. let! lines = reader.AsyncReadAllLines()
  24. return new List<String>(lines |> List.toArray)
  25. }
  26. /// key is just a variable for concatinating outputs
  27. let translateText(key, text, fromLang, toLang) =
  28. async {
  29. let uri = sprintf "%sfrom=%s&to=%s" translateUri fromLang toLang
  30. let req2 = WebRequest.Create(uri, Method = "Post", ContentType = "text/plain")
  31. do! req2.AsyncWriteContent text
  32. let! resp = req2.AsyncReadResponse()
  33. return key + resp
  34. }
  35. let translateFile(filename : string, fromLang : string, toLang : string, outputfile : string) =
  36. let languages = httpLines languageUri |> run
  37. printfn "Languages available"
  38. languages
  39. |> Seq.iteri(fun i t -> printfn "%d) %s" i t)
  40. use sr = new StreamReader(filename)
  41. let lines = sr.ReadToEnd().Split([|Environment.NewLine|], StringSplitOptions.RemoveEmptyEntries)
  42. printfn "Language Translation started..."
  43. let task =
  44. Async.Parallel
  45. [for line in lines ->
  46. let txt = line.Split([|'='|])
  47. let key = txt.[0] + "="
  48. translateText(key, txt.[1], fromLang, toLang)]
  49. Async.StartWithContinuations(
  50. task,
  51. (fun results ->
  52. let sb = new System.Text.StringBuilder()
  53. for r in results do
  54. printfn "%s" r
  55. sb.AppendLine(r) |> ignore
  56. let ofile =
  57. if outputfile = String.Empty then
  58. let f = filename.Substring(0, filename.IndexOf("."))
  59. f + "." + toLang + ".txt"
  60. else
  61. outputfile
  62. use sw = new StreamWriter(ofile)
  63. sw.Write(sb.ToString())
  64. printfn "Language Translation done..."
  65. ),
  66. (fun _ -> ()),
  67. (fun _ -> ()))
  68. #if INTERACTIVE
  69. printf "From Lang:"
  70. let fLang = Console.ReadLine()
  71. printf "To Lang:"
  72. let tLang = Console.ReadLine()
  73. printf "Enter Resouces File Path:"
  74. let filename = Console.ReadLine()
  75. if fLang <> String.Empty && languages.Contains(fLang) && tLang <> String.Empty && languages.Contains(tLang) && filename <> String.Empty then
  76. translateFile(filename, fLang, tLang, String.Empty)
  77. else
  78. printfn "Input details in-correct"
  79. #else
  80. /// /file:sometext.txt /from:en /to:de /o:output.de
  81. [<EntryPoint>]
  82. let main args =
  83. let usage = "Usage of ResxGenerator should be as below,
  84. resxgenerator.exe /f:sometext.txt /from:en /to:de /o:output.de.txt
  85. /f: - filename
  86. /from: - from language
  87. /to: - to language
  88. /o: - output file"
  89. if args.Length = 0 then
  90. printfn "%s" usage
  91. else
  92. try
  93. let parseArg(cmp) =
  94. let bitString = args.FirstOrDefault(Func<string, bool>(fun s -> s.Contains(cmp)))
  95. if bitString <> String.Empty then
  96. let b = bitString.Split([|':'|])
  97. Some(b.[0], b.[1])
  98. else
  99. None
  100. let parseFileArg(cmp) =
  101. let bitString = args.FirstOrDefault(Func<string, bool>(fun s -> s.Contains(cmp)))
  102. if bitString <> String.Empty then
  103. let s1 = bitString
  104. Some(s1.Substring(s1.IndexOf("/f:") + 3, s1.Length - (s1.IndexOf("/f:") + 3)))
  105. else
  106. None
  107. let fileArg = parseFileArg("/f:")
  108. let filename =
  109. match fileArg with
  110. | Some(b) -> b
  111. | _ -> String.Empty
  112. let fromArg = parseArg("/from:")
  113. let fLang =
  114. match fromArg with
  115. | Some(b, b1) -> b1
  116. | _ -> String.Empty
  117. let toArg = parseArg("/to:")
  118. let tLang =
  119. match toArg with
  120. | Some(b, b1) -> b1
  121. | _ -> String.Empty
  122. let outputfileArg = parseArg("/o:")
  123. let outputfile =
  124. match outputfileArg with
  125. | Some(b, b1) -> b1
  126. | _ -> "output.txt"
  127. if fLang <> String.Empty && tLang <> String.Empty && filename <> String.Empty then
  128. translateFile(filename, fLang, tLang, outputfile)
  129. else
  130. printfn "%s" usage
  131. Console.ReadKey() |> ignore
  132. with
  133. | e ->
  134. printfn "%s" e.Message
  135. printfn "%s" usage
  136. 0
  137. #endif