sig
  type category =
    [ `LC_ALL
    | `LC_COLLATE
    | `LC_CTYPE
    | `LC_MESSAGES
    | `LC_MONETARY
    | `LC_NUMERIC
    | `LC_TIME ]
  and numeric_lconv = {
    decimal_point : string;
    thousands_sep : string;
    grouping : string;
  }
  and sign_pos =
    [ `SignPrecedesBoth
    | `SignPrecedesCS
    | `SignSucceedsBoth
    | `SignSucceedsCS
    | `SurroundBoth
    | `UnknownOrder ]
  and monetary_lconv = {
    int_curr_symbol : string;
    currency_symbol : string;
    decimal_point : string;
    thousands_sep : string;
    grouping : string;
    positive_sign : string;
    negative_sign : string;
    int_frac_digits : int;
    frac_digits : int;
    p_cs_precedes : bool;
    p_sep_by_space : bool;
    n_cs_precedes : bool;
    n_sep_by_space : bool;
    p_sign_posn : Locale.sign_pos;
    n_sign_posn : Locale.sign_pos;
  }
  val set : ?name:string -> Locale.category -> string option
  val set_from_env : Locale.category -> string option
  val get : Locale.category -> string
  val numeric_info : unit -> Locale.numeric_lconv
  val monetary_info : unit -> Locale.monetary_lconv
end