Copyright | 2012 Michael Snoyman <michael@snoyman.com>, Jeremy Shaw |
---|---|
License | BSD-style (see the LICENSE file in the distribution) |
Maintainer | Michael Snoyman <michael@snoyman.com> |
Stability | experimental |
Portability | portable |
Safe Haskell | None |
Language | Haskell98 |
This module provides a type-based system for providing translations for text strings.
It is similar in purpose to gettext or Java message bundles.
The core idea is to create simple data type where each constructor represents a phrase, sentence, paragraph, etc. For example:
data AppMessages = Hello | Goodbye
The RenderMessage
class is used to retrieve the appropriate
translation for a message value:
class RenderMessage master message where renderMessage :: master -- ^ type that specifies which set of translations to use -> [Lang] -- ^ acceptable languages in descending order of preference -> message -- ^ message to translate -> Text
Defining the translation type and providing the RenderMessage
instance in Haskell is not very translator friendly. Instead,
translations are generally provided in external translations
files. Then the mkMessage
Template Haskell function is used to
read the external translation files and automatically create the
translation type and the RenderMessage
instance.
A full description of using this module to create translations for Hamlet
can be found here:
http://www.yesodweb.com/book/internationalization
A full description of using the module to create translations for HSP
can be found here:
http://happstack.com/docs/crashcourse/Templates.html#hsp-i18n
You can also adapt those instructions for use with other systems.
- mkMessage :: String -> FilePath -> Lang -> Q [Dec]
- mkMessageFor :: String -> String -> FilePath -> Lang -> Q [Dec]
- mkMessageVariant :: String -> String -> FilePath -> Lang -> Q [Dec]
- class RenderMessage master message where
- renderMessage :: master -> [Lang] -> message -> Text
- class ToMessage a where
- data SomeMessage master = forall msg . RenderMessage master msg => SomeMessage msg
- type Lang = Text
Documentation
:: String | base name to use for translation type |
-> FilePath | subdirectory which contains the translation files |
-> Lang | default translation language |
-> Q [Dec] |
generate translations from translation files
This function will:
- look in the supplied subdirectory for files ending in
.msg
- generate a type based on the constructors found
- create a
RenderMessage
instance
:: String | master translation data type |
-> String | existing type to add translations for |
-> FilePath | path to translation folder |
-> Lang | default language |
-> Q [Dec] |
create RenderMessage
instance for an existing data-type
:: String | master translation data type |
-> String | existing type to add translations for |
-> FilePath | path to translation folder |
-> Lang | default language |
-> Q [Dec] |
create an additional set of translations for a type created by mkMessage
class RenderMessage master message where Source
the RenderMessage
is used to provide translations for a message types
The master
argument exists so that it is possible to provide more
than one set of translations for a message
type. This is useful
if a library provides a default set of translations, but the user
of the library wants to provide a different set of translations.
RenderMessage master Text | |
(~) * master master' => RenderMessage master (SomeMessage master') |
data SomeMessage master Source
forall msg . RenderMessage master msg => SomeMessage msg |
(~) * master master' => RenderMessage master (SomeMessage master') | |
IsString (SomeMessage master) |