diff --git a/naver-translate.cabal b/naver-translate.cabal
--- a/naver-translate.cabal
+++ b/naver-translate.cabal
@@ -1,7 +1,8 @@
 name:                naver-translate
-version:             0.1.0.0
+version:             0.1.0.1
 synopsis:            Interface to Naver Translate
 homepage:            https://github.com/dahlia/naver-translate
+bug-reports:         https://github.com/dahlia/naver-translate/issues
 license:             GPL-3
 license-file:        LICENSE
 author:              Hong Minhee
@@ -14,13 +15,14 @@
 
 library
   exposed-modules:     Language.Translate.Naver
-  build-depends:       aeson       >=0.7.0.6  && <0.8.0.0,
-                       base        >=4.7 && <4.8,
+  build-depends:       aeson        >=0.7.0.6  && <0.8.0.0,
+                       base         >=4.7 && <4.8,
                        iso639,
-                       lens        >=4.8 && <4.9,
-                       lens-aeson  >=1.0.0.3  && <1.1.0.0,
-                       text        >=1.1.0.0  && <1.2.0.0,
-                       wreq        >=0.3.0.1  && <0.4.0.0,
-                       random      >=1.0.1.1  && <1.1.0.0
+                       lens         >=4.8 && <4.9,
+                       lens-aeson   >=1.0.0.3  && <1.1.0.0,
+                       network-uri  >=2.6.0.0  && <3.0.0.0,
+                       text         >=1.1.0.0  && <1.2.0.0,
+                       wreq         >=0.3.0.1  && <0.4.0.0,
+                       random       >=1.0.1.1  && <1.1.0.0
   hs-source-dirs:      src
   default-language:    Haskell2010
diff --git a/src/Language/Translate/Naver.hs b/src/Language/Translate/Naver.hs
--- a/src/Language/Translate/Naver.hs
+++ b/src/Language/Translate/Naver.hs
@@ -1,28 +1,35 @@
 {-# LANGUAGE OverloadedStrings #-}
 module Language.Translate.Naver ( translate
                                 , translateMultiple
+                                , translateUrl
                                 ) where
 
 import Control.Lens ((^?))
+import Control.Monad (liftM)
 import Data.Aeson.Lens (key)
 import Data.Aeson.Types (Value(String))
-import Data.LanguageCodes (ISO639_1, language)
+import Data.LanguageCodes (ISO639_1(JA, KO), language)
 import Data.Text (Text, cons, intercalate, pack, snoc, splitOn, strip)
+import Network.URI (URI(URI), URIAuth(URIAuth), relativeTo, uriIsAbsolute)
 import Network.Wreq (FormParam((:=)), post, responseBody)
 import System.Random (getStdRandom, randomR)
 
-translate :: ISO639_1 -> ISO639_1 -> Text -> IO Text
+-- | Translate a string.
+translate :: ISO639_1 -- ^ The language translated from
+          -> ISO639_1 -- ^ The language to translate to
+          -> Text     -- ^ The text to translate
+          -> IO Text  -- ^ The translated text
 translate sourceLanguage targetLanguage text =
     let response =
             post
             "http://translate.naver.com/translate.dic"
             [ "query" := text
-            , "srcLang" := (pack $ language sourceLanguage)
-            , "tarLang" := (pack $ language targetLanguage)
+            , "srcLang" := pack (language sourceLanguage)
+            , "tarLang" := pack (language targetLanguage)
             , "highlight" := ("0" :: Text)
             , "hurigana" := ("0" :: Text)]
         getResultData resp = resp ^? responseBody . key "resultData"
-        resultData = response >>= return . getResultData
+        resultData = liftM getResultData response
     in
         resultData >>= \dat -> case dat of
             Just (String translated) -> return translated
@@ -35,13 +42,40 @@
 arbitraryNumeric =
     let
         randomDigit i = getStdRandom (randomR (if i > 1 then '0' else '1', '9'))
-        string = sequence $ map randomDigit [1..arbitraryNumericLength]
+        string = mapM randomDigit [1..arbitraryNumericLength]
     in
-        string >>= return . pack
+        liftM pack string
 
-translateMultiple :: ISO639_1 -> ISO639_1 -> [Text] -> IO [Text]
+-- | Translate multiple strings at one go.
+translateMultiple :: ISO639_1  -- ^ The language translated from
+                  -> ISO639_1  -- ^ The language to translate to
+                  -> [Text]    -- ^ The texts to translate
+                  -> IO [Text] -- ^ The translated texts
 translateMultiple sourceLanguage targetLanguage texts = do
     spliter <- arbitraryNumeric
     let bundle = intercalate (snoc (cons ' ' spliter) ' ') texts
     result <- translate sourceLanguage targetLanguage bundle
     return $ map strip $ splitOn spliter result
+
+-- | Get the url of the translated page.  Other languages than Korean
+-- ('KO') and Japanese ('JA') are unsupported, so they get 'Nothing'.
+translateUrl :: ISO639_1  -- ^ The language translated from
+             -> ISO639_1  -- ^ The language to translate to
+             -> URI       -- ^ The url of the page to translate
+             -> Maybe URI -- ^ The url of the translated page
+translateUrl sourceLanguage targetLanguage (URI scheme authority path query _) =
+    case (scheme, authority) of
+        ("http:", Just (URIAuth "" host port)) ->
+            let relUrl = getRelUrl host port
+                getUrl = Just . relativeTo relUrl
+            in case langPair of
+                (JA, KO) -> getUrl j2k
+                (KO, JA) -> getUrl k2j
+                _ -> Nothing
+        _ -> Nothing
+  where
+    langPair = (sourceLanguage, targetLanguage)
+    baseAuth = Just $ URIAuth "" "jptrans.naver.net" ""
+    j2k = URI "http:" baseAuth "/j2k_frame.php/korean/" "" ""
+    k2j = URI "http:" baseAuth "/webtrans.php/korean/" "" ""
+    getRelUrl host port = URI "" Nothing (host ++ port ++ path) query ""
