-
Notifications
You must be signed in to change notification settings - Fork 0
/
Translate.hs
54 lines (48 loc) · 1.63 KB
/
Translate.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
-- |A very primitive translation module. Translations are kept in
-- files, where each pair of lines is first the \"original\" text, and
-- then the translated text.
module Translate
(Translatable,
Language,
loadLanguage,
nullLanguage,
translate)
where
import System.IO
import Data.HashTable
type Language = HashTable Translatable Translatable
-- |This type should have more features, such as being able to insert
-- data in the middle.
type Translatable = String
-- |Translate a string from the \"source\" language to the given
-- language. If the string is not present in the hashtable, return
-- the original.
translate :: Language -> Translatable -> IO Translatable
translate lang from =
do
translated <- Data.HashTable.lookup lang from
return $ maybe from id translated
-- |Load a translation file into a hash table.
loadLanguage :: String -> IO Language
loadLanguage filename =
do
h <- openFile filename ReadMode
text <- hGetContents h
table <- new (==) hashString
addLines table (lines text)
hClose h
return table
where addLines table [] =
do
--putStrLn "Done."
return ()
addLines table (from:to:rest) =
do
--putStrLn $ "'"++from++"' translates to '"++to++"'"
insert table from to
addLines table rest
addLines table [odd] = putStrLn $ "Warning: discarding " ++ odd ++ " from " ++ filename
-- |Return an \"empty\" hash table, which will translate every string
-- to itself.
nullLanguage :: IO Language
nullLanguage = new (==) hashString