Docs about i18n.
diff --git a/Framework/GetText.hs b/Framework/GetText.hs
index b432605..d2741ad 100644
--- a/Framework/GetText.hs
+++ b/Framework/GetText.hs
@@ -23,7 +23,11 @@ fillLocale loc =
Just c -> loc++"_"++c++".UTF-8"
Nothing -> loc++"_"++(map toUpper loc)++".UTF-8"
-gettextInit :: String -> String -> String -> IO ()
+-- | Initialize GetText. NB: initialization affects all the OS thread, not only haskell's `green` thread.
+gettextInit :: String -- ^ Locale specification, such as `en_GB.UTF-8'
+ -> String -- ^ GetText domain
+ -> String -- ^ Directory with .mo files
+ -> IO ()
gettextInit lang domain dir = do
val <- setLocale LC_ALL $ Just $ fillLocale lang
case val of
@@ -33,11 +37,13 @@ gettextInit lang domain dir = do
textDomain $ Just domain
return ()
+-- | Translate the string (in IO monad)
__io :: String -> IO String
__io text = do
res <- getText text
return $ decodeString res
+-- | Translate the string
__ :: String -> AController String
__ text = liftIO $ __io text
diff --git a/README.ru b/README.ru
index 7671742..d901ced 100644
--- a/README.ru
+++ b/README.ru
@@ -132,3 +132,11 @@ controller = do
* Обработчики исключений: приложение может определить свои обработчики для request exceptions и controller exceptions.
Все эти функции должны быть определены в приложении в модуле Settings.hs, оттуда их импортируют разные части фреймворка. В нём же определяется соответствие возможных сигналов и их обработчиков.
+
+## Интернационализация
+
+Для интернационализации используется gettext и его привязки к haskell - hgettext. В контроллерах для перевода строки следует использовать функцию __. Затем .hs файлы обрабатываются утилитой hgettext, получается messages.pot и т.д. как обычно с gettext. Интернационализация в шаблонах сейчас не предусмотрена, предлагается либо переводить строки в контроллерах, либо использовать разные шаблоны для разных языков.
+
+Встроенное middleware добавляет в каждый запрос два заголовка: X-UserLanguage и X-UserCharset, например X-UserLanguage: ru_RU, X-UserCharset: .UTF-8 (информация берётся из заголовков AcceptLanguage и AcceptEncoding). Эти заголовки можно использовать в приложении. Кроме того, другое встроенное middleware использует их для инициализации gettext. Таким образом, без усилий программиста приложения, с каждым пользователем оно будет разговаривать на его языке (том, который выставлен в браузере как язык по умолчанию). Если перевода на этот язык нет, будет использован английский.
+
+Сейчас фреймворк расчитан на использование кодировки UTF8.