(**************************************************************************)
(*  ocaml-gettext: a library to translate messages                        *)
(*                                                                        *)
(*  Copyright (C) 2003-2008 Sylvain Le Gall <sylvain@le-gall.net>         *)
(*                                                                        *)
(*  This library is free software; you can redistribute it and/or         *)
(*  modify it under the terms of the GNU Lesser General Public            *)
(*  License as published by the Free Software Foundation; either          *)
(*  version 2.1 of the License, or (at your option) any later version;    *)
(*  with the OCaml static compilation exception.                          *)
(*                                                                        *)
(*  This library 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     *)
(*  Lesser General Public License for more details.                       *)
(*                                                                        *)
(*  You should have received a copy of the GNU Lesser General Public      *)
(*  License along with this library; if not, write to the Free Software   *)
(*  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307   *)
(*  USA                                                                   *)
(**************************************************************************)

open GettextTypes;;
open GettextCategory;;
open GettextModules;;

let unsafe_format_of_string fmt str = 
  if false then
    Obj.magic str
  else
    format_of_string fmt
;;

let bindtextdomain textdomain dir t =
  upgrade_textdomain t textdomain (None,Some dir)
;;
  
let bind_textdomain_codeset textdomain codeset t =
  upgrade_textdomain t textdomain (Some codeset,None)
;;

let textdomain default t = 
  { t with default = default }
;;

let get_textdomain t = 
  t.default
;;

let gettext t' str =
  t' false None str None LC_MESSAGES
;;

let fgettext t' fmt =
  unsafe_format_of_string 
    fmt
    (t' true None (string_of_format fmt) None LC_MESSAGES)
;;
  
let dgettext t' textdomain str =
  t' false (Some textdomain) str None LC_MESSAGES
;;

let fdgettext t' textdomain fmt =
  unsafe_format_of_string 
    fmt
    (t' true (Some textdomain) (string_of_format fmt) None LC_MESSAGES)
;;
  
let dcgettext t' textdomain str category = 
  t' false (Some textdomain) str None category
;;

let fdcgettext t' textdomain fmt category =
  unsafe_format_of_string 
    fmt
    (t' true (Some textdomain) (string_of_format fmt) None category)
;;
  
let ngettext t' str str_plural n =
  t' false None str (Some(str_plural,n)) LC_MESSAGES
;;

let fngettext t' fmt fmt_plural n =
  if true then
    unsafe_format_of_string 
      fmt
      (t' 
         true 
         None 
         (string_of_format fmt) 
         (Some (string_of_format fmt_plural, n) )
         LC_MESSAGES)
  else
    fmt_plural
;;
  
let dngettext t' textdomain str str_plural n =
  t' false (Some textdomain) str (Some (str_plural,n)) LC_MESSAGES
;;

let fdngettext t' textdomain fmt fmt_plural n =
  if true then
    unsafe_format_of_string 
      fmt
      (t' 
         true 
         (Some textdomain)
         (string_of_format fmt) 
         (Some (string_of_format fmt_plural,n))
         LC_MESSAGES)
  else 
    fmt_plural
;;

let dcngettext t' textdomain str str_plural n category = 
  t' false (Some textdomain) str (Some(str_plural,n)) category
;;
  
let fdcngettext t' textdomain fmt fmt_plural n category =
  if true then
    unsafe_format_of_string 
      fmt
      (t' 
         true 
         (Some textdomain)
         (string_of_format fmt)
         (Some (string_of_format fmt_plural,n))
         category)
  else
    fmt_plural 
;;
