summaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Translations.hs
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2017-08-11 11:56:54 -0700
committerJohn MacFarlane <jgm@berkeley.edu>2017-08-11 22:22:31 -0700
commit74212eb1b0e1757fc0ac3e5d45b0ee18bac491e5 (patch)
tree522b79da10f8838b0bd2665ddfa741eed0ecbeff /src/Text/Pandoc/Translations.hs
parent7892dcd353ff0efd24ed753061b9be8e556b0177 (diff)
Added support for translations (localization) (see #3559).
* readDataFile, readDefaultDataFile, getReferenceDocx, getReferenceODT have been removed from Shared and moved into Class. They are now defined in terms of PandocMonad primitives, rather than being primitve methods of the class. * toLang has been moved from BCP47 to Class. * NoTranslation and CouldNotLoudTranslations have been added to LogMessage. * New module, Text.Pandoc.Translations, exporting Term, Translations, readTranslations. * New functions in Class: translateTerm, setTranslations. Note that nothing is loaded from data files until translateTerm is used; setTranslation just sets the language to be used. * Added two translation data files in data/translations. * LaTeX reader: Support `\setmainlanguage` or `\setdefaultlanguage` (polyglossia) and `\figurename`.
Diffstat (limited to 'src/Text/Pandoc/Translations.hs')
-rw-r--r--src/Text/Pandoc/Translations.hs94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/Text/Pandoc/Translations.hs b/src/Text/Pandoc/Translations.hs
new file mode 100644
index 000000000..2185366fd
--- /dev/null
+++ b/src/Text/Pandoc/Translations.hs
@@ -0,0 +1,94 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-
+Copyright (C) 2017 John MacFarlane <jgm@berkeley.edu>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+-}
+
+{- |
+ Module : Text.Pandoc.Translations
+ Copyright : Copyright (C) 2017 John MacFarlane
+ License : GNU GPL, version 2 or above
+
+ Maintainer : John MacFarlane <jgm@berkeley.edu>
+ Stability : alpha
+ Portability : portable
+
+Data types for localization.
+
+Translations are stored in @data/translations/langname.trans@,
+where langname can be the full BCP47 language specifier, or
+just the language part. File format is:
+
+> # A comment, ignored
+> Figure: Figura
+> Index: Indeksi
+
+-}
+module Text.Pandoc.Translations (
+ Term(..)
+ , Translations(..)
+ , readTranslations
+ )
+where
+import qualified Data.Map as M
+import GHC.Generics (Generic)
+import Text.Pandoc.Shared (trim, safeRead)
+
+data Term =
+ Preface
+ | References
+ | Abstract
+ | Bibliography
+ | Chapter
+ | Appendix
+ | Contents
+ | ListOfFigures
+ | ListOfTables
+ | Index
+ | Figure
+ | Table
+ | Part
+ | Page
+ | Proof
+ | See
+ | SeeAlso
+ | Cc
+ | To
+ deriving (Show, Eq, Ord, Generic, Read)
+
+newtype Translations = Translations (M.Map Term String)
+ deriving (Show, Eq, Ord, Generic, Monoid)
+
+readTranslations :: String -> Either String Translations
+readTranslations = foldr parseLine (Right mempty) . lines
+
+parseLine :: String
+ -> Either String Translations
+ -> Either String Translations
+parseLine _ (Left s) = Left s
+parseLine ('#':_) x = x
+parseLine [] x = x
+parseLine t (Right (Translations tm)) =
+ if null rest
+ then Left $ "no colon in " ++ term
+ else
+ case safeRead term of
+ Nothing -> Left $ term ++ " is not a recognized term name"
+ Just term' -> Right (Translations $ (M.insert term' defn) tm)
+ where (trm, rest) = break (\c -> c == ':') t
+ defn = trim $ drop 1 rest
+ term = trim trm