/usr/lib/ocaml/gettext/gettextLocale.ml is in libgettext-ocaml-dev 0.3.5-2build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | (**************************************************************************)
(* 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 *)
(**************************************************************************)
(** Implements different operation over locale/category.
@author Sylvain Le Gall
*)
open GettextTypes;;
open GettextCategory;;
open GettextUtils;;
module type LOCALE_TYPE =
sig
(** get_locale t cat : Return the value of locale and encoding for cat.
The value returned is in ASCII. Priority should be given to the
values language/codeset provided in variable t.
*)
val get_locale : t -> category -> (locale list * codeset)
end
;;
(** Return the best value of environnement variable, that can be found according to the
priority defined in gettext. The choice take into account t and category,
but may ignore it, if a variable with a best priority is set.
This function can be used to get a value for a LOCALE_TYPE implementation.
Raise Not_found if nothing appropriate.
*)
let posix_getenv t category =
(* http://www.gnu.org/software/gettext/manual/html_mono/gettext.html#SEC155
In the function dcgettext at every call the current setting of the
highest priority environment variable is determined and used.
Highest priority means here the following list with decreasing priority:
1. LANGUAGE
2. LC_ALL
3. LC_xxx, according to selected locale
4. LANG
*)
match t.language with
Some str ->
str
| None ->
try
let best_env =
List.find (
fun s ->
try
ignore(Sys.getenv s);
true
with Not_found ->
false
) [
"LANGUAGE" ;
string_of_category LC_ALL ;
string_of_category category;
"LANG" ]
in
Sys.getenv best_env
with Not_found ->
"C"
;;
module Posix : LOCALE_TYPE =
struct
(* Extract from "man setlocale"
A locale name is typically of the form language[_territory][.codeset][@modi-
fier], where language is an ISO 639 language code, territory is an ISO 3166
country code, and codeset is a character set or encoding identifier like
ISO-8859-1 or UTF-8. For a list of all supported locales, try "locale -a", cf.
locale(1).
*)
let get_locale t category =
let posix_lang = posix_getenv t category
in
let locale =
try
let lexbuf =
Lexing.from_string posix_lang
in
GettextLocale_parser.main
GettextLocale_lexer.token
lexbuf
with x ->
fail_or_continue t.failsafe
(LocalePosixUnparseable (posix_lang^" "^(Printexc.to_string x)))
(GettextLocale_types.create_locale posix_lang)
in
let locales =
match
(locale.GettextLocale_types.territory,locale.GettextLocale_types.modifier) with
Some territory, Some modifier ->
[
locale.GettextLocale_types.language^"_"^territory^"@"^modifier;
locale.GettextLocale_types.language^"_"^territory;
locale.GettextLocale_types.language
]
| None, Some modifier ->
[
locale.GettextLocale_types.language^"@"^modifier;
locale.GettextLocale_types.language
]
| Some territory, None ->
[
locale.GettextLocale_types.language^"_"^territory;
locale.GettextLocale_types.language
]
| None, None ->
[
locale.GettextLocale_types.language
]
in
let codeset =
match locale.GettextLocale_types.codeset with
Some codeset ->
codeset
| None ->
t.codeset
in
(locales,codeset)
end
;;
|